Просмотр исходного кода

修复bugSAS-911
车辆运单循环单单据号生成处理

lengfaqiang 2 лет назад
Родитель
Сommit
cb2e7d85f1

+ 14 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/OrderGenerateSeqNoUtils.java

@@ -74,6 +74,20 @@ public class OrderGenerateSeqNoUtils {
         return appendKey.toString();
     }
 
+    /**
+     * 拼接redis key 公共key+[业务标识]+日期
+     *
+     * @param redisOrderGenerateEnum
+     * @param prefix
+     * @param date
+     * @return
+     */
+    public static String getKey(RedisOrderGenerateEnum redisOrderGenerateEnum, OrderRuleEnum prefix, Date date,String lOrderId) {
+        StringBuilder stringBuilder = new StringBuilder();
+        StringBuilder appendKey = stringBuilder.append(redisOrderGenerateEnum.getKey()).append(prefix.getCode()).append(DateUtils.formatDate(date)).append(lOrderId);
+        return appendKey.toString();
+    }
+
     /**
      * 拼接redis key 公共key+[业务标识]不携带日期
      *

+ 6 - 0
sckw-common/sckw-common-redis/src/main/java/com/sckw/redis/constant/RedisConstant.java

@@ -62,6 +62,12 @@ public class RedisConstant {
     public static final String LOGISTICS_NO_GENERATE_KEY = "order:logistics:no:generate:%s";
 
 
+    /**
+     * 生成物流订单号锁key
+     */
+    public static final String WAYBILL_NO_GENERATE_KEY = "order:waybill:no:generate:%s";
+
+
     /**
      * 消费请求有效时间(秒)
      */

+ 11 - 3
sckw-modules/sckw-report/src/main/java/com/sckw/report/service/KwTransportService.java

