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

修复bugSAS-866
车辆运单-单据编号生成处理

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

+ 13 - 2
sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/StringConstant.java

@@ -3,7 +3,7 @@ package com.sckw.core.common.enums;
 import java.time.format.DateTimeFormatter;
 
 /**
- * @description:    定义字符串常量
+ * @description: 定义字符串常量
  * @author: LengFaQiang
  * @copyright
  * @create: 2022-01-27 16:02
@@ -15,7 +15,18 @@ public final class StringConstant {
     public static final String COLON = ":";
     public static final String SEMICOLON = ";";
     public static final String POINT = ".";
-    public static final String COMMA=",";
+
+    public static final String COMMA = ",";
+
+    /**
+     * 中横线
+     */
+    public static final String HYPHEN = "-";
+
+    /**
+     * 下划线
+     */
+    public static final String UNDERLINE = "_";
     public static final String HTTP_STRING = "http";
     public static final String HTTPS_STRING = "https";
     public static final String B = "B";

+ 50 - 1
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/OrderGenerateSeqNoUtils.java

@@ -1,10 +1,12 @@
 package com.sckw.core.utils;
 
+import com.sckw.core.common.enums.StringConstant;
 import com.sckw.core.model.enums.OrderRuleEnum;
 import com.sckw.core.model.enums.RedisOrderGenerateEnum;
 import com.sckw.redis.utils.RedissonUtils;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.support.atomic.RedisAtomicLong;
 import org.springframework.stereotype.Component;
