Эх сурвалжийг харах

消费设备、卡务操作数据双向同步功能

baiyun 1 жил өмнө
parent
commit
f47b79b05c
16 өөрчлөгдсөн 1307 нэмэгдсэн , 6 устгасан
  1. 13 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteBagService.java
  2. 47 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemotePtXfTermService.java
  3. 117 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/bo/RemotePurseInOutBo.java
  4. 339 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/bo/RemoteXfTermBo.java
  5. 332 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/bo/RemoteXfTermParamBo.java
  6. 9 1
      ruoyi-common/ruoyi-common-message/src/main/java/org/dromara/common/message/kafka/constant/MessageEventTypeConstants.java
  7. 46 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/dubbo/RemoteXfTermServiceImpl.java
  8. 99 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/dubbo/RemoteBagServiceImpl.java
  9. 65 0
      ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/yktOperation/SyncRemotePXfTermService.java
  10. 127 0
      ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/yktOperation/SyncRemotePtCardCenterService.java
  11. 2 0
      ruoyi-server/ruoyi-server-base/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  12. 1 1
      ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/event/kafka/impl/yktOperation/PtAreaEventStrategyImpl.java
  13. 62 0
      ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/event/kafka/impl/yktOperation/PtCardCenterEventStrategyImpl.java
  14. 1 2
      ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/event/kafka/impl/yktOperation/PtRoomEventStrategyImpl.java
  15. 1 2
      ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/event/kafka/impl/yktOperation/PtUserAccountEventStrategyImpl.java
  16. 46 0
      ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/event/kafka/impl/yktOperation/PtXfTermEventStrategyImpl.java

+ 13 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteBagService.java

@@ -1,5 +1,9 @@
 package org.dromara.backstage.api;
 
+import org.dromara.backstage.api.domain.bo.RemoteConsumptionBo;
+import org.dromara.backstage.api.domain.bo.RemotePurseInOutBo;
+import org.dromara.common.core.domain.R;
+
 /**
  * name: RemoteBagService
  * package: org.dromara.backstage.api
@@ -18,4 +22,13 @@ public interface RemoteBagService {
      * @return 余额串,英文逗号分隔
      */
     String selectAccountBalanceByIds(String userIds);
+
+    Boolean recharge(RemotePurseInOutBo bo);
+    Boolean refund(RemotePurseInOutBo bo);
+    Boolean createErrFillRecord(RemoteConsumptionBo bo);
+    Boolean batchRecharge(RemotePurseInOutBo bo, Long[] userIds);
+    Boolean batchRefund(RemotePurseInOutBo bo, Long[] userIds);
+    Boolean batchSetBalance(RemotePurseInOutBo bo, Long[] userIds);
+    Boolean lockCard(Long cardId);
+    Boolean unlockCard(Long cardId);
 }

+ 47 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemotePtXfTermService.java

@@ -0,0 +1,47 @@
+package org.dromara.backstage.api;
+
+import org.dromara.backstage.api.domain.bo.RemoteXfTermBo;
+import org.dromara.backstage.api.domain.bo.RemoteXfTermParamBo;
+
+import java.util.Collection;
+
+/**
+ * 消费设备服务
+ *
+ * @author Lion Li
+ */
+public interface RemotePtXfTermService {
+
+    /**
+     * 新增设备
+     * @param bo
+     * @return
+     */
+    Boolean insertByBo(RemoteXfTermBo bo);
+
+    /**
+     * 修改设备
+     * @param bo
+     * @return
+     * @throws Exception
+     */
+    Boolean updateByBo(RemoteXfTermBo bo) throws Exception;
+
+    /**
+     * 删除设备
+     * @param ids
+     * @param isValid
+     * @return
+     * @throws Exception
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) throws Exception;
+
+    /**
+     * 修改设备参数
+     * @param bo
+     * @return
+     * @throws Exception
+     */
+    Boolean editParam(RemoteXfTermParamBo bo);
+
+}

+ 117 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/bo/RemotePurseInOutBo.java

