TRX 1 ano atrás
pai
commit
98e34dc5f4

+ 1 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/extend/ExpenseFlowDaoExtend.java

@@ -32,4 +32,5 @@ public interface ExpenseFlowDaoExtend {
      */
     ExpenseFlowCount countPayment(ExpenseFlowSearch param);
 
+    ExpenseFlow init(String mqttDataId, String token);
 }

+ 20 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/impl/ExpenseFlowDaoImpl.java

@@ -11,17 +11,20 @@ import com.zhongshu.card.server.core.domain.org.Department;
 import com.zhongshu.card.server.core.domain.payment.ExpenseFlow;
 import com.zhongshu.card.server.core.domain.school.BookInfo;
 import com.zhongshu.card.server.core.util.CommonUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.FindAndModifyOptions;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.data.mongodb.core.aggregation.Aggregation;
 import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
@@ -35,6 +38,7 @@ import java.util.regex.Pattern;
  * @CreateDate: 2023/4/12
  * @Version: 1.0
  */
+@Slf4j
 public class ExpenseFlowDaoImpl extends BaseImpl implements ExpenseFlowDaoExtend {
 
     @Autowired
@@ -138,4 +142,20 @@ public class ExpenseFlowDaoImpl extends BaseImpl implements ExpenseFlowDaoExtend
         return expenseFlowCount;
     }
 
+    public ExpenseFlow init(String mqttDataId, String token) {
+        ExpenseFlow doc = null;
+        try {
+            Query query = Query.query(Criteria.where("mqttDataId").is(mqttDataId).and("token").isNull());
+            Update update = new Update()
+                    .set("token", token);
+            FindAndModifyOptions options = new FindAndModifyOptions().upsert(true)
+                    .returnNew(true);
+            doc = mongoTemplate.findAndModify(query, update, options,
+                    ExpenseFlow.class);
+        } catch (Exception e) {
+            log.error("init {}", e.getMessage());
+        }
+        return doc;
+    }
+
 }

+ 6 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/payment/ExpenseFlow.java

