Jelajahi Sumber

Merge remote-tracking branch 'origin/master'

xiari 8 bulan lalu
induk
melakukan
d294830f18

+ 10 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteXfExceptionService.java

@@ -1,5 +1,8 @@
 package org.dromara.backstage.api;
 
+import org.dromara.backstage.api.domain.bo.RemoteXfExceptionBo;
+import org.dromara.common.core.domain.R;
+
 /**
  * 消费明细异常远程服务
  *
@@ -13,4 +16,11 @@ public interface RemoteXfExceptionService {
      * @param message 消费内容
      */
     void sendExceptionSms(String mobile, String message);
+
+    /**
+     * 提供给其它服务插入消费明细异常信息
+     * @param remoteBo 消费明细异常业务对象
+     * @return 插入结果
+     */
+    Boolean insertByRemoteBo(RemoteXfExceptionBo remoteBo);
 }

+ 115 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/bo/RemoteXfExceptionBo.java

@@ -0,0 +1,115 @@
+package org.dromara.backstage.api.domain.bo;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 消费明细异常业务对象 t_xf_exception
+ *
+ * @author LionLi
+ * @date 2025-09-15
+ */
+@Data
+@NoArgsConstructor
+public class RemoteXfExceptionBo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 8846217223745836309L;
+    /**
+     * 消费明细异常Id,主键
+     */
+    private Long exceptId;
+
+    /**
+     * 卡流水号
+     */
+    @NotNull(message = "卡流水号不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long cardNo;
+
+    /**
+     * 物理卡号
+     */
+    @NotNull(message = "物理卡号不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long factoryId;
+
+    /**
+     * 设备机号
+     */
+    @NotNull(message = "设备机号不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long termNo;
+
+    /**
+     * 机器流水号
+     */
+    @NotNull(message = "机器流水号不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long termRecordId;
+
+    /**
+     * 对应原始记录表中的record_Id
+     */
+    @NotNull(message = "对应原始记录表中的record_Id不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long recordId;
+
+    /**
+     * 人员Id
+     */
+    @NotNull(message = "人员Id不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long userId;
+
+    /**
+     * 学/工号
+     */
+    @NotBlank(message = "学/工号不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String userNumb;
+
+    /**
+     * 用户姓名
+     */
+    @NotBlank(message = "用户姓名不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String realName;
+
+    /**
+     * 消费日期
+     */
+    @NotNull(message = "消费日期不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Date consumeDate;
+
+    /**
+     * 消费金额
+     */
+    @NotNull(message = "消费金额不能为空", groups = {AddGroup.class, EditGroup.class})
+    private BigDecimal consumeMoney;
+
+    /**
+     * 产生异常的请求数据
+     */
+    @NotBlank(message = "产生异常的请求数据不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String requestData;
+
+    /**
+     * 异常说明
+     */
+    @NotBlank(message = "异常说明不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String exceptInfo;
+
+    /**
+     * 处理标志(0-未处理 1-已处理)
+     */
+    @NotBlank(message = "处理标志不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String status;
+
+    /**
+     * 处理说明
+     */
+    private String dealInfo;
+
+
+}

+ 3 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/XfException.java

@@ -4,6 +4,8 @@ import org.dromara.common.tenant.core.TenantEntity;
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 
@@ -77,7 +79,7 @@ public class XfException extends TenantEntity {
     /**
      * 消费金额
      */
-    private Long consumeMoney;
+    private BigDecimal consumeMoney;
 
     /**
      * 产生异常的请求数据

+ 2 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfExceptionBo.java

@@ -10,6 +10,7 @@ import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -86,7 +87,7 @@ public class XfExceptionBo extends BaseEntity {
      * 消费金额
      */
     @NotNull(message = "消费金额不能为空", groups = {AddGroup.class, EditGroup.class})
-    private Long consumeMoney;
+    private BigDecimal consumeMoney;
 
     /**
      * 产生异常的请求数据

+ 31 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/convert/RemoteBoConvert.java

@@ -0,0 +1,31 @@
+package org.dromara.backstage.consumption.domain.convert;
+
+import org.dromara.backstage.api.domain.bo.RemoteXfExceptionBo;
+import org.dromara.backstage.api.domain.vo.RemoteCardVo;
+import org.dromara.backstage.api.domain.vo.RemoteMealTypeVo;
+import org.dromara.backstage.api.domain.vo.RemoteUserAccountVo;
+import org.dromara.backstage.consumption.domain.bo.XfConsumeDetailOriginalBo;
+import org.dromara.backstage.consumption.domain.bo.XfExceptionBo;
+import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailOriginalVo;
+import org.dromara.backstage.consumption.domain.vo.XfTermVo;
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.MappingTarget;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+/**
+ * 消费业务对象转换类
+ * <p>
+ *
+ * @author luoyibo
+ * @version 2.2.0
+ * @date 2025-06-06
+ * @since JDK17
+ */
+@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface RemoteBoConvert {
+    RemoteBoConvert INSTANCE = Mappers.getMapper(RemoteBoConvert.class);
+
+    void convertXfExceptionToBo(@MappingTarget XfExceptionBo target, RemoteXfExceptionBo source);
+}

+ 2 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/vo/XfExceptionVo.java

@@ -1,5 +1,6 @@
 package org.dromara.backstage.consumption.domain.vo;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.dromara.backstage.consumption.domain.XfException;
@@ -58,7 +59,7 @@ public class XfExceptionVo implements Serializable {
      * 消费金额
      */
     @ExcelProperty(value = "消费金额")
-    private Long consumeMoney;
+    private BigDecimal consumeMoney;
 
     /**
      * 产生异常的请求数据

+ 12 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/dubbo/RemoteXfExceptionServiceImpl.java

@@ -3,7 +3,11 @@ package org.dromara.backstage.consumption.dubbo;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.dromara.backstage.api.RemoteXfExceptionService;
+import org.dromara.backstage.api.domain.bo.RemoteXfExceptionBo;
 import org.dromara.backstage.business.self.SelfBusiness;
+import org.dromara.backstage.consumption.domain.bo.XfExceptionBo;
+import org.dromara.backstage.consumption.domain.convert.RemoteBoConvert;
+import org.dromara.backstage.consumption.service.IXfExceptionService;
 import org.springframework.stereotype.Service;
 
 /**
@@ -21,9 +25,17 @@ import org.springframework.stereotype.Service;
 @DubboService
 public class RemoteXfExceptionServiceImpl implements RemoteXfExceptionService {
     private final SelfBusiness selfBusiness;
+    private final IXfExceptionService xfExceptionService;
 
     @Override
     public void sendExceptionSms(String mobile, String message) {
         selfBusiness.sendSms(mobile, message);
     }
+
+    @Override
+    public Boolean insertByRemoteBo(RemoteXfExceptionBo remoteBo) {
+        XfExceptionBo bo = new XfExceptionBo();
+        RemoteBoConvert.INSTANCE.convertXfExceptionToBo(bo,remoteBo);
+        return xfExceptionService.insertByBo(bo);
+    }
 }

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

@@ -7,6 +7,9 @@ import cn.hutool.json.JSONUtil;
 import lombok.Data;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.backstage.api.RemoteXfExceptionService;
+import org.dromara.backstage.api.domain.bo.RemoteXfExceptionBo;
 import org.dromara.backstage.api.domain.vo.RemoteCardVo;
 import org.dromara.backstage.api.domain.vo.RemoteMealTypeVo;
 import org.dromara.backstage.api.domain.vo.RemoteUserAccountVo;
@@ -29,6 +32,7 @@ import org.dromara.server.consume.check.ConsumeUploadCheck;
 import org.dromara.server.consume.domain.vo.PtBagVo;
 import org.dromara.server.consume.domain.vo.XfCardLimitedVo;
 import org.dromara.server.consume.domain.vo.XfTermVo;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
@@ -50,12 +54,17 @@ import java.util.concurrent.atomic.AtomicInteger;
 @Service
 @RequiredArgsConstructor
 public class ConsumeBusiness {
+    @Value("${sms.swdx.phone}")
+    private String exSendPhone;
+
     private final CommonCheck commonCheck;
     private final ConsumeRequestCheck requestCheck;
     private final ConsumeUploadCheck uploadCheck;
     private final BaseBusiness baseBusiness;
     private final TermBusiness termBusiness;
 
+    @DubboReference
+    private final RemoteXfExceptionService remoteXfExceptionService;
     /**
      * 请求消费
      *
@@ -218,6 +227,7 @@ public class ConsumeBusiness {
     @Async
     public void postOrderAsync(ConsumptionBo bo, String mac, String xfPwd) {
         R<ErrorInfo> result = null;
+        //setConsumeDetailException(bo, "消费明细异常测试");
         for (int i = 0; i < 3; i++) {
             result = SpringUtils.getAopProxy(this).postOrder(bo, mac, xfPwd);
             if (R.isSuccess(result)) {
@@ -227,10 +237,31 @@ public class ConsumeBusiness {
         }
         if (R.isError(result)) {
             log.info("[上传交易异步处理尝试3次失败,需要手工处理]-[{}]-[{}]", JSONUtil.toJsonStr(bo), JSONUtil.toJsonStr(result.getData()));
+            setConsumeDetailException(bo, JSONUtil.toJsonStr(result.getData()));
         }
         log.info("[上传交易异步处理完成]");
     }
 
+    private void setConsumeDetailException(ConsumptionBo bo,String message){
+        RemoteXfExceptionBo remoteBo = new RemoteXfExceptionBo();
+        remoteBo.setCardNo(bo.getCardNo());
+        remoteBo.setFactoryId(bo.getFactoryId());
+        remoteBo.setTermNo(bo.getTermNo());
+        remoteBo.setTermRecordId(bo.getTermRecordId());
+        remoteBo.setRecordId(bo.getRecordId());
+        remoteBo.setUserId(bo.getUserId());
+        remoteBo.setUserNumb(bo.getUserNumb());
+        remoteBo.setRealName(bo.getRealName());
+        remoteBo.setConsumeDate(bo.getConsumeDate());
+        remoteBo.setConsumeMoney(bo.getConsumeMoney());
+        remoteBo.setRequestData(JsonUtils.toJsonString(bo));
+        remoteBo.setExceptInfo(message);
+        remoteBo.setStatus("0");
+        remoteBo.setDealInfo("");
+
+        remoteXfExceptionService.insertByRemoteBo(remoteBo);
+        remoteXfExceptionService.sendExceptionSms(exSendPhone,message);
+    }
     //region 原始消费记录对账
 
     /**