@@ -0,0 +1,117 @@
+package org.dromara.backstage.api.domain.bo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.dromara.common.core.enums.BalanceUpdateEnum;
+import org.dromara.common.core.enums.CreditTypeEnum;
+import org.dromara.common.core.enums.SystemUseTypeEnum;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * description: 资金收支业务对象
+ */
+@Data
+@NoArgsConstructor
+public class RemotePurseInOutBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 5830503618923729067L;
+    /**
+     * 资金收支入账所属账户Id
+     */
+    private Long userId;
+
+    /**
+     * 资金收支入账钱包代码
+     */
+    private String bagCode;
+
+    /**
+     * 钱包余额
+     */
+    private BigDecimal balance;
+    /**
+     * 资金来源
+     */
+    private String payStyle;
+
+    /**
+     * 是否收管理费
+     */
+    private String takeCommission;
+
+    /**
+     * 资金收支入账金额
+     */
+    private BigDecimal receiptMoney;
+
+    /**
+     * 资金收支入账对账户余额的操作类型
+     */
+    private BalanceUpdateEnum operationMode;
+    /**
+     * 交易类型
+     */
+    private CreditTypeEnum creditType;
+    /**
+     * 资金收支入账对应卡片Id,可能为空
+     */
+    private Long cardId;
+
+    /**
+     * 资金收支入账对应卡片类别Id,可能为空
+     */
+    private Long cardTypeId;
+    /**
+     * 资金收支入账操作的设备机号,可能为空
+     */
+    private Long termNo;
+    /**
+     * 机器流水号,一般是消费机上传数据时会有此值
+     */
+    private Long termRecordId;
+    /**
+     * 资金收支入账的工作站编号,可能为空
+     */
+    private Long stationId;
+    /**
+     * 操作员Id
+     */
+    private Long operatorId;
+
+    /**
+     * 操作员姓名
+     */
+    private String operatorName;
+    /**
+     * 系统使用类型
+     */
+    private SystemUseTypeEnum useType;
+
+    /**
+     * 原始记录Id
+     */
+    private String originalId;
+    /**
+     * 入账记录Id
+     */
+    private String creditId;
+    /**
+     * 校园端流水号,一般使用第三方支付会有此编号
+     * 如:微信充值、微信扫码充值、银行圈存等,会先生成一笔请求支付的订单,支付成功后才会有一卡通系统的资金收支入账
+     *      并通过这个流水号确认订单入账的情况及对账
+     *
+     */
+    private String customerSn;
+
+    /**
+     * 收款方流水号,一般使用第三方支付成功后会有此编号
+     * 如:微信充值、微信扫码充值、银行圈存等,会先生成一笔请求支付的订单,并收收款方返回收款成功后有此数据,
+     *      用来和第三方收款方对账
+     *
+     */
+    private String PayeeSn;
+}

+ 339 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/bo/RemoteXfTermBo.java

@@ -0,0 +1,339 @@
+package org.dromara.backstage.api.domain.bo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 消费设备业务对象 t_xf_term
+ *
+ * @author bing
+ * @date 2024-08-21
+ */
+@Data
+@NoArgsConstructor
+public class RemoteXfTermBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+    /**
+     * 设备Id,主键
+     */
+    private Long termId;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+    private String termName;
+
+    /**
+     * 所属餐厅Id 所属餐厅不能为空
+     */
+    private Long roomId;
+
+    /**
+     * 结算账户Id
+     */
+    private Long accountId;
+
+    /**
+     * 设备类型,见XF_TermType字典类型
+     */
+    private String termType;
+
+    /**
+     * 设备二维码
+     */
+    private String qrCode;
+
+    /**
+     * 工作站Id
+     */
+    private Long stationId;
+
+    /**
+     * 扣费类型,见XF_ConsumeType字典类型
+     */
+    private String consumeType;
+
+    /**
+     * 是否自动下载参数,见sys_yew_no字典项
+     */
+    private String autoDown;
+
+    /**
+     * 应用系统,见YYXT数据字典类别
+     */
+    private String useType;
+
+    /**
+     * 允许使用的卡类
+     */
+    private Long cardType;
+
+    /**
+     * 设备IP
+     */
+    private String termIp;
+
+    /**
+     * 设备MAC地址
+     */
+    private String termMac;
+
+    /**
+     * 设备通讯端口
+     */
+    private Long commPort;
+
+    /**
+     * 子网掩码
+     */
+    private String mask;
+
+    /**
+     * 服务器IP
+     */
+    private String serverIp;
+
+    /**
+     * 服务器端口
+     */
+    private Long serverPort;
+
+    /**
+     * 网关IP
+     */
+    private String gatewayIp;
+
+    /**
+     * 心跳间隔,以秒为单位
+     */
+    private Long beatInterval;
+
+    /**
+     * 通讯超时时间,以100毫秒为单位
+     */
+    private Long timeout;
+
+    /**
+     * 允许脱机时间
+     */
+    private Long offlineTime;
+
+    /**
+     * 高级参数
+     */
+    private String advParam;
+
+    /**
+     * 设备参数
+     */
+    private String posParam;
+
+    /**
+     * 费率参数
+     */
+    private String rateParam;
+
+    /**
+     * 消费工作模式,见XF_WorkMode字典类别
+     */
+    private String workMode;
+
+    /**
+     * 开机模式,0-不需要营业员开机,1-需要营业员开机
+     */
+    private String openMode;
+
+    /**
+     * 卡上最大金额
+     */
+    private BigDecimal maxCardMoney;
+
+    /**
+     * 定值消费金额
+     */
+    private BigDecimal constantValue;
+
+    /**
+     * 编号0代表的金额
+     */
+    private BigDecimal rationZero;
+
+    /**
+     * 编号1代表的金额
+     */
+    private BigDecimal rationOne;
+
+    /**
+     * 编号2代表的金额
+     */
+    private BigDecimal rationTwo;
+
+    /**
+     * 编号3代表的金额
+     */
+    private BigDecimal rationThree;
+
+    /**
+     * 编号4代表的金额
+     */
+    private BigDecimal rationFour;
+
+    /**
+     * 编号5代表的金额
+     */
+    private BigDecimal rationFive;
+
+    /**
+     * 编号6代表的金额
+     */
+    private BigDecimal rationSix;
+
+    /**
+     * 编号7代表的金额
+     */
+    private BigDecimal rationSeven;
+
+    /**
+     * 编号8代表的金额
+     */
+    private BigDecimal rationEight;
+
+    /**
+     * 编号9代表的金额
+     */
+    private BigDecimal rationNine;
+
+    /**
+     * 每天最大消费次数,0-不限
+     */
+    private Long dayCount;
+
+    /**
+     * 每天最大消费金额
+     */
+    private Long dayMoney;
+
+    /**
+     * 每餐最大消费次数,0-不限
+     */
+    private BigDecimal mealCount;
+
+    /**
+     * 单次最大消费金额
+     */
+    private BigDecimal singleMoney;
+
+    /**
+     * 早餐消费金额
+     */
+    private BigDecimal breakfastMoney;
+
+    /**
+     * 午餐消费金额
+     */
+    private BigDecimal lunchMoney;
+
+    /**
+     * 晚餐消费金额
+     */
+    private BigDecimal supperMoney;
+
+    /**
+     * 夜宵消费金额
+     */
+    private BigDecimal nightMoney;
+
+    /**
+     * 早餐开始时间
+     */
+    private Long breakfastBegin;
+
+    /**
+     * 早餐结束时间
+     */
+    private Long breakfastEnd;
+
+    /**
+     * 午餐开始时间
+     */
+    private Long lunchBegin;
+
+    /**
+     * 午餐结束时间
+     */
+    private Long lunchEnd;
+
+    /**
+     * 晚餐开始时间
+     */
+    private Long supperBegin;
+
+    /**
+     * 晚餐结束时间
+     */
+    private Long supperEnd;
+
+    /**
+     * 宵夜开始时间
+     */
+    private Long nightBegin;
+
+    /**
+     * 宵夜结束时间
+     */
+    private Long nightEnd;
+
+    /**
+     * 两次刷卡间隔,0-不限制
+     */
+    private Long swipeInterval;
+
+    /**
+     * 是否启用卡片有效限制,0-禁用 1-启用
+     */
+    private String termValidity;
+
+    /**
+     * 设备记录流水号
+     */
+    private Long recordId;
+
+    /**
+     * 数据上传时间
+     */
+    private Date uploadTime;
+
+    /**
+     * 黑名单下载时间
+     */
+    private Date blackDownTime;
+
+    /**
+     * 最后校时时间
+     */
+    private Date lastCheck;
+
+    /**
+     * 重启时间
+     */
+    private String rebootTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 332 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/bo/RemoteXfTermParamBo.java

