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

Merge branch 'dev' of http://git.sckaiwu.cn/17358629955/sckw-service-platform into dev

15928045575 2 лет назад
Родитель
Сommit
f16d812d1b

+ 1 - 1
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/OrderRuleEnum.java

@@ -15,7 +15,7 @@ public enum OrderRuleEnum {
     /**
      * 贸易订单
      */
-    TRADE_ORDER("waybillOrder", "B", "贸易订单业务类别"),
+    TRADE_ORDER("tradeOrder", "B", "贸易订单业务类别"),
 
     /**
      * 运单

+ 2 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/RedisOrderGenerateEnum.java

@@ -14,6 +14,8 @@ public enum RedisOrderGenerateEnum {
      */
     LOGISTICS_ORDER("logisticsOrder","logistics_order_no_generator:","物流订单key"),
 
+    TRADE_ORDER("tradeOrder","trade_order_no_generator:","贸易订单key"),
+
     /**
      * 车辆运单key
      */

+ 13 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/DateUtils.java

@@ -4,6 +4,8 @@ import cn.hutool.core.date.DateUtil;
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.Duration;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.*;
@@ -344,6 +346,17 @@ public class DateUtils extends DateUtil {
         return String.format("%.5f", newTime);
     }
 
+    /**
+     * 获取当天剩余秒数
+     *
+     * @return
+     */
+    public static Long getSecondsDay() {
+        LocalDateTime nextDay = LocalDate.now().plusDays(1).atStartOfDay();
+        LocalDateTime now = LocalDateTime.now();
+        return Duration.between(now, nextDay).getSeconds();
+    }
+
 
     public static void main(String[] ager) throws InterruptedException {
 

+ 31 - 40
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/OrderGenerateSeqNoUtils.java

@@ -9,8 +9,8 @@ import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.support.atomic.RedisAtomicLong;
 import org.springframework.stereotype.Component;
 
-import java.util.Calendar;
 import java.util.Date;
+import java.util.Objects;
 
 /**
  * @author lfdc
@@ -26,35 +26,31 @@ public class OrderGenerateSeqNoUtils {
     private RedisTemplate redisTemplate;
 
     /**
-     * @param redisOrderGenerateEnum       传入指定枚举的key
-     * @param prefix    业务类别
-     * @param orderType 单据创建类型
-     * @param level     所属几级分包
-     * @param number    同级分包次数
+     * @param redisOrderGenerateEnum 传入指定枚举的key
+     * @param prefix                 业务类别
+     * @param orderType              单据创建类型
+     * @param level                  所属几级分包
+     * @param number                 同级分包次数
      * @return
      */
     public static String getSeqNo(RedisOrderGenerateEnum redisOrderGenerateEnum, OrderRuleEnum prefix, String orderType, String level, String number) {
-        Calendar calendar = Calendar.getInstance();
-        calendar.set(Calendar.HOUR_OF_DAY, 23);
-        calendar.set(Calendar.MINUTE, 59);
-        calendar.set(Calendar.SECOND, 59);
-        calendar.set(Calendar.MILLISECOND, 999);
-        /**拼接redis key 公共key+[业务标识]+日期 */
-        StringBuilder stringBuilder = new StringBuilder();
-        StringBuilder appendKey = stringBuilder.append(redisOrderGenerateEnum.getKey()).append(prefix.getCode()).append(DateUtils.formatDate(new Date()));
-        //设置过期时间,这里设置为当天的23:59:59
-        Date expireDate = calendar.getTime();
-        Long seq = generate(appendKey.toString(), expireDate);
-        String date = DateUtils.formatDateToYYMMDD(expireDate);
-        String sequence = StringUtils.addZeroForNum(seq.toString(), 4);
         if (prefix == null) {
             throw new RuntimeException("Order Generate SeqNo Error");
         }
+        Date now = new Date();
+        /**拼接redis key 公共key+[业务标识]+日期 */
+        StringBuilder stringBuilder = new StringBuilder();
+        StringBuilder appendKey = stringBuilder.append(redisOrderGenerateEnum.getKey()).append(prefix.getCode()).append(DateUtils.formatDate(now));
+        //设置过期时间,这里设置为当天的23:59:59
+        Long secondsDay = DateUtils.getSecondsDay();
+        Long seq = generate(appendKey.toString(), secondsDay);
+        String date = DateUtils.formatDateToYYMMDD(now);
+        String sequence = String.format("%04d", seq);
         /**拼接业务编号*/
         String seqNo = prefix.getCode() + date + sequence;
         /**extendBusiness 根据实际业务是否需要 */
         String seqNoEnd = extendBusiness(seqNo, orderType, level, number);
-        log.info("KEY:{}, 序列号生成:{}, 过期时间:{}", appendKey, seqNo, String.format("%tF %tT ", expireDate, expireDate));
+        log.info("KEY:{}, 序列号生成:{}, 过期时间:{}秒", appendKey, seqNo, secondsDay);
         return seqNoEnd;
     }
 
@@ -88,42 +84,37 @@ public class OrderGenerateSeqNoUtils {
      * @param expireTime 过期时间
      * @return
      */
-    public static long generate(String key, Date expireTime) {
-        long seq = RedissonUtils.getAtomicLong(key, expireTime.getTime());
-//        RedisAtomicLong counter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
+    public static long generate(String key, Long expireTime) {
+                //RedisAtomicLong counter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
 //        //设置过期时间
 //        counter.expireAt(expireTime);
 //        //返回redis中key的值,内部实现下面详细说明
 //        return counter.incrementAndGet();
-        return seq;
+        return RedissonUtils.getAtomicLong(key, expireTime);
     }
 
 
     /**
-     * @param redisOrderGenerateEnum    传入枚举指定的key
-     * @param prefix 业务类别
+     * @param redisOrderGenerateEnum 传入枚举指定的key
+     * @param prefix                 业务类别
      * @return
      */
     public static String getOtherSeqNo(RedisOrderGenerateEnum redisOrderGenerateEnum, OrderRuleEnum prefix) {
-        Calendar calendar = Calendar.getInstance();
-        calendar.set(Calendar.HOUR_OF_DAY, 23);
-        calendar.set(Calendar.MINUTE, 59);
-        calendar.set(Calendar.SECOND, 59);
-        calendar.set(Calendar.MILLISECOND, 999);
+        if (Objects.isNull(prefix)) {
+            throw new RuntimeException("Order Generate SeqNo Error");
+        }
+        Date now = new Date();
         /**拼接redis key 公共key+[业务标识]+日期 */
         StringBuilder stringBuilder = new StringBuilder();
-        StringBuilder appendKey = stringBuilder.append(redisOrderGenerateEnum.getKey()).append(prefix.getCode()).append(DateUtils.formatDate(new Date()));
+        StringBuilder appendKey = stringBuilder.append(redisOrderGenerateEnum.getKey()).append(prefix.getCode()).append(DateUtils.formatDate(now));
         //设置过期时间,这里设置为当天的23:59:59
-        Date expireDate = calendar.getTime();
-        Long seq = generate(appendKey.toString(), expireDate);
-        String date = DateUtils.formatDateToYYMMDD(expireDate);
-        String sequence = StringUtils.addZeroForNum(seq.toString(), 4);
-        if (prefix == null) {
-            throw new RuntimeException("Order Generate SeqNo Error");
-        }
+        Long secondsDay = DateUtils.getSecondsDay();
+        Long seq = generate(appendKey.toString(), secondsDay);
+        String date = DateUtils.formatDateToYYMMDD(now);
+        String sequence = String.format("%04d", seq);
         /**拼接业务编号*/
         String seqNo = prefix.getCode() + date + sequence;
-        log.info("KEY:{}, 序列号生成:{}, 过期时间:{}", appendKey, seqNo, String.format("%tF %tT ", expireDate, expireDate));
+        log.info("KEY:{}, 序列号生成:{}, 过期时间:{}秒", appendKey, seqNo, secondsDay);
         return seqNo;
     }
 }

+ 18 - 9
sckw-common/sckw-common-redis/src/main/java/com/sckw/redis/constant/RedisConstant.java

@@ -10,38 +10,47 @@ public class RedisConstant {
     /**
      * 短信验证码值key
      */
-    public static final String MESSAGE_SMS_VERIFY_CODE_VALUE_KEY = "sckw:sms:verifyCode:value:%s:%s";
+    public static final String MESSAGE_SMS_VERIFY_CODE_VALUE_KEY = "message:sms:verifyCode:value:%s:%s";
     /**
      * 短信验证码请求key
      */
-    public static final String MESSAGE_SMS_VERIFY_CODE_REQUEST_KEY = "sckw:sms:verifyCode:request:%s:%s";
+    public static final String MESSAGE_SMS_VERIFY_CODE_REQUEST_KEY = "message:sms:verifyCode:request:%s:%s";
+
+    /**
+     * 短信验证码请求时间
+     */
+    public static final Long SMS_VERIFY_CODE_REQUEST_TIME = 60L;
+    /**
+     * 短信验证码锁key
+     */
+    public static final String MESSAGE_SMS_VERIFY_CODE_LOCK_KEY = "message:sms:verifyCode:lock:%s:%s";
     /**
-     * 短信验证码有效时间(秒)
+     * 短信验证码有效时间(秒)5分钟
      */
-    public static final Long SMS_VERIFY_CODE_VALID_TIME = 180L;
+    public static final Long SMS_VERIFY_CODE_VALID_TIME = 300L;
 
     /**
      * message消费请求key
      */
-    public static final String MESSAGE_CONSUMER_REQUEST_KEY = "sckw:message:consumer:request:%s";
+    public static final String MESSAGE_CONSUMER_REQUEST_KEY = "message:msg:consumer:request:%s";
 
     /**
      * 商品更新库存锁key
      */
-    public static final String GOODS_UPDATE_AMOUNT_KEY = "sckw:product:goods:update:amount:%s";
+    public static final String GOODS_UPDATE_AMOUNT_KEY = "product:goods:update:amount:%s";
     /**
      * 更新贸易订单委托量、已履约量锁key
      */
-    public static final String TORDER_UPDATE_AMOUNT_KEY = "sckw:trade:order:update:amount:%s";
+    public static final String TORDER_UPDATE_AMOUNT_KEY = "order:trade:update:amount:%s";
     /**
      * 合同签约完成更新贸易订单状态锁key
      */
-    public static final String TORDER_CONTRACT_UPDATE_KEY = "sckw:trade:order:contract:update:%s";
+    public static final String TORDER_CONTRACT_UPDATE_KEY = "order:trade:contract:update:%s";
 
     /**
      * 合同签约完成更新物流订单状态锁key
      */
-    public static final String LOGISTICS_ORDER_CONTRACT_UPDATE_KEY = "sckw:logistics:order:contract:update:%s";
+    public static final String LOGISTICS_ORDER_CONTRACT_UPDATE_KEY = "order:trade:logistics:update:%s";
 
     /**
      * 消费请求有效时间(秒)

+ 7 - 5
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SckwSmsHandlerService.java

@@ -35,19 +35,21 @@ public class SckwSmsHandlerService {
         log.info("接收到发送短信消息:{},开始处理", JSON.toJSONString(sckwSms));
         String type = sckwSms.getType();
         String phone = sckwSms.getPhone();
-        String requestKey = getKey(RedisConstant.MESSAGE_SMS_VERIFY_CODE_REQUEST_KEY, type, phone);
-        if (Boolean.FALSE.equals(RedissonUtils.tryLock(requestKey, 5L, 10L))) {
+        String lockKey = getKey(RedisConstant.MESSAGE_SMS_VERIFY_CODE_LOCK_KEY, type, phone);
+        if (Boolean.FALSE.equals(RedissonUtils.tryLock(lockKey, 5L, 10L))) {
             log.info("获取发送短信锁失败,不处理");
             return;
         }
         try {
-            String valueKey = getKey(RedisConstant.MESSAGE_SMS_VERIFY_CODE_VALUE_KEY, type, phone);
-            if (Boolean.TRUE.equals(RedissonUtils.exists(valueKey))) {
+            String requestKey = getKey(RedisConstant.MESSAGE_SMS_VERIFY_CODE_REQUEST_KEY, type, phone);
+            if (Boolean.TRUE.equals(RedissonUtils.exists(requestKey))) {
                 throw new BusinessException("请勿频繁获取短信验证码!");
             }
+            RedissonUtils.putString(requestKey, String.valueOf(sckwSms.getParams().get("code")), RedisConstant.SMS_VERIFY_CODE_REQUEST_TIME);
             //发送短信
             SmsUtil.sendSms(sckwSms.getPhone(), sckwSms.getSignName(), sckwSms.getTemplateCode().getName(), JSON.toJSONString(sckwSms.getParams()));
             //放入缓存
+            String valueKey = getKey(RedisConstant.MESSAGE_SMS_VERIFY_CODE_VALUE_KEY, type, phone);
             RedissonUtils.putString(valueKey, String.valueOf(sckwSms.getParams().get("code")), RedisConstant.SMS_VERIFY_CODE_VALID_TIME);
             //数据入库
             SmsCodeEnum smsCodeEnum = sckwSms.getTemplateCode();
@@ -58,7 +60,7 @@ public class SckwSmsHandlerService {
             kwmSms.setUpdateBy(sckwSms.getCreateBy());
             kwmSmsService.add(kwmSms);
         } finally {
-            RedissonUtils.unlock(requestKey);
+            RedissonUtils.unlock(lockKey);
         }
     }
 

+ 1 - 1
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SmsService.java

@@ -45,7 +45,7 @@ public class SmsService {
             throw new BusinessException("非法短信类型!");
         }
         String phone = param.getPhone();
-        String key = StringUtils.format(RedisConstant.MESSAGE_SMS_VERIFY_CODE_VALUE_KEY, type, phone);
+        String key = StringUtils.format(RedisConstant.MESSAGE_SMS_VERIFY_CODE_REQUEST_KEY, type, phone);
         if (Boolean.TRUE.equals(RedissonUtils.exists(key))) {
             throw new BusinessException("请勿频繁获取短信验证码!");
         }