Browse Source

Merge remote-tracking branch 'origin/master'

yubin 1 week ago
parent
commit
04a00e6f39
41 changed files with 1594 additions and 1700 deletions
  1. 22 87
      cif-api/src/main/java/com/txz/cif/dto/BizLogDTO.java
  2. 59 0
      cif-api/src/main/java/com/txz/cif/dto/EarningsDTO.java
  3. 0 384
      cif-api/src/main/java/com/txz/cif/dto/HospitalDTO.java
  4. 0 290
      cif-api/src/main/java/com/txz/cif/dto/OperatorDTO.java
  5. 0 207
      cif-api/src/main/java/com/txz/cif/dto/OrgContractDTO.java
  6. 0 100
      cif-api/src/main/java/com/txz/cif/dto/OrgDTO.java
  7. 0 79
      cif-api/src/main/java/com/txz/cif/dto/OrgHospitalDTO.java
  8. 0 207
      cif-api/src/main/java/com/txz/cif/dto/OrgUserDTO.java
  9. 49 0
      cif-api/src/main/java/com/txz/cif/dto/tfpay/CheckSignDTO.java
  10. 49 0
      cif-api/src/main/java/com/txz/cif/dto/tfpay/TFCreateOrderDTO.java
  11. 123 0
      cif-api/src/main/java/com/txz/cif/dto/tfpay/TFCreateWithdrawDTO.java
  12. 135 0
      cif-api/src/main/java/com/txz/cif/dto/tfpay/TFPayOrderDTO.java
  13. 25 0
      cif-api/src/main/java/com/txz/cif/dto/tfpay/TFQueryOrderDTO.java
  14. 69 0
      cif-api/src/main/java/com/txz/cif/dto/tfpay/TFWithdrawDTO.java
  15. 15 0
      cif-api/src/main/java/com/txz/cif/service/RedEnvelopeDubboService.java
  16. 6 0
      cif-service/pom.xml
  17. 36 0
      cif-service/src/main/java/com/txz/cif/configurer/TFPayConfig.java
  18. 1 0
      cif-service/src/main/java/com/txz/cif/constants/MyConstants.java
  19. 3 0
      cif-service/src/main/java/com/txz/cif/dao/RedEnvelopeMapper.java
  20. 47 0
      cif-service/src/main/java/com/txz/cif/dubbo/impl/RedEnvelopeDubboServiceImpl.java
  21. 27 15
      cif-service/src/main/java/com/txz/cif/model/BizLog.java
  22. 52 49
      cif-service/src/main/java/com/txz/cif/model/RechargeRecord.java
  23. 3 0
      cif-service/src/main/java/com/txz/cif/service/RedEnvelopeService.java
  24. 35 0
      cif-service/src/main/java/com/txz/cif/service/TFPayService.java
  25. 1 1
      cif-service/src/main/java/com/txz/cif/service/impl/RechargeRecordServiceImpl.java
  26. 6 0
      cif-service/src/main/java/com/txz/cif/service/impl/RedEnvelopeServiceImpl.java
  27. 130 0
      cif-service/src/main/java/com/txz/cif/service/impl/TFPayServiceImpl.java
  28. 6 1
      cif-service/src/main/java/com/txz/cif/service/impl/UserServiceImpl.java
  29. 112 0
      cif-service/src/main/java/com/txz/cif/util/TFPayUtil.java
  30. 144 42
      cif-service/src/main/java/com/txz/cif/web/RechargeRecordApiController.java
  31. 46 6
      cif-service/src/main/java/com/txz/cif/web/UserApiController.java
  32. 2 0
      cif-service/src/main/java/com/txz/cif/web/WithdrawRecordApiController.java
  33. 223 215
      cif-service/src/main/java/com/txz/cif/web/mng/WithdrawRecordController.java
  34. 18 14
      cif-service/src/main/java/com/txz/cif/web/para/ReviewParam.java
  35. 52 0
      cif-service/src/main/java/com/txz/cif/web/ro/TFPayNotifyDTO.java
  36. 24 0
      cif-service/src/main/java/com/txz/cif/web/vo/CreatePayVO.java
  37. 1 1
      cif-service/src/main/resources/bootstrap.properties
  38. 1 0
      cif-service/src/main/resources/mapper/RechargeRecordMapper.xml
  39. 6 0
      cif-service/src/main/resources/mapper/RedEnvelopeMapper.xml
  40. 33 0
      cif-service/src/main/resources/static/i18n/messages_bn.properties
  41. 33 2
      cif-service/src/main/resources/static/i18n/messages_en_US.properties

+ 22 - 87
cif-api/src/main/java/com/txz/cif/dto/BizLogDTO.java

@@ -1,122 +1,57 @@
 /*
-*
-* BizLogDTO.java
-* Copyright(C) 2017-2020 fendo公司
-* @date 2025-07-29
-*/
+ *
+ * BizLogDTO.java
+ * Copyright(C) 2017-2020 fendo公司
+ * @date 2025-07-29
+ */
 package com.txz.cif.dto;
 
+import lombok.Builder;
+import lombok.Data;
+
 import java.io.Serializable;
 import java.util.Date;
 
+@Data
+@Builder
 public class BizLogDTO implements Serializable {
     /**
-     * 
+     *
      */
     private Long id;
-
+    
     /**
      * 订单号
      */
     private String bizNo;
-
+    
     /**
      * 类型1提交充值订单 2充值调用第三方 3充值回调通知成功 4提交提现申请
      */
     private Integer type;
-
+    
     /**
      * 创建人
      */
     private String createUser;
-
+    
     /**
      * 创建时间
      */
     private Date createTime;
-
+    
     /**
      * c_biz_log
      */
     private static final long serialVersionUID = 1L;
-
-    /**
-     * 
-     * @return id 
-     */
-    public Long getId() {
-        return id;
-    }
-
-    /**
-     * 
-     * @param id 
-     */
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    /**
-     * 订单号
-     * @return biz_no 订单号
-     */
-    public String getBizNo() {
-        return bizNo;
-    }
-
-    /**
-     * 订单号
-     * @param bizNo 订单号
-     */
-    public void setBizNo(String bizNo) {
-        this.bizNo = bizNo;
-    }
-
-    /**
-     * 类型1提交充值订单 2充值调用第三方 3充值回调通知成功 4提交提现申请
-     * @return type 类型1提交充值订单 2充值调用第三方 3充值回调通知成功 4提交提现申请
-     */
-    public Integer getType() {
-        return type;
-    }
-
-    /**
-     * 类型1提交充值订单 2充值调用第三方 3充值回调通知成功 4提交提现申请
-     * @param type 类型1提交充值订单 2充值调用第三方 3充值回调通知成功 4提交提现申请
-     */
-    public void setType(Integer type) {
-        this.type = type;
-    }
-
-    /**
-     * 创建人
-     * @return create_user 创建人
-     */
-    public String getCreateUser() {
-        return createUser;
-    }
-
-    /**
-     * 创建人
-     * @param createUser 创建人
-     */
-    public void setCreateUser(String createUser) {
-        this.createUser = createUser;
-    }
-
+    
     /**
-     * 创建时间
-     * @return create_time 创建时间
+     * 三方接口请求消息
      */
-    public Date getCreateTime() {
-        return createTime;
-    }
-
+    private String sendMessage;
+    
     /**
-     * 创建时间
-     * @param createTime 创建时间
+     * 三方接口接收消息
      */
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
+    private String receiveMessage;
 }

+ 59 - 0
cif-api/src/main/java/com/txz/cif/dto/EarningsDTO.java

@@ -0,0 +1,59 @@
+/*
+*
+* @date 2025-07-15
+*/
+package com.txz.cif.dto;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class EarningsDTO implements Serializable {
+
+    /**
+     * 订单号
+     */
+    private String orderNo;
+
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 收益金额
+     */
+    private BigDecimal earnings;
+
+
+
+    /**
+     * c_red_envelope
+     */
+    private static final long serialVersionUID = 1L;
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public BigDecimal getEarnings() {
+        return earnings;
+    }
+
+    public void setEarnings(BigDecimal earnings) {
+        this.earnings = earnings;
+    }
+}

+ 0 - 384
cif-api/src/main/java/com/txz/cif/dto/HospitalDTO.java

@@ -1,384 +0,0 @@
-/*
-*
-* HospitalDTO.java
-* Copyright(C) 2017-2020 fendo公司
-* @date 2022-11-11
-*/
-package com.txz.cif.dto;
-
-import java.io.Serializable;
-import java.util.Date;
-
-public class HospitalDTO implements Serializable {
-    /**
-     * 
-     */
-    private Long id;
-
-    /**
-     * 管理账号用户id(关联登录账号,结算账户)
-     */
-    private Long userId;
-
-    private String deviceId;
-
-    /**
-     * 结算方案id
-     */
-    private Long settlePlanId;
-
-    /**
-     * 医院名称
-     */
-    private String name;
-
-    /**
-     * 地址
-     */
-    private String address;
-
-    /**
-     * 图标
-     */
-    private String icon;
-
-    /**
-     * 状态 1正常 2禁用
-     */
-    private Integer status;
-
-    /**
-     * 类型 1区域中心 2省级中心 3会诊医院
-     */
-    private Integer type;
-
-    /**
-     * 分类 多个分类 使用 , 分割
-     */
-    private String sysTypes;
-
-    /**
-     * 区域码
-     */
-    private String areaCode;
-
-    /**
-     * 省地区码
-     */
-    private String provinceCode;
-
-    /**
-     * 城市地区码
-     */
-    private String cityCode;
-
-    /**
-     * 公告
-     */
-    private String notice;
-
-    /**
-     * 创建时间
-     */
-    private Date createTime;
-
-    /**
-     * 更新时间
-     */
-    private Date updateTime;
-
-    /**
-     * 简介
-     */
-    private String introductory;
-
-    /**
-     * 科室简介
-     */
-    private String officeIntro;
-
-    /**
-     * c_hospital
-     */
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 
-     * @return id 
-     */
-    public Long getId() {
-        return id;
-    }
-
-    /**
-     * 
-     * @param id 
-     */
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    /**
-     * 管理账号用户id(关联登录账号,结算账户)
-     * @return user_id 管理账号用户id(关联登录账号,结算账户)
-     */
-    public Long getUserId() {
-        return userId;
-    }
-
-    /**
-     * 管理账号用户id(关联登录账号,结算账户)
-     * @param userId 管理账号用户id(关联登录账号,结算账户)
-     */
-    public void setUserId(Long userId) {
-        this.userId = userId;
-    }
-
-    /**
-     * 结算方案id
-     * @return settle_plan_id 结算方案id
-     */
-    public Long getSettlePlanId() {
-        return settlePlanId;
-    }
-
-    /**
-     * 结算方案id
-     * @param settlePlanId 结算方案id
-     */
-    public void setSettlePlanId(Long settlePlanId) {
-        this.settlePlanId = settlePlanId;
-    }
-
-    /**
-     * 医院名称
-     * @return name 医院名称
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * 医院名称
-     * @param name 医院名称
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    /**
-     * 地址
-     * @return address 地址
-     */
-    public String getAddress() {
-        return address;
-    }
-
-    /**
-     * 地址
-     * @param address 地址
-     */
-    public void setAddress(String address) {
-        this.address = address;
-    }
-
-    /**
-     * 图标
-     * @return icon 图标
-     */
-    public String getIcon() {
-        return icon;
-    }
-
-    /**
-     * 图标
-     * @param icon 图标
-     */
-    public void setIcon(String icon) {
-        this.icon = icon;
-    }
-
-    /**
-     * 状态 1正常 2禁用
-     * @return status 状态 1正常 2禁用
-     */
-    public Integer getStatus() {
-        return status;
-    }
-
-    /**
-     * 状态 1正常 2禁用
-     * @param status 状态 1正常 2禁用
-     */
-    public void setStatus(Integer status) {
-        this.status = status;
-    }
-
-    /**
-     * 类型 1区域中心 2省级中心 3会诊医院
-     * @return type 类型 1区域中心 2省级中心 3会诊医院
-     */
-    public Integer getType() {
-        return type;
-    }
-
-    /**
-     * 类型 1区域中心 2省级中心 3会诊医院
-     * @param type 类型 1区域中心 2省级中心 3会诊医院
-     */
-    public void setType(Integer type) {
-        this.type = type;
-    }
-
-    /**
-     * 分类 多个分类 使用 , 分割
-     * @return sys_types 分类 多个分类 使用 , 分割
-     */
-    public String getSysTypes() {
-        return sysTypes;
-    }
-
-    /**
-     * 分类 多个分类 使用 , 分割
-     * @param sysTypes 分类 多个分类 使用 , 分割
-     */
-    public void setSysTypes(String sysTypes) {
-        this.sysTypes = sysTypes;
-    }
-
-    /**
-     * 区域码
-     * @return area_code 区域码
-     */
-    public String getAreaCode() {
-        return areaCode;
-    }
-
-    /**
-     * 区域码
-     * @param areaCode 区域码
-     */
-    public void setAreaCode(String areaCode) {
-        this.areaCode = areaCode;
-    }
-
-    /**
-     * 省地区码
-     * @return province_code 省地区码
-     */
-    public String getProvinceCode() {
-        return provinceCode;
-    }
-
-    /**
-     * 省地区码
-     * @param provinceCode 省地区码
-     */
-    public void setProvinceCode(String provinceCode) {
-        this.provinceCode = provinceCode;
-    }
-
-    /**
-     * 城市地区码
-     * @return city_code 城市地区码
-     */
-    public String getCityCode() {
-        return cityCode;
-    }
-
-    /**
-     * 城市地区码
-     * @param cityCode 城市地区码
-     */
-    public void setCityCode(String cityCode) {
-        this.cityCode = cityCode;
-    }
-
-    /**
-     * 公告
-     * @return notice 公告
-     */
-    public String getNotice() {
-        return notice;
-    }
-
-    /**
-     * 公告
-     * @param notice 公告
-     */
-    public void setNotice(String notice) {
-        this.notice = notice;
-    }
-
-    /**
-     * 创建时间
-     * @return create_time 创建时间
-     */
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    /**
-     * 创建时间
-     * @param createTime 创建时间
-     */
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-
-    /**
-     * 更新时间
-     * @return update_time 更新时间
-     */
-    public Date getUpdateTime() {
-        return updateTime;
-    }
-
-    /**
-     * 更新时间
-     * @param updateTime 更新时间
-     */
-    public void setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
-    }
-
-    /**
-     * 简介
-     * @return introductory 简介
-     */
-    public String getIntroductory() {
-        return introductory;
-    }
-
-    /**
-     * 简介
-     * @param introductory 简介
-     */
-    public void setIntroductory(String introductory) {
-        this.introductory = introductory;
-    }
-
-    /**
-     * 科室简介
-     * @return office_intro 科室简介
-     */
-    public String getOfficeIntro() {
-        return officeIntro;
-    }
-
-    /**
-     * 科室简介
-     * @param officeIntro 科室简介
-     */
-    public void setOfficeIntro(String officeIntro) {
-        this.officeIntro = officeIntro;
-    }
-
-    public String getDeviceId() {
-        return deviceId;
-    }
-
-    public void setDeviceId(String deviceId) {
-        this.deviceId = deviceId;
-    }
-}