@@ -0,0 +1,332 @@
+package org.dromara.backstage.api.domain.bo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 消费设备参数编辑对象
+ *
+ * @author bing
+ * @date 2024-08-21
+ */
+@Data
+@NoArgsConstructor
+public class RemoteXfTermParamBo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    /**
+     * 设备Id,主键
+     */
+    private Long termId;
+
+    /**
+     * 设备机号
+     */
+//    private Long termNo;
+
+    /**
+     * 设备名称
+     */
+//    private String termName;
+
+    /**
+     * 所属餐厅Id
+     */
+//    private Long roomId;
+
+    /**
+     * 结算账户Id
+     */
+//    private Long accountId;
+
+    /**
+     * 设备类型,见XF_TermType字典类型
+     */
+//    private String termType;
+
+    /**
+     * 设备二维码
+     */
+//    private String qrCode;
+
+    /**
+     * 工作站Id
+     */
+//    private Long stationId;
+
+    /**
+     * 扣费类型,见XF_ConsumeType字典类型
+     */
+//    private String consumeType;
+
+    /**
+     * 是否自动下载参数,见sys_yew_no字典项
+     */
+//    private String autoDown;
+
+    /**
+     * 应用系统,见YYXT数据字典类别
+     */
+//    private String useType;
+
+    /**
+     * 允许使用的卡类
+     */
+//    @NotNull(message = "允许使用的卡类不能为空")
+    private Long cardType;
+
+    /**
+     * 设备IP
+     */
+//    private String termIp;
+
+    /**
+     * 设备MAC地址
+     */
+//    private String termMac;
+
+    /**
+     * 设备通讯端口
+     */
+//    private Long commPort;
+
+    /**
+     * 子网掩码
+     */
+//    private String mask;
+
+    /**
+     * 服务器IP
+     */
+//    private String serverIp;
+
+    /**
+     * 服务器端口
+     */
+//    private Long serverPort;
+
+    /**
+     * 网关IP
+     */
+//    private String gatewayIp;
+
+    /**
+     * 心跳间隔,以秒为单位
+     */
+//    private Long beatInterval;
+
+    /**
+     * 通讯超时时间,以100毫秒为单位
+     */
+//    private Long timeout;
+
+    /**
+     * 允许脱机时间
+     */
+//    private Long offlineTime;
+
+    /**
+     * 高级参数
+     */
+//    private String advParam;
+
+    /**
+     * 设备参数
+     */
+//    private String posParam;
+
+    /**
+     * 费率参数
+     */
+//    private String rateParam;
+
+    /**
+     * 消费工作模式,见XF_WorkMode字典类别
+     */
+    private String workMode;
+
+    /**
+     * 开机模式,0-不需要营业员开机,1-需要营业员开机
+     */
+    private String openMode;
+
+    /**
+     * 卡上最大金额
+     */
+    private BigDecimal maxCardMoney;
+
+    /**
+     * 定值消费金额
+     */
+    private BigDecimal constantValue;
+
+    /**
+     * 编号0代表的金额
+     */
+    private BigDecimal rationZero;
+
+    /**
+     * 编号1代表的金额
+     */
+    private BigDecimal rationOne;
+
+    /**
+     * 编号2代表的金额
+     */
+    private BigDecimal rationTwo;
+
+    /**
+     * 编号3代表的金额
+     */
+    private BigDecimal rationThree;
+
+    /**
+     * 编号4代表的金额
+     */
+    private BigDecimal rationFour;
+
+    /**
+     * 编号5代表的金额
+     */
+    private BigDecimal rationFive;
+
+    /**
+     * 编号6代表的金额
+     */
+    private BigDecimal rationSix;
+
+    /**
+     * 编号7代表的金额
+     */
+    private BigDecimal rationSeven;
+
+    /**
+     * 编号8代表的金额
+     */
+    private BigDecimal rationEight;
+
+    /**
+     * 编号9代表的金额
+     */
+    private BigDecimal rationNine;
+
+    /**
+     * 每天最大消费次数,0-不限
+     */
+    private Long dayCount;
+
+    /**
+     * 每天最大消费金额
+     */
+    private BigDecimal dayMoney;
+
+    /**
+     * 每餐最大消费次数,0-不限
+     */
+    private Long mealCount;
+
+    /**
+     * 单次最大消费金额
+     */
+    private BigDecimal singleMoney;
+
+    /**
+     * 早餐消费金额
+     */
+    private BigDecimal breakfastMoney;
+
+    /**
+     * 午餐消费金额
+     */
+    private BigDecimal lunchMoney;
+
+    /**
+     * 晚餐消费金额
+     */
+    private BigDecimal supperMoney;
+
+    /**
+     * 夜宵消费金额
+     */
+    private BigDecimal nightMoney;
+
+    /**
+     * 早餐开始时间
+     */
+    private Long breakfastBegin;
+
+    /**
+     * 早餐结束时间
+     */
+    private Long breakfastEnd;
+
+    /**
+     * 午餐开始时间
+     */
+    private Long lunchBegin;
+
+    /**
+     * 午餐结束时间
+     */
+    private Long lunchEnd;
+
+    /**
+     * 晚餐开始时间
+     */
+    private Long supperBegin;
+
+    /**
+     * 晚餐结束时间
+     */
+    private Long suppeEnd;
+
+    /**
+     * 宵夜开始时间
+     */
+    private Long nightBegin;
+
+    /**
+     * 宵夜结束时间
+     */
+    private Long nightEnd;
+
+    /**
+     * 两次刷卡间隔,0-不限制
+     */
+    private Long swipeInterval;
+
+    /**
+     * 是否启用卡片有效限制,0-禁用 1-启用
+     */
+    private String termValidity;
+
+    /**
+     * 设备记录流水号
+     */
+//    private Long recordId;
+
+    /**
+     * 数据上传时间
+     */
+//    private Date uploadTime;
+
+    /**
+     * 黑名单下载时间
+     */
+//    private Date blackDownTime;
+
+    /**
+     * 最后校时时间
+     */
+//    private Date lastCheck;
+
+    /**
+     * 重启时间
+     */
+    private String rebootTime;
+
+
+}

