|
|
@@ -13,6 +13,7 @@ import com.sckw.core.model.constant.Global;
|
|
|
import com.sckw.core.model.enums.CarWaybillV1Enum;
|
|
|
import com.sckw.core.model.enums.ForkliftStatusEnum;
|
|
|
import com.sckw.core.model.enums.GatekeeperStatusEnum;
|
|
|
+import com.sckw.core.model.enums.GatekeeperTypeEnum;
|
|
|
import com.sckw.core.utils.CollectionUtils;
|
|
|
import com.sckw.core.utils.DateUtils;
|
|
|
import com.sckw.core.utils.StringUtils;
|
|
|
@@ -30,6 +31,7 @@ import com.sckw.transport.model.param.forklift.request.GatekeeperOrderPassReason
|
|
|
import com.sckw.transport.model.param.forklift.request.GatekeeperOrderQueryParam;
|
|
|
import com.sckw.transport.model.vo.StatisticsWaybillResp;
|
|
|
import com.sckw.transport.repository.*;
|
|
|
+import com.sckw.transport.util.ParkingNotificationAsyncService;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
@@ -37,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
import java.util.function.Function;
|
|
|
@@ -68,6 +71,10 @@ public class GatekeeperOrderService {
|
|
|
@Autowired
|
|
|
protected KwtLogisticsOrderUnitRepository logisticsOrderUnitRepository;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private ParkingNotificationAsyncService parkingNotificationAsyncService;
|
|
|
+
|
|
|
+
|
|
|
@DubboReference(version = "1.0.0", group = "design", check = false)
|
|
|
private RemoteContractService remoteContractService;
|
|
|
|
|
|
@@ -576,11 +583,136 @@ public class GatekeeperOrderService {
|
|
|
if (gatekeeper == null) {
|
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_NOT_FOUND, "当前门卫订单不存在!");
|
|
|
}
|
|
|
- //1. 更改门卫状态为:已放行
|
|
|
- updateGatekeeperOrderStatus(gatekeeper, param);
|
|
|
|
|
|
- //2. 更改司机状态为:已放行未离场
|
|
|
- updateWaybillOrderStatus(gatekeeper, param);
|
|
|
+ //放行后直接抬杆离场
|
|
|
+ driverPass(param, gatekeeper);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 放行后直接离场
|
|
|
+ * @param param
|
|
|
+ * @param gatekeeper
|
|
|
+ */
|
|
|
+ private void driverPass(GatekeeperOrderPassParam param, KwtGatekeeperWaybillOrder gatekeeper) {
|
|
|
+ // 查询运单
|
|
|
+ KwtWaybillOrder waybillOrder = waybillOrderRepository.getById(gatekeeper.getWOrderId());
|
|
|
+ if (waybillOrder == null) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_NOT_FOUND, "[门卫放行]当前运单数据不存在!");
|
|
|
+ }
|
|
|
+
|
|
|
+ //1. 计算是否空载离场
|
|
|
+ Boolean isEmptyLoadLeave = calculateEmptyLoad(waybillOrder);
|
|
|
+
|
|
|
+ //2. 更改门卫状态为:已离场
|
|
|
+ updateGatekeeperOrderStatus2(gatekeeper, param, isEmptyLoadLeave);
|
|
|
+
|
|
|
+ //3. 更改司机状态为:已离场
|
|
|
+ updateWaybillOrderStatus2(gatekeeper, param, waybillOrder, isEmptyLoadLeave);
|
|
|
+
|
|
|
+ //4. 创建门卫卸货订单
|
|
|
+// creatGatekeeperUnLoadingOrder(gatekeeper, waybillOrder);
|
|
|
+
|
|
|
+ // 异步通知第三方出场收费接口
|
|
|
+ parkingNotificationAsyncService.asyncExitNotification(waybillOrder, gatekeeper, isEmptyLoadLeave);
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 更改司机状态为:已离场
|
|
|
+ * @param gatekeeper
|
|
|
+ */
|
|
|
+ private void updateWaybillOrderStatus2(KwtGatekeeperWaybillOrder gatekeeper, GatekeeperOrderPassParam param,
|
|
|
+ KwtWaybillOrder waybillOrder, Boolean isEmptyLoadLeave) {
|
|
|
+ // 1. 修改运单状态:已离场
|
|
|
+ updateWaybillStatus2(gatekeeper, waybillOrder, isEmptyLoadLeave);
|
|
|
+
|
|
|
+ // 2. 修改子运单状态:已离场
|
|
|
+ updateWaybillSubtaskStatus2(gatekeeper, isEmptyLoadLeave);
|
|
|
+
|
|
|
+ // 3.创建运单轨迹日日志
|
|
|
+ creatWaybillOrderNode(gatekeeper, param);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改运单状态
|
|
|
+ * @param gatekeeper
|
|
|
+ */
|
|
|
+ private void updateWaybillStatus2(KwtGatekeeperWaybillOrder gatekeeper, KwtWaybillOrder waybillOrder,Boolean isEmptyLoadLeave) {
|
|
|
+ log.info("[门卫放行]更改运单状态为已离场/空载离场:{}", JSON.toJSONString(gatekeeper));
|
|
|
+ //装货单
|
|
|
+ if (Objects.equals(gatekeeper.getType(), GatekeeperTypeEnum.LOADING.getCode())) {
|
|
|
+ if (!CarWaybillV1Enum.WAIT_RELEASE.getCode().equals(waybillOrder.getStatus())) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "当前运单状态异常,不能推进为已离场!");
|
|
|
+ }
|
|
|
+ // 校验状态:若是空载离场,运单状态为已完成
|
|
|
+ CarWaybillV1Enum status = isEmptyLoadLeave ? CarWaybillV1Enum.COMPLETED : CarWaybillV1Enum.WAIT_LOADING;
|
|
|
+ if (isEmptyLoadLeave) {
|
|
|
+ waybillOrder.setRemark("空载离场");
|
|
|
+ }
|
|
|
+ waybillOrder.setStatus(status.getCode());
|
|
|
+ }
|
|
|
+ waybillOrderRepository.updateById(waybillOrder);
|
|
|
+ log.info("[门卫放行]更改运单状态为已离场/空载离场完成!");
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 修改子运单状态
|
|
|
+ * @param gatekeeper
|
|
|
+ */
|
|
|
+ private void updateWaybillSubtaskStatus2(KwtGatekeeperWaybillOrder gatekeeper, Boolean isEmptyLoadLeave) {
|
|
|
+ log.info("[门卫放行]更改子运单状态为已离场/空载离场:{}", JSON.toJSONString(gatekeeper));
|
|
|
+ KwtWaybillOrderSubtask waybillSubtask = waybillOrderSubtaskRepository.queryByWOrderId(gatekeeper.getWOrderId());
|
|
|
+ if (waybillSubtask == null) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_SUB_NOT_FOUND, "未找到关联的子运单!");
|
|
|
+ }
|
|
|
+ //装货单
|
|
|
+ if (Objects.equals(gatekeeper.getType(), GatekeeperTypeEnum.LOADING.getCode())) {
|
|
|
+ if (!CarWaybillV1Enum.WAIT_RELEASE.getCode().equals(waybillSubtask.getStatus())) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "当前子运单状态异常,不能推进为已离场!");
|
|
|
+ }
|
|
|
+ // 校验状态:若是空载离场,运单状态为已完成
|
|
|
+ CarWaybillV1Enum status = isEmptyLoadLeave ? CarWaybillV1Enum.COMPLETED : CarWaybillV1Enum.WAIT_LOADING;
|
|
|
+ waybillSubtask.setStatus(status.getCode());
|
|
|
+ }
|
|
|
+ waybillOrderSubtaskRepository.updateById(waybillSubtask);
|
|
|
+ log.info("[门卫放行]更改子运单状态为已离场/空载离场完成!");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更改门卫状态为:已放行
|
|
|
+ * @param gatekeeper
|
|
|
+ */
|
|
|
+ private void updateGatekeeperOrderStatus2(KwtGatekeeperWaybillOrder gatekeeper, GatekeeperOrderPassParam param, Boolean isEmptyLoadLeave) {
|
|
|
+ log.info("[门卫放行]更改门卫状态为已放行:{}", JSON.toJSONString(gatekeeper));
|
|
|
+ if (!GatekeeperStatusEnum.PENDING_RELEASE.getCode().equals(gatekeeper.getStatus())) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_STATUS_ERROR, "当前门卫订单状态异常,不能放行!");
|
|
|
+ }
|
|
|
+ //门卫放行后状态更改为:已离场/空载离场
|
|
|
+ GatekeeperStatusEnum targetStatus = isEmptyLoadLeave ? GatekeeperStatusEnum.EMPTY_EXITED : GatekeeperStatusEnum.EXITED;
|
|
|
+ gatekeeper.setStatus(targetStatus.getCode());
|
|
|
+ gatekeeper.setLeaveTime(new Date());
|
|
|
+ gatekeeper.setGatekeeperUserId(param.getGatekeeperUserId());
|
|
|
+ gatekeeper.setGatekeeperName(param.getGatekeeperName());
|
|
|
+ gatekeeper.setUpdateUser(param.getGatekeeperUserId());
|
|
|
+ gatekeeperWaybillOrderRepository.updateById(gatekeeper);
|
|
|
+ log.info("[门卫放行]更改门卫状态已放行完成!");
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 计算是否空载离场
|
|
|
+ * @param waybillOrder
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Boolean calculateEmptyLoad(KwtWaybillOrder waybillOrder) {
|
|
|
+ log.info("[门卫放行]计算是否空载离场:{}", JSON.toJSONString(waybillOrder));
|
|
|
+ //查询运单装卸货信息
|
|
|
+ KwtWaybillOrderTicket orderTicket = waybillOrderTicketRepository.queryByWOrderIdByIdAndType(waybillOrder.getId(), 1);
|
|
|
+ if (orderTicket == null) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_TICKET_NOT_FOUND, "当前物流运单装卸货信息不存在,无法记录皮重!");
|
|
|
+ }
|
|
|
+ BigDecimal loadAmount = orderTicket.getAmount();
|
|
|
+
|
|
|
+ //空载离场,净重<=0.5
|
|
|
+ boolean result = loadAmount != null && loadAmount.compareTo(BigDecimal.valueOf(0.5)) <= 0;
|
|
|
+ log.info("[门卫放行]计算是否空载离场完成:{}", JSON.toJSONString(result));
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
/**
|