+ 0 - 290
cif-api/src/main/java/com/txz/cif/dto/OperatorDTO.java

@@ -1,290 +0,0 @@
-/*
-*
-* OperatorDTO.java
-* Copyright(C) 2017-2020 fendo公司
-* @date 2022-11-02
-*/
-package com.txz.cif.dto;
-
-import java.io.Serializable;
-import java.util.Date;
-
-public class OperatorDTO implements Serializable {
-    /**
-     * 
-     */
-    private Long id;
-
-    /**
-     * 支持登录类型 1,账号登录 2,手机登录 3,邮箱登录 4,微信公众号登录 
-     */
-    private Integer loginType;
-
-    /**
-     * 状态 1正常 2禁用
-     */
-    private Integer status;
-
-    /**
-     * 微信的unionId
-     */
-    private String unionId;
-
-    /**
-     * 登录账号
-     */
-    private String loginAccount;
-
-    /**
-     * 登录密码
-     */
-    private String loginPassword;
-
-    /**
-     * 盐
-     */
-    private String salt;
-
-    /**
-     * 最后登录时间
-     */
-    private Date lastLoginTime;
-
-    /**
-     * 最后登陆token
-     */
-    private String lastToken;
-
-    /**
-     * 创建人
-     */
-    private String createUser;
-
-    /**
-     * 更新人
-     */
-    private String updateUser;
-
-    /**
-     * 创建时间
-     */
-    private Date createTime;
-
-    /**
-     * 更新时间
-     */
-    private Date updateTime;
-
-    /**
-     * c_operator
-     */
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 
-     * @return id 
-     */
-    public Long getId() {
-        return id;
-    }
-
-    /**
-     * 
-     * @param id 
-     */
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    /**
-     * 支持登录类型 1,账号登录 2,手机登录 3,邮箱登录 4,微信公众号登录 
-     * @return login_type 支持登录类型 1,账号登录 2,手机登录 3,邮箱登录 4,微信公众号登录 
-     */
-    public Integer getLoginType() {
-        return loginType;
-    }
-
-    /**
-     * 支持登录类型 1,账号登录 2,手机登录 3,邮箱登录 4,微信公众号登录 
-     * @param loginType 支持登录类型 1,账号登录 2,手机登录 3,邮箱登录 4,微信公众号登录 
-     */
-    public void setLoginType(Integer loginType) {
-        this.loginType = loginType;
-    }
-
-    /**
-     * 状态 1正常 2禁用
-     * @return status 状态 1正常 2禁用
-     */
-    public Integer getStatus() {
-        return status;
-    }
-
-    /**
-     * 状态 1正常 2禁用
-     * @param status 状态 1正常 2禁用
-     */
-    public void setStatus(Integer status) {
-        this.status = status;
-    }
-
-    /**
-     * 微信的unionId
-     * @return union_id 微信的unionId
-     */
-    public String getUnionId() {
-        return unionId;
-    }
-
-    /**
-     * 微信的unionId
-     * @param unionId 微信的unionId
-     */
-    public void setUnionId(String unionId) {
-        this.unionId = unionId;
-    }
-
-    /**
-     * 登录账号
-     * @return login_account 登录账号
-     */
-    public String getLoginAccount() {
-        return loginAccount;
-    }
-
-    /**
-     * 登录账号
-     * @param loginAccount 登录账号
-     */
-    public void setLoginAccount(String loginAccount) {
-        this.loginAccount = loginAccount;
-    }
-
-    /**
-     * 登录密码
-     * @return login_password 登录密码
-     */
-    public String getLoginPassword() {
-        return loginPassword;
-    }
-
-    /**
-     * 登录密码
-     * @param loginPassword 登录密码
-     */
-    public void setLoginPassword(String loginPassword) {
-        this.loginPassword = loginPassword;
-    }
-
-    /**
-     * 盐
-     * @return salt 盐
-     */
-    public String getSalt() {
-        return salt;
-    }
-
-    /**
-     * 盐
-     * @param salt 盐
-     */
-    public void setSalt(String salt) {
-        this.salt = salt;
-    }
-
-    /**
-     * 最后登录时间
-     * @return last_login_time 最后登录时间
-     */
-    public Date getLastLoginTime() {
-        return lastLoginTime;
-    }
-
-    /**
-     * 最后登录时间
-     * @param lastLoginTime 最后登录时间
-     */
-    public void setLastLoginTime(Date lastLoginTime) {
-        this.lastLoginTime = lastLoginTime;
-    }
-
-    /**
-     * 最后登陆token
-     * @return last_token 最后登陆token
-     */
-    public String getLastToken() {
-        return lastToken;
-    }
-
-    /**
-     * 最后登陆token
-     * @param lastToken 最后登陆token
-     */
-    public void setLastToken(String lastToken) {
-        this.lastToken = lastToken;
-    }
-
-    /**
-     * 创建人
-     * @return create_user 创建人
-     */
-    public String getCreateUser() {
-        return createUser;
-    }
-
-    /**
-     * 创建人
-     * @param createUser 创建人
-     */
-    public void setCreateUser(String createUser) {
-        this.createUser = createUser;
-    }
-
-    /**
-     * 更新人
-     * @return update_user 更新人
-     */
-    public String getUpdateUser() {
-        return updateUser;
-    }
-
-    /**
-     * 更新人
-     * @param updateUser 更新人
-     */
-    public void setUpdateUser(String updateUser) {
-        this.updateUser = updateUser;
-    }
-
-    /**
-     * 创建时间
-     * @return create_time 创建时间
-     */
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    /**
-     * 创建时间
-     * @param createTime 创建时间
-     */
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-
-    /**
-     * 更新时间
-     * @return update_time 更新时间
-     */
-    public Date getUpdateTime() {
-        return updateTime;
-    }
-
-    /**
-     * 更新时间
-     * @param updateTime 更新时间
-     */
-    public void setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
-    }
-}

+ 0 - 207
cif-api/src/main/java/com/txz/cif/dto/OrgContractDTO.java

@@ -1,207 +0,0 @@
-/*
-*
-* OrgContractDTO.java
-* Copyright(C) 2017-2020 fendo公司
-* @date 2022-11-04
-*/
-package com.txz.cif.dto;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.Date;
-
-public class OrgContractDTO implements Serializable {
-    /**
-     * 
-     */
-    private Long id;
-
-    /**
-     * 发起端组织id
-     */
-    private Long sponsorOrgId;
-
-    /**
-     * 接收端组织id
-     */
-    private Long receivingOrgId;
-
-    /**
-     * 状态 1正常 2解约
-     */
-    private Integer status;
-
-    /**
-     * 合同到期时间
-     */
-    private Date endTime;
-
-    /**
-     * 结算类型 1平台结算  2组织结算
-     */
-    private Integer settleType;
-
-    /**
-     * 结算固定值/笔
-     */
-    private BigDecimal settleFixed;
-
-    /**
-     * 创建时间
-     */
-    private Date createTime;
-
-    /**
-     * 更新时间
-     */
-    private Date updateTime;
-
-    /**
-     * c_org_contract
-     */
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 
-     * @return id 
-     */
-    public Long getId() {
-        return id;
-    }
-
-    /**
-     * 
-     * @param id 
-     */
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    /**
-     * 发起端组织id
-     * @return sponsor_org_id 发起端组织id
-     */
-    public Long getSponsorOrgId() {
-        return sponsorOrgId;
-    }
-
-    /**
-     * 发起端组织id
-     * @param sponsorOrgId 发起端组织id
-     */
-    public void setSponsorOrgId(Long sponsorOrgId) {
-        this.sponsorOrgId = sponsorOrgId;
-    }
-
-    /**
-     * 接收端组织id
-     * @return receiving_org_id 接收端组织id
-     */
-    public Long getReceivingOrgId() {
-        return receivingOrgId;
-    }
-
-    /**
-     * 接收端组织id
-     * @param receivingOrgId 接收端组织id
-     */
-    public void setReceivingOrgId(Long receivingOrgId) {
-        this.receivingOrgId = receivingOrgId;
-    }
-
-    /**
-     * 状态 1正常 2解约
-     * @return status 状态 1正常 2解约
-     */
-    public Integer getStatus() {
-        return status;
-    }
-
-    /**
-     * 状态 1正常 2解约
-     * @param status 状态 1正常 2解约
-     */
-    public void setStatus(Integer status) {
-        this.status = status;
-    }
-
-    /**
-     * 合同到期时间
-     * @return end_time 合同到期时间
-     */
-    public Date getEndTime() {
-        return endTime;
-    }
-
-    /**
-     * 合同到期时间
-     * @param endTime 合同到期时间
-     */
-    public void setEndTime(Date endTime) {
-        this.endTime = endTime;
-    }
-
-    /**
-     * 结算类型 1平台结算  2组织结算
-     * @return settle_type 结算类型 1平台结算  2组织结算
-     */
-    public Integer getSettleType() {
-        return settleType;
-    }
-
-    /**
-     * 结算类型 1平台结算  2组织结算
-     * @param settleType 结算类型 1平台结算  2组织结算
-     */
-    public void setSettleType(Integer settleType) {
-        this.settleType = settleType;
-    }
-
-    /**
-     * 结算固定值/笔
-     * @return settle_fixed 结算固定值/笔
-     */
-    public BigDecimal getSettleFixed() {
-        return settleFixed;
-    }
-
-    /**
-     * 结算固定值/笔
-     * @param settleFixed 结算固定值/笔
-     */
-    public void setSettleFixed(BigDecimal settleFixed) {
-        this.settleFixed = settleFixed;
-    }
-
-    /**
-     * 创建时间
-     * @return create_time 创建时间
-     */
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    /**
-     * 创建时间
-     * @param createTime 创建时间
-     */
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-
-    /**
-     * 更新时间
-     * @return update_time 更新时间
-     */
-    public Date getUpdateTime() {
-        return updateTime;
-    }
-
-    /**
-     * 更新时间
-     * @param updateTime 更新时间
-     */
-    public void setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
-    }
-}

+ 0 - 100
cif-api/src/main/java/com/txz/cif/dto/OrgDTO.java

@@ -1,100 +0,0 @@
-/*
-*
-* OrgDTO.java
-* Copyright(C) 2017-2020 fendo公司
-* @date 2022-11-02
-*/
-package com.txz.cif.dto;
-
-import lombok.Data;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.Date;
-
-@Data
-public class OrgDTO implements Serializable {
-    /**
-     * 
-     */
-    private Long id;
-
-    private Long settlePlanId;
-
-    /**
-     * 资金账户(目前只有一个)
-     */
-    private Long accountId;
-
-    public Long getUserId() {
-        return userId;
-    }
-
-    public void setUserId(Long userId) {
-        this.userId = userId;
-    }
-
-    private Long userId;
-
-    /**
-     * 组织名称
-     */
-    private String name;
-
-    /**
-     * 地址
-     */
-    private String address;
-
-    /**
-     * 图标
-     */
-    private String icon;
-
-    /**
-     * 状态 1正常 2禁用
-     */
-    private Integer status;
-
-    /**
-     * 类型 1专家组织 2医院
-     */
-    private Integer type;
-
-    /**
-     * 公告
-     */
-    private String notice;
-
-    /**
-     * 固定金额/病例
-     */
-    private BigDecimal settleFixed;
-
-    /**
-     * 销售员id
-     */
-    private Long salesmanId;
-
-    /**
-     * 销售提成固定金额/病例
-     */
-    private BigDecimal salesSettleFixed;
-
-    /**
-     * 创建时间
-     */
-    private Date createTime;
-
-    /**
-     * 更新时间
-     */
-    private Date updateTime;
-
-    /**
-     * c_org
-     */
-    private static final long serialVersionUID = 1L;
-
-
-}

+ 0 - 79
cif-api/src/main/java/com/txz/cif/dto/OrgHospitalDTO.java