+ 9 - 1
ruoyi-common/ruoyi-common-message/src/main/java/org/dromara/common/message/kafka/constant/MessageEventTypeConstants.java

@@ -82,6 +82,10 @@ public class MessageEventTypeConstants {
      * 卡务操作能模块标识
      */
     public static final String CARD_CENTER_SENDER = "YKT_109";
+    /**
+     * 卡务操作能模块标识
+     */
+    public static final String XF_TERM_SENDER = "YKT_112";
     /** 系统参数新增 */
     public static final String	ptParameter_ADD = "YKT_101_ADD";
     /** 系统参数修改 */
@@ -145,10 +149,14 @@ public class MessageEventTypeConstants {
     /** 卡务中心解挂 */
     public static final String	ptCard_CARD_UNLOCK = "YKT_109_UNLOCK";
     public static final String	subsidy_EDIT = "YKT_109_EDIT";
+    /** 消费设备新增 */
     public static final String	xfTerm_ADD = "YKT_112_ADD";
+    /** 消费设备修改 */
     public static final String	xfTerm_EDIT = "YKT_112_EDIT";
+    /** 消费设备删除 */
     public static final String	xfTerm_REMOVE = "YKT_112_REMOVE";
-    public static final String	xfTerm_param_EDIT = "YKT_113_EDIT";
+    /** 消费设备参数修改 */
+    public static final String	xfTerm_param_EDIT = "YKT_112_PARAMETER_EDIT";
     public static final String	xfDiscount_ADD = "YKT_114_ADD";
     public static final String	xfDiscount_EDIT = "YKT_114_EDIT";
     public static final String	xfDiscount_REMOVE = "YKT_114_REMOVE";

+ 46 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/dubbo/RemoteXfTermServiceImpl.java

@@ -0,0 +1,46 @@
+package org.dromara.backstage.consumption.dubbo;
+
+import cn.hutool.core.bean.BeanUtil;
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.backstage.api.RemotePtXfTermService;
+import org.dromara.backstage.api.domain.bo.RemoteXfTermBo;
+import org.dromara.backstage.api.domain.bo.RemoteXfTermParamBo;
+import org.dromara.backstage.consumption.domain.bo.XfTermBo;
+import org.dromara.backstage.consumption.domain.bo.XfTermParamBo;
+import org.dromara.backstage.consumption.service.IXfTermService;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+
+/**
+ * @author Hz
+ * @date 2024/11/4
+ * @description
+ */
+
+@RequiredArgsConstructor
+@Service
+@DubboService
+public class RemoteXfTermServiceImpl implements RemotePtXfTermService {
+    private final IXfTermService xfTermService;
+    @Override
+    public Boolean insertByBo(RemoteXfTermBo bo) {
+        return xfTermService.insertByBo(BeanUtil.copyProperties(bo, XfTermBo.class));
+    }
+
+    @Override
+    public Boolean updateByBo(RemoteXfTermBo bo) throws Exception {
+        return xfTermService.updateByBo(BeanUtil.copyProperties(bo, XfTermBo.class));
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) throws Exception {
+        return xfTermService.deleteWithValidByIds(ids,isValid);
+    }
+
+    @Override
+    public Boolean editParam(RemoteXfTermParamBo bo) {
+        return xfTermService.updateParamByBo(BeanUtil.copyProperties(bo, XfTermParamBo.class));
+    }
+}

+ 99 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/dubbo/RemoteBagServiceImpl.java

@@ -1,11 +1,25 @@
 package org.dromara.backstage.payment.dubbo;
 
+import cn.hutool.core.bean.BeanUtil;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.dromara.backstage.api.RemoteBagService;
+import org.dromara.backstage.api.domain.bo.RemoteConsumptionBo;
+import org.dromara.backstage.api.domain.bo.RemotePurseInOutBo;
+import org.dromara.backstage.business.errfill.ErrFillBusiness;
+import org.dromara.backstage.business.payments.PayOrderBusiness;
+import org.dromara.backstage.cardCenter.service.IPtCardService;
+import org.dromara.backstage.consumption.domain.bo.ConsumptionBo;
+import org.dromara.backstage.payment.domain.bo.PtBagBo;
+import org.dromara.backstage.payment.domain.bo.PurseInOutBo;
 import org.dromara.backstage.payment.service.IPtBagService;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.enums.SystemUseTypeEnum;
 import org.springframework.stereotype.Service;
 
+import java.util.Arrays;
+
 /**
  * name: RemoteBagServiceImpl
  * package: org.dromara.backstage.dubbo
@@ -19,10 +33,95 @@ import org.springframework.stereotype.Service;
 @RequiredArgsConstructor
 @Service
 @DubboService
+@Slf4j
 public class RemoteBagServiceImpl implements RemoteBagService {
     private final IPtBagService bagService;
+    private final PayOrderBusiness payOrderBusiness;
+    private final ErrFillBusiness errFillBusiness;
+    private final IPtCardService ptCardService;
     @Override
     public String selectAccountBalanceByIds(String userIds) {
         return bagService.selectAccountBalanceByIds(userIds);
     }
+
+    @Override
+    public Boolean recharge(RemotePurseInOutBo bo) {
+        return R.isSuccess(payOrderBusiness.recharge(BeanUtil.copyProperties(bo, PurseInOutBo.class)));
+    }
+
+    @Override
+    public Boolean refund(RemotePurseInOutBo bo) {
+        return R.isSuccess(payOrderBusiness.refund(BeanUtil.copyProperties(bo, PurseInOutBo.class)));
+    }
+
+    @Override
+    public Boolean createErrFillRecord(RemoteConsumptionBo bo) {
+        bo.setUseType(SystemUseTypeEnum.CONSUME);
+        return null != errFillBusiness.createErrFillRecord(BeanUtil.copyProperties(bo, ConsumptionBo.class));
+    }
+
+    @Override
+    public Boolean batchRecharge(RemotePurseInOutBo bo, Long[] userIds) {
+        StringBuffer errIds = new StringBuffer();
+        boolean flag = true;
+        bo.setUseType(SystemUseTypeEnum.CONSUME);
+        for(Long userId : userIds) {
+            bo.setUserId(userId);
+            if(R.isError(payOrderBusiness.recharge(BeanUtil.copyProperties(bo, PurseInOutBo.class)))){
+                flag = false;
+                errIds.append(userId).append(",");
+            }
+        }
+        if(!flag){
+            log.error("账户批量充值失败,失败用户ID:{}", Arrays.toString(userIds));
+        }
+        return flag;
+    }
+
+    @Override
+    public Boolean batchRefund(RemotePurseInOutBo bo, Long[] userIds) {
+        StringBuffer errIds = new StringBuffer();
+        boolean flag = true;
+        bo.setUseType(SystemUseTypeEnum.CONSUME);
+        for(Long userId : userIds) {
+            bo.setUserId(userId);
+            if(R.isError(payOrderBusiness.refund(BeanUtil.copyProperties(bo, PurseInOutBo.class)))){
+                flag = false;
+                errIds.append(userId).append(",");
+            }
+        }
+        if(!flag){
+            log.error("账户批量退款失败,失败用户ID:{}", Arrays.toString(userIds));
+        }
+        return flag;
+    }
+
+    @Override
+    public Boolean batchSetBalance(RemotePurseInOutBo bo, Long[] userIds) {
+        StringBuffer errIds = new StringBuffer();
+        boolean flag = true;
+        bo.setUseType(SystemUseTypeEnum.CONSUME);
+        for(Long userId : userIds) {
+            bo.setUserId(userId);
+            if(null == bagService.updateBalanceByBo(BeanUtil.copyProperties(bo, PtBagBo.class))){
+                flag = false;
+                errIds.append(userId).append(",");
+            }
+        }
+        if(!flag){
+            log.error("账户批量设置余额失败,失败用户ID:{}", Arrays.toString(userIds));
+        }
+        return flag;
+    }
+
+    @Override
+    public Boolean lockCard(Long cardId) {
+        return ptCardService.lockCard(cardId);
+    }
+
+    @Override
+    public Boolean unlockCard(Long cardId) {
+        return ptCardService.unlockCard(cardId);
+    }
+
 }

+ 65 - 0
ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/yktOperation/SyncRemotePXfTermService.java

@@ -0,0 +1,65 @@
+package org.dromara.server.base.service.yktOperation;
+
+import cn.hutool.json.JSONUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.backstage.api.RemotePtXfTermService;
+import org.dromara.backstage.api.domain.bo.RemoteXfTermBo;
+import org.dromara.backstage.api.domain.bo.RemoteXfTermParamBo;
+import org.dromara.common.core.exception.ServiceException;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+
+/**
+ * 消费设备同步
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class SyncRemotePXfTermService {
+
+    @DubboReference
+    private final RemotePtXfTermService xfTermService;
+
+    /**
+     * 远程调用系统参数新增
+     * @param msg
+     */
+    public void addPtXfTerm(Object msg) {
+        boolean flag = xfTermService.insertByBo(JSONUtil.parseObj(msg).toBean(RemoteXfTermBo.class));
+        if (!flag){
+            throw new ServiceException("消费设备新增失败");
+        }
+    }
+
+    /**
+     * 远程调用系统参数修改
+     * @param msg
+     */
+    public void editPtXfTerm(Object msg) throws Exception{
+        boolean flag = xfTermService.updateByBo(JSONUtil.parseObj(msg).toBean(RemoteXfTermBo.class));
+        if (!flag){
+            throw new ServiceException("消费设备修改失败");
+        }
+    }
+
+    /**
+     * 远程调用系统参数删除
+     * @param msg
+     */
+    public void delPtXfTerm(Object msg) throws Exception{
+        Collection<Long> ids = JSONUtil.parseArray(msg).toBean(Collection.class);
+        boolean flag = xfTermService.deleteWithValidByIds(ids,false);
+        if (!flag){
+            throw new ServiceException("区域删除失败");
+        }
+    }
+    public void editParam(Object msg) throws ServiceException{
+        boolean flag = xfTermService.editParam(JSONUtil.parseObj(msg).toBean(RemoteXfTermParamBo.class));
+        if (!flag){
+            throw new ServiceException("消费设备参数修改失败");
+        }
+    }
+}

+ 127 - 0
ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/yktOperation/SyncRemotePtCardCenterService.java

@@ -0,0 +1,127 @@
+package org.dromara.server.base.service.yktOperation;
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.backstage.api.RemoteBagService;
+import org.dromara.backstage.api.RemoteMealTypeService;
+import org.dromara.backstage.api.domain.bo.RemoteConsumptionBo;
+import org.dromara.backstage.api.domain.bo.RemotePtMealTypeBo;
+import org.dromara.backstage.api.domain.bo.RemotePurseInOutBo;
+import org.dromara.common.core.exception.ServiceException;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+
+/**
+ * 卡务中心卡务操作同步
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class SyncRemotePtCardCenterService {
+
+    @DubboReference
+    private final RemoteBagService bagService;
+
+    /**
+     * 远程调用充值
+     * @param msg
+     */
+    public void recharge(Object msg) throws ServiceException{
+        boolean flag = bagService.recharge(JSONUtil.parseObj(msg).toBean(RemotePurseInOutBo.class));
+        if (!flag){
+            throw new ServiceException("充值失败");
+        }
+    }
+
+    /**
+     * 远程调用退款
+     * @param msg
+     */
+    public void refund(Object msg) throws ServiceException{
+        boolean flag = bagService.recharge(JSONUtil.parseObj(msg).toBean(RemotePurseInOutBo.class));
+        if (!flag){
+            throw new ServiceException("退款失败");
+        }
+    }
+
+    /**
+     * 远程调用错扣补款
+     * @param msg
+     */
+    public void errFill(Object msg) throws ServiceException{
+        boolean flag = bagService.createErrFillRecord(JSONUtil.parseObj(msg).toBean(RemoteConsumptionBo.class));
+        if (!flag){
+            throw new ServiceException("错扣补款失败");
+        }
+    }
+    /**
+     * 远程调用批量充值
+     * @param msg
+     */
+    public void batchRecharge(Object msg) throws ServiceException{
+        JSONObject msgObj = JSONUtil.parseObj(msg);
+        RemotePurseInOutBo bo = msgObj.getJSONObject("bo").toBean(RemotePurseInOutBo.class);
+        Long[] userIds = (Long[]) msgObj.get("userIds");
+        boolean flag = bagService.batchRecharge(bo, userIds);
+        if (!flag){
+            throw new ServiceException("批量充值失败");
+        }
+    }
+
+    /**
+     * 远程调用批量退款
+     * @param msg
+     * @throws ServiceException
+     */
+    public void batchRefund(Object msg) throws ServiceException{
+        JSONObject msgObj = JSONUtil.parseObj(msg);
+        RemotePurseInOutBo bo = msgObj.getJSONObject("bo").toBean(RemotePurseInOutBo.class);
+        Long[] userIds = (Long[]) msgObj.get("userIds");
+        boolean flag = bagService.batchRefund(bo, userIds);
+        if (!flag){
+            throw new ServiceException("批量退款失败");
+        }
+    }
+
+    /**
+     * 远程调用批量设置余额
+     * @param msg
+     * @throws ServiceException
+     */
+    public void batchSetBalance(Object msg) throws ServiceException{
+        JSONObject msgObj = JSONUtil.parseObj(msg);
+        RemotePurseInOutBo bo = msgObj.getJSONObject("bo").toBean(RemotePurseInOutBo.class);
+        Long[] userIds = (Long[]) msgObj.get("userIds");
+        boolean flag = bagService.batchRecharge(bo, userIds);
+        if (!flag){
+            throw new ServiceException("批量设置余额失败");
+        }
+    }
+
+    /**
+     * 远程调用卡片挂失
+     * @param msg
+     * @throws ServiceException
+     */
+    public void lockCard(Object msg) throws ServiceException{
+        boolean flag = bagService.lockCard(JSONUtil.parseObj(msg).getLong("cardId"));
+        if (!flag){
+            throw new ServiceException("卡片挂失失败");
+        }
+    }
+    /**
+     * 远程调用卡片解挂
+     * @param msg
+     * @throws ServiceException
+     */
+    public void unlockCard(Object msg) throws ServiceException{
+        boolean flag = bagService.unlockCard(JSONUtil.parseObj(msg).getLong("cardId"));
+        if (!flag){
+            throw new ServiceException("卡片解挂失败");
+        }
+    }
+}

