|
|
@@ -3,16 +3,23 @@ package com.sckw.transport.handler;
|
|
|
|
|
|
import com.sckw.core.common.enums.enums.ErrorCodeEnum;
|
|
|
import com.sckw.core.exception.BusinessPlatfromException;
|
|
|
+import com.sckw.core.model.enums.AddressTypeEnum;
|
|
|
import com.sckw.core.model.enums.CarWaybillV1Enum;
|
|
|
+import com.sckw.order.api.model.OrderDetailVo;
|
|
|
+import com.sckw.transport.model.KwtLogisticsOrder;
|
|
|
import com.sckw.transport.model.KwtWaybillOrder;
|
|
|
import com.sckw.transport.model.KwtWaybillOrderSubtask;
|
|
|
+import com.sckw.transport.model.KwtWaybillOrderTicket;
|
|
|
import com.sckw.transport.model.param.WaybillOrderUnloadParam;
|
|
|
import com.sckw.transport.repository.KwtWaybillOrderSubtaskRepository;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
-import java.util.Date;
|
|
|
-import java.util.Objects;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.*;
|
|
|
+import java.util.function.Function;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* Author: donglang
|
|
|
@@ -20,7 +27,7 @@ import java.util.Objects;
|
|
|
* Des: 卸货
|
|
|
* Version: 1.0
|
|
|
*/
|
|
|
-
|
|
|
+@Slf4j
|
|
|
@Service
|
|
|
public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUnloadParam>{
|
|
|
|
|
|
@@ -28,6 +35,10 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
|
|
|
private KwtWaybillOrderSubtaskRepository waybillOrderSubtaskRepository;
|
|
|
|
|
|
|
|
|
+ //用于存储动态状态
|
|
|
+ private Integer targetStatus;
|
|
|
+
|
|
|
+
|
|
|
@Override
|
|
|
protected KwtWaybillOrder getWaybillOrder(WaybillOrderUnloadParam param) {
|
|
|
return getWaybillOrder(param.getWaybillOrderId());
|
|
|
@@ -40,21 +51,104 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
|
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_NOT_FOUND, "运单不存在");
|
|
|
}
|
|
|
if (!Objects.equals(CarWaybillV1Enum.WAIT_LOADING.getCode(), waybill.getStatus())
|
|
|
- || !Objects.equals(CarWaybillV1Enum.COMPLETION_UNLOADING.getCode(), waybill.getStatus())) {
|
|
|
+ && !Objects.equals(CarWaybillV1Enum.COMPLETION_UNLOADING.getCode(), waybill.getStatus())) {
|
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "当前物流运单不是“已离场”或“审核驳回”状态,无法推进下一节点!");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
protected void doBusiness(WaybillOrderUnloadParam param, KwtWaybillOrder waybill) {
|
|
|
- //更新子运单卸货净重 TODO 审核通过后,贸易订单和物流订单的运输量需要已实际卸货净重为准
|
|
|
+ KwtLogisticsOrder logisticsOrder = logisticsOrderRepository.queryByLogisticsOrderId(waybill.getLOrderId());
|
|
|
+ if (logisticsOrder == null) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_FOUND, "物流订单数据不存在!");
|
|
|
+ }
|
|
|
+ OrderDetailVo orderDetailVo = tradeOrderInfoService.queryByTradeOrderId(logisticsOrder.getTOrderId());
|
|
|
+ if (orderDetailVo == null) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.TRADE_ORDER_NOT_FOUND, "交易订单数据不存在!");
|
|
|
+ }
|
|
|
+
|
|
|
+ //按照装货量计算:推送到已完成状态
|
|
|
+ if (orderDetailVo.getChargeType() == 1) {
|
|
|
+ this.targetStatus = CarWaybillV1Enum.WAIT_UNLOADING.getCode();
|
|
|
+ //1.计算净装货量
|
|
|
+ BigDecimal loadAmount = getLoadAmount(param);
|
|
|
+
|
|
|
+ //2. 填充运单装货量
|
|
|
+ KwtWaybillOrderSubtask subtask = updateWaybillOrderSubtask(waybill, loadAmount);
|
|
|
+
|
|
|
+ //3. 更新物流订单
|
|
|
+ updateTradeOrder(logisticsOrder, loadAmount, subtask);
|
|
|
+
|
|
|
+ } else if (orderDetailVo.getChargeType() == 2) {
|
|
|
+ this.targetStatus = CarWaybillV1Enum.COMPLETION_LOADING.getCode();
|
|
|
+ //按照卸货量计算:推送到已卸货状态,更新子运单卸货净重
|
|
|
+ KwtWaybillOrderSubtask subtask = getWaybillSubtask(waybill.getId());
|
|
|
+ subtask.setUnloadAmount(param.getUnloadAmount());
|
|
|
+ subtask.setUnloadTime(new Date());
|
|
|
+ subtask.setUnloadUrl(param.getUnloadUrl());
|
|
|
+ subtask.setUnloadUploadTime(new Date());
|
|
|
+ subtask.setUnloadOperator(waybill.getDriverId());
|
|
|
+ waybillOrderSubtaskRepository.updateById(subtask);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算净装货量
|
|
|
+ * @param param
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private BigDecimal getLoadAmount(WaybillOrderUnloadParam param) {
|
|
|
+ List<KwtWaybillOrderTicket> ticketList = waybillOrderTicketRepository.queryByWOrderId(param.getWaybillOrderId());
|
|
|
+ // 毛重
|
|
|
+ BigDecimal grossAmount = ticketList.stream().filter(Objects::nonNull)
|
|
|
+ .filter(ticket -> Objects.equals(ticket.getType(), AddressTypeEnum.TAKE.getCode()))
|
|
|
+ .findFirst()
|
|
|
+ .map(KwtWaybillOrderTicket::getGrossAmount)
|
|
|
+ .orElse(BigDecimal.ZERO);
|
|
|
+ // 皮重
|
|
|
+ BigDecimal tareAmount = ticketList.stream().filter(Objects::nonNull)
|
|
|
+ .filter(ticket -> Objects.equals(ticket.getType(), AddressTypeEnum.SHIPMENT.getCode()))
|
|
|
+ .findFirst()
|
|
|
+ .map(KwtWaybillOrderTicket::getTareAmount)
|
|
|
+ .orElse(BigDecimal.ZERO);
|
|
|
+ if (grossAmount.compareTo(BigDecimal.ZERO) <= 0 || tareAmount.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_TICKET_NOT_FOUND, "运单车辆的皮重/毛重为空!");
|
|
|
+ }
|
|
|
+ //装货净重
|
|
|
+ return grossAmount.subtract(tareAmount);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 填充运单装货量
|
|
|
+ */
|
|
|
+ private KwtWaybillOrderSubtask updateWaybillOrderSubtask(KwtWaybillOrder waybill, BigDecimal loadAmount) {
|
|
|
KwtWaybillOrderSubtask subtask = getWaybillSubtask(waybill.getId());
|
|
|
- subtask.setUnloadAmount(param.getUnloadAmount());
|
|
|
- subtask.setUnloadTime(new Date());
|
|
|
- subtask.setUnloadUrl(param.getUnloadUrl());
|
|
|
- subtask.setUnloadUploadTime(new Date());
|
|
|
- subtask.setUnloadOperator(waybill.getDriverId());
|
|
|
+ subtask.setLoadAmount(loadAmount);
|
|
|
+ subtask.setLoadTime(new Date());
|
|
|
waybillOrderSubtaskRepository.updateById(subtask);
|
|
|
+ return subtask;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新物流订单装货量和已委托量
|
|
|
+ */
|
|
|
+ private void updateTradeOrder(KwtLogisticsOrder logisticsOrder, BigDecimal loadAmount, KwtWaybillOrderSubtask subtask) {
|
|
|
+ //物流订单装货量累加
|
|
|
+ BigDecimal currentTotalLoad = Optional.ofNullable(logisticsOrder.getTotalLoadAmount())
|
|
|
+ .filter(amount -> amount.compareTo(BigDecimal.ZERO) > 0)
|
|
|
+ .orElse(BigDecimal.ZERO);
|
|
|
+ BigDecimal totalLoadAmount = currentTotalLoad.add(Optional.ofNullable(loadAmount).orElse(BigDecimal.ZERO));
|
|
|
+ logisticsOrder.setTotalLoadAmount(totalLoadAmount);
|
|
|
+
|
|
|
+ // 物流订单已委托量扣减
|
|
|
+ BigDecimal currentEntrust = Optional.ofNullable(logisticsOrder.getEntrustAmount())
|
|
|
+ .filter(amount -> amount.compareTo(BigDecimal.ZERO) > 0)
|
|
|
+ .orElse(BigDecimal.ZERO);
|
|
|
+ BigDecimal subtractAmount = Optional.ofNullable(subtask.getEntrustAmount()).orElse(BigDecimal.ZERO);
|
|
|
+ BigDecimal totalEntrustAmount = currentEntrust.subtract(subtractAmount);
|
|
|
+ // 确保已委托量不为负数
|
|
|
+ logisticsOrder.setEntrustAmount(totalEntrustAmount.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : totalEntrustAmount);
|
|
|
+ logisticsOrderRepository.updateById(logisticsOrder);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@@ -64,7 +158,8 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
|
|
|
|
|
|
@Override
|
|
|
protected Integer getStatus() {
|
|
|
- return CarWaybillV1Enum.COMPLETION_LOADING.getCode();
|
|
|
+ return Optional.ofNullable(this.targetStatus)
|
|
|
+ .orElse(CarWaybillV1Enum.COMPLETION_LOADING.getCode());
|
|
|
}
|
|
|
|
|
|
@Override
|