@@ -1,79 +0,0 @@
-/*
-*
-* OrgHospitalDTO.java
-* Copyright(C) 2017-2020 fendo公司
-* @date 2022-11-11
-*/
-package com.txz.cif.dto;
-
-import java.io.Serializable;
-
-public class OrgHospitalDTO implements Serializable {
-    /**
-     * 
-     */
-    private Long id;
-
-    /**
-     * 
-     */
-    private Long orgId;
-
-    /**
-     * 
-     */
-    private Long hospitalId;
-
-    /**
-     * c_org_hospital
-     */
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 
-     * @return id 
-     */
-    public Long getId() {
-        return id;
-    }
-
-    /**
-     * 
-     * @param id 
-     */
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    /**
-     * 
-     * @return org_id 
-     */
-    public Long getOrgId() {
-        return orgId;
-    }
-
-    /**
-     * 
-     * @param orgId 
-     */
-    public void setOrgId(Long orgId) {
-        this.orgId = orgId;
-    }
-
-    /**
-     * 
-     * @return hospital_id 
-     */
-    public Long getHospitalId() {
-        return hospitalId;
-    }
-
-    /**
-     * 
-     * @param hospitalId 
-     */
-    public void setHospitalId(Long hospitalId) {
-        this.hospitalId = hospitalId;
-    }
-}

+ 0 - 207
cif-api/src/main/java/com/txz/cif/dto/OrgUserDTO.java

@@ -1,207 +0,0 @@
-/*
-*
-* OrgUserDTO.java
-* Copyright(C) 2017-2020 fendo公司
-* @date 2022-11-02
-*/
-package com.txz.cif.dto;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.Date;
-
-public class OrgUserDTO implements Serializable {
-    /**
-     * 
-     */
-    private Long id;
-
-    /**
-     * 组织id
-     */
-    private Long orgId;
-
-    /**
-     * 用户id
-     */
-    private Long userId;
-
-    /**
-     * 状态 1正常 2已解约
-     */
-    private Integer status;
-
-    /**
-     * 合同到期时间
-     */
-    private Date endTime;
-
-    /**
-     * 类型 1平台单笔结算 2组织结算
-     */
-    private Integer settleType;
-
-    /**
-     * 结算固定值/笔
-     */
-    private BigDecimal settleFixed;
-
-    /**
-     * 创建时间
-     */
-    private Date createTime;
-
-    /**
-     * 更新时间
-     */
-    private Date updateTime;
-
-    /**
-     * c_org_user
-     */
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 
-     * @return id 
-     */
-    public Long getId() {
-        return id;
-    }
-
-    /**
-     * 
-     * @param id 
-     */
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    /**
-     * 组织id
-     * @return org_id 组织id
-     */
-    public Long getOrgId() {
-        return orgId;
-    }
-
-    /**
-     * 组织id
-     * @param orgId 组织id
-     */
-    public void setOrgId(Long orgId) {
-        this.orgId = orgId;
-    }
-
-    /**
-     * 用户id
-     * @return user_id 用户id
-     */
-    public Long getUserId() {
-        return userId;
-    }
-
-    /**
-     * 用户id
-     * @param userId 用户id
-     */
-    public void setUserId(Long userId) {
-        this.userId = userId;
-    }
-
-    /**
-     * 状态 1正常 2已解约
-     * @return status 状态 1正常 2已解约
-     */
-    public Integer getStatus() {
-        return status;
-    }
-
-    /**
-     * 状态 1正常 2已解约
-     * @param status 状态 1正常 2已解约
-     */
-    public void setStatus(Integer status) {
-        this.status = status;
-    }
-
-    /**
-     * 合同到期时间
-     * @return end_time 合同到期时间
-     */
-    public Date getEndTime() {
-        return endTime;
-    }
-
-    /**
-     * 合同到期时间
-     * @param endTime 合同到期时间
-     */
-    public void setEndTime(Date endTime) {
-        this.endTime = endTime;
-    }
-
-    /**
-     * 类型 1平台单笔结算 2组织结算
-     * @return settle_type 类型 1平台单笔结算 2组织结算
-     */
-    public Integer getSettleType() {
-        return settleType;
-    }
-
-    /**
-     * 类型 1平台单笔结算 2组织结算
-     * @param settleType 类型 1平台单笔结算 2组织结算
-     */
-    public void setSettleType(Integer settleType) {
-        this.settleType = settleType;
-    }
-
-    /**
-     * 结算固定值/笔
-     * @return settle_fixed 结算固定值/笔
-     */
-    public BigDecimal getSettleFixed() {
-        return settleFixed;
-    }
-
-    /**
-     * 结算固定值/笔
-     * @param settleFixed 结算固定值/笔
-     */
-    public void setSettleFixed(BigDecimal settleFixed) {
-        this.settleFixed = settleFixed;
-    }
-
-    /**
-     * 创建时间
-     * @return create_time 创建时间
-     */
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    /**
-     * 创建时间
-     * @param createTime 创建时间
-     */
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-
-    /**
-     * 更新时间
-     * @return update_time 更新时间
-     */
-    public Date getUpdateTime() {
-        return updateTime;
-    }
-
-    /**
-     * 更新时间
-     * @param updateTime 更新时间
-     */
-    public void setUpdateTime(Date updateTime) {
-        this.updateTime = updateTime;
-    }
-}

+ 49 - 0
cif-api/src/main/java/com/txz/cif/dto/tfpay/CheckSignDTO.java

@@ -0,0 +1,49 @@
+package com.txz.cif.dto.tfpay;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+/**
+ * @author: MTD®️
+ * @date: 2025/9/2
+ */
+@Data
+public class CheckSignDTO {
+    
+     /**
+     * 商户编号 - 平台分配商户号
+     */
+    @JsonProperty("memberid")
+    private String memberid;
+    
+    /**
+     * 商户订单号 - 订单号唯一, 字符长度20
+     */
+    @JsonProperty("orderid")
+    private String orderid;
+    
+    /**
+     * 订单最终金额 - 订单金额 单位:元
+     */
+    @JsonProperty("amount")
+    private String amount;
+    
+    /**
+     * 平台订单号
+     */
+    @JsonProperty("transaction_id")
+    private String transaction_id;
+    
+    /**
+     * 交易成功时间 - 时间格式:Y-m-d H:i:s
+     */
+    @JsonProperty("datetime")
+    private String datetime;
+    
+    /**
+     * 交易状态 - "00" 为成功
+     */
+    @JsonProperty("returncode")
+    private String returncode;
+    
+}

+ 49 - 0
cif-api/src/main/java/com/txz/cif/dto/tfpay/TFCreateOrderDTO.java

@@ -0,0 +1,49 @@
+package com.txz.cif.dto.tfpay;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @author: MTD®️
+ * @date: 2025/8/29
+ */
+@Data
+@Builder
+public class TFCreateOrderDTO {
+    
+    /**
+     * 商户号
+     */
+    private String payMemberid;
+    
+    /**
+     * 商户订单号
+     */
+    private String payOrderid;
+    
+    /**
+     * 提交时间
+     */
+    private String payApplydate;
+    
+    /**
+     * 通道编码
+     */
+    private String payChannelcode;
+    
+    /**
+     * 异步回调
+     */
+    private String payNotifyurl;
+    
+    /**
+     * 订单金额
+     */
+    private String payAmount;
+    
+    /**
+     * 客户端ip
+     */
+    private String ip;
+    
+}

+ 123 - 0
cif-api/src/main/java/com/txz/cif/dto/tfpay/TFCreateWithdrawDTO.java

@@ -0,0 +1,123 @@
+package com.txz.cif.dto.tfpay;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @author: MTD®️
+ * @date: 2025/9/3
+ */
+@Data
+@Builder
+public class TFCreateWithdrawDTO {
+    
+    /**
+     * 商户号
+     */
+    @JsonProperty("pay_memberid")
+    private String payMemberid;
+    
+    /**
+     * 商户订单号
+     */
+    @JsonProperty("pay_orderid")
+    private String payOrderid;
+    
+    /**
+     * 提交时间
+     */
+    @JsonProperty("pay_applydate")
+    private String payApplydate;
+    
+    /**
+     * 通道编码
+     */
+    @JsonProperty("pay_channelcode")
+    private String payChannelcode;
+    
+    /**
+     * 异步回调
+     */
+    @JsonProperty("pay_notifyurl")
+    private String payNotifyurl;
+    
+    /**
+     * 订单金额
+     */
+    @JsonProperty("pay_amount")
+    private String payAmount;
+    
+    /**
+     * 商品名称/备注
+     */
+    @JsonProperty("pay_productname")
+    private String payProductname;
+    
+    /**
+     * 用户姓名
+     */
+    @JsonProperty("pay_username")
+    private String payUsername;
+    
+    /**
+     * 银行账号
+     */
+    @JsonProperty("pay_banknumber")
+    private String payBanknumber;
+    
+    /**
+     * 银行名称
+     */
+    @JsonProperty("pay_bankname")
+    private String payBankname;
+    
+    /**
+     * 银行代码(key)
+     */
+    @JsonProperty("pay_bankcode")
+    private String payBankcode;
+    
+    /**
+     * 数据签名
+     */
+    @JsonProperty("pay_md5sign")
+    private String payMd5sign;
+    
+    /**
+     * 币种
+     */
+    @JsonProperty("currency_type")
+    private String currencyType;
+    
+    /**
+     * 返回数据格式
+     */
+    @JsonProperty("type")
+    private String type;
+    
+    /**
+     * 附加字段
+     */
+    @JsonProperty("pay_attach")
+    private String payAttach;
+    
+    /**
+     * 用户邮箱
+     */
+    @JsonProperty("pay_email")
+    private String payEmail;
+    
+    /**
+     * 用户电话
+     */
+    @JsonProperty("pay_mobile")
+    private String payMobile;
+    
+    /**
+     * 加密方式
+     */
+    @JsonProperty("pay_signtype")
+    private String paySigntype;
+    
+}

+ 135 - 0
cif-api/src/main/java/com/txz/cif/dto/tfpay/TFPayOrderDTO.java

@@ -0,0 +1,135 @@
+package com.txz.cif.dto.tfpay;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @author: MTD®️
+ * @date: 2025/8/29
+ */
+@Data
+@Builder
+public class TFPayOrderDTO {
+    
+    /**
+     * 商户号
+     */
+    @JsonProperty("pay_memberid")
+    private String payMemberid;
+    
+    /**
+     * 商户订单号
+     */
+    @JsonProperty("pay_orderid")
+    private String payOrderid;
+    
+    /**
+     * 提交时间
+     */
+    @JsonProperty("pay_applydate")
+    private String payApplydate;
+    
+    /**
+     * 通道编码
+     */
+    @JsonProperty("pay_channelcode")
+    private String payChannelcode;
+    
+    /**
+     * 异步回调
+     */
+    @JsonProperty("pay_notifyurl")
+    private String payNotifyurl;
+    
+    /**
+     * 同步回调
+     */
+    @JsonProperty("pay_callbackurl")
+    private String payCallbackurl;
+    
+    /**
+     * 订单金额
+     */
+    @JsonProperty("pay_amount")
+    private String payAmount;
+    
+    /**
+     * 数据签名
+     */
+    @JsonProperty("pay_md5sign")
+    private String payMd5sign;
+    
+    /**
+     * 币种
+     */
+    @JsonProperty("currency_type")
+    private String currencyType;
+    
+    /**
+     * 返回数据格式
+     */
+    @JsonProperty("type")
+    private String type;
+    
+    /**
+     * 用户真实ip
+     */
+    @JsonProperty("ip")
+    private String ip;
+    
+    /**
+     * 用户姓名
+     */
+    @JsonProperty("pay_username")
+    private String payUsername;
+    
+    /**
+     * 用户邮箱
+     */
+    @JsonProperty("pay_email")
+    private String payEmail;
+    
+    /**
+     * 用户电话
+     */
+    @JsonProperty("pay_mobile")
+    private String payMobile;
+    
+    /**
+     * 银行账号
+     */
+    @JsonProperty("pay_banknumber")
+    private String payBanknumber;
+    
+    /**
+     * 银行名称
+     */
+    @JsonProperty("pay_bankname")
+    private String payBankname;
+    
+    /**
+     * 附加字段
+     */
+    @JsonProperty("pay_attach")
+    private String payAttach;
+    
+    /**
+     * 商品名称
+     */
+    @JsonProperty("pay_productname")
+    private String payProductname;
+    
+    /**
+     * 身份证号
+     */
+    @JsonProperty("pay_idno")
+    private String payIdno;
+    
+    /**
+     * 加密方式
+     */
+    @JsonProperty("pay_signtype")
+    private String paySigntype;
+    
+}

+ 25 - 0
cif-api/src/main/java/com/txz/cif/dto/tfpay/TFQueryOrderDTO.java

@@ -0,0 +1,25 @@
+package com.txz.cif.dto.tfpay;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+/**
+ * @author: MTD®️
+ * @date: 2025/8/29
+ */
+@Data
+public class TFQueryOrderDTO {
+    
+    /**
+     * 商户号
+     */
+    @JsonProperty("pay_memberid")
+    private String payMemberid;
+    
+    /**
+     * 商户订单号
+     */
+    @JsonProperty("pay_orderid")
+    private String payOrderid;
+    
+}

+ 69 - 0
cif-api/src/main/java/com/txz/cif/dto/tfpay/TFWithdrawDTO.java