+ 2 - 0
ruoyi-server/ruoyi-server-base/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -14,3 +14,5 @@ org.dromara.server.base.service.yktOperation.SyncRemotePtRoomService
 org.dromara.server.base.service.yktOperation.SyncRemotePtAreaService
 org.dromara.server.base.service.yktOperation.SyncRemotePtAccountService
 org.dromara.server.base.service.yktOperation.SyncRemotePtUserAccountService
+org.dromara.server.base.service.yktOperation.SyncRemotePtCardCenterService
+org.dromara.server.base.service.yktOperation.SyncRemotePXfTermService

+ 1 - 1
ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/event/kafka/impl/yktOperation/PtAreaEventStrategyImpl.java

@@ -11,7 +11,7 @@ import org.springframework.stereotype.Service;
 /**
  * @author Hz
  * @date 2024/10/29
- * @description 营业时段功能同步策略
+ * @description 区域功能同步策略
  */
 @Slf4j
 @RequiredArgsConstructor

+ 62 - 0
ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/event/kafka/impl/yktOperation/PtCardCenterEventStrategyImpl.java

@@ -0,0 +1,62 @@
+package org.dromara.server.mq.event.kafka.impl.yktOperation;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.message.kafka.constant.MessageEventTypeConstants;
+import org.dromara.server.base.service.yktOperation.SyncRemotePtCardCenterService;
+import org.dromara.server.mq.event.kafka.IYktEventStrategy;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author Hz
+ * @date 2024/10/29
+ * @description 卡务中心卡务操作功能同步策略
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service(MessageEventTypeConstants.CARD_CENTER_SENDER)
+public class PtCardCenterEventStrategyImpl implements IYktEventStrategy {
+
+    private final SyncRemotePtCardCenterService cardCenterService;
+    @Override
+    public void doMsgHandle(String eventType, Object msg) throws Exception{
+
+        switch (eventType) {
+            case MessageEventTypeConstants.ptCard_CHARGE_EDIT:{
+                cardCenterService.recharge(msg);
+            }
+            break;
+            case MessageEventTypeConstants.ptCard_refund_EDIT:{
+                cardCenterService.refund(msg);
+            }
+            break;
+            case MessageEventTypeConstants.ptCard_supply_EDIT:{
+                cardCenterService.errFill(msg);
+            }
+            break;
+            case MessageEventTypeConstants.ptCard_multicharge_EDIT:{
+                cardCenterService.batchRecharge(msg);
+            }
+            break;
+            case MessageEventTypeConstants.ptCard_multirefund_EDIT:{
+                cardCenterService.batchRefund(msg);
+            }
+            break;
+            case MessageEventTypeConstants.ptCard_multiSet_EDIT:{
+                cardCenterService.batchSetBalance(msg);
+            }
+            break;
+            case MessageEventTypeConstants.ptCard_CARD_LOCK:{
+                cardCenterService.lockCard(msg);
+            }
+            break;
+            case MessageEventTypeConstants.ptCard_CARD_UNLOCK:{
+                cardCenterService.unlockCard(msg);
+            }
+            default:
+                log.info("未知事件");
+
+        }
+    }
+
+}

