Explorar el Código

fix: 消费服务
1.扣款顺序逻辑完善、增加日志

luoyb hace 1 año
padre
commit
a8fb7f9889

+ 1 - 0
ArcFace64.dat

@@ -0,0 +1 @@
+EWEPEPEOGMGTELIZJUGECKIUJDBCJTCNISGPBNHLJTJUBHEWGNAKGEGAIOHJDQAJGNCFDRFZJEDMJTGGFTAIBMBXGNJCCHAXDXHZILJMIACUGAGUCQAGAVILIXDAACGZERCWISFQGTGQEYDHCKESBCICFNDLDVGYFKAFIEFXAGGXCSFFCRIDCQIPISIRJBFTDAFJBAAAALFFEBHWGLIQJEBNHLFJBLBJCDETGKBLESHCAMEDCUADBTJQJHIAGRFCINHNHGGYBZEKBLDLCHCBDNJLAJFWECAHHXJRFYEDJMARCRFYGXAQGOJFJMJUJADQHCFDHPJNECHOCRILHVGMICEIBCGJJPCPBPHKGUBZAIGFCYJDGEHGIKFEGWANADGSHWHIELCPJAJUEMAGCDEGDYFZCHEWGWBOHNBJFRGJGMEXBFIADEJOAFFEADBNJUBFAMGACNDBGCCMEPHICYHCHWDZBGBRIRCBDCAAHVAPELHRASJCEAAWFMBBEUCVISGHDAEFDVGXCYBCAADSBAINFNFXEUFHFGGLJHELDMGUFRHBHKDQJSINIPEBABHNHAJMCGBYCEDUFHGDCOHFEKDPJBCKDGAKFNJEHTBNIPJUGNDLBUAYDBFQGMABHHIJDIGJFGGAIVIQIXGFGJJDJKAXAPGIJFBFBBIYGLGUEOJJDSJSHTIIIYHKHJCQBMECCLECGEHPINHAISBCCCFLFFDUGXBFDIGVFVDGBREMHAASDQEEAZDAFUALAHJIALHLFXCTDSBFJIFEDYGLINITEUAQGJBTIRELJIIIIFDRFCDJGEISAAGGDFAGABCSFCAPBLARIUEVDGDZFYEEHUEWIFERGZAMEDFYIZBRCADNGOBZDSBYHRBZGBJDFTCTFXCDIFFPGDFEBDJVIUGSEIHRBHDIBBEZBNBDBDFYGXCEBYHIEDETAVCBAMHQEAFMASDUDXHZGGFCGSEZIQHSCTILEGHJIJBDDAFGJMELDJIQHTFJDCCMDTCKFQFMFJDFEFGXJDIFJDDZFPFXBJJNHJFGHDANHVEFGUANIKBADHFSDFGSHBEYEMDZJAEXGTBDJNAPDVESCQDBEVETAWHIFKDDFRGMBTJPBKDDIZBTGPADHCHHJIADBIEYDUEVIHBEBKHXCYFHANALEUIUDSBHDOJMDEEFARBACLHQHQDQCBBDAEEEHAALES

+ 3 - 4
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/BaseBusiness.java

@@ -147,7 +147,6 @@ public class BaseBusiness {
         List<XfConsumeDetailVo> detailVos = new ArrayList<>();
 
         for (PtBagVo bagVo : bagVos) {
-            log.info("扣费钱包代码:{},钱包余额:{},消费金额:{}", bagVo.getBagCode(), bagVo.getBalance(), bo.getConsumeMoney());
             XfConsumeDetailVo vo = createConsumeRecord(bo, userAccountVo, cardVo, bagVo, termVo, mealTypeVo, remark);
             // 多钱包扣费时,只要有一个钱包入消费明细表失败,则都失败
             if (ObjUtil.isEmpty(vo)) {
@@ -162,17 +161,17 @@ public class BaseBusiness {
             return R.fail(errorInfo);
         }
         // 2.更新人员日统计表
-        log.info("[上传交易]-[更新人员日统计表]-[{}]", JSONUtil.toJsonStr(bo));
+        log.warn("[上传交易]-[更新人员日统计表]-[{}]", JSONUtil.toJsonStr(bo));
         if (!createOrUpdateUserTotal(bo, userAccountVo, cardVo)) {
             return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.EXCEPTION, "更新个人日统计表失败", ""));
         }
         // 3.更新设备日统计表
-        log.info("[上传交易]-[更新设备日统计表]-[{}]", JSONUtil.toJsonStr(bo));
+        log.warn("[上传交易]-[更新设备日统计表]-[{}]", JSONUtil.toJsonStr(bo));
         if (!createOrUpdateTermTotal(bo, termVo, mealTypeVo)) {
             return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.EXCEPTION, "更新设备日统计表失败", ""));
         }
         // 4.更新钱包余额
