Pārlūkot izejas kodu

门卫新增货损率逻辑

donglang 3 nedēļas atpakaļ
vecāks
revīzija
e2977b3e4e

+ 13 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/enterpriseApp/AppGatekeeperController.java

@@ -6,6 +6,7 @@ import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.transport.model.param.forklift.reponse.GatekeeperOrderResp;
 import com.sckw.transport.model.param.forklift.request.GatekeeperOrderIsPassParam;
 import com.sckw.transport.model.param.forklift.request.GatekeeperOrderPassParam;
+import com.sckw.transport.model.param.forklift.request.GatekeeperOrderPassReasonParam;
 import com.sckw.transport.model.param.forklift.request.GatekeeperOrderQueryParam;
 import com.sckw.transport.model.vo.StatisticsWaybillResp;
 import com.sckw.transport.service.app.GatekeeperOrderService;
@@ -71,6 +72,18 @@ public class AppGatekeeperController {
         return BaseResult.success();
     }
 
+    /**
+     * 保存放行原因
+     *
+     * @param param
+     * @return
+     */
+    @Operation(summary = "保存放行原因", description = "保存放行原因")
+    @PostMapping("/savePassReason")
+    public BaseResult savePassReason(@RequestBody @Valid GatekeeperOrderPassReasonParam param){
+        gatekeeperOrderService.savePassReason(param);
+        return BaseResult.success();
+    }
 
     /**
      * 是否放行

+ 10 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtWaybillOrder.java

@@ -182,6 +182,16 @@ public class KwtWaybillOrder implements Serializable {
      */
     private Integer label;
 
+    /**
+     * 放行原因
+     */
+    private String passReason;
+
+    /**
+     * 放行图片地址
+     */
+    private String passUrl;
+
     //用于存储动态状态
     @TableField(exist = false)
     private Integer targetStatus;

+ 11 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderStatusResp.java

@@ -235,4 +235,15 @@ public class WaybillOrderStatusResp implements Serializable {
      * 标签
      */
     private Integer label;
+
+    /**
+     * 放行原因
+     */
+    private String passReason;
+
+    /**
+     * 放行图片地址
+     */
+    private String passUrl;
+
 }

+ 11 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/reponse/GatekeeperOrderResp.java

@@ -215,6 +215,17 @@ public class GatekeeperOrderResp implements Serializable {
     @Schema(description = "订单类型")
     private String orderTypeDesc;
 
+    /**
+     * 货损率(装货量-卸货量)*装货量*100%
+     */
+    @Schema(description = "货损率")
+    private BigDecimal lossRate;
+
+    /**
+     * 货损率是否超过千分之三
+     */
+    @Schema(description = "货损率是否超过千分之三")
+    private Boolean isPassReason;
 
 
 }

+ 47 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/request/GatekeeperOrderPassReasonParam.java

@@ -0,0 +1,47 @@
+ package com.sckw.transport.model.param.forklift.request;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :donglang
+ * @version :1.0
+ * @description :
+ * @create :2026-01-05 08:59:00
+ */
+@Data
+public class GatekeeperOrderPassReasonParam implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 8601314159466179906L;
+
+    /**
+     * 门卫订单id
+     */
+    @NotNull(message = "门卫订单id不能为空")
+    @Schema(description = "门卫订单id")
+    private Long id;
+
+    /**
+     * 放行原因
+     */
+    @NotBlank(message = "放行原因不能为空")
+    @Schema(description = "放行原因")
+    private String passReason;
+
+    /**
+     * 放行图片地址
+     */
+    @NotBlank(message = "放行图片地址不能为空")
+    @Schema(description = "放行图片地址")
+    private String passUrl;
+
+
+
+
+}

+ 57 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/GatekeeperOrderService.java

@@ -30,6 +30,7 @@ import com.sckw.transport.model.enuma.WeighbridgeTypeEnum;
 import com.sckw.transport.model.param.forklift.reponse.GatekeeperOrderResp;
 import com.sckw.transport.model.param.forklift.request.GatekeeperOrderIsPassParam;
 import com.sckw.transport.model.param.forklift.request.GatekeeperOrderPassParam;
+import com.sckw.transport.model.param.forklift.request.GatekeeperOrderPassReasonParam;
 import com.sckw.transport.model.param.forklift.request.GatekeeperOrderQueryParam;
 import com.sckw.transport.model.vo.StatisticsWaybillResp;
 import com.sckw.transport.repository.*;