@@ -0,0 +1,69 @@
+package com.txz.cif.dto.tfpay;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @author: MTD®️
+ * @date: 2025/9/3
+ */
+@Data
+@Builder
+public class TFWithdrawDTO {
+    
+    /**
+     * 商户号
+     */
+    private String payMemberid;
+    
+    /**
+     * 商户订单号
+     */
+    private String payOrderid;
+    
+    /**
+     * 提交时间
+     */
+    private String payApplydate;
+    
+    /**
+     * 通道编码
+     */
+    private String payChannelcode;
+    
+    /**
+     * 异步回调
+     */
+    private String payNotifyurl;
+    
+    /**
+     * 订单金额
+     */
+    private String payAmount;
+    
+    /**
+     * 商品名称/备注
+     */
+    private String payProductname;
+    
+    /**
+     * 用户姓名
+     */
+    private String payUsername;
+    
+    /**
+     * 银行账号
+     */
+    private String payBanknumber;
+    
+    /**
+     * 银行名称
+     */
+    private String payBankname;
+    
+    /**
+     * 银行代码(key)
+     */
+    private String payBankcode;
+    
+}

+ 15 - 0
cif-api/src/main/java/com/txz/cif/service/RedEnvelopeDubboService.java

@@ -0,0 +1,15 @@
+package com.txz.cif.service;
+
+
+import com.txz.cif.dto.EarningsDTO;
+import com.txz.cif.dto.Result;
+import com.txz.cif.dto.UserDTO;
+
+import java.util.List;
+
+public interface RedEnvelopeDubboService {
+
+
+    List<EarningsDTO> getEarningsByOrders(List<String> orders);
+
+}

+ 6 - 0
cif-service/pom.xml

@@ -316,6 +316,12 @@
             <scope>test</scope>
         </dependency>
 
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>lock4j-redis-template-spring-boot-starter</artifactId>
+            <version>2.2.5</version>
+        </dependency>
+
     </dependencies>
 
 

+ 36 - 0
cif-service/src/main/java/com/txz/cif/configurer/TFPayConfig.java

@@ -0,0 +1,36 @@
+package com.txz.cif.configurer;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author: MTD®️
+ * @date: 2025/8/29
+ */
+
+@Component
+@Data
+@RefreshScope
+public class TFPayConfig {
+    
+    // @Value("${tfpay.memberid}")
+    // private String payMemberid;
+    
+    // @Value("${tfpay.key}")
+    // private String key;
+    
+    // @Value("${tfpay.notifyurl}")
+    // private String payNotifyurl;
+    
+    @Value("${tfpay.callbackurl}")
+    private String payCallbackurl;
+    
+    @Value("${tfpay.paymenturl}")
+    private String paymenturl;
+    
+    @Value("${tfpay.withdrawurl}")
+    private String withdrawurl;
+    
+}

+ 1 - 0
cif-service/src/main/java/com/txz/cif/constants/MyConstants.java

@@ -52,4 +52,5 @@ public class MyConstants {
    */
   public static final String ICON_USER = "/public/user.png";
 
+  public static final String TF_PAY_NOTIFY_LOCK = "TF_PAY_NOTIFY_LOCK:%s";
 }

+ 3 - 0
cif-service/src/main/java/com/txz/cif/dao/RedEnvelopeMapper.java

@@ -1,6 +1,7 @@
 package com.txz.cif.dao;
 
 import com.txz.cif.core.Mapper;
+import com.txz.cif.dto.EarningsDTO;
 import com.txz.cif.model.RedEnvelope;
 import com.txz.cif.web.bo.UserTopBo;
 
@@ -14,4 +15,6 @@ public interface RedEnvelopeMapper extends Mapper<RedEnvelope> {
 
 
     List<UserTopBo> top(HashMap<String, Object> map);
+
+    EarningsDTO sumWithOrderNo(String orderNo);
 }

+ 47 - 0
cif-service/src/main/java/com/txz/cif/dubbo/impl/RedEnvelopeDubboServiceImpl.java

@@ -0,0 +1,47 @@
+package com.txz.cif.dubbo.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
+import com.txz.cif.core.RedisUtil;
+import com.txz.cif.core.cache.CacheKey;
+import com.txz.cif.core.cache.CacheType;
+import com.txz.cif.dto.EarningsDTO;
+import com.txz.cif.dto.Result;
+import com.txz.cif.dto.UserDTO;
+import com.txz.cif.model.User;
+import com.txz.cif.service.RedEnvelopeDubboService;
+import com.txz.cif.service.RedEnvelopeService;
+import com.txz.cif.service.UserDubboService;
+import com.txz.cif.service.UserService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.apache.dubbo.config.annotation.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@Slf4j
+@DubboService(timeout = 1200000)
+public class RedEnvelopeDubboServiceImpl implements RedEnvelopeDubboService {
+    
+    @Resource
+    private RedisUtil redisUtil;
+    
+    @Resource
+    private RedEnvelopeService redEnvelopeService;
+
+
+    @Override
+    public List<EarningsDTO> getEarningsByOrders(List<String> orders) {
+        List<EarningsDTO> ret = new ArrayList<>();
+        for (String orderNo : orders){
+            EarningsDTO dto  =  redEnvelopeService.sumWithOrderNo(orderNo);
+            ret.add(dto);
+        }
+        return ret;
+    }
+}

+ 27 - 15
cif-service/src/main/java/com/txz/cif/model/BizLog.java

@@ -4,53 +4,65 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.*;
 
-import java.util.Date;
 import javax.persistence.*;
+import java.util.Date;
 
 @Getter
 @Setter
 @NoArgsConstructor
 @AllArgsConstructor
 @Builder
-@ApiModel(value="com.txz.cif.model.BizLog")
+@ApiModel(value = "com.txz.cif.model.BizLog")
 @Table(name = "c_biz_log")
 public class BizLog {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @ApiModelProperty(value="id")
+    @ApiModelProperty(value = "id")
     private Long id;
-
+    
     /**
      * 订单号
      */
     @Column(name = "biz_no")
-    @ApiModelProperty(value="bizNo订单号")
+    @ApiModelProperty(value = "bizNo订单号")
     private String bizNo;
-    @ApiModelProperty(value="备注")
+    @ApiModelProperty(value = "备注")
     private String memo;
     @Column(name = "biz_type")
-    @ApiModelProperty(value="类型1充值 2提现")
+    @ApiModelProperty(value = "类型1充值 2提现")
     private Integer bizType;
-
+    
     /**
      * type类型1提交充值订单 2充值调用第三方 3充值回调通知成功 4提交提现申请 5提现审核通过 6提现审核失败 7提现调用第三方 8提现回调通知成功
      */
-    @ApiModelProperty(value="type类型1提交充值订单 2充值调用第三方 3充值回调通知成功 4提交提现申请 5提现审核通过 6提现审核失败 7提现调用第三方 8提现回调通知成功 9提现回调通知失败")
+    @ApiModelProperty(value = "type类型1提交充值订单 2充值调用第三方 3充值回调通知成功 4提交提现申请 5提现审核通过 6提现审核失败 7提现调用第三方 8提现回调通知成功 9提现回调通知失败")
     private Integer type;
-
+    
+    /**
+     * 三方接口请求消息
+     */
+    @Column(name = "send_message")
+    private String sendMessage;
+    
+    /**
+     * 三方接口接收消息
+     */
+    @Column(name = "receive_message")
+    private String receiveMessage;
+    
     /**
      * 创建人
      */
     @Column(name = "create_user")
-    @ApiModelProperty(value="createUser创建人")
+    @ApiModelProperty(value = "createUser创建人")
     private String createUser;
-
+    
     /**
      * 创建时间
      */
     @Column(name = "create_time")
-    @ApiModelProperty(value="createTime创建时间")
+    @ApiModelProperty(value = "createTime创建时间")
     private Date createTime;
-
-
+    
+    
 }

+ 52 - 49
cif-service/src/main/java/com/txz/cif/model/RechargeRecord.java

@@ -7,154 +7,157 @@ import lombok.*;
 import javax.persistence.*;
 import java.math.BigDecimal;
 import java.util.Date;
+
 @Getter
 @Setter
 @NoArgsConstructor
 @AllArgsConstructor
 @Builder
 
-@ApiModel(value="com.txz.cif.model.RechargeRecord")
+@ApiModel(value = "com.txz.cif.model.RechargeRecord")
 @Table(name = "c_recharge_record")
 public class RechargeRecord {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @ApiModelProperty(value="id")
+    @ApiModelProperty(value = "id")
     private Long id;
-
+    
     /**
      * 订单号
      */
     @Column(name = "order_no")
-    @ApiModelProperty(value="orderNo订单号")
+    @ApiModelProperty(value = "orderNo订单号")
     private String orderNo;
-
+    
     /**
      * 用户id
      */
     @Column(name = "user_id")
-    @ApiModelProperty(value="userId用户id")
+    @ApiModelProperty(value = "userId用户id")
     private Long userId;
-
+    
     @Column(name = "method_id")
-    @ApiModelProperty(value="支付方式id")
+    @ApiModelProperty(value = "支付方式id")
     private Long methodId;
-
+    
     @Column(name = "channel_id")
-    @ApiModelProperty(value="支付渠道id")
+    @ApiModelProperty(value = "支付渠道id")
     private Long channelId;
-
+    
     /**
      * 交易金额
      */
-    @ApiModelProperty(value="amount交易金额")
+    @ApiModelProperty(value = "amount交易金额")
     private BigDecimal amount;
-
-    @ApiModelProperty(value="折扣金额")
+    
+    @Column(name = "real_amount")
+    @ApiModelProperty(value = "真实金额")
+    private BigDecimal realAmount;
+    
+    @ApiModelProperty(value = "折扣金额")
     private BigDecimal discount;
-
+    
     /**
      * 状态 1处理中 2充值成功 3充值失败 4超时取消
      */
-    @ApiModelProperty(value="status状态 1处理中 2充值成功 3充值失败 4超时取消")
+    @ApiModelProperty(value = "status状态 1处理中 2充值成功 3充值失败 4超时取消")
     private Integer status;
-
+    
     /**
      * 渠道
      */
-    @ApiModelProperty(value="channel渠道")
+    @ApiModelProperty(value = "channel渠道")
     private String channel;
-
+    
     /**
      * 币种
      */
-    @ApiModelProperty(value="currency币种")
+    @ApiModelProperty(value = "currency币种")
     private String currency;
-
+    
     /**
      * 用户名
      */
     @Column(name = "user_name")
-    @ApiModelProperty(value="userName用户名")
+    @ApiModelProperty(value = "userName用户名")
     private String userName;
-
+    
     /**
      * 手机号
      */
     @Column(name = "user_phone")
-    @ApiModelProperty(value="userPhone手机号")
+    @ApiModelProperty(value = "userPhone手机号")
     private String userPhone;
-
+    
     /**
      * 交易时间
      */
     @Column(name = "trans_time")
-    @ApiModelProperty(value="transTime交易时间")
+    @ApiModelProperty(value = "transTime交易时间")
     private Date transTime;
-
+    
     /**
      * 交易成功时间
      */
     @Column(name = "success_time")
-    @ApiModelProperty(value="successTime交易成功时间")
+    @ApiModelProperty(value = "successTime交易成功时间")
     private Date successTime;
-
+    
     /**
      * 商品id
      */
     @Column(name = "goods_id")
-    @ApiModelProperty(value="goodsId商品id")
+    @ApiModelProperty(value = "goodsId商品id")
     private Integer goodsId;
-
+    
     /**
      * 创建人
      */
     @Column(name = "create_user")
-    @ApiModelProperty(value="createUser创建人")
+    @ApiModelProperty(value = "createUser创建人")
     private String createUser;
-
+    
     /**
      * 更新人
      */
     @Column(name = "update_user")
-    @ApiModelProperty(value="updateUser更新人")
+    @ApiModelProperty(value = "updateUser更新人")
     private String updateUser;
-
+    
     /**
      * 更新时间
      */
     @Column(name = "update_time")
-    @ApiModelProperty(value="updateTime更新时间")
+    @ApiModelProperty(value = "updateTime更新时间")
     private Date updateTime;
-
+    
     /**
      * 创建时间
      */
     @Column(name = "create_time")
-    @ApiModelProperty(value="createTime创建时间")
+    @ApiModelProperty(value = "createTime创建时间")
     private Date createTime;
-
+    
     /**
      * 版本号
      */
-    @ApiModelProperty(value="version版本号")
+    @ApiModelProperty(value = "version版本号")
     private String version;
-
-
+    
+    
     @Column(name = "bank")
-    @ApiModelProperty(value="银行")
+    @ApiModelProperty(value = "银行")
     private String bank;
-
+    
     /**
      * 用户名
      */
     @Column(name = "bank_account_name")
-    @ApiModelProperty(value="银行账号姓名")
+    @ApiModelProperty(value = "银行账号姓名")
     private String bankAccountName;
-
+    
     @Column(name = "bank_account")
-    @ApiModelProperty(value="银行")
+    @ApiModelProperty(value = "银行")
     private String bankAccount;
     
-    private String url;
-
 }

+ 3 - 0
cif-service/src/main/java/com/txz/cif/service/RedEnvelopeService.java

@@ -1,4 +1,5 @@
 package com.txz.cif.service;
+import com.txz.cif.dto.EarningsDTO;
 import com.txz.cif.dto.Result;
 import com.txz.cif.model.RedEnvelope;
 import com.txz.cif.core.Service;
@@ -27,4 +28,6 @@ public interface RedEnvelopeService extends Service<RedEnvelope> {
     BigDecimal sumWithDay(Integer day, Long userId,Integer type);
 
     List<UserTopBo> top(Integer type, Integer page, Integer size);
+
+    EarningsDTO sumWithOrderNo(String orderNo);
 }

