xiari 9 місяців тому
батько
коміт
117cc126c0

+ 2 - 0
ruoyi-server/ruoyi-server-hik/src/main/java/org/dromara/server/hik/event/domain/ConsumptionEventDetail.java

@@ -35,6 +35,8 @@ public class ConsumptionEventDetail implements Serializable {
     /*ro, opt, int, 需要纠错的流水号, desc:type为refund该字段有效,且必须返回*/
     private String mode;
     /*ro, req, enum, 消费模式, subType:string, [amount#金额,quota#定额,count#计次,setMeal#套餐,box#格口消费]*/
+    // 实际消费金额
+    private String actualPayment;
     private String totalPayment;
     /*ro, opt, string, 应付金额,
     desc:当交易类型为交易时表示交易金额、且mode为amount或quota或box时,该字段必填;当交易类型为纠错类型、且mode为amount或quota或setMeal时,该字段必填,并与纠错金额refundPayment结合使用,使用方法:平台对账户先加上纠错金额再减去应付金额。

+ 9 - 2
ruoyi-server/ruoyi-server-hik/src/main/java/org/dromara/server/hik/event/handler/ConsumptionEventHandler.java

@@ -68,7 +68,6 @@ public class ConsumptionEventHandler implements HikEventHandler {
             String reason = "";
             BigDecimal balance = updatedRemoteBo.getBalance();
             BigDecimal consumeMoney = updatedRemoteBo.getConsumeMoney();
-//            BigDecimal consumeMoney = new BigDecimal("10");
             String deptName =updatedRemoteBo.getDeptName();
             if (R.isError(errorInfo)) {
                 // 应答失败
@@ -116,9 +115,17 @@ public class ConsumptionEventHandler implements HikEventHandler {
     }
 
     private RemoteConsumeBo setParamBo(ConsumptionEventReceive receive, ConsumptionEventDetail consumptionEvent) {
+        String consumeMoney = consumptionEvent.getActualPayment();
+        if (TRANSACTION_PREPROCESSING_REQUEST.equals(consumptionEvent.getMinor())) {
+            consumeMoney = consumptionEvent.getTotalPayment();
+        }
+        // 如果是计次模式,金额就为0
+        if (ConsumeModeEnum.count.getCode().equals(consumptionEvent.getMode())) {
+            consumeMoney = "0";
+        }
         RemoteConsumeBo remoteBo = new RemoteConsumeBo();
         TransactionRecordEventHandler.setCommonFields(remoteBo, consumptionEvent.getEmployeeNoString(), consumptionEvent.getCardNo(),
-            receive.getDateTime(), consumptionEvent.getSerialNo(), consumptionEvent.getTotalPayment(), receive.getMacAddress());
+            receive.getDateTime(), consumptionEvent.getSerialNo(), consumeMoney, receive.getMacAddress());
         remoteBo.setCardNo(0L);
         remoteBo.setStatusFlag(4);
         remoteBo.setUseType(SystemUseTypeEnum.CONSUME.code());

+ 2 - 0
ruoyi-server/ruoyi-server-hik/src/main/java/org/dromara/server/hik/event/handler/HeatBeatHandler.java

@@ -60,6 +60,8 @@ public class HeatBeatHandler implements HikEventHandler {
             // 获取当前时间的前一天的时间
             LocalDateTime localDate = LocalDateTime.now();
             LocalDateTime minus = localDate.minus(1, ChronoUnit.DAYS);
+            // 设置 时分秒为00:00:00
+            minus = minus.with(LocalTime.of(0, 0, 0));
             // LocalDateTime 转 date
             Date date = Date.from(minus.atZone(ZoneId.systemDefault()).toInstant());
 //            System.err.println("minus: " + minus);

+ 34 - 9
ruoyi-server/ruoyi-server-hik/src/main/java/org/dromara/server/hik/event/handler/TransactionRecordEventHandler.java

@@ -17,6 +17,7 @@ import org.dromara.consume.api.domain.bo.RemoteResultDto;
 import org.dromara.server.hik.domain.bo.XfFailedRecordBo;
 import org.dromara.server.hik.domain.vo.XfConsumeDetailVo;
 import org.dromara.server.hik.domain.vo.XfTermVo;
+import org.dromara.server.hik.enums.ConsumeModeEnum;
 import org.dromara.server.hik.enums.ModeTypeEnum;
 import org.dromara.server.hik.event.HikEventHandler;
 import org.dromara.server.hik.event.domain.FileContent;
@@ -73,16 +74,16 @@ public class TransactionRecordEventHandler implements HikEventHandler {
             FileUtils.writeBytes(content, image_dir_path+fileName);
         }
 
-        BigDecimal balance = null;
+        BigDecimal balance = BigDecimal.ZERO;
         String actualPayment = transactionRecordEvent.getActualPayment();
         BigDecimal consumeMoney = BigDecimal.ZERO;
         if(StringUtils.isNotBlank(actualPayment)){
-            balance = new BigDecimal(actualPayment).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+            consumeMoney = new BigDecimal(actualPayment).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
         }
         // 这里只能应答成功,如果是业务异常(余额不足、脏数据等)失败,要存入表中,使用定时任务处理失败,所以即使失败的 也要回复成功
         // 如果是在线交易的,平台根据流水号判断当前交易记录事件是否为未处理事件,若为未处理事件,则平台进行处理并进行扣费;
         // 如果是离线交易记录事件,则平台进行处理并进行扣费;
-        RemoteConsumeBo remoteBo = getRemoteBo(transactionRecordEventReceive);
+        RemoteConsumeBo remoteBo = getRemoteBo(transactionRecordEventReceive,modeType);
         remoteBo.setTermNo(termNo);
         R<ErrorInfo> errorInfo = R.ok("处理成功");
         try  {
@@ -153,7 +154,7 @@ public class TransactionRecordEventHandler implements HikEventHandler {
     }
 
 
-    private RemoteConsumeBo getRemoteBo(TransactionRecordEventReceive info){
+    private RemoteConsumeBo getRemoteBo(TransactionRecordEventReceive info,String modeType){
         RemoteConsumeBo remoteBo = new RemoteConsumeBo();
         remoteBo.setStatusFlag(4);
         remoteBo.setCardNo(0L);
@@ -161,15 +162,27 @@ public class TransactionRecordEventHandler implements HikEventHandler {
         remoteBo.setRecordStatus(364L);
         remoteBo.setRecordId(0L);
 
+        String consumeMoney;
         TransactionRecordEventDetail recordEvent = info.getTransactionRecordEvent();
+        String mode = recordEvent.getMode();
+        if(ConsumeModeEnum.count.getCode().equals( mode)){
+            consumeMoney = "0";
+        }else{
+            // 离线消费则取 totalPayment,在线消费则取 actualPayment
+            if (ModeTypeEnum.offLine.getCode().equals(modeType)) {
+                consumeMoney = recordEvent.getTotalPayment();
+            }else{
+                consumeMoney = recordEvent.getActualPayment();
+            }
+        }
         setCommonFields(remoteBo, recordEvent.getEmployeeNoString(), recordEvent.getCardNo(), info.getDateTime(),
-            recordEvent.getSerialNo(), recordEvent.getTotalPayment(), info.getMacAddress());
+            recordEvent.getSerialNo(), consumeMoney, info.getMacAddress());
 
         return remoteBo;
     }
 
     static void setCommonFields(RemoteConsumeBo remoteBo, String employeeNoString, String cardNo2, Date dateTime2, Integer serialNo,
-                                String totalPayment, String macAddress) {
+                                String actualPayment, String macAddress) {
         remoteBo.setUserNo(Long.valueOf(employeeNoString));
         if(StringUtils.isNotBlank(cardNo2)){
             remoteBo.setFactoryId(Long.valueOf(cardNo2));
@@ -178,8 +191,8 @@ public class TransactionRecordEventHandler implements HikEventHandler {
         }
         remoteBo.setConsumeDate(dateTime2);
         remoteBo.setTermRecordId(Long.valueOf(serialNo));
-        if(StringUtils.isNotBlank(totalPayment)){
-            BigDecimal money = new BigDecimal(totalPayment).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
+        if(StringUtils.isNotBlank(actualPayment)){
+            BigDecimal money = new BigDecimal(actualPayment).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
             remoteBo.setConsumeMoney(money);
         }else{
             remoteBo.setConsumeMoney(BigDecimal.ZERO);
@@ -194,10 +207,22 @@ public class TransactionRecordEventHandler implements HikEventHandler {
         }
         XfFailedRecordBo bo = new XfFailedRecordBo();
         TransactionRecordEventDetail recordEvent = info.getTransactionRecordEvent();
+        String consumeMoney;
+        String mode = recordEvent.getMode();
+        if(ConsumeModeEnum.count.getCode().equals(mode)){
+            consumeMoney = "0";
+        }else{
+            // 离线消费则取 totalPayment,在线消费则取 actualPayment
+            if (ModeTypeEnum.offLine.getCode().equals(modeType)) {
+                consumeMoney = recordEvent.getTotalPayment();
+            }else{
+                consumeMoney = recordEvent.getActualPayment();
+            }
+        }
         bo.setUserNo(recordEvent.getEmployeeNoString());
         bo.setConsumeDate(info.getDateTime());
         bo.setTermRecordId(recordEvent.getSerialNo().toString());
-        bo.setConsumeMoney(recordEvent.getTotalPayment());
+        bo.setConsumeMoney(consumeMoney);
         bo.setTermMac(info.getMacAddress());
         if(termNo != null){
             bo.setTermNo(termNo.toString());