+ 1 - 2
ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/event/kafka/impl/yktOperation/PtRoomEventStrategyImpl.java

@@ -3,7 +3,6 @@ package org.dromara.server.mq.event.kafka.impl.yktOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.message.kafka.constant.MessageEventTypeConstants;
-import org.dromara.server.base.service.yktOperation.SyncRemotePtMealTypeService;
 import org.dromara.server.base.service.yktOperation.SyncRemotePtRoomService;
 import org.dromara.server.mq.event.kafka.IYktEventStrategy;
 import org.springframework.stereotype.Service;
@@ -11,7 +10,7 @@ import org.springframework.stereotype.Service;
 /**
  * @author Hz
  * @date 2024/10/29
- * @description 营业时段功能同步策略
+ * @description 房间信息功能同步策略
  */
 @Slf4j
 @RequiredArgsConstructor

+ 1 - 2
ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/event/kafka/impl/yktOperation/PtUserAccountEventStrategyImpl.java

@@ -3,7 +3,6 @@ package org.dromara.server.mq.event.kafka.impl.yktOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.message.kafka.constant.MessageEventTypeConstants;
-import org.dromara.server.base.service.yktOperation.SyncRemotePtAccountService;
 import org.dromara.server.base.service.yktOperation.SyncRemotePtUserAccountService;
 import org.dromara.server.mq.event.kafka.IYktEventStrategy;
 import org.springframework.stereotype.Service;