+ 35 - 0
cif-service/src/main/java/com/txz/cif/service/TFPayService.java

@@ -0,0 +1,35 @@
+package com.txz.cif.service;
+
+import com.txz.cif.dto.BizLogDTO;
+import com.txz.cif.dto.tfpay.TFCreateOrderDTO;
+import com.txz.cif.dto.tfpay.TFQueryOrderDTO;
+import com.txz.cif.dto.tfpay.TFWithdrawDTO;
+
+/**
+ * @author: MTD®️
+ * @date: 2025/8/29
+ */
+
+public interface TFPayService {
+    
+    /**
+     * 创单
+     */
+    BizLogDTO createTFPayOrder(TFCreateOrderDTO dto, String key);
+    
+    /**
+     * 查单
+     */
+    String queryOrder(TFQueryOrderDTO dto, String key);
+    
+    /**
+     * 银行列表
+     */
+    String queryBankList(String payChannelcode);
+    
+    /**
+     * 提现
+     */
+    BizLogDTO withdraw(TFWithdrawDTO dto, String key);
+    
+}

+ 1 - 1
cif-service/src/main/java/com/txz/cif/service/impl/RechargeRecordServiceImpl.java

@@ -37,7 +37,7 @@ public class RechargeRecordServiceImpl extends AbstractService<RechargeRecord> i
                 .build());
 //        accountService.
         flowService.recharge(RechargeParam.builder()
-                        .amount(record.getAmount())
+                        .amount(record.getRealAmount())
                         .bizNo(record.getOrderNo())
                         .bizId(record.getId()+"")
                         .userId(record.getUserId())

+ 6 - 0
cif-service/src/main/java/com/txz/cif/service/impl/RedEnvelopeServiceImpl.java

@@ -6,6 +6,7 @@ import cn.hutool.core.util.IdUtil;
 import com.github.pagehelper.PageHelper;
 import com.txz.cif.constants.MyConstants;
 import com.txz.cif.dao.RedEnvelopeMapper;
+import com.txz.cif.dto.EarningsDTO;
 import com.txz.cif.dto.Result;
 import com.txz.cif.dubbo.client.OperatingConfigDubboServiceClient;
 import com.txz.cif.enums.BizTypeEnum;
@@ -108,6 +109,11 @@ public class RedEnvelopeServiceImpl extends AbstractService<RedEnvelope> impleme
         return cRedEnvelopeMapper.top( map);
     }
 
+    @Override
+    public EarningsDTO sumWithOrderNo(String orderNo) {
+        return cRedEnvelopeMapper.sumWithOrderNo(orderNo);
+    }
+
     /**
      * 构建红包对象
      * @param userId

+ 130 - 0
cif-service/src/main/java/com/txz/cif/service/impl/TFPayServiceImpl.java

@@ -0,0 +1,130 @@
+package com.txz.cif.service.impl;
+
+import cn.hutool.http.HttpRequest;
+import com.txz.cif.configurer.TFPayConfig;
+import com.txz.cif.dto.BizLogDTO;
+import com.txz.cif.dto.tfpay.*;
+import com.txz.cif.service.TFPayService;
+import com.txz.cif.util.TFPayUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * @author: MTD®️
+ * @date: 2025/8/29
+ */
+@Slf4j
+@Service
+public class TFPayServiceImpl implements TFPayService {
+    
+    @Autowired
+    private TFPayConfig tfPayConfig;
+    
+    @Override
+    public BizLogDTO createTFPayOrder(TFCreateOrderDTO dto, String key) {
+        // 构建签名参数
+        TFPayOrderDTO tyPay = TFPayOrderDTO.builder()
+                .payMemberid(dto.getPayMemberid())
+                .payOrderid(dto.getPayOrderid())
+                .payApplydate(dto.getPayApplydate())
+                .payChannelcode(dto.getPayChannelcode())
+                .payNotifyurl(dto.getPayNotifyurl())
+                .payCallbackurl(tfPayConfig.getPayCallbackurl())
+                .payAmount(dto.getPayAmount())
+                .build();
+        
+        tyPay.setPayMd5sign(TFPayUtil.generateSignature(tyPay, key));
+        tyPay.setCurrencyType("BDT");
+        tyPay.setType("json");
+        tyPay.setIp(dto.getIp());
+        
+        Map<String, Object> reqMap = TFPayUtil.convertObjectToMap(tyPay);
+        String result = HttpRequest.post(tfPayConfig.getPaymenturl() + "/pay")
+                .form(reqMap)
+                .contentType("application/x-www-form-urlencoded")
+                .execute()
+                .body();
+        log.info("TFPay createOrder result: {}", result);
+        return BizLogDTO.builder()
+                .sendMessage(reqMap.toString())
+                .receiveMessage(result)
+                .build();
+    }
+    
+    @Override
+    public String queryOrder(TFQueryOrderDTO dto, String key) {
+        TFPayOrderDTO tfPay = TFPayOrderDTO.builder()
+                .payMemberid(dto.getPayMemberid())
+                .payOrderid(dto.getPayOrderid())
+                .build();
+        tfPay.setPayMd5sign(TFPayUtil.generateSignature(tfPay, key));
+        String result = HttpRequest.post(tfPayConfig.getPaymenturl() + "/query")
+                .form(TFPayUtil.convertObjectToMap(tfPay))
+                .contentType("application/x-www-form-urlencoded")
+                .execute()
+                .body();
+        log.info("TFPay queryOrder result: {}", result);
+        // JSONObject resultJson = JSONUtil.parseObj(result);
+        // if (resultJson.getStr("status").equals("200")) {
+        //     return resultJson.getStr("data");
+        // } else {
+        //     throw new RuntimeException("查询TFPAY支付单失败--->" + result);
+        // }
+        // todo 暂无功能,后续修改
+        return result;
+    }
+    
+    @Override
+    public String queryBankList(String payChannelcode) {
+        TFPayOrderDTO tfPay = TFPayOrderDTO.builder()
+                .payMemberid("260875")
+                .payOrderid(payChannelcode)
+                .build();
+        String result = HttpRequest.post(tfPayConfig.getPaymenturl() + "/bank")
+                .form(TFPayUtil.convertObjectToMap(tfPay))
+                .contentType("application/x-www-form-urlencoded")
+                .execute()
+                .body();
+        // todo 暂无功能,后续修改
+        return result;
+    }
+    
+    @Override
+    public BizLogDTO withdraw(TFWithdrawDTO dto, String key) {
+        TFCreateWithdrawDTO withdrawDTO = TFCreateWithdrawDTO.builder()
+                .payMemberid(dto.getPayMemberid())
+                .payOrderid(dto.getPayOrderid())
+                .payApplydate(dto.getPayApplydate())
+                .payChannelcode(dto.getPayChannelcode())
+                .payNotifyurl(dto.getPayNotifyurl())
+                .payAmount(dto.getPayAmount())
+                .payProductname(dto.getPayProductname())
+                .payUsername(dto.getPayUsername())
+                .payBanknumber(dto.getPayBanknumber())
+                .payBankname(dto.getPayBankname())
+                .build();
+        
+        // 生成签名
+        withdrawDTO.setPayMd5sign(TFPayUtil.generateSignature(dto, key));
+        withdrawDTO.setPayBankcode(dto.getPayBankcode());
+        withdrawDTO.setCurrencyType("BDT");
+        withdrawDTO.setType("json");
+        
+        Map<String, Object> reqMap = TFPayUtil.convertObjectToMap(dto);
+        String result = HttpRequest.post(tfPayConfig.getWithdrawurl())
+                .form(reqMap)
+                .contentType("application/x-www-form-urlencoded")
+                .execute()
+                .body();
+        log.info("TFPay withdraw result: {}", result);
+        return BizLogDTO.builder()
+                .sendMessage(reqMap.toString())
+                .receiveMessage(result)
+                .build();
+    }
+    
+    
+}

+ 6 - 1
cif-service/src/main/java/com/txz/cif/service/impl/UserServiceImpl.java

@@ -86,9 +86,14 @@ public class UserServiceImpl extends AbstractService<User> implements UserServic
         if (StrUtil.equals("888888",code)){
             return true;
         }
+        log.error("checkCode  phoneNo:"+phoneNo);
+        log.error("checkCode  code:"+code);
         String key = getKey(phoneNo);
         Object o = redisClient.get(key);
-        if (StrUtil.equals(o.toString(),code)){
+        if (o != null){
+            log.error("checkCode  o:"+o.toString());
+        }
+        if (o != null && StrUtil.equals(o.toString(),code)){
             return true;
         }
         return false;

+ 112 - 0
cif-service/src/main/java/com/txz/cif/util/TFPayUtil.java

@@ -0,0 +1,112 @@
+package com.txz.cif.util;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * @author: MTD®️
+ * @date: 2025/8/29
+ */
+public class TFPayUtil {
+    
+    /**
+     * 签名
+     *
+     * @param dto
+     * @param key 私钥
+     *
+     * @return
+     */
+    public static String generateSignature(Object dto, String key) {
+        Map<String, Object> paramMap = convertObjectToMap(dto);
+        String signString = buildSignString(paramMap);
+        return md5(signString + "&key=" + key).toUpperCase();
+    }
+    
+    /**
+     * 验签
+     *
+     * @param dto
+     * @param key          私钥
+     * @param expectedSign 签名
+     *
+     * @return
+     */
+    public static boolean verifySignature(Object dto, String key, String expectedSign) {
+        String generatedSign = generateSignature(dto, key);
+        return generatedSign.equals(expectedSign);
+    }
+    
+    public static Map<String, Object> convertObjectToMap(Object obj) {
+        Map<String, Object> paramMap = new TreeMap<>();
+        Class<?> clazz = obj.getClass();
+        Field[] fields = clazz.getDeclaredFields();
+        
+        for (Field field : fields) {
+            try {
+                field.setAccessible(true);
+                Object value = field.get(obj);
+                if (value != null && !value.toString().isEmpty()) {
+                    JsonProperty jsonProperty = field.getAnnotation(JsonProperty.class);
+                    String key = (jsonProperty != null) ? jsonProperty.value() : field.getName();
+                    
+                    if (value instanceof BigDecimal) {
+                        paramMap.put(key, ((BigDecimal) value).stripTrailingZeros().toPlainString());
+                    } else {
+                        paramMap.put(key, value);
+                    }
+                }
+            } catch (IllegalAccessException e) {
+            }
+        }
+        return paramMap;
+    }
+    
+    
+    private static String buildSignString(Map<String, Object> paramMap) {
+        StringBuilder sb = new StringBuilder();
+        Iterator<Map.Entry<String, Object>> iterator = paramMap.entrySet().iterator();
+        while (iterator.hasNext()) {
+            Map.Entry<String, Object> entry = iterator.next();
+            sb.append(entry.getKey()).append("=").append(entry.getValue());
+            if (iterator.hasNext()) {
+                sb.append("&");
+            }
+        }
+        return sb.toString();
+    }
+    
+    /**
+     * MD5加密
+     *
+     * @param input 输入字符串
+     *
+     * @return MD5加密结果
+     */
+    public static String md5(String input) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] messageDigest = md.digest(input.getBytes());
+            StringBuilder hexString = new StringBuilder();
+            
+            for (byte b : messageDigest) {
+                String hex = Integer.toHexString(0xFF & b);
+                if (hex.length() == 1) {
+                    hexString.append('0');
+                }
+                hexString.append(hex);
+            }
+            
+            return hexString.toString();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException("MD5 algorithm not found", e);
+        }
+    }
+}

+ 144 - 42
cif-service/src/main/java/com/txz/cif/web/RechargeRecordApiController.java

@@ -1,28 +1,38 @@
 package com.txz.cif.web;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
-import com.txz.cif.core.Result;
-import com.txz.cif.core.ResultGenerator;
-import com.txz.cif.model.*;
-import com.txz.cif.service.*;
-
-import com.txz.cif.core.ResultCode;
-
+import com.baomidou.lock.LockInfo;
+import com.baomidou.lock.LockTemplate;
+import com.baomidou.lock.executor.RedisTemplateLockExecutor;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
-import com.txz.cif.core.AuthService;
+import com.txz.cif.constants.MyConstants;
+import com.txz.cif.core.*;
+import com.txz.cif.dto.BizLogDTO;
+import com.txz.cif.dto.tfpay.CheckSignDTO;
+import com.txz.cif.dto.tfpay.TFCreateOrderDTO;
+import com.txz.cif.model.*;
+import com.txz.cif.service.*;
+import com.txz.cif.util.IpUtils;
+import com.txz.cif.util.TFPayUtil;
 import com.txz.cif.web.para.RecordParam;
+import com.txz.cif.web.ro.TFPayNotifyDTO;
+import com.txz.cif.web.vo.CreatePayVO;
 import com.txz.cif.web.vo.PaymentPriceVO;
-import org.springframework.web.bind.annotation.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
 import tk.mybatis.mapper.entity.Condition;
+import tk.mybatis.mapper.entity.Example;
 import tk.mybatis.mapper.entity.Example.Criteria;
 
 import javax.annotation.Resource;