@@ -41,6 +42,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ConcurrentHashMap;
@@ -423,6 +425,21 @@ public class GatekeeperOrderService {
             gatekeeper.setPrEntId(orderUnit.getEntId());
             gatekeeper.setPrEntName(orderUnit.getFirmName());
         }
+
+        // 原矿运输
+        if (isRawOre) {
+            //装货净重
+            BigDecimal loadAmount = ticket.getAmount();
+            //卸货净重
+            KwtWaybillOrderTicket unloadTicket = waybillOrderTicketMap.getOrDefault(gatekeeperWaybillOrder.getWOrderId() + "-" + 2, new KwtWaybillOrderTicket());
+            BigDecimal unloadAmount = unloadTicket.getAmount();
+
+            //计算货损率
+            BigDecimal lossRate = calculateLossRate(loadAmount, unloadAmount);
+            gatekeeper.setLossRate(lossRate);
+            gatekeeper.setIsPassReason(isLossRateExceeded(lossRate));
+        }
+
         gatekeeper.setOrderType(logOrder.getOrderType());
         gatekeeper.setOrderTypeDesc(Objects.equals(logOrder.getOrderType(), 1) ? "原矿运输" : "产品销售");
 
@@ -430,6 +447,26 @@ public class GatekeeperOrderService {
         return gatekeeper;
     }
 
+    /**
+     * 计算货损率
+     */
+    private static BigDecimal calculateLossRate(BigDecimal loadAmount, BigDecimal unloadAmount) {
+        if (loadAmount != null && unloadAmount != null && loadAmount.compareTo(BigDecimal.ZERO) > 0) {
+            return loadAmount.subtract(unloadAmount)
+                    .divide(loadAmount, 4, RoundingMode.HALF_UP)
+                    .setScale(2, RoundingMode.HALF_UP);
+        }
+        return BigDecimal.ZERO;
+    }
+
+    /**
+     * 校验货损率是否超过千分之三
+     */
+    private static boolean isLossRateExceeded(BigDecimal lossRate) {
+        BigDecimal threshold = new BigDecimal("0.003");
+        return lossRate.compareTo(threshold) > 0;
+    }
+
     /**
      * 处理异常车辆数据
      * @param param
@@ -1032,6 +1069,26 @@ public class GatekeeperOrderService {
         return subtask;
     }
 
+    /**
+     * 校验是否可放行
+     * @param gatekeeper
+     */
+    public void savePassReason(GatekeeperOrderPassReasonParam gatekeeper) {
+        log.info("[门卫放行原因]保存放行原因, param:{}", JSON.toJSONString(gatekeeper));
+        KwtGatekeeperWaybillOrder gatekeeperWaybillOrder = gatekeeperWaybillOrderRepository.getById(gatekeeper.getId());
+        if (gatekeeperWaybillOrder == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.GATEKEEPER_ORDER_NOT_FOUND, "[门卫放行原因]门卫订单不存在!");
+        }
+        KwtWaybillOrder waybillOrder = waybillOrderRepository.getById(gatekeeperWaybillOrder.getLOrderId());
+        if (waybillOrder == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_NOT_FOUND, "[门卫放行原因]运单不存在!");
+        }
+        waybillOrder.setPassReason(gatekeeper.getPassReason());
+        waybillOrder.setPassUrl(gatekeeper.getPassUrl());
+        waybillOrderRepository.updateById(waybillOrder);
+        log.info("[门卫放行原因]保存放行原因完成!");
+    }
+
     /**
      * 校验是否可放行
      * @param gatekeeper

+ 2 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/WaybillOrderService.java

@@ -1091,6 +1091,8 @@ public class WaybillOrderService {
         wbOrderResp.setRemark(wbOrder.getRemark());
         wbOrderResp.setLabel(wbOrder.getLabel());
         wbOrderResp.setUpdateTime(wbOrder.getUpdateTime());
+        wbOrderResp.setPassReason(wbOrder.getPassReason());
+        wbOrderResp.setPassUrl(wbOrder.getPassUrl());
         //装货、卸货净重、任务量
         KwtWaybillOrderSubtask subtask = subtaskMap.getOrDefault(wbOrder.getId(), new KwtWaybillOrderSubtask());
         wbOrderResp.setLoadingNetWeight(subtask.getLoadAmount());