-        log.info("[上传交易]-[更新钱包余额]-[{}]", JSONUtil.toJsonStr(bo));
+        log.warn("[上传交易]-[更新钱包余额]-[{}]", JSONUtil.toJsonStr(bo));
         if (!updateBagBalance(bagVos)) {
             return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.EXCEPTION, "更新钱包余额表失败", ""));
         }

+ 31 - 10
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CheckBusiness.java

@@ -265,8 +265,7 @@ public class CheckBusiness {
             }
         }
         // 4.根据消费机的消费模式验证余额,如果余额不足则返回
-        List<PtBagVo> bagVos = new ArrayList<>();
-        result = checkDeductionBag(bo, userAccountVo, useTermVo, bagVos);
+        result = checkOrigDeductionBag(bo, userAccountVo, useTermVo);
         if (R.isError(result)) {
             return result;
         }
@@ -542,6 +541,10 @@ public class CheckBusiness {
     }
 
     public R<ErrorInfo> checkDeductionBag(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, XfTermVo termVo, List<PtBagVo> bagVos) {
+        R<ErrorInfo> result = this.checkOrigDeductionBag(bo, userAccountVo, termVo);
+        if (R.isError(result)) {
+            return result;
+        }
         StringBuilder sb = new StringBuilder();
         // 设备的扣费钱包字符串
         String consumeType = termVo.getConsumeType();
@@ -562,12 +565,6 @@ public class CheckBusiness {
                 totalBalance = totalBalance.add(bagVo.getBalance());
             }
         }