@@ -11,7 +10,7 @@ import org.springframework.stereotype.Service;
 /**
  * @author Hz
  * @date 2024/10/29
- * @description 结算账户功能同步策略
+ * @description 账户管理功能同步策略
  */
 @Slf4j
 @RequiredArgsConstructor

+ 46 - 0
ruoyi-server/ruoyi-server-mqdata/src/main/java/org/dromara/server/mq/event/kafka/impl/yktOperation/PtXfTermEventStrategyImpl.java

@@ -0,0 +1,46 @@
+package org.dromara.server.mq.event.kafka.impl.yktOperation;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.message.kafka.constant.MessageEventTypeConstants;
+import org.dromara.server.base.service.yktOperation.SyncRemotePXfTermService;
+import org.dromara.server.mq.event.kafka.IYktEventStrategy;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author Hz
+ * @date 2024/10/29
+ * @description 消费设备功能同步策略
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service(MessageEventTypeConstants.XF_TERM_SENDER)
+public class PtXfTermEventStrategyImpl implements IYktEventStrategy {
+
+    private final SyncRemotePXfTermService xfTermService;
+    @Override
+    public void doMsgHandle(String eventType, Object msg) throws Exception{
+
+        switch (eventType) {
+            case MessageEventTypeConstants.xfTerm_ADD:{
+                xfTermService.addPtXfTerm(msg);
+            }
+            break;
+            case MessageEventTypeConstants.xfTerm_EDIT:{
+                xfTermService.editPtXfTerm(msg);
+            }
+            break;
+            case MessageEventTypeConstants.xfTerm_REMOVE:{
+                xfTermService.delPtXfTerm(msg);
+            }
+            break;
+            case MessageEventTypeConstants.xfTerm_param_EDIT:{
+                xfTermService.editParam(msg);
+            }
+            default:
+                log.info("未知事件");
+
+        }
+    }
+
+}