@@ -64,6 +74,12 @@ public class RechargeRecordApiController {
     @Resource
     private PaymentMethodService paymentMethodService;
     
+    @Resource
+    private TFPayService tfPayService;
+    
+    @Resource
+    private LockTemplate lockTemplate;
+    
     @GetMapping("/goodsList/{methodId:^\\d+$}")
     @ApiOperation(value = "充值商品", httpMethod = "GET")
     public Result<PaymentPriceVO> goodsList(@PathVariable("methodId") Long methodId) {
@@ -85,11 +101,12 @@ public class RechargeRecordApiController {
     
     @GetMapping("/add")
     @ApiOperation(value = "创建充值订单", httpMethod = "GET")
-    public Result add(@RequestParam BigDecimal amount, @RequestParam Long methodId, HttpServletRequest request) {
+    public Result<CreatePayVO> add(@RequestParam BigDecimal amount, @RequestParam Long methodId, HttpServletRequest request) {
         Long userId = authService.getTokenUserId(request);
         // if (goodsId == null) {
         //     return ResultGenerator.genFailResult(ResultCode.OAUTH_INVALID_ACCESS_TOKEN);
         // }
+        DateTime now = DateUtil.date();
         try {
             // Goods goods = goodsService.findById(goodsId);
             // if (goods == null) {
@@ -109,8 +126,10 @@ public class RechargeRecordApiController {
             RechargeRecord rechargeRecord = RechargeRecord.builder()
                     .discount(BigDecimal.ZERO)
                     .amount(amount)
-                    .currency("BDT").userId(userId)
-                    .userName(user.getName()).userPhone(user.getPhoneNo())
+                    .currency("BDT")
+                    .userId(userId)
+                    .userName(user.getName())
+                    .userPhone(user.getPhoneNo())
                     .bank(user.getBank())
                     .methodId(methodId)
                     .channelId(paymentChannel == null ? null : paymentChannel.getId())
@@ -119,21 +138,66 @@ public class RechargeRecordApiController {
                     .orderNo(orderNo)
                     .goodsId(-1)
                     .createUser(user.getName())
-                    .status(1).createTime(DateUtil.date())
+                    .status(1)
+                    .createTime(now)
                     .build();
             rechargeRecordService.save(rechargeRecord);
-            // TODO 发起第三方支付
-            
+            // 获取渠道编码
+            String channelCode;
+            if (methodId == 1) {
+                channelCode = paymentChannel.getBkashPayCode();
+            } else if (methodId == 2) {
+                channelCode = paymentChannel.getNagadPayCode();
+            } else {
+                channelCode = paymentChannel.getRocketPayCode();
+            }
+            BizLogDTO bizLog;
+            String payUrl = "";
+            boolean issuccess = false;
+            switch (paymentChannel.getChannelName()) {
+                case "TFPAY":
+                    bizLog = tfPayService.createTFPayOrder(
+                            TFCreateOrderDTO.builder()
+                                    .payMemberid(paymentChannel.getMerchantNum())
+                                    .payOrderid(orderNo)
+                                    .payApplydate(now.toString())
+                                    .payChannelcode(channelCode)
+                                    .payNotifyurl(paymentChannel.getNotifyUrl())
+                                    .payAmount(amount.toString())
+                                    .ip(IpUtils.getIPAddress(request))
+                                    .build()
+                            , paymentChannel.getSecretKey());
+                    
+                    JSONObject resultJson = JSONUtil.parseObj(bizLog.getReceiveMessage());
+                    if (resultJson.getStr("status").equals("200")) {
+                        payUrl = resultJson.getStr("data");
+                        issuccess = Boolean.TRUE;
+                    }
+                    break;
+                default:
+                    throw new ServiceException("暂不支持此渠道");
+            }
             
             try {
                 // 新增日志
-                bizLogService.save(BizLog.builder().bizType(1).bizNo(orderNo)
-                        .type(1).createTime(DateUtil.date()).createUser(user.getName())
+                bizLogService.save(BizLog.builder()
+                        .bizType(1)
+                        .bizNo(orderNo)
+                        .type(1)
+                        .receiveMessage(bizLog.getReceiveMessage())
+                        .sendMessage(bizLog.getSendMessage())
+                        .createTime(now)
+                        .createUser(user.getName())
                         .memo("提交充值订单").build());
             } catch (Exception e) {
                 log.error("新增充值提交订单日志失败", e);
             }
-            return ResultGenerator.genSuccessResult(rechargeRecord);
+            
+            if (!issuccess) {
+                throw new ServiceException("创建支付单失败");
+            }
+            
+            return Result.success(CreatePayVO.builder().orderNo(orderNo).payUrl(payUrl).build());
         } catch (Exception e) {
             log.error("新增对象操作异常e:{}", e);
             return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
@@ -141,30 +205,68 @@ public class RechargeRecordApiController {
         
     }
     
-    @GetMapping("/callback")
-    @ApiOperation(value = "三方回调", httpMethod = "GET")
-    public Result<RechargeRecord> detail(@RequestParam String data) {
-        // TODO 回调成功
-        JSONObject json = JSONUtil.parseObj(data);
-        String orderNo = json.getStr("orderNo");
-        RechargeRecord record = rechargeRecordService.findBy("orderNo", orderNo);
-        if (record == null) {
-            return ResultGenerator.genFailResult("订单未找到");
-        }
-        if (StrUtil.equals("1", json.getStr("status"))) {
-            rechargeRecordService.success(record);
-        } else {
-            rechargeRecordService.fail(record);
+    /**
+     * 回调通知
+     */
+    @PostMapping("/callback/tfpay")
+    public Object callback(@ModelAttribute TFPayNotifyDTO dto) {
+        LockInfo lockInfo = lockTemplate.lock(String.format(MyConstants.TF_PAY_NOTIFY_LOCK, dto.getOrderid()), Long.valueOf(1000 * 60 * 2), Long.valueOf(1000 * 1), RedisTemplateLockExecutor.class);
+        if (null == lockInfo) {
+            return "WAIT";
         }
         try {
-            // 新增充值回调日志
-            bizLogService.save(BizLog.builder().bizType(1).bizNo(orderNo)
-                    .type(3).createTime(DateUtil.date()).createUser("第三方")
-                    .memo("充值回调").build());
-        } catch (Exception e) {
-            log.error("新增充值回调日志失败", e);
+            log.info("支付渠道--->tfpay,回调通知--->" + dto);
+            Condition condition = new Condition(PaymentChannel.class);
+            Example.Criteria criteria = condition.createCriteria();
+            criteria.andEqualTo("channelName", "TFPAY");
+            criteria.andEqualTo("isValid", 1);
+            List<PaymentChannel> paymentChannels = paymentChannelService.findByCondition(condition);
+            if (CollectionUtil.isEmpty(paymentChannels)) {
+                log.info("支付渠道不存在");
+                return "FAIL";
+            }
+            boolean checkSignResult = TFPayUtil.verifySignature(BeanUtil.copyProperties(dto, CheckSignDTO.class), paymentChannels.get(0).getSecretKey(), dto.getSign());
+            if (!checkSignResult) {
+                log.info("签名校验失败");
+                return "FAIL";
+            }
+            RechargeRecord record = rechargeRecordService.findBy("orderNo", dto.getOrderid());
+            if (ObjectUtil.isEmpty(record)) {
+                return "FAIL";
+            }
+            if (record.getStatus() == 2) {
+                return "FAIL";
+            }
+            record.setRealAmount(new BigDecimal(dto.getAmount()));
+            rechargeRecordService.success(record);
+            
+            // String orderNo = dto.getOrderid();
+            // RechargeRecord record = rechargeRecordService.findBy("orderNo", orderNo);
+            // if (record == null) {
+            //     return ResultGenerator.genFailResult("订单未找到");
+            // }
+            // if (StrUtil.equals("1", json.getStr("status"))) {
+            // rechargeRecordService.success(record);
+            // } else {
+            //     rechargeRecordService.fail(record);
+            // }
+            try {
+                // 新增充值回调日志
+                bizLogService.save(BizLog.builder()
+                        .bizType(1)
+                        .bizNo(dto.getOrderid())
+                        .type(3)
+                        .receiveMessage(dto.toString())
+                        .createTime(DateUtil.date())
+                        .createUser("TFPAY")
+                        .memo("充值回调").build());
+            } catch (Exception e) {
+                log.error("新增充值回调日志失败", e);
+            }
+            return "OK";
+        } finally {
+            this.lockTemplate.releaseLock(lockInfo);
         }
-        return ResultGenerator.genSuccessResult();
     }
     
     

+ 46 - 6
cif-service/src/main/java/com/txz/cif/web/UserApiController.java

@@ -8,7 +8,11 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.SecureUtil;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+
+import com.txz.cif.configurer.LocalUtil;
+
 import com.txz.cif.core.*;
+
 import com.txz.cif.dubbo.client.OperatingConfigDubboServiceClient;
 import com.txz.cif.enums.BizTypeEnum;
 import com.txz.cif.enums.RechargeStatusEnum;
@@ -81,25 +85,61 @@ public class UserApiController extends AbstractApiController {
         switch (id) {
             case 1:
                 return ResultGenerator.genSuccessResult(Arrays.stream(BizTypeEnum.values())
-                        .map(temp -> EnumBo.builder().code(temp.getKey()).name(temp.getValue()).build()).collect(Collectors.toList()));
+                        .map(temp -> {
+                            EnumBo bo =  EnumBo.builder().code(temp.getKey()).name(temp.getValue()).build();
+                            String msg = LocalUtil.get("BizTypeEnum."+temp.name());
+                            if (StrUtil.isNotBlank(msg) ){
+                                bo.setName(msg);
+                            }
+                            return bo;
+                        }).collect(Collectors.toList()));
             case 2:
                 return ResultGenerator.genSuccessResult(Arrays.stream(RechargeStatusEnum.values())
-                        .map(temp -> EnumBo.builder().code(temp.getKey()).name(temp.getDesc()).build()).collect(Collectors.toList()));
+                        .map(temp ->  {
+                            EnumBo bo =  EnumBo.builder().code(temp.getKey()).name(temp.getDesc()).build();
+                            String msg = LocalUtil.get("RechargeStatusEnum."+temp.name());
+                            if (StrUtil.isNotBlank(msg) ){
+                                bo.setName(msg);
+                            }
+                            return bo;
+                        } ).collect(Collectors.toList()));
             case 3:
                 return ResultGenerator.genSuccessResult(Arrays.stream(WithdrawStatusEnum.values())
-                        .map(temp -> EnumBo.builder().code(temp.getKey()).name(temp.getDesc()).build()).collect(Collectors.toList()));
+                        .map(temp ->  {
+                            EnumBo bo =  EnumBo.builder().code(temp.getKey()).name(temp.getDesc()).build();
+                            String msg = LocalUtil.get("WithdrawStatusEnum."+temp.name());
+                            if (StrUtil.isNotBlank(msg) ){
+                                bo.setName(msg);
+                            }
+                            return bo;
+                        } ).collect(Collectors.toList()));
             case 4:
                 return ResultGenerator.genSuccessResult(Arrays.stream(RedEnvelopeStatusEnum.values())
-                        .map(temp -> EnumBo.builder().code(temp.getKey()).name(temp.getDesc()).build()).collect(Collectors.toList()));
+                        .map(temp -> {
+                            EnumBo bo =  EnumBo.builder().code(temp.getKey()).name(temp.getDesc()).build();
+                            String msg = LocalUtil.get("RedEnvelopeStatusEnum."+temp.name());
+                            if (StrUtil.isNotBlank(msg) ){
+                                bo.setName(msg);
+                            }
+                            return bo;
+                        }).collect(Collectors.toList()));
             case 5:
                 return ResultGenerator.genSuccessResult(BizTypeEnum.getRedEnvelopeTypes().stream()
-                        .map(temp -> EnumBo.builder().code(temp.getKey()).name(temp.getValue()).build()).collect(Collectors.toList()));
+                        .map(temp -> {
+                            EnumBo bo =  EnumBo.builder().code(temp.getKey()).name(temp.getValue()).build();
+                            String msg = LocalUtil.get("BizTypeEnum."+temp.name());
+                            if (StrUtil.isNotBlank(msg) ){
+                                bo.setName(msg);
+                            }
+                            return bo;
+                        }).collect(Collectors.toList()));
         }
         return ResultGenerator.genSuccessResult();
     }
-    
+
     
     @ApiOperation(value = "用户登陆", notes = "", httpMethod = "POST")
+
     @PostMapping("/login")
     public Result<UserBo> login(@RequestBody LoginAccountParameters loginPara,
                                 @RequestHeader(value = "version", defaultValue = "1.0.1") String version,

+ 2 - 0
cif-service/src/main/java/com/txz/cif/web/WithdrawRecordApiController.java

@@ -122,6 +122,8 @@ public class WithdrawRecordApiController {
 			WithdrawRecord withdrawRecord = new WithdrawRecord();
 			withdrawRecord.setOrderNo(orderNo);
 			withdrawRecord.setStatus(1);
+			withdrawRecord.setUserName(user.getName());
+			withdrawRecord.setUserPhone(user.getPhoneNo());
 			withdrawRecord.setTransTime(DateUtil.date());
 			withdrawRecord.setUserId(userId);
 			withdrawRecord.setAccountType(param.getAccountType());

+ 223 - 215
cif-service/src/main/java/com/txz/cif/web/mng/WithdrawRecordController.java

@@ -1,11 +1,15 @@
 package com.txz.cif.web.mng;
+
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.poi.excel.ExcelUtil;
 import cn.hutool.poi.excel.ExcelWriter;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
 import com.txz.cif.core.Result;
+import com.txz.cif.core.ResultCode;
 import com.txz.cif.core.ResultGenerator;
 import com.txz.cif.model.Account;
 import com.txz.cif.model.BizLog;
@@ -13,21 +17,16 @@ import com.txz.cif.model.RechargeRecord;
 import com.txz.cif.model.WithdrawRecord;
 import com.txz.cif.service.AccountService;
 import com.txz.cif.service.BizLogService;
+import com.txz.cif.service.TFPayService;
 import com.txz.cif.service.WithdrawRecordService;
-
-import com.txz.cif.core.ResultCode;
-
-import com.github.pagehelper.PageHelper;
-import com.github.pagehelper.PageInfo;
 import com.txz.cif.web.bo.WithdrawRecordBO;
 import com.txz.cif.web.para.RecordParam;
 import com.txz.cif.web.para.ReviewParam;
-import org.springframework.web.bind.annotation.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
 import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example.Criteria;
 
@@ -38,219 +37,228 @@ import java.util.LinkedList;
 import java.util.List;
 
 /**
-* Created by CodeGenerator on 2025/07/15.
-*/
+ * Created by CodeGenerator on 2025/07/15.
+ */
 @Api(tags = "[后台]withdrawRecord管理")
 @RestController
 @RequestMapping("/withdraw/record")
 public class WithdrawRecordController {
-
-	private static Logger log = LoggerFactory.getLogger(WithdrawRecordController.class);
-
+    
+    private static Logger log = LoggerFactory.getLogger(WithdrawRecordController.class);
+    
     @Resource
     private WithdrawRecordService withdrawRecordService;
-
-	@Resource
-	private BizLogService bizLogService;
-
-	@Resource
-	private AccountService accountService;
-
+    
+    @Resource
+    private BizLogService bizLogService;
+    
+    @Resource
+    private AccountService accountService;
+    
+    @Resource
+    private TFPayService tfPayService;
+    
     @GetMapping("/detail")
-	@ApiOperation(value = "withdrawRecord获取详情",httpMethod = "GET")
+    @ApiOperation(value = "withdrawRecord获取详情", httpMethod = "GET")
     public Result<WithdrawRecordBO> detail(@RequestParam Long id) {
-    	if(id == null){
-    		return ResultGenerator.genFailResult(ResultCode.ID_IS_NULL);
-    	}
-
-    	try {
-			WithdrawRecord withdrawRecord = withdrawRecordService.findById(id);
-			if (withdrawRecord == null){
-				return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
-			}
-			WithdrawRecordBO bo = BeanUtil.toBean(withdrawRecord,WithdrawRecordBO.class);
-			Condition c = new Condition(BizLog.class);
-			c.createCriteria().andEqualTo("bizType",2)
-					.andEqualTo("bizNo",withdrawRecord.getOrderNo());
-			List<BizLog> logs = bizLogService.findByCondition(c);
-			bo.setBizLogs(logs);
-
-			Account wallet = accountService.getAccount(withdrawRecord.getUserId(), 1);
-			if (wallet != null){
-				bo.setWalletBalance(wallet.getBalance());
-			}
-			Account earnings = accountService.getAccount(withdrawRecord.getUserId(), 2);
-			if (earnings != null){
-				bo.setEarningsBalance(earnings.getBalance());
-			}
-			return ResultGenerator.genSuccessResult(bo);
-		} catch (Exception e) {
-			log.error("查询对象操作异常e:{}",e);
-			return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
-		}
-
+        if (id == null) {
+            return ResultGenerator.genFailResult(ResultCode.ID_IS_NULL);
+        }
+        
+        try {
+            WithdrawRecord withdrawRecord = withdrawRecordService.findById(id);
+            if (withdrawRecord == null) {
+                return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
+            }
+            WithdrawRecordBO bo = BeanUtil.toBean(withdrawRecord, WithdrawRecordBO.class);
+            Condition c = new Condition(BizLog.class);
+            c.createCriteria().andEqualTo("bizType", 2)
+                    .andEqualTo("bizNo", withdrawRecord.getOrderNo());
+            List<BizLog> logs = bizLogService.findByCondition(c);
+            bo.setBizLogs(logs);
+            
+            Account wallet = accountService.getAccount(withdrawRecord.getUserId(), 1);
+            if (wallet != null) {
+                bo.setWalletBalance(wallet.getBalance());
+            }
+            Account earnings = accountService.getAccount(withdrawRecord.getUserId(), 2);
+            if (earnings != null) {
+                bo.setEarningsBalance(earnings.getBalance());
+            }
+            return ResultGenerator.genSuccessResult(bo);
+        } catch (Exception e) {
+            log.error("查询对象操作异常e:{}", e);
+            return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
+        }
+        
+    }
+    
+    @PostMapping("/review")
+    @ApiOperation(value = "审核", httpMethod = "POST")
+    public Result review(@RequestBody ReviewParam param) {
+        if (param == null) {
+            return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
+        }
+        if (param.getId() == null) {
+            return ResultGenerator.genFailResult(ResultCode.ID_IS_NULL);
+        }
+        if (param.getType() == null) {
+            return ResultGenerator.genFailResult(ResultCode.TYPE_IS_NULL);
+        }
+        if (param.getType() == 2) {
+            if (StrUtil.isBlank(param.getReview())) {
+                return ResultGenerator.genFailResult(ResultCode.REVIEW_IS_NULL);
+            }
+        }
+        WithdrawRecord w = withdrawRecordService.findById(param.getId());
+        if (w == null) {
+            return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
+        }
+        if (w.getStatus() != 1) {
+            return ResultGenerator.genFailResult(ResultCode.STATUS_IS_NULL);
+        }
+        
+        if (param.getType() == 1) {
+            // 同意提现
+            
+            // tfPayService.withdraw();
+        }
+        
+        withdrawRecordService.review(WithdrawRecord.builder().id(param.getId())
+                .review(param.getReview()).status(param.getType() == 1 ? 2 : 3).build());
+        return ResultGenerator.genSuccessResult();
+    }
+    
+    @PostMapping("/list")
+    @ApiOperation(value = "withdrawRecord获取列表", httpMethod = "POST")
+    public Result<List<WithdrawRecord>> list(@RequestBody RecordParam param) {
+        
+        PageHelper.startPage(param.getPage(), param.getSize());
+        
+        Condition condition = new Condition(WithdrawRecord.class);
+        Criteria criteria = condition.createCriteria();
+        if (StrUtil.isNotBlank(param.getChannel())) {
+            criteria.andEqualTo("channel", param.getChannel());
+        }
+        if (StrUtil.isNotBlank(param.getUserName())) {
+            criteria.andEqualTo("userName", param.getUserName());
+        }
+        if (StrUtil.isNotBlank(param.getUserPhone())) {
+            criteria.andEqualTo("userPhone", param.getUserPhone());
+        }
+        if (StrUtil.isNotBlank(param.getOrderNo())) {
+            criteria.andEqualTo("orderNo", param.getOrderNo());
+        }
+        if (param.getStatus() != null) {
+            criteria.andEqualTo("status", param.getStatus());
+        }
+        if (param.getTimeType() != null) {
+            if (param.getTimeType() == 1) {
+                if (StrUtil.isNotBlank(param.getStartTime())) {
+                    criteria.andBetween("createTime", param.getStartTime(), param.getEndTime());
+                }
+            } else if (param.getTimeType() == 2) {
+                if (StrUtil.isNotBlank(param.getStartTime())) {
+                    criteria.andBetween("successTime", param.getStartTime(), param.getEndTime());
+                }
+            }
+        }
+        PageInfo pageInfo = null;
+        try {
+            condition.setOrderByClause("create_time desc");
+            List<WithdrawRecord> list = withdrawRecordService.findByCondition(condition);
+            pageInfo = new PageInfo(list);
+        } catch (Exception e) {
+            log.error("查询对象操作异常e:{}", e);
+            return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
+        }
+        return ResultGenerator.genSuccessResult(pageInfo);
+    }
+    
+    @GetMapping("/report")
+    @ApiOperation(value = "导出", httpMethod = "GET")
+    public void report(@RequestParam(required = false) String orderNo,
+                       @RequestParam(required = false) String channel,
+                       @RequestParam(required = false) String userName,
+                       @RequestParam(required = false) String userPhone,
+                       @RequestParam(required = false) Integer status,
+                       @RequestParam(required = false) Integer timeType,
+                       @RequestParam(required = false) String startTime,
+                       @RequestParam(required = false) String endTime,
+                       HttpServletResponse response) {
+        Condition condition = new Condition(RechargeRecord.class);
+        Criteria criteria = condition.createCriteria();
+        if (StrUtil.isNotBlank(channel)) {
+            criteria.andEqualTo("channel", channel);
+        }
+        if (StrUtil.isNotBlank(userName)) {
+            criteria.andEqualTo("userName", userName);
+        }
+        if (StrUtil.isNotBlank(userPhone)) {
+            criteria.andEqualTo("userPhone", userPhone);
+        }
+        if (StrUtil.isNotBlank(orderNo)) {
+            criteria.andEqualTo("orderNo", orderNo);
+        }
+        if (status != null) {
+            criteria.andEqualTo("status", status);
+        }
+        if (timeType != null) {
+            if (timeType == 1) {
+                if (StrUtil.isNotBlank(startTime) && StrUtil.isNotBlank(endTime)) {
+                    criteria.andBetween("createTime", startTime, endTime);
+                }
+            } else if (timeType == 2) {
+                if (StrUtil.isNotBlank(startTime) && StrUtil.isNotBlank(endTime)) {
+                    criteria.andBetween("successTime", startTime, endTime);
+                }
+            }
+        }
+        condition.setOrderByClause("create_time desc");
+        List<WithdrawRecord> list = withdrawRecordService.findByCondition(condition);
+        List<String> rowHead = CollUtil.newArrayList("编号", "订单号", "用户id", "交易金额", "手续费", "状态 1处理中 2充值成功 3充值失败 4超时取消", "渠道", "币种", "用户名", "手机号", "交易时间", "交易成功时间", "银行", "银行账户", "银行账户姓名");
+        ExcelWriter writer = ExcelUtil.getWriter();
+        try {
+            writer.writeHeadRow(rowHead);
+            List<List<Object>> rows = new LinkedList<>();
+            if (CollUtil.isNotEmpty(list)) {
+                for (WithdrawRecord temp : list) {
+                    List<Object> rowA = CollUtil.newArrayList(
+                            temp.getId() + "",
+                            temp.getOrderNo(),
+                            temp.getAmount() == null ? "0" : temp.getAmount().toPlainString(),
+                            temp.getFee() == null ? "0" : temp.getFee().toPlainString(),
+                            temp.getStatus() + "",
+                            temp.getChannel(),
+                            temp.getCurrency(),
+                            temp.getUserName(),
+                            temp.getUserPhone(),
+                            temp.getTransTime() == null ? "" : DateUtil.format(temp.getTransTime(), "yyyy-MM-dd HH:mm:ss"),
+                            temp.getSuccessTime() == null ? "" : DateUtil.format(temp.getSuccessTime(), "yyyy-MM-dd HH:mm:ss"),
+                            temp.getBank(),
+                            temp.getBankAccount(),
+                            temp.getBankAccountName());
+                    rows.add(rowA);
+                }
+            }
+            writer.write(rows);
+            // 设置宽度自适应
+            writer.setColumnWidth(-1, 22);
+            // response为HttpServletResponse对象
+            response.setContentType("application/vnd.ms-excel;charset=utf-8");
+            // test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
+            response.setHeader("Content-Disposition", "attachment;filename=" + new String(("数据列表").getBytes("UTF-8"), "ISO-8859-1") + ".xls");
+            ServletOutputStream out = response.getOutputStream();
+            // out为OutputStream,需要写出到的目标流
+            writer.flush(out);
+            log.info("导出结束");
+        } catch (Exception e) {
+            log.error("导出异常", e);
+            e.printStackTrace();
+        } finally {
+            // 关闭writer,释放内存
+            writer.close();
+            log.info("导出结束");
+        }
     }
-
-	@PostMapping("/review")
-	@ApiOperation(value = "审核",httpMethod = "POST")
-	public Result review(@RequestBody ReviewParam param) {
-		if (param == null){
-			return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
-		}
-		if (param.getId() == null){
-			return ResultGenerator.genFailResult(ResultCode.ID_IS_NULL);
-		}
-		if (param.getType() == null){
-			return ResultGenerator.genFailResult(ResultCode.TYPE_IS_NULL);
-		}
-		if (param.getType() == 2){
-			if (StrUtil.isBlank(param.getReview())){
-				return ResultGenerator.genFailResult(ResultCode.REVIEW_IS_NULL);
-			}
-		}
-		WithdrawRecord w = withdrawRecordService.findById(param.getId());
-		if (w == null){
-			return ResultGenerator.genFailResult(ResultCode.OBJECT_IS_NULL);
-		}
-		if (w.getStatus() != 1){
-			return ResultGenerator.genFailResult(ResultCode.STATUS_IS_NULL);
-		}
-
-		withdrawRecordService.review(WithdrawRecord.builder().id(param.getId())
-				.review(param.getReview()).status(param.getType() == 1?2:3).build());
-		return ResultGenerator.genSuccessResult();
-	}
-
-		@PostMapping("/list")
-	@ApiOperation(value = "withdrawRecord获取列表",httpMethod = "POST")
-	public Result<List<WithdrawRecord>> list(@RequestBody RecordParam param) {
-
-		PageHelper.startPage(param.getPage(), param.getSize());
-
-		Condition condition = new Condition(WithdrawRecord.class);
-		Criteria criteria = condition.createCriteria();
-		if (StrUtil.isNotBlank(param.getChannel())){
-			criteria.andEqualTo("channel", param.getChannel());
-		}
-		if (StrUtil.isNotBlank(param.getUserName())){
-			criteria.andEqualTo("userName", param.getUserName());
-		}
-		if (StrUtil.isNotBlank(param.getUserPhone())){
-			criteria.andEqualTo("userPhone", param.getUserPhone());
-		}
-		if (StrUtil.isNotBlank(param.getOrderNo())){
-			criteria.andEqualTo("orderNo", param.getOrderNo());
-		}
-		if (param.getStatus() != null){
-			criteria.andEqualTo("status", param.getStatus());
-		}
-		if (param.getTimeType() != null){
-			if (param.getTimeType() ==1 ){
-				if (StrUtil.isNotBlank(param.getStartTime())){
-					criteria.andBetween("createTime", param.getStartTime(),param.getEndTime());
-				}
-			} else  if (param.getTimeType() ==2 ){
-				if (StrUtil.isNotBlank(param.getStartTime())){
-					criteria.andBetween("successTime", param.getStartTime(),param.getEndTime());
-				}
-			}
-		}
-		PageInfo pageInfo = null;
-		try {
-			condition.setOrderByClause("create_time desc");
-			List<WithdrawRecord> list = withdrawRecordService.findByCondition(condition);
-			pageInfo = new PageInfo(list);
-		} catch (Exception e) {
-			log.error("查询对象操作异常e:{}",e);
-			return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
-		}
-		return ResultGenerator.genSuccessResult(pageInfo);
-	}
-
-	@GetMapping("/report")
-	@ApiOperation(value = "导出", httpMethod = "GET")
-	public void report(@RequestParam(required = false) String orderNo ,
-					   @RequestParam(required = false) String channel ,
-					   @RequestParam(required = false) String userName ,
-					   @RequestParam(required = false) String userPhone ,
-					   @RequestParam(required = false) Integer status ,
-					   @RequestParam(required = false) Integer timeType ,
-					   @RequestParam(required = false) String startTime ,
-					   @RequestParam(required = false) String endTime ,
-					   HttpServletResponse response) {
-		Condition condition = new Condition(RechargeRecord.class);
-		Criteria criteria = condition.createCriteria();
-		if (StrUtil.isNotBlank(channel)){
-			criteria.andEqualTo("channel", channel);
-		}
-		if (StrUtil.isNotBlank(userName)){
-			criteria.andEqualTo("userName", userName);
-		}
-		if (StrUtil.isNotBlank(userPhone)){
-			criteria.andEqualTo("userPhone", userPhone);
-		}
-		if (StrUtil.isNotBlank(orderNo)){
-			criteria.andEqualTo("orderNo", orderNo);
-		}
-		if (status != null){
-			criteria.andEqualTo("status", status);
-		}
-		if (timeType != null){
-			if (timeType ==1 ){
-				if (StrUtil.isNotBlank(startTime) && StrUtil.isNotBlank(endTime)){
-					criteria.andBetween("createTime", startTime,endTime);
-				}
-			} else  if (timeType ==2 ){
-				if (StrUtil.isNotBlank(startTime) && StrUtil.isNotBlank(endTime)){
-					criteria.andBetween("successTime", startTime,endTime);
-				}
-			}
-		}
-		condition.setOrderByClause("create_time desc");
-		List<WithdrawRecord> list = withdrawRecordService.findByCondition(condition);
-		List<String> rowHead = CollUtil.newArrayList("编号", "订单号", "用户id", "交易金额", "手续费", "状态 1处理中 2充值成功 3充值失败 4超时取消", "渠道", "币种", "用户名", "手机号", "交易时间", "交易成功时间", "银行", "银行账户", "银行账户姓名");
-		ExcelWriter writer = ExcelUtil.getWriter();
-		try {
-			writer.writeHeadRow(rowHead);
-			List<List<Object>> rows = new LinkedList<>();
-			if (CollUtil.isNotEmpty(list)) {
-				for (WithdrawRecord temp : list) {
-					List<Object> rowA = CollUtil.newArrayList(
-							temp.getId()+"",
-							temp.getOrderNo(),
-							temp.getAmount() == null? "0":temp.getAmount().toPlainString(),
-							temp.getFee() == null? "0":temp.getFee().toPlainString(),
-							temp.getStatus()+"",
-							temp.getChannel(),
-							temp.getCurrency(),
-							temp.getUserName(),
-							temp.getUserPhone(),
-							temp.getTransTime() == null? "": DateUtil.format(temp.getTransTime(), "yyyy-MM-dd HH:mm:ss"),
-							temp.getSuccessTime() == null? "":DateUtil.format(temp.getSuccessTime(), "yyyy-MM-dd HH:mm:ss"),
-							temp.getBank(),
-							temp.getBankAccount(),
-							temp.getBankAccountName());
-					rows.add(rowA);
-				}
-			}
-			writer.write(rows);
-			//设置宽度自适应
-			writer.setColumnWidth(-1, 22);
-			//response为HttpServletResponse对象
-			response.setContentType("application/vnd.ms-excel;charset=utf-8");
-			//test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
-			response.setHeader("Content-Disposition", "attachment;filename=" + new String(("数据列表").getBytes("UTF-8"), "ISO-8859-1") + ".xls");
-			ServletOutputStream out = response.getOutputStream();
-			//out为OutputStream,需要写出到的目标流
-			writer.flush(out);
-			log.info("导出结束");
-		} catch (Exception e) {
-			log.error("导出异常", e);
-			e.printStackTrace();
-		} finally {
-			// 关闭writer,释放内存
-			writer.close();
-			log.info("导出结束");
-		}
-	}
 }

+ 18 - 14
cif-service/src/main/java/com/txz/cif/web/para/ReviewParam.java

@@ -4,31 +4,35 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.*;
 
-import java.math.BigDecimal;
-import java.util.Date;
-import javax.persistence.*;
 @Getter
 @Setter
 @NoArgsConstructor
 @AllArgsConstructor
 @Builder
 
-@ApiModel(value="审核入参")
+@ApiModel(value = "审核入参")
 public class ReviewParam {
-
-
-    @ApiModelProperty(value="id")
+    
+    @ApiModelProperty(value = "id")
     private Long id;
-
+    
     /**
      * 审核内容
      */
-    @ApiModelProperty(value="审核内容")
+    @ApiModelProperty(value = "审核内容")
     private String review;
-
-    @ApiModelProperty(value="类型 1通过 2不通过")
+    
+    @ApiModelProperty(value = "类型 1通过 2不通过")
     private Integer type;
-
-
-
+    
+    /**
+     * 通道id
+     */
+    private Long channelId;
+    
+    /**
+     * 提现code
+     */
+    private String withdrawCode;
+    
 }

+ 52 - 0
cif-service/src/main/java/com/txz/cif/web/ro/TFPayNotifyDTO.java

@@ -0,0 +1,52 @@
+package com.txz.cif.web.ro;
+
+import lombok.Data;
+
+/**
+ * @author: MTD®️
+ * @date: 2025/9/1
+ */
+
+@Data
+public class TFPayNotifyDTO {
+    
+    /**
+     * 商户编号 - 平台分配商户号
+     */
+    private String memberid;
+    
+    /**
+     * 商户订单号 - 订单号唯一, 字符长度20
+     */
+    private String orderid;
+    
+    /**
+     * 订单最终金额 - 订单金额 单位:元
+     */
+    private String amount;
+    
+    /**
+     * 平台订单号
+     */
+    private String transaction_id;
+    
+    /**
+     * 交易成功时间 - 时间格式:Y-m-d H:i:s
+     */
+    private String datetime;
+    
+    /**
+     * 交易状态 - "00" 为成功
+     */
+    private String returncode;
+    
+    /**
+     * 扩展返回 - 商户附加数据返回
+     */
+    private String attach;
+    
+    /**
+     * 签名
+     */
+    private String sign;
+}

+ 24 - 0
cif-service/src/main/java/com/txz/cif/web/vo/CreatePayVO.java

@@ -0,0 +1,24 @@
+package com.txz.cif.web.vo;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @author: MTD®️
+ * @date: 2025/9/2
+ */
+@Data
+@Builder
+public class CreatePayVO {
+    
+    /**
+     * 订单号
+     */
+    private String orderNo;
+    
+    /**
+     * 支付连接
+     */
+    private String payUrl;
+    
+}

+ 1 - 1
cif-service/src/main/resources/bootstrap.properties

@@ -50,7 +50,7 @@ dubbo.cloud.subscribed-services=operating
 dubbo.provider.dynamic=true
 dubbo.application.qos.enable=false
 dubbo.application.qos.port=-1
-dubbo.application.qos.accept.foreign.ip=true
+dubbo.application.qos.accept.foreign.ip=false
 dubbo.reference.com.foo.BarService.check=false
 dubbo.reference.check=false
 dubbo.consumer.check=false

+ 1 - 0
cif-service/src/main/resources/mapper/RechargeRecordMapper.xml

@@ -10,6 +10,7 @@
     <result column="user_id" jdbcType="BIGINT" property="userId" />
     <result column="amount" jdbcType="DECIMAL" property="amount" />
     <result column="discount" jdbcType="DECIMAL" property="discount" />
+    <result column="real_amount" jdbcType="DECIMAL" property="realAmount" />
 
     <result column="status" jdbcType="INTEGER" property="status" />
     <result column="channel" jdbcType="VARCHAR" property="channel" />

+ 6 - 0
cif-service/src/main/resources/mapper/RedEnvelopeMapper.xml

@@ -58,4 +58,10 @@
     ORDER BY
     L7DEarnings DESC
   </select>
+
+  <select id="sumWithOrderNo" resultType="com.txz.cif.dto.EarningsDTO">
+    SELECT SUM(amount) AS earnings, user_id as userId,order_no as orderNo
+    FROM c_red_envelope
+    WHERE order_no=#{orderNo}
+  </select>
 </mapper>

+ 33 - 0
cif-service/src/main/resources/static/i18n/messages_bn.properties

@@ -0,0 +1,33 @@
+
+BizTypeEnum.RECHARGE=recharge
+BizTypeEnum.WITHDRAW=withdraw
+BizTypeEnum.OPEN_GROUP_PAY=open group pay
+BizTypeEnum.JOIN_GROUP_PAY=join group pay
+BizTypeEnum.FAIL_GROUP_REFUND=fail group refund
+BizTypeEnum.SUCCESS_GROUP_REFUND=success group refund
+BizTypeEnum.OPEN_GROUP_RED_ENVELOPE=open group red envelope
+BizTypeEnum.JOIN_GROUP_RED_ENVELOPE=join group red envelope
+BizTypeEnum.SIGN_RED_ENVELOPE=sign red envelope
+BizTypeEnum.FIRST_COMMISSION=first commission
+BizTypeEnum.SECONDARY_COMMISSION=secondary commission
+BizTypeEnum.PROMOTION_COMMISSION=promotion commission
+BizTypeEnum.REFUND_RECHARGE=refund recharge
+BizTypeEnum.WITHDRAWAL_FEE=withdrawal fee
+BizTypeEnum.FREEZE=freeze
+BizTypeEnum.UNFREEZE=unfreeze
+
+RechargeStatusEnum.PROCESSED=processed
+RechargeStatusEnum.SUCCESS=success
+RechargeStatusEnum.FAIL=fail
+RechargeStatusEnum.CANCEL=cancel
+
+WithdrawStatusEnum.WAITING_REVIEW=waiting_review
+WithdrawStatusEnum.PROCESSED=processed
+WithdrawStatusEnum.REVIEW_FAIL=review_fail
+WithdrawStatusEnum.SUCCESS=success
+WithdrawStatusEnum.FAIL=fail
+WithdrawStatusEnum.CANCEL=cancel
+
+RedEnvelopeStatusEnum.PROCESSED=processed
+RedEnvelopeStatusEnum.SUCCESS=success
+

+ 33 - 2
cif-service/src/main/resources/static/i18n/messages_en_US.properties

@@ -1,2 +1,33 @@
-user.appname=test
-SUCCESS=success
+
+BizTypeEnum.RECHARGE=recharge
+BizTypeEnum.WITHDRAW=withdraw
+BizTypeEnum.OPEN_GROUP_PAY=open group pay
+BizTypeEnum.JOIN_GROUP_PAY=join group pay
+BizTypeEnum.FAIL_GROUP_REFUND=fail group refund
+BizTypeEnum.SUCCESS_GROUP_REFUND=success group refund
+BizTypeEnum.OPEN_GROUP_RED_ENVELOPE=open group red envelope
+BizTypeEnum.JOIN_GROUP_RED_ENVELOPE=join group red envelope
+BizTypeEnum.SIGN_RED_ENVELOPE=sign red envelope
+BizTypeEnum.FIRST_COMMISSION=first commission
+BizTypeEnum.SECONDARY_COMMISSION=secondary commission
+BizTypeEnum.PROMOTION_COMMISSION=promotion commission
+BizTypeEnum.REFUND_RECHARGE=refund recharge
+BizTypeEnum.WITHDRAWAL_FEE=withdrawal fee
+BizTypeEnum.FREEZE=freeze
+BizTypeEnum.UNFREEZE=unfreeze
+
+RechargeStatusEnum.PROCESSED=processed
+RechargeStatusEnum.SUCCESS=success
+RechargeStatusEnum.FAIL=fail
+RechargeStatusEnum.CANCEL=cancel
+
+WithdrawStatusEnum.WAITING_REVIEW=waiting_review
+WithdrawStatusEnum.PROCESSED=processed
+WithdrawStatusEnum.REVIEW_FAIL=review_fail
+WithdrawStatusEnum.SUCCESS=success
+WithdrawStatusEnum.FAIL=fail
+WithdrawStatusEnum.CANCEL=cancel
+
+RedEnvelopeStatusEnum.PROCESSED=processed
+RedEnvelopeStatusEnum.SUCCESS=success
+