-        // 如果扣费钱包总余额<消费金额,则不允许消费
-        if (consumeMoney.compareTo(totalBalance) > 0) {
-            return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.CONSUME_CHECK_FAIL, "钱包余额不足",
-                                        MessageFormat.format("余额不足,总余额[{0}],消费金额[{1}]", totalBalance, consumeMoney)));
-        }
-
         for (String bagCode : bagCodes) {
             // 1.查询对应的钱包
             PtBagVo bagVo = bagService.queryByUserBagCode(userId, bagCode);
@@ -577,13 +574,13 @@ public class CheckBusiness {
             }
             // 2.比较扣费金额
             BigDecimal balance = bagVo.getBalance();
-            log.info("钱包代码:{},钱包余额:{},消费金额:{},扣款金额:{},姓名:{}", bagCode, balance, consumeMoney,doMoney,userAccountVo.getRealName());
             if (consumeMoney.compareTo(BigDecimal.ZERO) == 0) {
                 // 如果是消费0元,设置为第一个钱包扣费
                 bagVo.setReceiptMoney(BigDecimal.ZERO);
                 bagVo.setBalance(balance);
                 sb.append(BagNameEnum.getMessage(Integer.parseInt(bagCode)));
                 doBagVos.add(bagVo);
+                log.warn("[上传交易]-[扣费钱包]-[钱包代码:{},钱包余额:{},消费金额:{},扣款金额:{},姓名:{}]", bagCode, balance, consumeMoney,doMoney,userAccountVo.getRealName());
                 break;
             } else {
                 // 如果消费金额>0,则可能会需要多钱包扣费
@@ -595,6 +592,7 @@ public class CheckBusiness {
                         bagVo.setBalance(balance.subtract(doMoney));
                         sb.append(BagNameEnum.getMessage(Integer.parseInt(bagCode)));
                         doBagVos.add(bagVo);
+                        log.warn("[上传交易]-[扣费钱包]-[钱包代码:{},钱包余额:{},消费金额:{},扣款金额:{},姓名:{}]", bagCode, balance, consumeMoney,doMoney,userAccountVo.getRealName());
                         break;
                     } else {
                         // 将钱包扣费为0,剩余待扣金额=消费金额-原钱包余额
@@ -603,6 +601,7 @@ public class CheckBusiness {
                         doMoney = doMoney.subtract(balance);
                         sb.append(BagNameEnum.getMessage(Integer.parseInt(bagCode)));
                         doBagVos.add(bagVo);
+                        log.warn("[上传交易]-[扣费钱包]-[钱包代码:{},钱包余额:{},消费金额:{},扣款金额:{},姓名:{}]", bagCode, balance, consumeMoney,doMoney,userAccountVo.getRealName());
                     }
                 }
             }
@@ -614,7 +613,29 @@ public class CheckBusiness {
 
         return R.ok();
     }
-
+    public R<ErrorInfo> checkOrigDeductionBag(ConsumptionBo bo, RemoteUserAccountVo userAccountVo, XfTermVo termVo) {
+        // 设备的扣费钱包字符串
+        String consumeType = termVo.getConsumeType();
+        // 分解扣费钱包
+        List<String> bagCodes = StrUtil.split(consumeType, ",");
+        Long userId = userAccountVo.getUserId();
+        BigDecimal consumeMoney = bo.getConsumeMoney();
+        BigDecimal totalBalance = BigDecimal.ZERO;
+        // 计算扣费钱包的总金额
+        for (String bagCode : bagCodes) {
+            PtBagVo bagVo = bagService.queryByUserBagCode(userId, bagCode);
+            if (ObjectUtil.isNotEmpty(bagVo)) {
+                totalBalance = totalBalance.add(bagVo.getBalance());
+            }
+        }
+        // 如果扣费钱包总余额<消费金额,则不允许消费
+        if (consumeMoney.compareTo(totalBalance) > 0) {
+            return R.fail(new ErrorInfo(400, ApiErrorTypeConstants.CONSUME_CHECK_FAIL, "钱包余额不足",
+                MessageFormat.format("余额不足,总余额[{0}],消费金额[{1}]", totalBalance, consumeMoney)));
+        }
+        bo.setBalance(totalBalance.subtract(consumeMoney));
+        return R.ok();
+    }
     /**
      * 设备限额、限次与折扣验证
      *

+ 4 - 4
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/ConsumeBusiness.java

@@ -121,20 +121,20 @@ public class ConsumeBusiness {
      * @return 上传结果
      */
     public R<ErrorInfo> postOrder(ConsumptionBo bo, String mac, String xfPwd) {
-        log.info("[上传交易]-[开始参数验证]-[{}]", JSONUtil.toJsonStr(bo));
+        log.warn("[上传交易]-[开始参数验证]-[{}]", JSONUtil.toJsonStr(bo));
         R<ErrorInfo> result = checkBusiness.checkParam(bo);
         if (R.isError(result)) {
             log.error("[上传交易]-[参数验证失败]-[{}]", JSONUtil.toJsonStr(result.getData()));
             return result;
         }
-        log.info("[上传交易]-[消费设备验证]-[{}]", JSONUtil.toJsonStr(bo));
+        log.warn("[上传交易]-[消费设备验证]-[{}]", JSONUtil.toJsonStr(bo));
         XfTermVo termVo = new XfTermVo();
         result = checkBusiness.checkTerm(bo, termVo);
         if (R.isError(result)) {
             log.error("[上传交易]-[设备验证失败]-[{}]", result.getData());
             return result;
         }
-        log.info("[上传交易]-[交易账单处理]-[{}]", JSONUtil.toJsonStr(bo));
+        log.warn("[上传交易]-[交易账单处理]-[{}]", JSONUtil.toJsonStr(bo));
         RemoteUserAccountVo userAccountVo = new RemoteUserAccountVo();
         RemoteCardVo userCardVo = new RemoteCardVo();
         List<PtBagVo> bagVos = new ArrayList<>();
@@ -145,7 +145,7 @@ public class ConsumeBusiness {
             log.error("[上传交易]-[交易账单处理失败]-[{}]", result.getData());
             return result;
         }
-        log.info("[上传交易]-[交易入库]-[{}]", JSONUtil.toJsonStr(bo));
+        log.warn("[上传交易]-[交易入库]-[{}]", JSONUtil.toJsonStr(bo));
         result = baseBusiness.postConsumeRecord(bo, userAccountVo, userCardVo, bagVos, termVo, mealTypeVo, "");
         if (R.isError(result)) {
             log.error("[上传交易]-[交易入库失败]-[{}]", result.getData());

+ 7 - 7
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/ConsumeController.java

@@ -62,7 +62,7 @@ public class ConsumeController {
     public Object consumeOriginalVirtualCard(@RequestBody Object record, @RequestParam(name = "mac", required = false) java.lang.String mac,
                                              @RequestParam(name = "qrcode") java.lang.String qrcode,
                                              @RequestParam(name = "xfPwd", required = false) java.lang.String xfPwd) {
-        log.info("[二维码请求消费]-[{}]", JSONUtil.parseObj(record));
+        log.warn("[二维码请求消费]-[{}]", JSONUtil.parseObj(record));
         JSONObject yc = JSONUtil.parseObj(record);
         long userNo = ObjectUtil.isEmpty(yc.get("employeeID")) ? 0L : Long.parseLong(yc.get("employeeID").toString());
         Object redisQrCode = RedisUtils.getCacheMapValue(CacheNames.SCHOOL_CODE, Long.toString(userNo));
@@ -88,7 +88,7 @@ public class ConsumeController {
     @PostMapping("/ConsumeOriginal")
     public Object consumeOriginal(@RequestBody Object record, @RequestParam(name = "mac", required = false) java.lang.String mac,
                                   @RequestParam(name = "xfPwd", required = false) java.lang.String xfPwd) {
-        log.info("[刷卡请求消费]-[{}]", JSONUtil.parseObj(record));
+        log.warn("[刷卡请求消费]-[{}]", JSONUtil.parseObj(record));
         return doRecordData(record, "requestConsume", mac, xfPwd);
     }
 
@@ -101,7 +101,7 @@ public class ConsumeController {
      */
     @PostMapping("/Consume")
     public Object uploadRecord(@RequestBody Object record, @RequestParam(name = "mac", required = false) java.lang.String mac) {
-        log.info("[消费机上传消费记录]-[{}]", JSONUtil.parseObj(record));
+        log.warn("[消费机上传消费记录]-[{}]", JSONUtil.parseObj(record));
         Object object = doRecordData(record, "uploadRecord", mac, "");
         JSONObject jsonObject = JSONUtil.parseObj(object);
 
@@ -166,10 +166,10 @@ public class ConsumeController {
         R<ErrorInfo> errorInfo;
         if (Objects.equals(type, "requestConsume")) {
             int recordType = bo.getRecordStatus().intValue();
-            if (ObjectUtil.equals(bo.getCreditType(), CreditTypeEnum.TERM_CONSUME.code()) && recordType == 364) {
-                // 如果是消费机请求消费,而且是正常消费记录将消费时间设置为当前时间,以防消费时时钟不对造成实际消费时间不正确
-                bo.setConsumeDate(DateUtil.date());
-            }
+            //if (ObjectUtil.equals(bo.getCreditType(), CreditTypeEnum.TERM_CONSUME.code()) && recordType == 364) {
+            //    // 如果是消费机请求消费,而且是正常消费记录将消费时间设置为当前时间,以防消费时时钟不对造成实际消费时间不正确
+            //    bo.setConsumeDate(DateUtil.date());
+            //}
             errorInfo = consumeBusiness.createOrder(bo, mac, xfPwd);
         } else if (Objects.equals(type, "uploadRecord")) {
             errorInfo = consumeBusiness.postOrder(bo, mac, xfPwd);

+ 34 - 1
ruoyi-server/ruoyi-server-consume/src/main/resources/logback-plus.xml

@@ -5,7 +5,7 @@
    <!-- 日志输出格式 -->
     <property name="console.log.pattern"
               value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
-
+    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/>
     <!-- 控制台输出 -->
     <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
         <encoder>
@@ -14,6 +14,38 @@
         </encoder>
     </appender>
 
+    <appender name="file_warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/warn.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/warn.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>WARN</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- info异步输出 -->
+    <appender name="async_warn" class="ch.qos.logback.classic.AsyncAppender">
+        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
+        <discardingThreshold>0</discardingThreshold>
+        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
+        <queueSize>512</queueSize>
+        <!-- 添加附加的appender,最多只能添加一个 -->
+        <appender-ref ref="file_warn"/>
+    </appender>
     <include resource="logback-common.xml" />
 
     <include resource="logback-logstash.xml" />
@@ -24,5 +56,6 @@
 	<!--系统操作日志-->
     <root level="info">
         <appender-ref ref="console" />
+        <appender-ref ref="async_warn" />
     </root>
 </configuration>