@@ -518,11 +518,19 @@ public class KwTransportService {
         //设置模糊查询匹配规则  忽略大小写
         // 创建条件对象
         Criteria criteria = new Criteria();
+        Long entId = LoginUserHolder.getEntId();
         //判断承运还是托运企业
-        if (unitType.equals(NumberConstant.ONE)) {
-            criteria.and("checkEntId").is(LoginUserHolder.getEntId());
+        if (unitType.equals(String.valueOf(NumberConstant.ONE))) {
+            //托运
+            criteria.orOperator(
+                    Criteria.where("checkTopEntId").is(entId),
+                    Criteria.where("checkEntId").is(entId));
         } else {
-            criteria.and("carrierEntId").is(LoginUserHolder.getEntId());
+            //承运企业主键ID
+//            criteria.and("carrierTopEntId").is(entMap.get(LoginUserHolder.getEntId()).getId());
+            criteria.orOperator(
+                    Criteria.where("carrierTopEntId").is(entId),
+                    Criteria.where("carrierEntId").is(entId));
         }
         List<String> stringList = StringUtils.splitStrToList(contractIds, String.class);
         criteria.and("delFlag").is(String.valueOf(NumberConstant.ZERO));

+ 2 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtWaybillOrderMapper.java

@@ -147,4 +147,6 @@ public interface KwtWaybillOrderMapper extends BaseMapper<KwtWaybillOrder> {
             @Param("startDate") String startDate,
             @Param("endDate") String endDate
     );
+
+    String getMaxOrderNo(@Param("lOrderNo") String lOrderNo);
 }

+ 4 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/WaybillDetailVO.java

@@ -56,6 +56,10 @@ public class WaybillDetailVO {
      * 扣亏损值
      */
     private BigDecimal goodsPrice;
+    /**
+     * 扣亏损值
+     */
+    private String goodsPriceLabel;
     /**
      * 派车人
      */

+ 9 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/AcceptCarriageOrderService.java

@@ -830,6 +830,10 @@ public class AcceptCarriageOrderService {
         vo.setLoss(kwtLogisticsOrder.getLoss());
         vo.setLossLabel(sysDictResDto == null ? null : sysDictResDto.getLabel());
         vo.setGoodsPrice(sckwWaybillOrder.getGoodsPrice());
+        if (kwtLogisticsOrder.getGoodsPriceUnit() != null) {
+            SysDictResDto dictResDto = remoteSystemService.queryDictByTypeAndValue(DictTypeEnum.PRICE_TYPE.getType(), kwtLogisticsOrder.getGoodsPriceUnit());
+            vo.setGoodsPriceLabel(dictResDto == null ? null : dictResDto.getLabel());
+        }
         vo.setAppointor(sckwWaybillOrder.getCreateByName());
         vo.setFleetName(sckwWaybillOrder.getCarrierFirmName());
         vo.setTruckNo(waybillOrder.getTruckNo());
@@ -1357,6 +1361,10 @@ public class AcceptCarriageOrderService {
                 throw new BusinessException("单据完结出现错误!");
             }
         }
+
+        //修改合同履约量
+        commonService.updatePerformed(logisticsOrder,orderFinishDTO.getLoadAmount(),orderFinishDTO.getUnloadAmount());
+
         //修改mongodb的数据
         updateMongoDbByLogisticsOrder(logisticsOrder.getId(), orderFinishDTO, ignoreAmount);
         if (!CollectionUtils.isEmpty(list) && list.size() > 0) {
@@ -1688,7 +1696,7 @@ public class AcceptCarriageOrderService {
             SysDictResDto sysDictResDto = remoteSystemService.queryDictByTypeAndValue(DictTypeEnum.TAX_RATE_TYPE.getType(), logisticsOrder.getLossUnit());
             orderDetailVO.setLossLabel(sysDictResDto == null ? null : sysDictResDto.getLabel());
         }
-        if (logisticsOrder.getUnit()!=null){
+        if (logisticsOrder.getUnit() != null) {
             SysDictResDto sysDictResDto = remoteSystemService.queryDictByTypeAndValue(DictTypeEnum.UNIT_TYPE.getType(), logisticsOrder.getUnit());
             orderDetailVO.setNumberLabel(sysDictResDto == null ? null : sysDictResDto.getLabel());
         }

+ 37 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/CommonService.java

@@ -2,7 +2,10 @@ package com.sckw.transport.service;
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.sckw.contract.api.RemoteContractService;
 import com.sckw.core.common.enums.NumberConstant;
+import com.sckw.core.common.enums.enums.DictEnum;
 import com.sckw.core.exception.BusinessException;
 import com.sckw.core.model.enums.LogisticsOrderEnum;
 import com.sckw.core.model.enums.OrderRuleEnum;
@@ -16,12 +19,16 @@ import com.sckw.redis.constant.RedisConstant;
 import com.sckw.redis.utils.RedissonUtils;
 import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.model.dto.res.SysDictResDto;
+import com.sckw.transport.dao.KwtLogisticsOrderContractMapper;
 import com.sckw.transport.dao.KwtLogisticsOrderMapper;
+import com.sckw.transport.model.KwtLogisticsOrder;
+import com.sckw.transport.model.KwtLogisticsOrderContract;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -37,9 +44,15 @@ public class CommonService {
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
     RemoteSystemService remoteSystemService;
 
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
+    RemoteContractService remoteContractService;
+
     @Autowired
     private KwtLogisticsOrderMapper logisticsOrderMapper;
 
+    @Autowired
+    private KwtLogisticsOrderContractMapper logisticsOrderContractMapper;
+
     /**
      * 组装返回数据
      *
@@ -107,6 +120,7 @@ public class CommonService {
         }
         return arrayList;
     }
+
     public List<String> getDiffrentList(List<String> sourceList, List<String> targetList) {
         return targetList.stream().filter(item -> sourceList.stream().allMatch(each -> !item.equals(each))).collect(Collectors.toList());
     }
@@ -146,4 +160,27 @@ public class CommonService {
             RedissonUtils.unlock(lockKey);
         }
     }
+
+    /**
+     * 修改合同履约量
+     *
+     * @param loadAmount
+     * @param unloadAmount
+     */
+    public void updatePerformed(KwtLogisticsOrder logisticsOrder, BigDecimal loadAmount, BigDecimal unloadAmount) {
+        /**
+         * 更新合同履约量
+         * 根据单据计费方式处理【目前只考虑 按照装货量 按照卸货量 】*/
+        String billingMode = logisticsOrder.getBillingMode();
+        BigDecimal actualAmount = new BigDecimal("0.00");
+        if (DictEnum.CHARGING_TYPE_1.equals(billingMode)) {
+            actualAmount = loadAmount;
+        } else if (DictEnum.CHARGING_TYPE_2.equals(billingMode)) {
+            actualAmount = unloadAmount;
+        } else {
+            throw new BusinessException("单据计费方式错误!");
+        }
+        KwtLogisticsOrderContract contract = logisticsOrderContractMapper.selectOne(new LambdaQueryWrapper<KwtLogisticsOrderContract>().eq(KwtLogisticsOrderContract::getLOrderId, logisticsOrder.getId()));
+        remoteContractService.updatePerformed(contract.getContractId(), actualAmount);
+    }
 }

+ 8 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/ConsignOrderService.java

@@ -595,7 +595,7 @@ public class ConsignOrderService {
                             .eq(StringUtils.isNotBlank(kwtWaybillOrder.getId()), KwtWaybillOrderTicket::getWOrderId, kwtWaybillOrder.getId())
                             .eq(KwtWaybillOrderTicket::getType, NumberConstant.TWO));
                     //合理损耗
-                    BigDecimal loss = order.getLoss();
+                    BigDecimal loss = order.getLoss() == null ? new BigDecimal("0.00") : order.getLoss();
                     /**亏吨量/吨->装货量-卸货量
                      * 合理损耗值=装货量*合理损耗
                      扣亏量/吨->亏吨量-合理损耗值
@@ -646,6 +646,9 @@ public class ConsignOrderService {
 //                        String.valueOf(kwtWaybillOrder.getCreateBy()) : remoteSystemService.queryUserCacheById(kwtWaybillOrder.getCreateBy()).getName());
                     carWaybillVo.setLOrderNo(order.getLOrderNo());
                     carWaybillVo.setLOrderId(String.valueOf(order.getId()));
+                    carWaybillVo.setLoss(loss);
+                    SysDictResDto sysDictResDto = remoteSystemService.queryDictByTypeAndValue(DictTypeEnum.TAX_RATE_TYPE.getType(), order.getLossUnit());
+                    carWaybillVo.setLossLabel(sysDictResDto == null ? null : sysDictResDto.getLabel());
                     returnList.add(carWaybillVo);
                 }
             }
@@ -818,6 +821,10 @@ public class ConsignOrderService {
                 throw new BusinessException("单据完结出现错误!");
             }
         }
+
+        //修改合同履约量
+        commonService.updatePerformed(logisticsOrder, orderFinishDTO.getLoadAmount(), orderFinishDTO.getUnloadAmount());
+
         //修改mongodb的数据
         updateMongoDbByLogisticsOrder(logisticsOrder.getId(), orderFinishDTO, ignoreAmount);
         if (!CollectionUtils.isEmpty(list) && list.size() > 0) {

+ 38 - 7
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderService.java

@@ -22,6 +22,8 @@ import com.sckw.mongo.model.SckwLogisticsOrder;
 import com.sckw.mongo.model.SckwWaybillOrder;
 import com.sckw.order.api.dubbo.TradeOrderInfoService;
 import com.sckw.order.api.model.CompleteLogisticsOrderParam;
+import com.sckw.redis.constant.RedisConstant;
+import com.sckw.redis.utils.RedissonUtils;
 import com.sckw.stream.model.SckwBusSum;
 import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.model.dto.res.EntCacheResDto;
@@ -33,6 +35,7 @@ import com.sckw.transport.model.vo.WaybillCountVo;
 import com.sckw.transport.model.vo.WaybillOrderDriverVo;
 import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.stream.function.StreamBridge;
@@ -40,6 +43,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
+
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
@@ -50,6 +54,7 @@ import java.util.stream.Collectors;
  * @desc TODO
  * @date 2023/7/19 0019
  */
+@Slf4j
 @Service
 @SuppressWarnings("all")
 public class KwtWaybillOrderService {
@@ -471,7 +476,7 @@ public class KwtWaybillOrderService {
         List<SckwWaybillOrder> sckwWaybillOrders = new ArrayList();
         for (SendCarDto1 sendCarDto : params) {
             /**KwtWaybillOrder数据组装**/
-            String wOrderNo = OrderGenerateSeqNoUtils.getWaybillSeqNo(RedisOrderGenerateEnum.WAYBILL_ORDER, OrderRuleEnum.WAYBILL_ORDER, logisticsOrder.getLOrderNo());
+            String wOrderNo = getRedisGenerateWaybillOrderNo(RedisOrderGenerateEnum.WAYBILL_ORDER, OrderRuleEnum.WAYBILL_ORDER, logisticsOrder.getLOrderNo());
             KwtWaybillOrder waybillOrder = this.setKwtWaybillOrder(sendCarDto, wOrderNo);
             /**数据存储**/
             if (sendCarDto.getType() == Global.NUMERICAL_ONE) {
@@ -514,6 +519,31 @@ public class KwtWaybillOrderService {
         return HttpResult.ok(sckwWaybillOrders);
     }
 
+
+    /**
+     * 获取生成车辆运单单据号最大值处理
+     */
+    public String getRedisGenerateWaybillOrderNo(RedisOrderGenerateEnum redisOrderGenerateEnum, OrderRuleEnum orderRuleEnum, String lOrderNo) {
+        Date date = new Date();
+        String lockKey = String.format(RedisConstant.WAYBILL_NO_GENERATE_KEY, DateUtils.formatDateToYYMMDD(date)) + lOrderNo;
+        String key = OrderGenerateSeqNoUtils.getKeyNotDate(RedisOrderGenerateEnum.WAYBILL_ORDER, OrderRuleEnum.WAYBILL_ORDER, lOrderNo);
+        try {
+        if (Boolean.FALSE.equals(RedissonUtils.exists(key))) {
+            if (Boolean.FALSE.equals(RedissonUtils.tryLock(lockKey, 5L, 10L))) {
+                throw new BusinessException("业务繁忙,请稍后再试!");
+            }
+            String maxOrderNo = waybillOrderDao.getMaxOrderNo(lOrderNo);
+            if (StringUtils.isNotBlank(maxOrderNo)) {
+                Long maxNum = Long.valueOf(StringUtils.subStrFromIndexToEnd(maxOrderNo, 3));
+                RedissonUtils.setAtomicLong(key, maxNum, DateUtils.getSecondsDay());
+            }
+        }
+        return OrderGenerateSeqNoUtils.getWaybillSeqNo(RedisOrderGenerateEnum.WAYBILL_ORDER, OrderRuleEnum.WAYBILL_ORDER, lOrderNo);
+        } finally {
+            RedissonUtils.unlock(lockKey);
+        }
+    }
+
     /**
      * @param waybillOrder  车辆订单信息
      * @param loadAddress   装货地址信息
@@ -644,12 +674,12 @@ public class KwtWaybillOrderService {
      * @author zk
      * @date 2023/7/20
      **/
-    public KwtWaybillOrder setKwtWaybillOrder(KwtLogisticsOrderCirculate circulate, OperateSendCarDto params) {
+    public KwtWaybillOrder setKwtWaybillOrder(KwtLogisticsOrderCirculate circulate, OperateSendCarDto params, String wOrderNo) {
         KwtWaybillOrder waybillOrder = new KwtWaybillOrder();
         waybillOrder.setId(circulate.getId());
         waybillOrder.setEntId(LoginUserHolder.getEntId());
         waybillOrder.setLOrderId(circulate.getLOrderId());
-        waybillOrder.setWOrderNo("xxxxxx");
+        waybillOrder.setWOrderNo(wOrderNo);
         waybillOrder.setType(params.getType());
         waybillOrder.setStartTime(circulate.getStartTime());
         waybillOrder.setEndTime(circulate.getEndTime());
@@ -1132,7 +1162,8 @@ public class KwtWaybillOrderService {
             //卸货地址
             KwtWaybillOrderAddress unloadAddress = this.getAddress(circulate.getLOrderId(), Global.NUMERICAL_TWO, Global.NUMERICAL_ONE);
             //KwtWaybillOrder数据组装
-            KwtWaybillOrder waybillOrder = setKwtWaybillOrder(circulate, params);
+            String wOrderNo = getRedisGenerateWaybillOrderNo(RedisOrderGenerateEnum.WAYBILL_ORDER, OrderRuleEnum.WAYBILL_ORDER, logisticsOrder.getLOrderNo());
+            KwtWaybillOrder waybillOrder = setKwtWaybillOrder(circulate, params, wOrderNo);
 
             /**2车辆运单存储**/
             ranksSave(waybillOrder, loadAddress, unloadAddress);
@@ -2307,7 +2338,7 @@ public class KwtWaybillOrderService {
      */
     public HttpResult getLogisticsAmountByOrderId(String orderId) {
         KwtLogisticsOrder kwtLogisticsOrder = logisticsOrderDao.selectOne(new LambdaQueryWrapper<KwtLogisticsOrder>().eq(KwtLogisticsOrder::getId, Long.parseLong(orderId)));
-        if (kwtLogisticsOrder==null){
+        if (kwtLogisticsOrder == null) {
             return HttpResult.error("单据不存在!");
         }
         BigDecimal amount = kwtLogisticsOrder.getAmount();
@@ -2325,11 +2356,11 @@ public class KwtWaybillOrderService {
         statusList.add(CarWaybillEnum.APPROVAL_NO_PASS.getCode().longValue());
         //趟次
         Map<String, Object> tripMap = waybillOrderDao.selectOrderByOrderId(Long.parseLong(orderId), 1, statusList);
-        tripMap.put("waitDistributionAmount",waitDistributionAmount);
+        tripMap.put("waitDistributionAmount", waitDistributionAmount);
         map.put("trip", tripMap);
         //循环
         Map<String, Object> loopMap = waybillOrderDao.selectOrderByOrderId(Long.parseLong(orderId), 2, statusList);
-        loopMap.put("waitDistributionAmount",waitDistributionAmount);
+        loopMap.put("waitDistributionAmount", waitDistributionAmount);
         map.put("loop", loopMap);
         return HttpResult.ok(map);
     }

+ 7 - 7
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/LogisticsConsignmentService.java

@@ -6,7 +6,6 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.sckw.contract.api.RemoteContractService;
 import com.sckw.core.common.enums.NumberConstant;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.exception.BusinessException;
@@ -88,9 +87,6 @@ public class LogisticsConsignmentService {
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
     RemoteFleetService remoteFleetService;
 
-    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
-    RemoteContractService remoteContractService;
-
     @Autowired
     public KwtLogisticsOrderGoodsMapper kwtLogisticsOrderGoodsMapper;
 
@@ -1214,7 +1210,11 @@ public class LogisticsConsignmentService {
                 updateMongoDbByLogisticsOrder(kwtLogisticsOrder, orderFinishDTO);
             });
         }
-        //数据推送至贸易订单
+
+        //修改合同履约量
+        commonService.updatePerformed(logisticsOrder, orderFinishDTO.getLoadAmount(), orderFinishDTO.getUnloadAmount());
+
+        /**数据推送至贸易订单*/
         CompleteLogisticsOrderParam tradeOrder = new CompleteLogisticsOrderParam();
         //获取实际装货量-实际卸货量
         Map<String, BigDecimal> map = kwtLogisticsOrderMapper.countAmountByTradeOrderId(logisticsOrder.getTOrderId());
@@ -1894,8 +1894,8 @@ public class LogisticsConsignmentService {
     }
 
     public HttpResult addWaybillNumberDemo() {
-        String seqNo = OrderGenerateSeqNoUtils.getWaybillSeqNo(RedisOrderGenerateEnum.WAYBILL_ORDER, OrderRuleEnum.WAYBILL_ORDER, "T2308290001101");
-        System.out.println(seqNo);
+//        String seqNo = OrderGenerateSeqNoUtils.getWaybillSeqNo(RedisOrderGenerateEnum.WAYBILL_ORDER, OrderRuleEnum.WAYBILL_ORDER,"T2308290001101");
+//        System.out.println(seqNo);
         return HttpResult.ok();
     }
 

+ 3 - 0
sckw-modules/sckw-transport/src/main/resources/mapper/KwtWaybillOrderMapper.xml

@@ -488,4 +488,7 @@
             </foreach>
         </if>
     </select>
+    <select id="getMaxOrderNo" resultType="java.lang.String">
+        SELECT w_order_no FROM `kwt_waybill_order`  WHERE w_order_no LIKE concat(#{lOrderNo},'%') ORDER BY w_order_no DESC LIMIT 1
+    </select>
 </mapper>