@@ -26,6 +28,8 @@ public class OrderGenerateSeqNoUtils {
     private RedisTemplate redisTemplate;
 
     /**
+     * 物流订单编号生成
+     *
      * @param redisOrderGenerateEnum 传入指定枚举的key
      * @param prefix                 业务类别
      * @param orderType              单据创建类型
@@ -70,6 +74,25 @@ public class OrderGenerateSeqNoUtils {
         return appendKey.toString();
     }
 
+    /**
+     * 拼接redis key 公共key+[业务标识]不携带日期
+     *
+     * @param redisOrderGenerateEnum
+     * @param prefix
+     * @param str
+     * @return
+     */
+    public static String getKeyNotDate(RedisOrderGenerateEnum redisOrderGenerateEnum, OrderRuleEnum prefix, String str) {
+        StringBuilder stringBuilder = new StringBuilder();
+        StringBuilder appendKey = new StringBuilder();
+        if (StringUtils.isNotEmpty(str)) {
+            appendKey = stringBuilder.append(redisOrderGenerateEnum.getKey()).append(prefix.getCode()).append(str);
+        } else {
+            appendKey = stringBuilder.append(redisOrderGenerateEnum.getKey()).append(prefix.getCode());
+        }
+        return appendKey.toString();
+    }
+
     /**
      * //返回当前redis中的key的最大值
      *
@@ -96,7 +119,7 @@ public class OrderGenerateSeqNoUtils {
      * @return
      */
     public static long generate(String key, Long expireTime) {
-                //RedisAtomicLong counter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
+        //RedisAtomicLong counter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
 //        //设置过期时间
 //        counter.expireAt(expireTime);
 //        //返回redis中key的值,内部实现下面详细说明
@@ -107,6 +130,7 @@ public class OrderGenerateSeqNoUtils {
 
     /**
      * redis 根据key需要减一
+     *
      * @param redisOrderGenerateEnum
      * @param prefix
      * @return
@@ -140,6 +164,8 @@ public class OrderGenerateSeqNoUtils {
 
 
     /**
+     * 贸易订单/对账/结算生成规则
+     *
      * @param redisOrderGenerateEnum 传入枚举指定的key
      * @param prefix                 业务类别
      * @return
@@ -160,4 +186,27 @@ public class OrderGenerateSeqNoUtils {
         log.info("KEY:{}, 序列号生成:{}, 过期时间:{}秒", appendKey, seqNo, secondsDay);
         return seqNo;
     }
+
+
+    /**
+     * 车辆运单编号规则生成
+     *
+     * @param redisOrderGenerateEnum 传入枚举指定的key
+     * @param prefix                 业务类别
+     * @return
+     */
+    public static String getWaybillSeqNo(RedisOrderGenerateEnum redisOrderGenerateEnum, OrderRuleEnum prefix, String pidOrderNo) {
+        if (Objects.isNull(prefix)) {
+            throw new RuntimeException("Order Generate SeqNo Error");
+        }
+        String appendKey = getKeyNotDate(redisOrderGenerateEnum, prefix, pidOrderNo);
+        //设置过期时间,这里设置为当天的23:59:59
+        Long secondsDay = DateUtils.getSecondsDay();
+        Long seq = generate(appendKey, secondsDay);
+        String sequence = com.sckw.core.utils.StringUtils.addZeroForNum(seq.toString(), 3);
+        /**拼接业务编号*/
+        String seqNo = pidOrderNo + StringConstant.HYPHEN + sequence;
+        log.info("KEY:{}, 序列号生成:{}, 过期时间:{}秒", appendKey, seqNo, secondsDay);
+        return seqNo;
+    }
 }

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

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

+ 3 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtLogisticsOrderMapper.java

@@ -17,6 +17,7 @@ import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -223,6 +224,8 @@ public interface KwtLogisticsOrderMapper extends BaseMapper<KwtLogisticsOrder> {
      */
     Integer selectCountByLorderId(@Param("orderId") String orderId, @Param("orderStatusList") List<Integer> orderStatusList);
 
+    String getMaxOrderNoByDate(@Param("date") Date date);
+
 //    List<TableTops> countAppLogisticsOrderListByStatus(@Param("type") String type,@Param("entId") Long entId
 //    );
 }

+ 180 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/AcceptCarriageOrderExcelVo.java

@@ -0,0 +1,180 @@
+package com.sckw.transport.model.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.sckw.excel.annotation.ExcelContext;
+import lombok.Data;
+
+/**
+ * @author lfdc
+ * @description 承运订单导出vo
+ * @date 2023-07-24 13:07:44
+ */
+@Data
+@ExcelContext(fileName = "承运订单列表", sheetName = "承运订单列表")
+public class AcceptCarriageOrderExcelVo {
+    /**
+     * 结算周期
+     */
+    @ExcelProperty(value = "结算周期")
+    private String accountsCycle;
+    /**
+     * 发起人
+     */
+    @ExcelProperty(value = "发起人")
+    private String appointor;
+    /**
+     * 计费方式
+     */
+    @ExcelProperty(value = "计费方式")
+    private String billingMode;
+    /**
+     * 承运单位
+     */
+    @ExcelProperty(value = "承运单位")
+    private String carrierCompany;
+    /**
+     * 承运联系人
+     */
+    @ExcelProperty(value = "承运联系人")
+    private String carrierContacts;
+    /**
+     * 承运订单
+     */
+    @ExcelProperty(value = "承运订单")
+    private String carrierOrder;
+    /**
+     * 承运联系电话
+     */
+    @ExcelProperty(value = "承运联系电话")
+    private String carrierPhone;
+    /**
+     * 分配承运量
+     */
+    @ExcelProperty(value = "分配承运量")
+    private String carryingCapacity;
+    /**
+     * 托运单位
+     */
+    @ExcelProperty(value = "托运单位")
+    private String consignCompany;
+    /**
+     * 托运联系人
+     */
+    @ExcelProperty(value = "托运联系人")
+    private String consignContacts;
+    /**
+     * 托运联系电话
+     */
+    @ExcelProperty(value = "托运联系电话")
+    private String consignPhone;
+    /**
+     * 合同
+     */
+    @ExcelProperty(value = "合同")
+    private String contract;
+    /**
+     * 扣亏货值/元/吨
+     */
+    @ExcelProperty(value = "扣亏货值/元/吨")
+    private String deficitAmount;
+    /**
+     * 货物名称
+     */
+    @ExcelProperty(value = "货物名称")
+    private String goodsName;
+    /**
+     * 装货地点
+     */
+    @ExcelProperty(value = "装货地点")
+    private String loadAddress;
+    /**
+     * 数据库id
+     */
+    private String lOrderId;
+    /**
+     * 托运订单号
+     */
+    @ExcelProperty(value = "托运订单号")
+    private String lOrderNo;
+    /**
+     * 合理损耗
+     */
+    @ExcelProperty(value = "合理损耗")
+    private String loss;
+    /**
+     * 计划时间
+     */
+    @ExcelProperty(value = "计划时间")
+    private String plannedDateTime;
+    /**
+     * 运价
+     */
+    @ExcelProperty(value = "运价")
+    private String price;
+    /**
+     * 收货联系人
+     */
+    @ExcelProperty(value = "收货联系人")
+    private String receiveGoodsContacts;
+    /**
+     * 计划收货时间
+     */
+    @ExcelProperty(value = "计划收货时间")
+    private String receiveGoodsDateTime;
+    /**
+     * 收货电话
+     */
+    @ExcelProperty(value = "收货电话")
+    private String receiveGoodsPhone;
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+    /**
+     * 发货联系人
+     */
+    @ExcelProperty(value = "发货联系人")
+    private String shipmentsContacts;
+    /**
+     * 计划发货时间
+     */
+    @ExcelProperty(value = "计划发货时间")
+    private String shipmentsDateTime;
+    /**
+     * 发货电话
+     */
+    @ExcelProperty(value = "发货电话")
+    private String shipmentsPhone;
+    /**
+     * 签约方式
+     */
+    @ExcelProperty(value = "签约方式")
+    private String signing;
+    /**
+     * 状态
+     */
+    @ExcelProperty(value = "状态")
+    private String status;
+    /**
+     * 卸货地点
+     */
+    @ExcelProperty(value = "卸货地点")
+    private String unloadAddress;
+    /**
+     * 关联承运订单号
+     */
+    @ExcelProperty(value = "关联承运订单号")
+    private String wOrderNo;
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private String createTime;
+    /**
+     * 修改时间
+     */
+    @ExcelProperty(value = "修改时间")
+    private String updateTime;
+
+}

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

@@ -1668,6 +1668,7 @@ public class AcceptCarriageOrderService {
      */
     @Transactional(rollbackFor = Exception.class)
     public HttpResult addOrder(AddOrderDTO orderDTO) {
+        commonService.getRedisGenerateOrderNo();
         /**生成订单编号*/
         String lOrderNo = OrderGenerateSeqNoUtils.getSeqNo(RedisOrderGenerateEnum.LOGISTICS_ORDER, OrderRuleEnum.LOGISTICS_ORDER, "2", "0", "0");
         HttpResult httpResult = ValidUtil.serviceValid(orderDTO);
@@ -2075,6 +2076,12 @@ public class AcceptCarriageOrderService {
         logisticsOrderMapper.insert(order);
     }
 
+    /**
+     * 承运订单首页条件查询
+     * @param query
+     * @param type
+     * @return
+     */
     public PageRes selectLogisticsOrderList(AcceptCarriageOrderQuery query, String type) {
         Long entId = LoginUserHolder.getEntId();
         PageHelper.startPage(query.getPage(), query.getPageSize());

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

@@ -1,14 +1,25 @@
 package com.sckw.transport.service;
 
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.ObjectUtil;
 import com.sckw.core.common.enums.NumberConstant;
+import com.sckw.core.exception.BusinessException;
 import com.sckw.core.model.enums.LogisticsOrderEnum;
+import com.sckw.core.model.enums.OrderRuleEnum;
+import com.sckw.core.model.enums.RedisOrderGenerateEnum;
 import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.utils.DateUtils;
+import com.sckw.core.utils.OrderGenerateSeqNoUtils;
+import com.sckw.core.utils.StringUtils;
 import com.sckw.mongo.model.TableTops;
+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.KwtLogisticsOrderMapper;
 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.util.*;
@@ -26,6 +37,9 @@ public class CommonService {
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
     RemoteSystemService remoteSystemService;
 
+    @Autowired
+    private KwtLogisticsOrderMapper logisticsOrderMapper;
+
     /**
      * 组装返回数据
      *
@@ -105,4 +119,31 @@ public class CommonService {
         }
         return maps;
     }
+
+    /**
+     * 获取生成单据号最大值处理(处理redis宕机或者重启情况)
+     */
+    public void getRedisGenerateOrderNo() {
+        Date date = new Date();
+        String lockKey = String.format(RedisConstant.LOGISTICS_NO_GENERATE_KEY, DateUtils.formatDateToYYMMDD(date));
+        try {
+            String key = OrderGenerateSeqNoUtils.getKey(RedisOrderGenerateEnum.LOGISTICS_ORDER, OrderRuleEnum.LOGISTICS_ORDER, date);
+            if (Boolean.FALSE.equals(RedissonUtils.exists(key))) {
+                if (Boolean.FALSE.equals(RedissonUtils.tryLock(lockKey, 5L, 10L))) {
+                    throw new BusinessException("业务繁忙,请稍后再试!");
+                }
+                DateTime dateTime = DateUtils.beginOfDay(date);
+                String maxOrderNo = logisticsOrderMapper.getMaxOrderNoByDate(dateTime);
+                if (StringUtils.isNotBlank(maxOrderNo)) {
+                    String substring = maxOrderNo.substring(0, 11);
+                    Long maxNum = Long.valueOf(StringUtils.subStrFromIndexToEnd(substring, 4));
+                    RedissonUtils.setAtomicLong(key, maxNum, DateUtils.getSecondsDay());
+                }
+            }
+        } catch (Exception e) {
+            log.error("物流订单获取生成单据号最大值处理异常:{}", e.getMessage(), e);
+        } finally {
+            RedissonUtils.unlock(lockKey);
+        }
+    }
 }

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

@@ -1094,6 +1094,7 @@ public class ConsignOrderService {
      */
     @Transactional(rollbackFor = Exception.class)
     public HttpResult addOrder(AddOrderDTO addOrderDTO) {
+        commonService.getRedisGenerateOrderNo();
         /**生成订单编号*/
         String lOrderNo = OrderGenerateSeqNoUtils.getSeqNo(RedisOrderGenerateEnum.LOGISTICS_ORDER, OrderRuleEnum.LOGISTICS_ORDER, "2", "0", "0");
         HttpResult httpResult = ValidUtil.serviceValid(addOrderDTO);

+ 6 - 4
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderService.java

@@ -6,6 +6,8 @@ import com.sckw.core.exception.BusinessException;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.enums.CarWaybillEnum;
 import com.sckw.core.model.enums.LogisticsOrderEnum;
+import com.sckw.core.model.enums.OrderRuleEnum;
+import com.sckw.core.model.enums.RedisOrderGenerateEnum;
 import com.sckw.core.model.page.PageResult;
 import com.sckw.core.utils.*;
 import com.sckw.core.web.constant.HttpStatus;
@@ -469,8 +471,8 @@ public class KwtWaybillOrderService {
         List<SckwWaybillOrder> sckwWaybillOrders = new ArrayList();
         for (SendCarDto1 sendCarDto : params) {
             /**KwtWaybillOrder数据组装**/
-            KwtWaybillOrder waybillOrder = this.setKwtWaybillOrder(sendCarDto);
-
+            String wOrderNo = OrderGenerateSeqNoUtils.getWaybillSeqNo(RedisOrderGenerateEnum.WAYBILL_ORDER, OrderRuleEnum.WAYBILL_ORDER, logisticsOrder.getLOrderNo());
+            KwtWaybillOrder waybillOrder = this.setKwtWaybillOrder(sendCarDto,wOrderNo);
             /**数据存储**/
             if (sendCarDto.getType() == Global.NUMERICAL_ONE) {
                 for (int i = 0; i < sendCarDto.getCount(); i++) {
@@ -615,11 +617,11 @@ public class KwtWaybillOrderService {
      * @author zk
      * @date 2023/7/20
      **/
-    public KwtWaybillOrder setKwtWaybillOrder(SendCarDto1 sendCarDto) {
+    public KwtWaybillOrder setKwtWaybillOrder(SendCarDto1 sendCarDto,String wOrderNo) {
         KwtWaybillOrder waybillOrder = new KwtWaybillOrder();
         waybillOrder.setEntId(LoginUserHolder.getEntId());
         waybillOrder.setLOrderId(sendCarDto.getLOrderId());
-        waybillOrder.setWOrderNo("xxxxx");
+        waybillOrder.setWOrderNo(wOrderNo);
         waybillOrder.setType(sendCarDto.getType());
         waybillOrder.setStartTime(sendCarDto.getLoadDateTime());
         waybillOrder.setEndTime(sendCarDto.getUnloadDateTime());

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

@@ -73,6 +73,9 @@ public class LogisticsConsignmentService {
     @Autowired
     RedisLockUtil redisLockUtil;
 
+    @Autowired
+    public CommonService commonService;
+
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
     RemoteSystemService remoteSystemService;
 
@@ -164,6 +167,7 @@ public class LogisticsConsignmentService {
     }
 
     void logisticsConsignmentInsert(LogisticsConsignmentParam bo) {
+        commonService.getRedisGenerateOrderNo();
         Long count = kwtLogisticsOrderMapper.selectCount(new LambdaQueryWrapper<KwtLogisticsOrder>().eq(KwtLogisticsOrder::getTOrderId, bo.getTOrderId()));
         String lOrderNo = OrderGenerateSeqNoUtils.getSeqNo(RedisOrderGenerateEnum.LOGISTICS_ORDER, OrderRuleEnum.LOGISTICS_ORDER, "1", "0", String.valueOf(count + 1));
         OrderDetailRes tradeOrder = tradeOrderInfoService.getOrderDetailById(Long.parseLong(bo.getTOrderId()));
@@ -1884,6 +1888,8 @@ public class LogisticsConsignmentService {
     }
 
     public HttpResult addWaybillNumberDemo() {
+        String seqNo = OrderGenerateSeqNoUtils.getWaybillSeqNo(RedisOrderGenerateEnum.WAYBILL_ORDER, OrderRuleEnum.WAYBILL_ORDER, "T2308290001101");
+        System.out.println(seqNo);
         return HttpResult.ok();
     }
 

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

@@ -304,7 +304,7 @@ public class TransportCommonService {
             result.setMsg("单据不存在");
             return result;
         }
-        if (!LogisticsOrderEnum.PENDING_ORDER.getCode().equals(logisticsOrder.getStatus())) {
+        if (!LogisticsOrderEnum.PENDING_ORDER.getStatus().equals(String.valueOf(logisticsOrder.getStatus()))) {
             result.setCode(HttpStatus.GLOBAL_EXCEPTION_CODE);
             result.setMsg("待接单才允许撤销托运");
             return result;

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

@@ -883,4 +883,7 @@
             </foreach>
         </if>
     </select>
+    <select id="getMaxOrderNoByDate" resultType="java.lang.String">
+        SELECT MAX(l_order_no) FROM kwt_logistics_order WHERE create_time &gt;= #{date};
+    </select>
 </mapper>