@@ -32,6 +32,12 @@ import java.math.BigDecimal;
 public class ExpenseFlow extends SuperMain {
 
     //-----------------------------订单信息 start---------------------
+    @Indexed(unique = true, sparse = true)
+    @Schema(description = "mqtt推送生成的业务数据ID")
+    private String mqttDataId;
+
+    private String token;
+
     @Schema(description = "用户userId")
     private String userId;
 

+ 4 - 4
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/ExpenseFlowServiceImpl.java

@@ -84,9 +84,9 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
      * @param param
      * @return
      */
-    public ResultContent<ExpenseFlow> createExpenseFlowByHxz(ConsumTransactionsFullParam param) {
-        ExpenseFlow expenseFlow = new ExpenseFlow();
+    public ResultContent<ExpenseFlow> createExpenseFlowByHxz(ConsumTransactionsFullParam param, ExpenseFlow expenseFlow) {
         ConsumTransactionsModel iotParam = param.getParam();
+        expenseFlow.setMqttDataId(iotParam.getMqttDataId());
 
         expenseFlow.setYear(DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternyyyy));
         expenseFlow.setMonth(DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternMM));
@@ -218,8 +218,8 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
      * @param iotParam
      * @return
      */
-    public ResultContent<ExpenseFlow> createExpenseFlowByHxz(QRCodeTransactionModel iotParam) {
-        ExpenseFlow expenseFlow = new ExpenseFlow();
+    public ResultContent<ExpenseFlow> createExpenseFlowByHxz(QRCodeTransactionModel iotParam, ExpenseFlow expenseFlow) {
+        expenseFlow.setMqttDataId(iotParam.getMqttDataId());
 
         String userId = "665fc0389083d203896d3541";
         expenseFlow.setUserId(userId);

+ 28 - 6
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/HxzService.java

@@ -6,11 +6,13 @@ import com.github.microservice.models.type.PaymentType;
 import com.zhongshu.card.client.ret.ResultContent;
 import com.zhongshu.card.server.core.dao.CardInfoDao;
 import com.zhongshu.card.server.core.dao.org.UserCountDao;
+import com.zhongshu.card.server.core.dao.payment.ExpenseFlowDao;
 import com.zhongshu.card.server.core.dao.school.DeviceInfoDao;
 import com.zhongshu.card.server.core.domain.payment.ExpenseFlow;
 import com.zhongshu.card.server.core.domain.org.DeviceInfo;
 import com.zhongshu.card.server.core.httpRequest.ApiRequestService;
 import com.zhongshu.card.server.core.service.base.SuperService;
+import com.zhongshu.card.server.core.util.TokenUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -42,6 +44,9 @@ public class HxzService extends SuperService {
     @Autowired
     ExpenseFlowServiceImpl expenseFlowService;
 
+    @Autowired
+    ExpenseFlowDao expenseFlowDao;
+
     /**
      * 得到系统时间
      *
@@ -74,11 +79,19 @@ public class HxzService extends SuperService {
         // 返回参数
         ConsumTransactionsFullResult result = new ConsumTransactionsFullResult();
         result.setPaymentType(param.getPaymentType());
-
         ConsumTransactionsResult resultModel = new ConsumTransactionsResult();
+
+        ConsumTransactionsModel param1 = param.getParam();
+        String mqttDataId = param1.getMqttDataId();
+        ExpenseFlow expenseFlow = expenseFlowDao.init(mqttDataId, TokenUtil.create());
+        if (ObjectUtils.isEmpty(expenseFlow)) {
+            resultModel.setFailed("重复订单");
+            result.setModel(resultModel);
+            return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
+        }
         // 创建订单
-        ResultContent<ExpenseFlow> createResult = expenseFlowService.createExpenseFlowByHxz(param);
-        ExpenseFlow expenseFlow = createResult.getContent();
+        ResultContent<ExpenseFlow> createResult = expenseFlowService.createExpenseFlowByHxz(param, expenseFlow);
+        expenseFlow = createResult.getContent();
 
         // 支付
         ResultContent<ExpenseFlow> resultContent = expenseFlowService.expendPay(expenseFlow);
@@ -92,6 +105,7 @@ public class HxzService extends SuperService {
         resultModel = expenseFlowService.buildConsumTransactionsResult(expenseFlow.getOrderNo(), expenseFlow.getCardNo());
         result.setModel(resultModel);
         requestInfoService.addRequestInfo(param, resultModel);
+
         return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
     }
 
@@ -120,17 +134,25 @@ public class HxzService extends SuperService {
         //  返回参数
         QRCodeTransactionFullResult result = new QRCodeTransactionFullResult();
         result.setPaymentType(param.getPaymentType());
+
         QRCodeTransactionResult model = new QRCodeTransactionResult();
+        String mqttDataId = param.getMqttDataId();
+        ExpenseFlow expenseFlow = expenseFlowDao.init(mqttDataId, TokenUtil.create());
+        if (ObjectUtils.isEmpty(expenseFlow)) {
+            model.setFailed("重复订单");
+            result.setModel(model);
+            return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
+        }
 
         // 创建订单
-        ResultContent<ExpenseFlow> createResult = expenseFlowService.createExpenseFlowByHxz(param);
-        ExpenseFlow expenseFlow = createResult.getContent();
+        ResultContent<ExpenseFlow> createResult = expenseFlowService.createExpenseFlowByHxz(param, expenseFlow);
+        expenseFlow = createResult.getContent();
 
         // 扣款支付订单
         ResultContent<ExpenseFlow> resultContent = expenseFlowService.expendPayQrCode(expenseFlow);
         if (resultContent.isFailed()) {
             model.setFailed(resultContent.getMsg());
-        }else {
+        } else {
             model.setSuccess();
             model.setQrorder(expenseFlow.getOrderNo());
         }

+ 57 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/util/TokenUtil.java

@@ -0,0 +1,57 @@
+package com.zhongshu.card.server.core.util;
+
+import com.zhongshu.card.server.core.util.encode.HashUtil;
+
+import java.util.UUID;
+
+public class TokenUtil {
+
+    /**
+     * 创建令牌
+     *
+     * @return
+     */
+    public static String create() {
+        return UUID.randomUUID().toString().replaceAll("-", "");
+    }
+
+
+    /**
+     * 创建令牌并将UUID的值Hash
+     *
+     * @return
+     */
+    public static String createAndHash() {
+        return HashUtil.hash(create());
+    }
+
+
+    /**
+     * 创建令牌,长度
+     *
+     * @param size
+     * @return
+     */
+    public static String create(int size) {
+        String ret = createAndHash();
+        ret = limitMaxText(ret, size);
+        while (ret.length() < size) {
+            ret += createAndHash();
+        }
+        return limitMaxText(ret, size);
+    }
+
+
+    /**
+     * 限制最大文本
+     *
+     * @param text
+     * @param maxCount
+     * @return
+     */
+    private static String limitMaxText(String text, int maxCount) {
+        return text.length() > maxCount ? text.substring(0, maxCount) : text;
+    }
+
+
+}

+ 22 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/util/encode/HashUtil.java

@@ -0,0 +1,22 @@
+package com.zhongshu.card.server.core.util.encode;
+
+import org.springframework.util.DigestUtils;
+
+public class HashUtil {
+
+    /**
+     * 多文本hash工具
+     *
+     * @param texts
+     * @return
+     */
+    public static String hash(String... texts) {
+        StringBuilder sb = new StringBuilder();
+        for (String text : texts) {
+            sb.append(text + "_");
+        }
+        return DigestUtils.md5DigestAsHex(sb.toString().getBytes());
+    }
+
+
+}