Prechádzať zdrojové kódy

1、移除ErrorCode模块
2、更新合并pay模块代码

rayson 11 mesiacov pred
rodič
commit
4777222ae3
100 zmenil súbory, kde vykonal 1170 pridanie a 808 odobranie
  1. 0 39
      citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/errorcode/config/CituErrorCodeAutoConfiguration.java
  2. 0 15
      citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/errorcode/config/CituErrorCodeRpcAutoConfiguration.java
  3. 0 30
      citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/errorcode/config/ErrorCodeProperties.java
  4. 0 15
      citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java
  5. 0 108
      citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java
  6. 0 35
      citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/errorcode/core/loader/ErrorCodeLoader.java
  7. 0 83
      citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java
  8. 0 10
      citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/errorcode/package-info.java
  9. 0 2
      citu-framework/citu-spring-boot-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  10. 11 4
      citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/notify/dto/PayOrderNotifyReqDTO.java
  11. 11 4
      citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/notify/dto/PayRefundNotifyReqDTO.java
  12. 27 0
      citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/notify/dto/PayTransferNotifyReqDTO.java
  13. 1 1
      citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/order/PayOrderApi.java
  14. 25 13
      citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/order/dto/PayOrderCreateReqDTO.java
  15. 26 11
      citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/order/dto/PayOrderRespDTO.java
  16. 23 10
      citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/refund/dto/PayRefundCreateReqDTO.java
  17. 23 11
      citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/refund/dto/PayRefundRespDTO.java
  18. 47 13
      citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/transfer/dto/PayTransferCreateReqDTO.java
  19. 11 11
      citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/enums/ErrorCodeConstants.java
  20. 14 0
      citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/enums/MessageTemplateConstants.java
  21. 1 0
      citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/enums/notify/PayNotifyTypeEnum.java
  22. 7 3
      citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/enums/transfer/PayTransferStatusEnum.java
  23. 5 2
      citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/enums/transfer/PayTransferTypeEnum.java
  24. 2 7
      citu-module-pay/citu-module-pay-biz/Dockerfile
  25. 5 5
      citu-module-pay/citu-module-pay-biz/pom.xml
  26. 6 6
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/app/PayAppController.java
  27. 3 2
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/app/vo/PayAppBaseVO.java
  28. 4 1
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/app/vo/PayAppCreateReqVO.java
  29. 4 1
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/app/vo/PayAppRespVO.java
  30. 6 2
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/app/vo/PayAppUpdateReqVO.java
  31. 4 2
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/channel/vo/PayChannelBaseVO.java
  32. 4 1
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/channel/vo/PayChannelRespVO.java
  33. 7 2
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/channel/vo/PayChannelUpdateReqVO.java
  34. 2 2
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/demo/PayDemoOrderController.java
  35. 26 7
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/demo/PayDemoTransferController.java
  36. 2 3
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/demo/vo/order/PayDemoOrderCreateReqVO.java
  37. 2 2
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/demo/vo/order/PayDemoOrderRespVO.java
  38. 40 6
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/demo/vo/transfer/PayDemoTransferCreateReqVO.java
  39. 47 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/demo/vo/transfer/PayDemoTransferRespVO.java
  40. 2 2
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/notify/PayNotifyController.java
  41. 4 1
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/notify/vo/PayNotifyTaskRespVO.java
  42. 1 1
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/order/PayOrderController.java
  43. 1 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/order/vo/PayOrderBaseVO.java
  44. 26 12
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/transfer/PayTransferController.java
  45. 95 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/transfer/vo/PayTransferCreateReqVO.java
  46. 5 2
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/transfer/vo/PayTransferCreateRespVO.java
  47. 62 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/transfer/vo/PayTransferPageItemRespVO.java
  48. 48 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/transfer/vo/PayTransferPageReqVO.java
  49. 79 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/transfer/vo/PayTransferRespVO.java
  50. 0 25
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/transfer/vo/PayTransferSubmitReqVO.java
  51. 3 27
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/wallet/PayWalletController.java
  52. 3 3
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/wallet/PayWalletRechargePackageController.java
  53. 7 5
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/wallet/vo/wallet/PayWalletPageReqVO.java
  54. 0 5
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/wallet/vo/wallet/PayWalletRespVO.java
  55. 0 1
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/order/AppPayOrderController.java
  56. 0 5
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/order/vo/AppPayOrderSubmitReqVO.java
  57. 0 4
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO.java
  58. 27 5
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/wallet/AppPayWalletRechargeController.java
  59. 13 6
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/wallet/AppPayWalletRechargePackageController.java
  60. 20 12
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/wallet/AppPayWalletTransactionController.java
  61. 2 1
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/wallet/vo/recharge/AppPayWalletRechargeCreateReqVO.java
  62. 42 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/wallet/vo/recharge/AppPayWalletRechargeRespVO.java
  63. 8 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/wallet/vo/transaction/AppPayWalletTransactionPageReqVO.java
  64. 16 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/wallet/vo/transaction/AppPayWalletTransactionSummaryRespVO.java
  65. 3 3
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/wallet/vo/wallet/AppPayWalletRespVO.java
  66. 2 2
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/package-info.java
  67. 0 1
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/app/PayAppConvert.java
  68. 2 2
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/demo/PayDemoOrderConvert.java
  69. 21 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/demo/PayDemoTransferConvert.java
  70. 12 2
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/transfer/PayTransferConvert.java
  71. 1 16
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/wallet/PayWalletConvert.java
  72. 24 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/wallet/PayWalletRechargeConvert.java
  73. 2 2
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/wallet/PayWalletRechargePackageConvert.java
  74. 0 3
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/wallet/PayWalletTransactionConvert.java
  75. 1 1
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md
  76. 5 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/dataobject/app/PayAppDO.java
  77. 24 12
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/dataobject/demo/PayDemoTransferDO.java
  78. 1 1
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/dataobject/notify/PayNotifyLogDO.java
  79. 4 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/dataobject/notify/PayNotifyTaskDO.java
  80. 1 1
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/dataobject/order/PayOrderExtensionDO.java
  81. 70 18
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/dataobject/transfer/PayTransferDO.java
  82. 0 68
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/dataobject/transfer/PayTransferExtensionDO.java
  83. 0 1
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/app/PayAppMapper.java
  84. 8 1
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/demo/PayDemoTransferMapper.java
  85. 1 1
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/notify/PayNotifyLogMapper.java
  86. 0 26
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/transfer/PayTransferExtensionMapper.java
  87. 29 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/transfer/PayTransferMapper.java
  88. 4 4
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/wallet/PayWalletMapper.java
  89. 9 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/wallet/PayWalletRechargeMapper.java
  90. 7 2
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/wallet/PayWalletRechargePackageMapper.java
  91. 26 4
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/wallet/PayWalletTransactionMapper.java
  92. 2 1
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/redis/no/PayNoRedisDAO.java
  93. 2 2
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/framework/pay/config/PayProperties.java
  94. 7 1
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/framework/pay/core/WalletPayClient.java
  95. 2 2
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/framework/rpc/config/RpcConfiguration.java
  96. 4 2
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/framework/security/config/SecurityConfiguration.java
  97. 2 2
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/job/order/PayOrderSyncJob.java
  98. 31 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/job/transfer/PayTransferSyncJob.java
  99. 2 40
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/service/channel/PayChannelServiceImpl.java
  100. 1 1
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/service/demo/PayDemoOrderService.java

+ 0 - 39
citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/errorcode/config/CituErrorCodeAutoConfiguration.java

@@ -1,39 +0,0 @@
-package com.citu.framework.errorcode.config;
-
-import com.citu.framework.errorcode.core.generator.ErrorCodeAutoGenerator;
-import com.citu.framework.errorcode.core.generator.ErrorCodeAutoGeneratorImpl;
-import com.citu.framework.errorcode.core.loader.ErrorCodeLoader;
-import com.citu.framework.errorcode.core.loader.ErrorCodeLoaderImpl;
-import com.citu.module.system.api.errorcode.ErrorCodeApi;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.autoconfigure.AutoConfiguration;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.scheduling.annotation.EnableScheduling;
-
-/**
- * 错误码配置类
- *
- * @author 芋道源码
- */
-@AutoConfiguration
-@ConditionalOnProperty(prefix = "citu.error-code", value = "enable", matchIfMissing = true) // 允许使用 yudao.error-code.enable=false 禁用访问日志
-@EnableConfigurationProperties(ErrorCodeProperties.class)
-@EnableScheduling // 开启调度任务的功能,因为 ErrorCodeRemoteLoader 通过定时刷新错误码
-public class CituErrorCodeAutoConfiguration {
-
-    @Bean
-    public ErrorCodeAutoGenerator errorCodeAutoGenerator(@Value("${spring.application.name}") String applicationName,
-                                                         ErrorCodeProperties errorCodeProperties,
-                                                         ErrorCodeApi errorCodeApi) {
-        return new ErrorCodeAutoGeneratorImpl(applicationName, errorCodeProperties.getConstantsClassList(), errorCodeApi);
-    }
-
-    @Bean
-    public ErrorCodeLoader errorCodeLoader(@Value("${spring.application.name}") String applicationName,
-                                           ErrorCodeApi errorCodeApi) {
-        return new ErrorCodeLoaderImpl(applicationName, errorCodeApi);
-    }
-
-}

+ 0 - 15
citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/errorcode/config/CituErrorCodeRpcAutoConfiguration.java

@@ -1,15 +0,0 @@
-package com.citu.framework.errorcode.config;
-
-import com.citu.module.system.api.errorcode.ErrorCodeApi;
-import org.springframework.boot.autoconfigure.AutoConfiguration;
-import org.springframework.cloud.openfeign.EnableFeignClients;
-
-/**
- * 错误码用到 Feign 的配置项
- *
- * @author 芋道源码
- */
-@AutoConfiguration
-@EnableFeignClients(clients = ErrorCodeApi.class) // 主要是引入相关的 API 服务
-public class CituErrorCodeRpcAutoConfiguration {
-}

+ 0 - 30
citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/errorcode/config/ErrorCodeProperties.java

@@ -1,30 +0,0 @@
-package com.citu.framework.errorcode.config;
-
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.validation.annotation.Validated;
-
-import javax.validation.constraints.NotNull;
-import java.util.List;
-
-/**
- * 错误码的配置属性类
- *
- * @author dlyan
- */
-@ConfigurationProperties("citu.error-code")
-@Data
-@Validated
-public class ErrorCodeProperties {
-
-    /**
-     * 是否开启
-     */
-    private Boolean enable = true;
-    /**
-     * 错误码枚举类
-     */
-    @NotNull(message = "错误码枚举类不能为空")
-    private List<String> constantsClassList;
-
-}

+ 0 - 15
citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java

@@ -1,15 +0,0 @@
-package com.citu.framework.errorcode.core.generator;
-
-/**
- * 错误码的自动生成器
- *
- * @author dylan
- */
-public interface ErrorCodeAutoGenerator {
-
-    /**
-     * 将配置类到错误码写入数据库
-     */
-    void execute();
-
-}

+ 0 - 108
citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java

@@ -1,108 +0,0 @@
-package com.citu.framework.errorcode.core.generator;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.exceptions.ExceptionUtil;
-import cn.hutool.core.util.ClassUtil;
-import cn.hutool.core.util.ReflectUtil;
-import com.citu.framework.common.exception.ErrorCode;
-import com.citu.module.system.api.errorcode.ErrorCodeApi;
-import com.citu.module.system.api.errorcode.dto.ErrorCodeAutoGenerateReqDTO;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.boot.context.event.ApplicationReadyEvent;
-import org.springframework.context.event.EventListener;
-import org.springframework.scheduling.annotation.Async;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * ErrorCodeAutoGenerator 的实现类
- * 目的是,扫描指定的 {@link #constantsClassList} 类,写入到 system 服务中
- *
- * @author dylan
- */
-@RequiredArgsConstructor
-@Slf4j
-public class ErrorCodeAutoGeneratorImpl implements ErrorCodeAutoGenerator {
-
-    /**
-     * 应用分组
-     */
-    private final String applicationName;
-    /**
-     * 错误码枚举类
-     */
-    private final List<String> constantsClassList;
-    /**
-     * 错误码 Api
-     */
-    private final ErrorCodeApi errorCodeApi;
-
-    @Override
-    @EventListener(ApplicationReadyEvent.class)
-    @Async // 异步,保证项目的启动过程,毕竟非关键流程
-    public void execute() {
-        // 第一步,解析错误码
-        List<ErrorCodeAutoGenerateReqDTO> autoGenerateDTOs = parseErrorCode();
-        log.info("[execute][解析到错误码数量为 ({}) 个]", autoGenerateDTOs.size());
-
-        // 第二步,写入到 system 服务
-        try {
-            errorCodeApi.autoGenerateErrorCodeList(autoGenerateDTOs);
-            log.info("[execute][写入到 system 组件完成]");
-        } catch (Exception ex) {
-            log.error("[execute][写入到 system 组件失败({})]", ExceptionUtil.getRootCauseMessage(ex));
-        }
-    }
-
-    /**
-     * 解析 constantsClassList 变量,转换成错误码数组
-     *
-     * @return 错误码数组
-     */
-    private List<ErrorCodeAutoGenerateReqDTO> parseErrorCode() {
-        // 校验 errorCodeConstantsClass 参数
-        if (CollUtil.isEmpty(constantsClassList)) {
-            log.info("[execute][未配置 citu.error-code.constants-class-list 配置项,不进行自动写入到 system 服务中]");
-            return new ArrayList<>();
-        }
-
-        // 解析错误码
-        List<ErrorCodeAutoGenerateReqDTO> autoGenerateDTOs = new ArrayList<>();
-        constantsClassList.forEach(constantsClass -> {
-            try {
-                // 解析错误码枚举类
-                Class<?> errorCodeConstantsClazz = ClassUtil.loadClass(constantsClass);
-                // 解析错误码
-                autoGenerateDTOs.addAll(parseErrorCode(errorCodeConstantsClazz));
-            } catch (Exception ex) {
-                log.warn("[parseErrorCode][constantsClass({}) 加载失败({})]", constantsClass,
-                        ExceptionUtil.getRootCauseMessage(ex));
-            }
-        });
-        return autoGenerateDTOs;
-    }
-
-    /**
-     * 解析错误码类,获得错误码数组
-     *
-     * @return 错误码数组
-     */
-    private List<ErrorCodeAutoGenerateReqDTO> parseErrorCode(Class<?> constantsClass) {
-        List<ErrorCodeAutoGenerateReqDTO> autoGenerateDTOs = new ArrayList<>();
-        Arrays.stream(constantsClass.getFields()).forEach(field -> {
-            if (field.getType() != ErrorCode.class) {
-                return;
-            }
-            // 转换成 ErrorCodeAutoGenerateReqDTO 对象
-            ErrorCode errorCode = (ErrorCode) ReflectUtil.getFieldValue(constantsClass, field);
-            autoGenerateDTOs.add(new ErrorCodeAutoGenerateReqDTO().setApplicationName(applicationName)
-                    .setCode(errorCode.getCode()).setMessage(errorCode.getMsg()));
-        });
-        return autoGenerateDTOs;
-    }
-
-}
-

+ 0 - 35
citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/errorcode/core/loader/ErrorCodeLoader.java

@@ -1,35 +0,0 @@
-package com.citu.framework.errorcode.core.loader;
-
-
-import com.citu.framework.common.exception.util.ServiceExceptionUtil;
-
-/**
- * 错误码加载器
- *
- * 注意,错误码最终加载到 {@link ServiceExceptionUtil} 的 MESSAGES 变量中!
- *
- * @author dlyan
- */
-public interface ErrorCodeLoader {
-
-    /**
-     * 添加错误码
-     *
-     * @param code 错误码的编号
-     * @param msg 错误码的提示
-     */
-    default void putErrorCode(Integer code, String msg) {
-        ServiceExceptionUtil.put(code, msg);
-    }
-
-    /**
-     * 刷新错误码
-     */
-    void refreshErrorCodes();
-
-    /**
-     * 加载错误码
-     */
-    void loadErrorCodes();
-
-}

+ 0 - 83
citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java

@@ -1,83 +0,0 @@
-package com.citu.framework.errorcode.core.loader;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.exceptions.ExceptionUtil;
-import com.citu.framework.common.util.date.DateUtils;
-import com.citu.module.system.api.errorcode.ErrorCodeApi;
-import com.citu.module.system.api.errorcode.dto.ErrorCodeRespDTO;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.boot.context.event.ApplicationReadyEvent;
-import org.springframework.context.event.EventListener;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.scheduling.annotation.Scheduled;
-
-import java.time.LocalDateTime;
-import java.util.List;
-
-/**
- * ErrorCodeLoader 的实现类,从 infra 的数据库中,加载错误码。
- * <p>
- * 考虑到错误码会刷新,所以按照 {@link #REFRESH_ERROR_CODE_PERIOD} 频率,增量加载错误码。
- *
- * @author dlyan
- */
-@RequiredArgsConstructor
-@Slf4j
-public class ErrorCodeLoaderImpl implements ErrorCodeLoader {
-
-
-    /**
-     * 刷新错误码的频率,单位:毫秒
-     */
-    private static final int REFRESH_ERROR_CODE_PERIOD = 60 * 1000;
-
-    /**
-     * 应用分组
-     */
-    private final String applicationName;
-    /**
-     * 错误码 Api
-     */
-    private final ErrorCodeApi errorCodeApi;
-
-    /**
-     * 缓存错误码的最大更新时间,用于后续的增量轮询,判断是否有更新
-     */
-    private LocalDateTime maxUpdateTime;
-
-    @Override
-    @EventListener(ApplicationReadyEvent.class)
-    @Async // 异步,保证项目的启动过程,毕竟非关键流程
-    public void loadErrorCodes() {
-        loadErrorCodes0();
-    }
-
-    @Override
-    @Scheduled(fixedDelay = REFRESH_ERROR_CODE_PERIOD, initialDelay = REFRESH_ERROR_CODE_PERIOD)
-    public void refreshErrorCodes() {
-        loadErrorCodes0();
-    }
-
-    private void loadErrorCodes0() {
-        try {
-            // 加载错误码
-            List<ErrorCodeRespDTO> errorCodeRespDTOs = errorCodeApi.getErrorCodeList(applicationName, maxUpdateTime).getCheckedData();
-            if (CollUtil.isEmpty(errorCodeRespDTOs)) {
-                return;
-            }
-            log.info("[loadErrorCodes0][加载到 ({}) 个错误码]", errorCodeRespDTOs.size());
-
-            // 刷新错误码的缓存
-            errorCodeRespDTOs.forEach(errorCodeRespDTO -> {
-                // 写入到错误码的缓存
-                putErrorCode(errorCodeRespDTO.getCode(), errorCodeRespDTO.getMessage());
-                // 记录下更新时间,方便增量更新
-                maxUpdateTime = DateUtils.max(maxUpdateTime, errorCodeRespDTO.getUpdateTime());
-            });
-        } catch (Exception ex) {
-            log.error("[loadErrorCodes0][加载错误码失败({})]", ExceptionUtil.getRootCauseMessage(ex));
-        }
-    }
-
-}

+ 0 - 10
citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/errorcode/package-info.java

@@ -1,10 +0,0 @@
-/**
- * 错误码 ErrorCode 的自动配置功能,提供如下功能:
- *
- * 1. 远程读取:项目启动时,从 system-service 服务,读取数据库中的 ErrorCode 错误码,实现错误码的提水可配置;
- * 2. 自动更新:管理员在管理后台修数据库中的 ErrorCode 错误码时,项目自动从 system-service 服务加载最新的 ErrorCode 错误码;
- * 3. 自动写入:项目启动时,将项目本地的错误码写到 system-server 服务中,方便管理员在管理后台编辑;
- *
- * @author 芋道源码
- */
-package com.citu.framework.errorcode;

+ 0 - 2
citu-framework/citu-spring-boot-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -4,6 +4,4 @@ com.citu.framework.swagger.config.CituSwaggerAutoConfiguration
 com.citu.framework.web.config.CituWebAutoConfiguration
 com.citu.framework.apilog.config.CituApiLogRpcAutoConfiguration
 com.citu.framework.banner.config.CituBannerAutoConfiguration
-com.citu.framework.errorcode.config.CituErrorCodeAutoConfiguration
-com.citu.framework.errorcode.config.CituErrorCodeRpcAutoConfiguration
 com.citu.framework.i18n.config.CituI18nAutoConfiguration

+ 11 - 4
citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/notify/dto/PayOrderNotifyReqDTO.java

@@ -1,6 +1,5 @@
 package com.citu.module.pay.api.notify.dto;
 
-import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -9,18 +8,26 @@ import lombok.NoArgsConstructor;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 
-@Schema(description = "RPC 服务 - 支付单的通知 Request DTO")
+/**
+ * 支付单的通知 Request DTO
+ *
+ * @author 芋道源码
+ */
 @Data
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
 public class PayOrderNotifyReqDTO {
 
-    @Schema(description = "商户订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "M101")
+    /**
+     * 商户订单编号
+     */
     @NotEmpty(message = "商户订单号不能为空")
     private String merchantOrderId;
 
-    @Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "P202")
+    /**
+     * 支付订单编号
+     */
     @NotNull(message = "支付订单编号不能为空")
     private Long payOrderId;
 

+ 11 - 4
citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/notify/dto/PayRefundNotifyReqDTO.java

@@ -1,6 +1,5 @@
 package com.citu.module.pay.api.notify.dto;
 
-import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -9,18 +8,26 @@ import lombok.NoArgsConstructor;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 
-@Schema(description = "RPC 服务 - 退款单的通知 Request DTO")
+/**
+ * 退款单的通知 Request DTO
+ *
+ * @author 芋道源码
+ */
 @Data
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
 public class PayRefundNotifyReqDTO {
 
-    @Schema(description = "商户退款单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "MR101")
+    /**
+     * 商户退款单编号
+     */
     @NotEmpty(message = "商户退款单编号不能为空")
     private String merchantOrderId;
 
-    @Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "R303")
+    /**
+     * 支付退款编号
+     */
     @NotNull(message = "支付退款编号不能为空")
     private Long payRefundId;
 

+ 27 - 0
citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/notify/dto/PayTransferNotifyReqDTO.java

@@ -0,0 +1,27 @@
+package com.citu.module.pay.api.notify.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 转账单的通知 Request DTO
+ *
+ * @author jason
+ */
+@Data
+public class PayTransferNotifyReqDTO {
+
+    /**
+     * 商户转账单号
+     */
+    @NotEmpty(message = "商户转账单号不能为空")
+    private String merchantTransferId;
+
+    /**
+     * 转账订单编号
+     */
+    @NotNull(message = "转账订单编号不能为空")
+    private Long payTransferId;
+}

+ 1 - 1
citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/order/PayOrderApi.java

@@ -8,10 +8,10 @@ import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameters;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import javax.annotation.security.PermitAll;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.security.PermitAll;
 import javax.validation.Valid;
 
 @FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory =

+ 25 - 13
citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/order/dto/PayOrderCreateReqDTO.java

@@ -1,6 +1,5 @@
 package com.citu.module.pay.api.order.dto;
 
-import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.hibernate.validator.constraints.Length;
 
@@ -10,43 +9,56 @@ import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 import java.time.LocalDateTime;
 
-@Schema(description = "RPC 服务 - 支付单创建 Request DTO")
+/**
+ * 支付单创建 Request DTO
+ */
 @Data
 public class PayOrderCreateReqDTO implements Serializable {
 
     public static final int SUBJECT_MAX_LENGTH = 32;
 
-    @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    /**
+     * 应用编号
+     */
     @NotNull(message = "应用编号不能为空")
     private Long appId;
-
-    @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1")
+    /**
+     * 用户 IP
+     */
     @NotEmpty(message = "用户 IP 不能为空")
     private String userIp;
 
     // ========== 商户相关字段 ==========
 
-    @Schema(description = "商户订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "M101") // 例如说,内部系统 A 的订单号。需要保证每个 PayMerchantDO 唯一
+    /**
+     * 商户订单编号
+     */
     @NotEmpty(message = "商户订单编号不能为空")
     private String merchantOrderId;
-
-    @Schema(description = "商品标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是标题")
+    /**
+     * 商品标题
+     */
     @NotEmpty(message = "商品标题不能为空")
-    @Length(max = 32, message = "商品标题不能超过 32")
+    @Length(max = SUBJECT_MAX_LENGTH, message = "商品标题不能超过 32")
     private String subject;
-
-    @Schema(description = "商品描述", example = "我是描述")
+    /**
+     * 商品描述
+     */
     @Length(max = 128, message = "商品描述信息长度不能超过128")
     private String body;
 
     // ========== 订单相关字段 ==========
 
-    @Schema(description = "支付金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "80")
+    /**
+     * 支付金额,单位:分
+     */
     @NotNull(message = "支付金额不能为空")
     @DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零")
     private Integer price;
 
-    @Schema(description = "支付过期时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    /**
+     * 支付过期时间
+     */
     @NotNull(message = "支付过期时间不能为空")
     private LocalDateTime expireTime;
 

+ 26 - 11
citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/order/dto/PayOrderRespDTO.java

@@ -1,29 +1,44 @@
 package com.citu.module.pay.api.order.dto;
 
-import io.swagger.v3.oas.annotations.media.Schema;
+import com.citu.module.pay.enums.order.PayOrderStatusEnum;
 import lombok.Data;
 
-@Schema(description = "RPC 服务 - 支付单信息 Response DTO")
+/**
+ * 支付单信息 Response DTO
+ *
+ * @author 芋道源码
+ */
 @Data
 public class PayOrderRespDTO {
 
-    @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    /**
+     * 订单编号,数据库自增
+     */
     private Long id;
-
-    @Schema(description = "渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx_pub") // PayChannelEnum 枚举
+    /**
+     * 渠道编码
+     *
+     * 枚举 PayChannelEnum
+     */
     private String channelCode;
 
     // ========== 商户相关字段 ==========
-
-    @Schema(description = "商户订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "M101") // 例如说,内部系统 A 的订单号。需要保证每个 PayMerchantDO 唯一
+    /**
+     * 商户订单编号
+     * 例如说,内部系统 A 的订单号。需要保证每个 PayMerchantDO 唯一
+     */
     private String merchantOrderId;
 
     // ========== 订单相关字段 ==========
-
-    @Schema(description = "支付金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "101")
+    /**
+     * 支付金额,单位:分
+     */
     private Integer price;
-
-    @Schema(description = "支付状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") // PayOrderStatusEnum 枚举
+    /**
+     * 支付状态
+     *
+     * 枚举 {@link PayOrderStatusEnum}
+     */
     private Integer status;
 
     // ========== 渠道相关字段 ==========

+ 23 - 10
citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/refund/dto/PayRefundCreateReqDTO.java

@@ -1,6 +1,5 @@
 package com.citu.module.pay.api.refund.dto;
 
-import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.hibernate.validator.constraints.Length;
 
@@ -8,36 +7,50 @@ import javax.validation.constraints.Min;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 
-@Schema(description = "RPC 服务 - 退款单创建 Request DTO")
+/**
+ * 退款单创建 Request DTO
+ *
+ * @author 芋道源码
+ */
 @Data
 public class PayRefundCreateReqDTO {
 
-    @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    /**
+     * 应用编号
+     */
     @NotNull(message = "应用编号不能为空")
     private Long appId;
-
-    @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1")
+    /**
+     * 用户 IP
+     */
     @NotEmpty(message = "用户 IP 不能为空")
     private String userIp;
 
     // ========== 商户相关字段 ==========
-
-    @Schema(description = "商户订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "M101") // 例如说,内部系统 A 的订单号。需要保证每个 PayMerchantDO 唯一
+    /**
+     * 商户订单编号
+     */
     @NotEmpty(message = "商户订单编号不能为空")
     private String merchantOrderId;
 
-    @Schema(description = "商户退款编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "MR101")
+    /**
+     * 商户退款编号
+     */
     @NotEmpty(message = "商户退款编号不能为空")
     private String merchantRefundId;
 
-    @Schema(description = "退款描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是退款描述")
+    /**
+     * 退款描述
+     */
     @NotEmpty(message = "退款描述不能为空")
     @Length(max = 128, message = "退款描述长度不能超过 128")
     private String reason;
 
     // ========== 订单相关字段 ==========
 
-    @Schema(description = "退款金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "60")
+    /**
+     * 退款金额,单位:分
+     */
     @NotNull(message = "退款金额不能为空")
     @Min(value = 1, message = "退款金额必须大于零")
     private Integer price;

+ 23 - 11
citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/refund/dto/PayRefundRespDTO.java

@@ -1,31 +1,43 @@
 package com.citu.module.pay.api.refund.dto;
 
-import io.swagger.v3.oas.annotations.media.Schema;
+import com.citu.module.pay.enums.refund.PayRefundStatusEnum;
 import lombok.Data;
 
 import java.time.LocalDateTime;
 
-@Schema(description = "RPC 服务 - 退款单信息 Response DTO")
+/**
+ * 退款单信息 Response DTO
+ *
+ * @author 芋道源码
+ */
 @Data
 public class PayRefundRespDTO {
 
-    @Schema(description = "退款单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    /**
+     * 退款单编号
+     */
     private Long id;
 
     // ========== 退款相关字段 ==========
-
-    @Schema(description = "退款状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") // PayRefundStatusEnum 枚举
+    /**
+     * 退款状态
+     *
+     * 枚举 {@link PayRefundStatusEnum}
+     */
     private Integer status;
-
-    @Schema(description = "退款金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "101")
+    /**
+     * 退款金额,单位:分
+     */
     private Integer refundPrice;
 
     // ========== 商户相关字段 ==========
-
-    @Schema(description = "商户订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "M101") // 例如说,内部系统 A 的订单号。需要保证每个 PayMerchantDO 唯一
+    /**
+     * 商户订单编号
+     */
     private String merchantOrderId;
-
-    @Schema(description = "退款成功时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    /**
+     * 退款成功时间
+     */
     private LocalDateTime successTime;
 
 }

+ 47 - 13
citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/api/transfer/dto/PayTransferCreateReqDTO.java

@@ -2,42 +2,76 @@ package com.citu.module.pay.api.transfer.dto;
 
 import com.citu.framework.common.validation.InEnum;
 import com.citu.module.pay.enums.transfer.PayTransferTypeEnum;
-import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.util.Map;
 
-@Schema(description = "RPC 服务 - 转账单创建 Request DTO")
+/**
+ * 转账单创建 Request DTO
+ *
+ * @author jason
+ */
 @Data
 public class PayTransferCreateReqDTO {
 
-    @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    /**
+     * 应用编号
+     */
     @NotNull(message = "应用编号不能为空")
     private Long appId;
 
-    @Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotEmpty(message = "转账渠道不能为空")
+    private String channelCode;
+
+    /**
+     * 转账渠道的额外参数
+     */
+    private Map<String, String> channelExtras;
+
+    @NotEmpty(message = "用户 IP 不能为空")
+    private String userIp;
+
+    /**
+     * 类型
+     */
     @NotNull(message = "转账类型不能为空")
     @InEnum(PayTransferTypeEnum.class)
     private Integer type;
 
-    @Schema(description = "商户订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "M101") // 例如说,内部系统 A 的订单号。需要保证每个 PayMerchantDO 唯一
-    @NotEmpty(message = "商户订单编号不能为空")
-    private String merchantOrderId;
 
-    @Schema(description = "转账金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "80")
+    /**
+     * 商户转账单编号
+     */
+    @NotEmpty(message = "商户转账单编号能为空")
+    private String merchantTransferId;
+
+    /**
+     * 转账金额,单位:分
+     */
     @Min(value = 1, message = "转账金额必须大于零")
     @NotNull(message = "转账金额不能为空")
     private Integer price;
 
-    @Schema(description = "转账标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是标题")
+    /**
+     * 转账标题
+     */
     @NotEmpty(message = "转账标题不能为空")
-    private String title;
+    private String subject;
+
+    /**
+     * 收款人姓名
+     */
+    @NotBlank(message = "收款人姓名不能为空", groups = {PayTransferTypeEnum.Alipay.class})
+    private String userName;
 
-    @Schema(description = "收款方信息", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotEmpty(message = "收款方信息不能为空")
-    private Map<String, String> payeeInfo;
+    @NotBlank(message = "支付宝登录号不能为空", groups = {PayTransferTypeEnum.Alipay.class})
+    private String alipayLogonId;
 
+    // ========== 微信转账相关字段 ==========
+    @NotBlank(message = "微信 openId 不能为空", groups = {PayTransferTypeEnum.WxPay.class})
+    private String openid;
 }

+ 11 - 11
citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/enums/ErrorCodeConstants.java

@@ -59,22 +59,18 @@ public interface ErrorCodeConstants {
     ErrorCode WALLET_RECHARGE_REFUND_FAIL_REFUND_ORDER_ID_ERROR = new ErrorCode(1_007_008_008, "钱包退款更新失败,钱包退款单编号不匹配");
     ErrorCode WALLET_RECHARGE_REFUND_FAIL_REFUND_NOT_FOUND = new ErrorCode(1_007_008_009, "钱包退款更新失败,退款订单不存在");
     ErrorCode WALLET_RECHARGE_REFUND_FAIL_REFUND_PRICE_NOT_MATCH = new ErrorCode(1_007_008_010, "钱包退款更新失败,退款单金额不匹配");
-    ErrorCode WALLET_RECHARGE_PACKAGE_AND_PRICE_IS_EMPTY = new ErrorCode(1_007_008_011, "充值金额和充钱套餐不能同时为空");
-    ErrorCode WALLET_RECHARGE_PACKAGE_NOT_FOUND = new ErrorCode(1_007_008_012, "钱包充值套餐不存在");
-    ErrorCode WALLET_RECHARGE_PACKAGE_IS_DISABLE = new ErrorCode(1_007_008_013, "钱包充值套餐已禁用");
-    ErrorCode WALLET_RECHARGE_PACKAGE_NAME_EXISTS = new ErrorCode(1_007_008_014, "钱包充值套餐名称已存在");
+    ErrorCode WALLET_RECHARGE_PACKAGE_NOT_FOUND = new ErrorCode(1_007_008_011, "钱包充值套餐不存在");
+    ErrorCode WALLET_RECHARGE_PACKAGE_IS_DISABLE = new ErrorCode(1_007_008_012, "钱包充值套餐已禁用");
+    ErrorCode WALLET_RECHARGE_PACKAGE_NAME_EXISTS = new ErrorCode(1_007_008_013, "钱包充值套餐名称已存在");
 
     // ========== 转账模块 1-007-009-000 ==========
     ErrorCode PAY_TRANSFER_SUBMIT_CHANNEL_ERROR = new ErrorCode(1_007_009_000, "发起转账报错,错误码:{},错误提示:{}");
-    ErrorCode PAY_TRANSFER_ALIPAY_LOGIN_ID_IS_EMPTY = new ErrorCode(1_007_009_001, "支付宝登录 ID 不能为空");
-    ErrorCode PAY_TRANSFER_ALIPAY_ACCOUNT_NAME_IS_EMPTY = new ErrorCode(1_007_009_002, "支付宝账号名称不能为空");
-    ErrorCode PAY_TRANSFER_NOT_FOUND = new ErrorCode(1_007_009_003, "转账交易单不存在");
-    ErrorCode PAY_TRANSFER_STATUS_IS_SUCCESS = new ErrorCode(1_007_009_004, "转账单已成功转账");
+    ErrorCode PAY_TRANSFER_NOT_FOUND = new ErrorCode(1_007_009_001, "转账单不存在");
+    ErrorCode PAY_SAME_MERCHANT_TRANSFER_TYPE_NOT_MATCH = new ErrorCode(1_007_009_002, "两次相同转账请求的类型不匹配");
+    ErrorCode PAY_SAME_MERCHANT_TRANSFER_PRICE_NOT_MATCH = new ErrorCode(1_007_009_003, "两次相同转账请求的金额不匹配");
+    ErrorCode PAY_MERCHANT_TRANSFER_EXISTS = new ErrorCode(1_007_009_004, "该笔业务的转账已经发起,请查询转账订单相关状态");
     ErrorCode PAY_TRANSFER_STATUS_IS_NOT_WAITING = new ErrorCode(1_007_009_005, "转账单不处于待转账");
     ErrorCode PAY_TRANSFER_STATUS_IS_NOT_PENDING = new ErrorCode(1_007_009_006, "转账单不处于待转账或转账中");
-    ErrorCode PAY_TRANSFER_EXTENSION_NOT_FOUND = new ErrorCode(1_007_009_007, "转账交易拓展单不存在");
-    ErrorCode PAY_TRANSFER_TYPE_AND_CHANNEL_NOT_MATCH = new ErrorCode(1_007_009_008, "转账类型和转账渠道不匹配");
-    ErrorCode PAY_TRANSFER_EXTENSION_STATUS_IS_NOT_PENDING = new ErrorCode(1_007_009_009, "转账拓展单不处于待转账或转账中");
 
     // ========== 示例订单 1-007-900-000 ==========
     ErrorCode DEMO_ORDER_NOT_FOUND = new ErrorCode(1_007_900_000, "示例订单不存在");
@@ -89,4 +85,8 @@ public interface ErrorCodeConstants {
     ErrorCode DEMO_ORDER_REFUND_FAIL_REFUND_ORDER_ID_ERROR = new ErrorCode(1_007_900_009, "发起退款失败,退款单编号不匹配");
     ErrorCode DEMO_ORDER_REFUND_FAIL_REFUND_PRICE_NOT_MATCH = new ErrorCode(1_007_900_010, "发起退款失败,退款单金额不匹配");
 
+    // ========== 示例转账订单 1-007-901-001 ==========
+    ErrorCode DEMO_TRANSFER_NOT_FOUND = new ErrorCode(1_007_901_001, "示例转账单不存在");
+    ErrorCode DEMO_TRANSFER_FAIL_TRANSFER_ID_ERROR = new ErrorCode(1_007_901_002, "转账失败,转账单编号不匹配");
+    ErrorCode DEMO_TRANSFER_FAIL_PRICE_NOT_MATCH = new ErrorCode(1_007_901_003, "转账失败,转账单金额不匹配");
 }

+ 14 - 0
citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/enums/MessageTemplateConstants.java

@@ -0,0 +1,14 @@
+package com.citu.module.pay.enums;
+
+/**
+ * 通知模板枚举类
+ *
+ * @author HUIHUI
+ */
+public interface MessageTemplateConstants {
+
+    // ======================= 小程序订阅消息 =======================
+
+    String WXA_WALLET_RECHARGER_PAID = "充值成功通知";
+
+}

+ 1 - 0
citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/enums/notify/PayNotifyTypeEnum.java

@@ -14,6 +14,7 @@ public enum PayNotifyTypeEnum {
 
     ORDER(1, "支付单"),
     REFUND(2, "退款单"),
+    TRANSFER(3, "转账单")
     ;
 
     /**

+ 7 - 3
citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/enums/transfer/PayTransferStatusEnum.java

@@ -12,7 +12,7 @@ import java.util.Objects;
 @AllArgsConstructor
 public enum PayTransferStatusEnum {
 
-    WAITING(0, "待转账"),
+    WAITING(0, "待转账"),
     /**
      * TODO 转账到银行卡. 会有T+0 T+1 到账的请情况。 还未实现
      */
@@ -20,7 +20,7 @@ public enum PayTransferStatusEnum {
 
     SUCCESS(20, "转账成功"),
     /**
-     * 转账关闭 (失败,或者其它情况)
+     * 转账关闭 (失败,或者其它情况) // TODO 改成 转账失败状态
      */
     CLOSED(30, "转账关闭");
 
@@ -40,16 +40,20 @@ public enum PayTransferStatusEnum {
     public static boolean isClosed(Integer status) {
         return Objects.equals(status, CLOSED.getStatus());
     }
+
     public static boolean isWaiting(Integer status) {
         return Objects.equals(status, WAITING.getStatus());
     }
+    public static boolean isInProgress(Integer status) {
+        return Objects.equals(status, IN_PROGRESS.getStatus());
+    }
 
     /**
      * 是否处于待转账或者转账中的状态
      * @param status 状态
      */
     public static boolean isPendingStatus(Integer status) {
-        return Objects.equals(status, WAITING.getStatus()) || Objects.equals(status, IN_PROGRESS.status);
+        return Objects.equals(status, WAITING.getStatus()) || Objects.equals(status, IN_PROGRESS.getStatus());
     }
 
 }

+ 5 - 2
citu-module-pay/citu-module-pay-api/src/main/java/com/citu/module/pay/enums/transfer/PayTransferTypeEnum.java

@@ -21,8 +21,11 @@ public enum PayTransferTypeEnum implements IntArrayValuable {
     BANK_CARD(3, "银行卡"),
     WALLET_BALANCE(4, "钱包余额");
 
-    public static final String ALIPAY_LOGON_ID = "ALIPAY_LOGON_ID";
-    public static final String ALIPAY_ACCOUNT_NAME = "ALIPAY_ACCOUNT_NAME";
+    public interface WxPay {
+    }
+
+    public interface Alipay {
+    }
 
     private final Integer type;
     private final String name;

+ 2 - 7
citu-module-pay/citu-module-pay-biz/Dockerfile

@@ -2,18 +2,13 @@
 ## 感谢复旦核博士的建议!灰子哥,牛皮!
 FROM adoptopenjdk/openjdk11
 
-
-## 创建目录,并使用它作为工作目录
-RUN mkdir -p /citu-module-pay-biz-1.8.0-snapshot
-WORKDIR /citu-module-pay-biz-1.8.0-snapshot
 ## 将后端项目的 Jar 文件,复制到镜像中
-COPY ./target/citu-module-pay-biz-1.8.0-snapshot.jar app.jar
-
+ADD target/citu-module-pay-biz app.jar
 ## 设置 TZ 时区
 ## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖
 ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx512m"
 
-## 暴露后端项目的 48080 端口
+## 暴露后端项目的 48085 端口
 EXPOSE 48085
 
 ## 启动后端项目

+ 5 - 5
citu-module-pay/citu-module-pay-biz/pom.xml

@@ -24,15 +24,15 @@
             <artifactId>spring-cloud-starter-bootstrap</artifactId>
         </dependency>
 
-        <!-- 依赖服务 -->
         <dependency>
             <groupId>com.citu</groupId>
-            <artifactId>citu-module-pay-api</artifactId>
-            <version>${revision}</version>
+            <artifactId>citu-spring-boot-starter-env</artifactId>
         </dependency>
+
+        <!-- 依赖服务 -->
         <dependency>
             <groupId>com.citu</groupId>
-            <artifactId>citu-module-member-api</artifactId>
+            <artifactId>citu-module-pay-api</artifactId>
             <version>${revision}</version>
         </dependency>
 
@@ -129,4 +129,4 @@
         </plugins>
     </build>
 
-</project>
+</project>

+ 6 - 6
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/app/PayAppController.java

@@ -1,10 +1,9 @@
 package com.citu.module.pay.controller.admin.app;
 
 import cn.hutool.core.collection.CollUtil;
+import com.citu.framework.common.enums.CommonStatusEnum;
 import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.common.pojo.PageResult;
-import com.citu.framework.common.util.collection.CollectionUtils;
-import com.citu.framework.pay.core.enums.channel.PayChannelEnum;
 import com.citu.module.pay.controller.admin.app.vo.*;
 import com.citu.module.pay.convert.app.PayAppConvert;
 import com.citu.module.pay.dal.dataobject.app.PayAppDO;
@@ -21,7 +20,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
-import java.util.*;
+import java.util.List;
 
 import static com.citu.framework.common.pojo.CommonResult.success;
 import static com.citu.framework.common.util.collection.CollectionUtils.convertList;
@@ -89,9 +88,10 @@ public class PayAppController {
             return success(PageResult.empty());
         }
 
-        // 得到所有的应用编号,查出所有的渠道
-        Collection<Long> appIds = convertList(pageResult.getList(), PayAppDO::getId);
-        List<PayChannelDO> channels = channelService.getChannelListByAppIds(appIds);
+        // 得到所有的应用编号,查出所有的渠道,并移除未启用的渠道
+        List<PayChannelDO> channels = channelService.getChannelListByAppIds(
+                convertList(pageResult.getList(), PayAppDO::getId));
+        channels.removeIf(channel -> !CommonStatusEnum.ENABLE.getStatus().equals(channel.getStatus()));
 
         // 拼接后返回
         return success(PayAppConvert.INSTANCE.convertPage(pageResult, channels));

+ 3 - 2
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/app/vo/PayAppBaseVO.java

@@ -1,11 +1,12 @@
 package com.citu.module.pay.controller.admin.app.vo;
+
 import com.citu.framework.common.enums.CommonStatusEnum;
 import com.citu.framework.common.validation.InEnum;
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
+import lombok.Data;
 import org.hibernate.validator.constraints.URL;
 
-import javax.validation.constraints.*;
+import javax.validation.constraints.NotNull;
 
 /**
 * 支付应用信息 Base VO,提供给添加、修改、详细的子 VO 使用

+ 4 - 1
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/app/vo/PayAppCreateReqVO.java

@@ -1,6 +1,9 @@
 package com.citu.module.pay.controller.admin.app.vo;
+
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
 
 @Schema(description = "管理后台 - 支付应用信息创建 Request VO")
 @Data

+ 4 - 1
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/app/vo/PayAppRespVO.java

@@ -1,6 +1,9 @@
 package com.citu.module.pay.controller.admin.app.vo;
+
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
 
 import java.time.LocalDateTime;
 

+ 6 - 2
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/app/vo/PayAppUpdateReqVO.java

@@ -1,7 +1,11 @@
 package com.citu.module.pay.controller.admin.app.vo;
+
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import javax.validation.constraints.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.validation.constraints.NotNull;
 
 @Schema(description = "管理后台 - 支付应用信息更新 Request VO")
 @Data

+ 4 - 2
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/channel/vo/PayChannelBaseVO.java

@@ -1,9 +1,11 @@
 package com.citu.module.pay.controller.admin.channel.vo;
+
 import com.citu.framework.common.enums.CommonStatusEnum;
 import com.citu.framework.common.validation.InEnum;
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import javax.validation.constraints.*;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
 
 /**
 * 支付渠道 Base VO,提供给添加、修改、详细的子 VO 使用

+ 4 - 1
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/channel/vo/PayChannelRespVO.java

@@ -1,6 +1,9 @@
 package com.citu.module.pay.controller.admin.channel.vo;
+
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
 
 import java.time.LocalDateTime;
 

+ 7 - 2
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/channel/vo/PayChannelUpdateReqVO.java

@@ -1,7 +1,12 @@
 package com.citu.module.pay.controller.admin.channel.vo;
+
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import javax.validation.constraints.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 
 @Schema(description = "管理后台 - 支付渠道 更新 Request VO")
 @Data

+ 2 - 2
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/demo/PayDemoOrderController.java

@@ -5,8 +5,8 @@ import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.pay.api.notify.dto.PayOrderNotifyReqDTO;
 import com.citu.module.pay.api.notify.dto.PayRefundNotifyReqDTO;
-import com.citu.module.pay.controller.admin.demo.vo.PayDemoOrderCreateReqVO;
-import com.citu.module.pay.controller.admin.demo.vo.PayDemoOrderRespVO;
+import com.citu.module.pay.controller.admin.demo.vo.order.PayDemoOrderCreateReqVO;
+import com.citu.module.pay.controller.admin.demo.vo.order.PayDemoOrderRespVO;
 import com.citu.module.pay.convert.demo.PayDemoOrderConvert;
 import com.citu.module.pay.dal.dataobject.demo.PayDemoOrderDO;
 import com.citu.module.pay.service.demo.PayDemoOrderService;

+ 26 - 7
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/demo/PayDemoTransferController.java

@@ -1,21 +1,24 @@
 package com.citu.module.pay.controller.admin.demo;
 
 import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.pay.api.notify.dto.PayTransferNotifyReqDTO;
 import com.citu.module.pay.controller.admin.demo.vo.transfer.PayDemoTransferCreateReqVO;
+import com.citu.module.pay.controller.admin.demo.vo.transfer.PayDemoTransferRespVO;
+import com.citu.module.pay.convert.demo.PayDemoTransferConvert;
+import com.citu.module.pay.dal.dataobject.demo.PayDemoTransferDO;
 import com.citu.module.pay.service.demo.PayDemoTransferService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.annotation.security.PermitAll;
 import javax.validation.Valid;
 
 import static com.citu.framework.common.pojo.CommonResult.success;
-import static com.citu.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 
 @Tag(name = "管理后台 - 示例转账单")
 @RestController
@@ -27,7 +30,23 @@ public class PayDemoTransferController {
 
     @PostMapping("/create")
     @Operation(summary = "创建示例转账订单")
-    public CommonResult<Long> createDemoOrder(@Valid @RequestBody PayDemoTransferCreateReqVO createReqVO) {
-        return success(demoTransferService.createDemoTransfer(getLoginUserId(), createReqVO));
+    public CommonResult<Long> createDemoTransfer(@Valid @RequestBody PayDemoTransferCreateReqVO createReqVO) {
+        return success(demoTransferService.createDemoTransfer(createReqVO));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得示例转账订单分页")
+    public CommonResult<PageResult<PayDemoTransferRespVO>> getDemoTransferPage(@Valid PageParam pageVO) {
+        PageResult<PayDemoTransferDO> pageResult = demoTransferService.getDemoTransferPage(pageVO);
+        return success(PayDemoTransferConvert.INSTANCE.convertPage(pageResult));
+    }
+
+    @PostMapping("/update-status")
+    @Operation(summary = "更新示例转账订单的转账状态") // 由 pay-module 转账服务,进行回调
+    @PermitAll // 无需登录,安全由 PayDemoTransferService 内部校验实现
+    public CommonResult<Boolean> updateDemoTransferStatus(@RequestBody PayTransferNotifyReqDTO notifyReqDTO) {
+        demoTransferService.updateDemoTransferStatus(Long.valueOf(notifyReqDTO.getMerchantTransferId()),
+                notifyReqDTO.getPayTransferId());
+        return success(true);
     }
 }

+ 2 - 3
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/demo/vo/PayDemoOrderCreateReqVO.java → citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/demo/vo/order/PayDemoOrderCreateReqVO.java

@@ -1,9 +1,8 @@
-package com.citu.module.pay.controller.admin.demo.vo;
+package com.citu.module.pay.controller.admin.demo.vo.order;
 
-import lombok.*;
 import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
 
-import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 
 @Schema(description = "管理后台 - 示例订单创建 Request VO")

+ 2 - 2
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/demo/vo/PayDemoOrderRespVO.java → citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/demo/vo/order/PayDemoOrderRespVO.java

@@ -1,7 +1,7 @@
-package com.citu.module.pay.controller.admin.demo.vo;
+package com.citu.module.pay.controller.admin.demo.vo.order;
 
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
+import lombok.Data;
 
 import java.time.LocalDateTime;
 

+ 40 - 6
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/demo/vo/transfer/PayDemoTransferCreateReqVO.java

@@ -1,14 +1,18 @@
 package com.citu.module.pay.controller.admin.demo.vo.transfer;
 
+import com.citu.framework.common.util.validation.ValidationUtils;
 import com.citu.framework.common.validation.InEnum;
 import com.citu.framework.pay.core.enums.transfer.PayTransferTypeEnum;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import javax.validation.Validator;
 import javax.validation.constraints.Min;
-import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
-import java.util.Map;
+
+import static com.citu.module.pay.enums.transfer.PayTransferTypeEnum.Alipay;
+import static com.citu.module.pay.enums.transfer.PayTransferTypeEnum.WxPay;
 
 /**
  * @author jason
@@ -22,13 +26,43 @@ public class PayDemoTransferCreateReqVO {
     @InEnum(PayTransferTypeEnum.class)
     private Integer type;
 
+    @Schema(description = "转账金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
     @NotNull(message = "转账金额不能为空")
     @Min(value = 1, message = "转账金额必须大于零")
     private Integer price;
 
-    // TODO @jason:感觉这个动态字段,晚点改;可能要讨论下怎么搞好;
-    @Schema(description = "收款方信息", requiredMode = Schema.RequiredMode.REQUIRED, example = "{'ALIPAY_LOGON_ID':'xxxx'}")
-    @NotEmpty(message = "收款方信息不能为空")
-    private Map<String, String> payeeInfo;
+    @Schema(description = "收款人姓名", example = "test1")
+    @NotBlank(message = "收款人姓名不能为空", groups = {Alipay.class})
+    private String userName;
+
+    // ========== 支付宝转账相关字段 ==========
+    @Schema(description = "支付宝登录号,支持邮箱和手机号格式", example = "test1@@sandbox.com")
+    @NotBlank(message = "支付宝登录号不能为空", groups = {Alipay.class})
+    private String alipayLogonId;
+
+    // ========== 微信转账相关字段 ==========
+    @Schema(description = "微信 openId", example = "oLefc4g5Gxx")
+    @NotBlank(message = "微信 openId 不能为空", groups = {WxPay.class})
+    private String openid;
+
+
+    // ========== 转账到银行卡和钱包相关字段 待补充 ==========
+
+    public void validate(Validator validator) {
+        PayTransferTypeEnum transferType = PayTransferTypeEnum.typeOf(type);
+        switch (transferType) {
+            case ALIPAY_BALANCE: {
+                ValidationUtils.validate(validator, this, Alipay.class);
+                break;
+            }
+            case WX_BALANCE: {
+                ValidationUtils.validate(validator, this, WxPay.class);
+                break;
+            }
+            default: {
+                throw new UnsupportedOperationException("待实现");
+            }
+        }
+    }
 
 }

+ 47 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/demo/vo/transfer/PayDemoTransferRespVO.java

@@ -0,0 +1,47 @@
+package com.citu.module.pay.controller.admin.demo.vo.transfer;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 示例业务转账订单 Base VO,提供给添加、修改、详细的子 VO 使用
+ * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
+ */
+@Data
+public class PayDemoTransferRespVO {
+
+    @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    private Long id;
+
+    @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Long appId;
+
+    @Schema(description = "转账金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "22338")
+    private Integer price;
+
+    @Schema(description = "转账类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Integer type;
+
+    @Schema(description = "收款人姓名",  example = "test")
+    private String userName;
+
+    @Schema(description = "支付宝登录号", example = "32167")
+    private String alipayLogonId;
+
+    @Schema(description = "微信 openId", example = "31139")
+    private String openid;
+
+    @Schema(description = "转账状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    private Integer transferStatus;
+
+    @Schema(description = "转账订单编号", example = "23695")
+    private Long payTransferId;
+
+    @Schema(description = "转账支付成功渠道")
+    private String payChannelCode;
+
+    @Schema(description = "转账支付时间")
+    private LocalDateTime transferTime;
+}

+ 2 - 2
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/notify/PayNotifyController.java

@@ -79,8 +79,8 @@ public class PayNotifyController {
     @Operation(summary = "支付渠道的统一【退款】回调")
     @PermitAll
     public String notifyRefund(@PathVariable("channelId") Long channelId,
-                               @RequestParam(required = false) Map<String, String> params,
-                               @RequestBody(required = false) String body) {
+                              @RequestParam(required = false) Map<String, String> params,
+                              @RequestBody(required = false) String body) {
         log.info("[notifyRefund][channelId({}) 回调数据({}/{})]", channelId, params, body);
         // 1. 校验支付渠道是否存在
         PayClient payClient = channelService.getPayClient(channelId);

+ 4 - 1
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/notify/vo/PayNotifyTaskRespVO.java

@@ -1,7 +1,10 @@
 package com.citu.module.pay.controller.admin.notify.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
 import java.time.LocalDateTime;
 
 @Schema(description = "管理后台 - 回调通知 Response VO")

+ 1 - 1
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/order/PayOrderController.java

@@ -109,7 +109,7 @@ public class PayOrderController {
     @PreAuthorize("@ss.hasPermission('pay:order:export')")
     @ApiAccessLog(operateType = EXPORT)
     public void exportOrderExcel(@Valid PayOrderExportReqVO exportReqVO,
-                                 HttpServletResponse response) throws IOException {
+            HttpServletResponse response) throws IOException {
         List<PayOrderDO> list = orderService.getOrderList(exportReqVO);
         if (CollectionUtil.isEmpty(list)) {
             ExcelUtils.write(response, "支付订单.xls", "数据",

+ 1 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/order/vo/PayOrderBaseVO.java

@@ -1,4 +1,5 @@
 package com.citu.module.pay.controller.admin.order.vo;
+
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;

+ 26 - 12
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/transfer/PayTransferController.java

@@ -1,16 +1,16 @@
 package com.citu.module.pay.controller.admin.transfer;
 
 import com.citu.framework.common.pojo.CommonResult;
-import com.citu.module.pay.controller.admin.transfer.vo.PayTransferSubmitReqVO;
-import com.citu.module.pay.controller.admin.transfer.vo.PayTransferSubmitRespVO;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.pay.controller.admin.transfer.vo.*;
+import com.citu.module.pay.convert.transfer.PayTransferConvert;
+import com.citu.module.pay.dal.dataobject.transfer.PayTransferDO;
 import com.citu.module.pay.service.transfer.PayTransferService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
@@ -27,12 +27,26 @@ public class PayTransferController {
     @Resource
     private PayTransferService payTransferService;
 
-    @PostMapping("/submit")
-    @Operation(summary = "提交转账订单")
-    // TODO @jason:权限的设置, 管理后台页面加的时候加一下
-    public CommonResult<PayTransferSubmitRespVO> submitPayTransfer(@Valid @RequestBody PayTransferSubmitReqVO reqVO) {
-        PayTransferSubmitRespVO respVO = payTransferService.submitTransfer(reqVO, getClientIP());
-        return success(respVO);
+    @PostMapping("/create")
+    @Operation(summary = "创建转账单,发起转账")
+    @PreAuthorize("@ss.hasPermission('pay:transfer:create')")
+    public CommonResult<PayTransferCreateRespVO> createPayTransfer(@Valid @RequestBody PayTransferCreateReqVO reqVO) {
+        PayTransferDO payTransfer = payTransferService.createTransfer(reqVO, getClientIP());
+        return success(new PayTransferCreateRespVO().setId(payTransfer.getId()).setStatus(payTransfer.getStatus()));
     }
 
+    @GetMapping("/get")
+    @Operation(summary = "获得转账订单")
+    @PreAuthorize("@ss.hasPermission('pay:transfer:query')")
+    public CommonResult<PayTransferRespVO> getTransfer(@RequestParam("id") Long id) {
+        return success(PayTransferConvert.INSTANCE.convert(payTransferService.getTransfer(id)));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得转账订单分页")
+    @PreAuthorize("@ss.hasPermission('pay:transfer:query')")
+    public CommonResult<PageResult<PayTransferPageItemRespVO>> getTransferPage(@Valid PayTransferPageReqVO pageVO) {
+        PageResult<PayTransferDO> pageResult = payTransferService.getTransferPage(pageVO);
+        return success(PayTransferConvert.INSTANCE.convertPage(pageResult));
+    }
 }

+ 95 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/transfer/vo/PayTransferCreateReqVO.java

@@ -0,0 +1,95 @@
+package com.citu.module.pay.controller.admin.transfer.vo;
+
+import com.citu.framework.common.util.validation.ValidationUtils;
+import com.citu.framework.common.validation.InEnum;
+import com.citu.framework.pay.core.enums.channel.PayChannelEnum;
+import com.citu.module.pay.enums.transfer.PayTransferTypeEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.Validator;
+import javax.validation.constraints.*;
+import java.util.Map;
+
+import static com.citu.framework.common.exception.enums.GlobalErrorCodeConstants.NOT_IMPLEMENTED;
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.pay.enums.transfer.PayTransferTypeEnum.*;
+
+@Schema(description = "管理后台 - 发起转账 Request VO")
+@Data
+public class PayTransferCreateReqVO {
+
+    @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "应用编号不能为空")
+    private Long appId;
+
+    @Schema(description = "商户转账单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "商户转账单编号不能为空")
+    private String merchantTransferId;
+
+    @Schema(description = "转账类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "转账类型不能为空")
+    @InEnum(PayTransferTypeEnum.class)
+    private Integer type;
+
+    @Schema(description = "转账渠道", requiredMode = Schema.RequiredMode.REQUIRED, example = "alipay_pc")
+    @NotEmpty(message = "转账渠道不能为空")
+    private String channelCode;
+
+    @Min(value = 1, message = "转账金额必须大于零")
+    @NotNull(message = "转账金额不能为空")
+    private Integer price;
+
+    @Schema(description = "转账标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "示例转账")
+    @NotEmpty(message = "转账标题不能为空")
+    private String subject;
+
+    @Schema(description = "收款人姓名", example = "test1")
+    @NotBlank(message = "收款人姓名不能为空", groups = {Alipay.class})
+    private String userName;
+
+    @Schema(description = "支付宝登录号",  example = "test1@sandbox.com")
+    @NotBlank(message = "支付宝登录号不能为空", groups = {Alipay.class})
+    private String alipayLogonId;
+
+    @Schema(description = "微信 openId",  example = "oLefc4g5Gxx")
+    @NotBlank(message = "微信 openId 不能为空", groups = {WxPay.class})
+    private String openid;
+
+    @Schema(description = "转账渠道的额外参数")
+    private Map<String, String> channelExtras;
+
+    public void validate(Validator validator) {
+       PayTransferTypeEnum transferType = typeOf(type);
+        switch (transferType) {
+            case ALIPAY_BALANCE: {
+                ValidationUtils.validate(validator, this, Alipay.class);
+                break;
+            }
+            case WX_BALANCE: {
+                ValidationUtils.validate(validator, this, WxPay.class);
+                break;
+            }
+            default: {
+                throw new UnsupportedOperationException("待实现");
+            }
+        }
+    }
+
+    @AssertTrue(message = "转账类型和转账渠道不匹配")
+    public boolean isValidChannelCode() {
+        PayTransferTypeEnum transferType = typeOf(type);
+        switch (transferType) {
+            case ALIPAY_BALANCE: {
+                return PayChannelEnum.isAlipay(channelCode);
+            }
+            case WX_BALANCE:
+            case BANK_CARD:
+            case WALLET_BALANCE: {
+                throw exception(NOT_IMPLEMENTED);
+            }
+        }
+        return Boolean.FALSE;
+    }
+
+}

+ 5 - 2
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/transfer/vo/PayTransferSubmitRespVO.java → citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/transfer/vo/PayTransferCreateRespVO.java

@@ -3,9 +3,12 @@ package com.citu.module.pay.controller.admin.transfer.vo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
-@Schema(description = "管理后台 - 转账单提交 Response VO")
+@Schema(description = "管理后台 - 发起转账 Response VO")
 @Data
-public class PayTransferSubmitRespVO {
+public class PayTransferCreateRespVO {
+
+    @Schema(description = "转账单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Long id;
 
     @Schema(description = "转账状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") // 参见 PayTransferStatusEnum 枚举
     private Integer status;

+ 62 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/transfer/vo/PayTransferPageItemRespVO.java

@@ -0,0 +1,62 @@
+package com.citu.module.pay.controller.admin.transfer.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author jason
+ */
+@Schema(description = "管理后台 - 转账单分页项 Response VO")
+@Data
+public class PayTransferPageItemRespVO {
+
+    @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2931")
+    private Long id;
+
+    @Schema(description = "转账单号", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String no;
+
+    @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12831")
+    private Long appId;
+
+    @Schema(description = "转账渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24833")
+    private Long channelId;
+
+    @Schema(description = "转账渠道编码", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String channelCode;
+
+    @Schema(description = "商户转账单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17481")
+    private String merchantTransferId;
+
+    @Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    private Integer type;
+
+    @Schema(description = "转账状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    private Integer status;
+
+    @Schema(description = "转账成功时间")
+    private LocalDateTime successTime;
+
+    @Schema(description = "转账金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "964")
+    private Integer price;
+
+    @Schema(description = "转账标题", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String subject;
+
+    @Schema(description = "收款人姓名", example = "王五")
+    private String userName;
+
+    @Schema(description = "支付宝登录号", example = "29245")
+    private String alipayLogonId;
+
+    @Schema(description = "微信 openId", example = "26589")
+    private String openid;
+
+    @Schema(description = "渠道转账单号")
+    private String channelTransferNo;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    private LocalDateTime createTime;
+}

+ 48 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/transfer/vo/PayTransferPageReqVO.java

@@ -0,0 +1,48 @@
+package com.citu.module.pay.controller.admin.transfer.vo;
+
+import com.citu.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 转账单分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class PayTransferPageReqVO extends PageParam {
+
+    @Schema(description = "转账单号")
+    private String no;
+
+    @Schema(description = "应用编号", example = "12831")
+    private Long appId;
+
+    @Schema(description = "渠道编码", example = "wx_app")
+    private String channelCode;
+
+    @Schema(description = "商户转账单编号", example = "17481")
+    private String merchantTransferId;
+
+    @Schema(description = "类型", example = "2")
+    private Integer type;
+
+    @Schema(description = "转账状态", example = "2")
+    private Integer status;
+
+    @Schema(description = "收款人姓名", example = "王五")
+    private String userName;
+
+    @Schema(description = "渠道转账单号")
+    private String channelTransferNo;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 79 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/transfer/vo/PayTransferRespVO.java

@@ -0,0 +1,79 @@
+package com.citu.module.pay.controller.admin.transfer.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.Map;
+
+@Schema(description = "管理后台 - 转账单 Response VO")
+@Data
+public class PayTransferRespVO {
+
+    @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2931")
+    private Long id;
+
+    @Schema(description = "转账单号", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String no;
+
+    @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12831")
+    private Long appId;
+
+    @Schema(description = "转账渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24833")
+    private Long channelId;
+
+    @Schema(description = "转账渠道编码", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String channelCode;
+
+    @Schema(description = "商户转账单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17481")
+    private String merchantTransferId;
+
+    @Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    private Integer type;
+
+    @Schema(description = "转账状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    private Integer status;
+
+    @Schema(description = "转账成功时间")
+    private LocalDateTime successTime;
+
+    @Schema(description = "转账金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "964")
+    private Integer price;
+
+    @Schema(description = "转账标题", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String subject;
+
+    @Schema(description = "收款人姓名", example = "王五")
+    private String userName;
+
+    @Schema(description = "支付宝登录号", example = "29245")
+    private String alipayLogonId;
+
+    @Schema(description = "微信 openId", example = "26589")
+    private String openid;
+
+    @Schema(description = "异步通知商户地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
+    private String notifyUrl;
+
+    @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String userIp;
+
+    @Schema(description = "渠道的额外参数")
+    private Map<String, String> channelExtras;
+
+    @Schema(description = "渠道转账单号")
+    private String channelTransferNo;
+
+    @Schema(description = "调用渠道的错误码")
+    private String channelErrorCode;
+
+    @Schema(description = "调用渠道的错误提示")
+    private String channelErrorMsg;
+
+    @Schema(description = "渠道的同步/异步通知的内容")
+    private String channelNotifyData;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    private LocalDateTime createTime;
+
+}

+ 0 - 25
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/transfer/vo/PayTransferSubmitReqVO.java

@@ -1,25 +0,0 @@
-package com.citu.module.pay.controller.admin.transfer.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-import java.util.Map;
-
-@Schema(description = "管理后台 - 转账单提交 Request VO")
-@Data
-public class PayTransferSubmitReqVO {
-
-    @Schema(description = "转账单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @NotNull(message = "转账单编号不能为空")
-    private Long id;
-
-    @Schema(description = "转账渠道", requiredMode = Schema.RequiredMode.REQUIRED, example = "alipay_transfer")
-    @NotEmpty(message = "转账渠道不能为空")
-    private String channelCode;
-
-    @Schema(description = "转账渠道的额外参数")
-    private Map<String, String> channelExtras;
-
-}

+ 3 - 27
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/wallet/PayWalletController.java

@@ -1,11 +1,7 @@
 package com.citu.module.pay.controller.admin.wallet;
 
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.util.StrUtil;
 import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.common.pojo.PageResult;
-import com.citu.module.member.api.user.MemberUserApi;
-import com.citu.module.member.api.user.dto.MemberUserRespDTO;
 import com.citu.module.pay.controller.admin.wallet.vo.wallet.PayWalletPageReqVO;
 import com.citu.module.pay.controller.admin.wallet.vo.wallet.PayWalletRespVO;
 import com.citu.module.pay.controller.admin.wallet.vo.wallet.PayWalletUserReqVO;
@@ -23,12 +19,9 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
-import java.util.List;
-import java.util.Map;
 
 import static com.citu.framework.common.enums.UserTypeEnum.MEMBER;
 import static com.citu.framework.common.pojo.CommonResult.success;
-import static com.citu.framework.common.util.collection.CollectionUtils.*;
 
 @Tag(name = "管理后台 - 用户钱包")
 @RestController
@@ -39,38 +32,21 @@ public class PayWalletController {
 
     @Resource
     private PayWalletService payWalletService;
-    @Resource
-    private MemberUserApi memberUserApi;
 
     @GetMapping("/get")
     @PreAuthorize("@ss.hasPermission('pay:wallet:query')")
     @Operation(summary = "获得用户钱包明细")
     public CommonResult<PayWalletRespVO> getWallet(PayWalletUserReqVO reqVO) {
         PayWalletDO wallet = payWalletService.getOrCreateWallet(reqVO.getUserId(), MEMBER.getValue());
-        // TODO jason:如果为空,返回给前端只要 null 就可以了
-        MemberUserRespDTO memberUser = memberUserApi.getUser(reqVO.getUserId()).getCheckedData();
-        String nickname = memberUser == null ? "" : memberUser.getNickname();
-        String avatar = memberUser == null ? "" : memberUser.getAvatar();
-        return success(PayWalletConvert.INSTANCE.convert02(nickname, avatar, wallet));
+        return success(PayWalletConvert.INSTANCE.convert02(wallet));
     }
 
     @GetMapping("/page")
     @Operation(summary = "获得会员钱包分页")
     @PreAuthorize("@ss.hasPermission('pay:wallet:query')")
     public CommonResult<PageResult<PayWalletRespVO>> getWalletPage(@Valid PayWalletPageReqVO pageVO) {
-        if (StrUtil.isNotEmpty(pageVO.getNickname())) {
-            List<MemberUserRespDTO> users = memberUserApi.getUserListByNickname(pageVO.getNickname()).getCheckedData();
-            pageVO.setUserIds(convertSet(users, MemberUserRespDTO::getId));
-        }
-        // TODO @jason:管理员也可以先查询下。。
-        // 暂时支持查询 userType 会员类型。管理员类型还不知道使用场景
-        PageResult<PayWalletDO> pageResult = payWalletService.getWalletPage(MEMBER.getValue(),pageVO);
-        if (CollectionUtil.isEmpty(pageResult.getList())) {
-            return success(new PageResult<>(pageResult.getTotal()));
-        }
-        List<MemberUserRespDTO> users = memberUserApi.getUserList(convertList(pageResult.getList(), PayWalletDO::getUserId)).getCheckedData();
-        Map<Long, MemberUserRespDTO> userMap = convertMap(users, MemberUserRespDTO::getId);
-        return success(PayWalletConvert.INSTANCE.convertPage(pageResult, userMap));
+        PageResult<PayWalletDO> pageResult = payWalletService.getWalletPage(pageVO);
+        return success(PayWalletConvert.INSTANCE.convertPage(pageResult));
     }
 
 }

+ 3 - 3
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/wallet/PayWalletRechargePackageController.java

@@ -6,7 +6,7 @@ import com.citu.module.pay.controller.admin.wallet.vo.rechargepackage.WalletRech
 import com.citu.module.pay.controller.admin.wallet.vo.rechargepackage.WalletRechargePackagePageReqVO;
 import com.citu.module.pay.controller.admin.wallet.vo.rechargepackage.WalletRechargePackageRespVO;
 import com.citu.module.pay.controller.admin.wallet.vo.rechargepackage.WalletRechargePackageUpdateReqVO;
-import com.citu.module.pay.convert.wallet.WalletRechargePackageConvert;
+import com.citu.module.pay.convert.wallet.PayWalletRechargePackageConvert;
 import com.citu.module.pay.dal.dataobject.wallet.PayWalletRechargePackageDO;
 import com.citu.module.pay.service.wallet.PayWalletRechargePackageService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -61,7 +61,7 @@ public class PayWalletRechargePackageController {
     @PreAuthorize("@ss.hasPermission('pay:wallet-recharge-package:query')")
     public CommonResult<WalletRechargePackageRespVO> getWalletRechargePackage(@RequestParam("id") Long id) {
         PayWalletRechargePackageDO walletRechargePackage = walletRechargePackageService.getWalletRechargePackage(id);
-        return success(WalletRechargePackageConvert.INSTANCE.convert(walletRechargePackage));
+        return success(PayWalletRechargePackageConvert.INSTANCE.convert(walletRechargePackage));
     }
 
     @GetMapping("/page")
@@ -69,7 +69,7 @@ public class PayWalletRechargePackageController {
     @PreAuthorize("@ss.hasPermission('pay:wallet-recharge-package:query')")
     public CommonResult<PageResult<WalletRechargePackageRespVO>> getWalletRechargePackagePage(@Valid WalletRechargePackagePageReqVO pageVO) {
         PageResult<PayWalletRechargePackageDO> pageResult = walletRechargePackageService.getWalletRechargePackagePage(pageVO);
-        return success(WalletRechargePackageConvert.INSTANCE.convertPage(pageResult));
+        return success(PayWalletRechargePackageConvert.INSTANCE.convertPage(pageResult));
     }
 
 }

+ 7 - 5
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/wallet/vo/wallet/PayWalletPageReqVO.java

@@ -1,6 +1,8 @@
 package com.citu.module.pay.controller.admin.wallet.vo.wallet;
 
+import com.citu.framework.common.enums.UserTypeEnum;
 import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.validation.InEnum;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -8,7 +10,6 @@ import lombok.ToString;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.time.LocalDateTime;
-import java.util.Collection;
 
 import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 
@@ -18,11 +19,12 @@ import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DA
 @ToString(callSuper = true)
 public class PayWalletPageReqVO extends PageParam {
 
-    @Schema(description = "用户昵称", example = "李四")
-    private String nickname;
+    @Schema(description = "用户编号", example = "1024")
+    private Long userId;
 
-    @Schema(description = "用户编号", example = "[1,2]")
-    private Collection<Long> userIds;
+    @Schema(description = "用户类型", example = "1")
+    @InEnum(value = UserTypeEnum.class)
+    private Integer userType;
 
     @Schema(description = "创建时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)

+ 0 - 5
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/wallet/vo/wallet/PayWalletRespVO.java

@@ -19,9 +19,4 @@ public class PayWalletRespVO extends PayWalletBaseVO {
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     private LocalDateTime createTime;
 
-    @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王**")
-    private String nickname;
-    @Schema(description = "用户头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xxx.jpg")
-    private String avatar;
-
 }

+ 0 - 1
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/order/AppPayOrderController.java

@@ -18,7 +18,6 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
-
 import java.util.Map;
 import java.util.Objects;
 

+ 0 - 5
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/order/vo/AppPayOrderSubmitReqVO.java

@@ -3,11 +3,6 @@ package com.citu.module.pay.controller.app.order.vo;
 import com.citu.module.pay.controller.admin.order.vo.PayOrderSubmitReqVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
-import lombok.experimental.Accessors;
-
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-import java.util.Map;
 
 @Schema(description = "用户 APP - 支付订单提交 Request VO")
 @Data

+ 0 - 4
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO.java

@@ -2,11 +2,7 @@ package com.citu.module.pay.controller.app.order.vo;
 
 import com.citu.module.pay.controller.admin.order.vo.PayOrderSubmitRespVO;
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
 import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
 
 @Schema(description = "用户 APP - 支付订单提交 Response VO")
 @Data

+ 27 - 5
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/wallet/AppPayWalletRechargeController.java

@@ -1,24 +1,30 @@
 package com.citu.module.pay.controller.app.wallet;
 
+import cn.hutool.core.collection.CollUtil;
+import com.citu.framework.common.enums.UserTypeEnum;
 import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.pay.controller.app.wallet.vo.recharge.AppPayWalletRechargeCreateReqVO;
 import com.citu.module.pay.controller.app.wallet.vo.recharge.AppPayWalletRechargeCreateRespVO;
+import com.citu.module.pay.controller.app.wallet.vo.recharge.AppPayWalletRechargeRespVO;
 import com.citu.module.pay.convert.wallet.PayWalletRechargeConvert;
+import com.citu.module.pay.dal.dataobject.order.PayOrderDO;
 import com.citu.module.pay.dal.dataobject.wallet.PayWalletRechargeDO;
+import com.citu.module.pay.service.order.PayOrderService;
 import com.citu.module.pay.service.wallet.PayWalletRechargeService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
+import java.util.List;
 
 import static com.citu.framework.common.pojo.CommonResult.success;
+import static com.citu.framework.common.util.collection.CollectionUtils.convertList;
 import static com.citu.framework.common.util.servlet.ServletUtils.getClientIP;
 import static com.citu.framework.web.core.util.WebFrameworkUtils.getLoginUserId;
 import static com.citu.framework.web.core.util.WebFrameworkUtils.getLoginUserType;
@@ -32,14 +38,30 @@ public class AppPayWalletRechargeController {
 
     @Resource
     private PayWalletRechargeService walletRechargeService;
+    @Resource
+    private PayOrderService payOrderService;
 
     @PostMapping("/create")
     @Operation(summary = "创建钱包充值记录(发起充值)")
     public CommonResult<AppPayWalletRechargeCreateRespVO> createWalletRecharge(
-            @Valid  @RequestBody  AppPayWalletRechargeCreateReqVO reqVO) {
+            @Valid @RequestBody  AppPayWalletRechargeCreateReqVO reqVO) {
         PayWalletRechargeDO walletRecharge = walletRechargeService.createWalletRecharge(
                 getLoginUserId(), getLoginUserType(), getClientIP(), reqVO);
         return success(PayWalletRechargeConvert.INSTANCE.convert(walletRecharge));
     }
 
+    @GetMapping("/page")
+    @Operation(summary = "获得钱包充值记录分页")
+    public CommonResult<PageResult<AppPayWalletRechargeRespVO>> getWalletRechargePage(@Valid PageParam pageReqVO) {
+        PageResult<PayWalletRechargeDO> pageResult = walletRechargeService.getWalletRechargePackagePage(
+                getLoginUserId(), UserTypeEnum.MEMBER.getValue(), pageReqVO, true);
+        if (CollUtil.isEmpty(pageResult.getList())) {
+            return success(PageResult.empty(pageResult.getTotal()));
+        }
+        // 拼接数据
+        List<PayOrderDO> payOrderList = payOrderService.getOrderList(
+                convertList(pageResult.getList(), PayWalletRechargeDO::getPayOrderId));
+        return success(PayWalletRechargeConvert.INSTANCE.convertPage(pageResult, payOrderList));
+    }
+
 }

+ 13 - 6
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/wallet/AppPayWalletRechargePackageController.java

@@ -1,7 +1,11 @@
 package com.citu.module.pay.controller.app.wallet;
 
+import com.citu.framework.common.enums.CommonStatusEnum;
 import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.module.pay.controller.app.wallet.vo.recharge.AppPayWalletPackageRespVO;
+import com.citu.module.pay.dal.dataobject.wallet.PayWalletRechargePackageDO;
+import com.citu.module.pay.service.wallet.PayWalletRechargePackageService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
@@ -10,7 +14,8 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.ArrayList;
+import javax.annotation.Resource;
+import java.util.Comparator;
 import java.util.List;
 
 import static com.citu.framework.common.pojo.CommonResult.success;
@@ -22,14 +27,16 @@ import static com.citu.framework.common.pojo.CommonResult.success;
 @Slf4j
 public class AppPayWalletRechargePackageController {
 
+    @Resource
+    private PayWalletRechargePackageService walletRechargePackageService;
+
     @GetMapping("/list")
     @Operation(summary = "获得钱包充值套餐列表")
     public CommonResult<List<AppPayWalletPackageRespVO>> getWalletRechargePackageList() {
-        // 只查询开启;需要按照 payPrice 排序;
-        List<AppPayWalletPackageRespVO> list = new ArrayList<>();
-        list.add(new AppPayWalletPackageRespVO().setId(1L).setName("土豆").setPayPrice(10).setBonusPrice(2));
-        list.add(new AppPayWalletPackageRespVO().setId(2L).setName("番茄").setPayPrice(20).setBonusPrice(5));
-        return success(list);
+        List<PayWalletRechargePackageDO> list = walletRechargePackageService.getWalletRechargePackageList(
+                CommonStatusEnum.ENABLE.getStatus());
+        list.sort(Comparator.comparingInt(PayWalletRechargePackageDO::getPayPrice));
+        return success(BeanUtils.toBean(list, AppPayWalletPackageRespVO.class));
     }
 
 }

+ 20 - 12
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/wallet/AppPayWalletTransactionController.java

@@ -3,17 +3,21 @@ package com.citu.module.pay.controller.app.wallet;
 import com.citu.framework.common.enums.UserTypeEnum;
 import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.module.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionPageReqVO;
 import com.citu.module.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionRespVO;
-import com.citu.module.pay.convert.wallet.PayWalletTransactionConvert;
+import com.citu.module.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionSummaryRespVO;
 import com.citu.module.pay.dal.dataobject.wallet.PayWalletTransactionDO;
 import com.citu.module.pay.service.wallet.PayWalletTransactionService;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
@@ -21,6 +25,7 @@ import javax.validation.Valid;
 import java.time.LocalDateTime;
 
 import static com.citu.framework.common.pojo.CommonResult.success;
+import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 import static com.citu.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 
 @Tag(name = "用户 APP - 钱包余额明细")
@@ -37,16 +42,19 @@ public class AppPayWalletTransactionController {
     @Operation(summary = "获得钱包流水分页")
     public CommonResult<PageResult<AppPayWalletTransactionRespVO>> getWalletTransactionPage(
             @Valid AppPayWalletTransactionPageReqVO pageReqVO) {
-        if (true) {
-            PageResult<AppPayWalletTransactionRespVO> result = new PageResult<>(10L);
-            result.getList().add(new AppPayWalletTransactionRespVO().setPrice(1L)
-                    .setTitle("测试").setCreateTime(LocalDateTime.now()));
-            result.getList().add(new AppPayWalletTransactionRespVO().setPrice(-1L)
-                    .setTitle("测试2").setCreateTime(LocalDateTime.now()));
-            return success(result);
-        }
-        PageResult<PayWalletTransactionDO> result = payWalletTransactionService.getWalletTransactionPage(getLoginUserId(),
-                UserTypeEnum.MEMBER.getValue(), pageReqVO);
-        return success(PayWalletTransactionConvert.INSTANCE.convertPage(result));
+        PageResult<PayWalletTransactionDO> pageResult = payWalletTransactionService.getWalletTransactionPage(
+                getLoginUserId(), UserTypeEnum.MEMBER.getValue(), pageReqVO);
+        return success(BeanUtils.toBean(pageResult, AppPayWalletTransactionRespVO.class));
     }
+
+    @GetMapping("/get-summary")
+    @Operation(summary = "获得钱包流水统计")
+    @Parameter(name = "times", description = "时间段", required = true)
+    public CommonResult<AppPayWalletTransactionSummaryRespVO> getWalletTransactionSummary(
+            @RequestParam("createTime") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) LocalDateTime[] createTime) {
+        AppPayWalletTransactionSummaryRespVO summary = payWalletTransactionService.getWalletTransactionSummary(
+                getLoginUserId(), UserTypeEnum.MEMBER.getValue(), createTime);
+        return success(summary);
+    }
+
 }

+ 2 - 1
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/wallet/vo/recharge/AppPayWalletRechargeCreateReqVO.java

@@ -19,7 +19,8 @@ public class AppPayWalletRechargeCreateReqVO {
     private Long packageId;
 
     @AssertTrue(message = "充值金额和充钱套餐不能同时为空")
-    public boolean validatePayPriceAndPackageId() {
+    public boolean isValidPayPriceAndPackageId() {
         return Objects.nonNull(payPrice) || Objects.nonNull(packageId);
     }
+
 }

+ 42 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/wallet/vo/recharge/AppPayWalletRechargeRespVO.java

@@ -0,0 +1,42 @@
+package com.citu.module.pay.controller.app.wallet.vo.recharge;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "用户 APP - 钱包充值记录 Resp VO")
+@Data
+public class AppPayWalletRechargeRespVO {
+
+    @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Long id;
+
+    @Schema(description = "用户实际到账余额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
+    private Integer totalPrice;
+
+    @Schema(description = "实际支付金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "20")
+    private Integer payPrice;
+
+    @Schema(description = "钱包赠送金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "80")
+    private Integer bonusPrice;
+
+    @Schema(description = "支付成功的支付渠道", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String payChannelCode;
+
+    @Schema(description = "支付渠道名", example = "微信小程序支付")
+    private String payChannelName;
+
+    @Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Long payOrderId;
+
+    @Schema(description = "支付成功的外部订单号", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String payOrderChannelOrderNo; // 从 PayOrderDO 的 channelOrderNo 字段
+
+    @Schema(description = "订单支付时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    private LocalDateTime payTime;
+
+    @Schema(description = "退款状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
+    private Integer refundStatus;
+
+}

+ 8 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/wallet/vo/transaction/AppPayWalletTransactionPageReqVO.java

@@ -1,8 +1,12 @@
 package com.citu.module.pay.controller.app.wallet.vo.transaction;
 
 import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.util.date.DateUtils;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
 
 @Schema(description = "用户 APP - 钱包流水分页 Request VO")
 @Data
@@ -20,4 +24,8 @@ public class AppPayWalletTransactionPageReqVO extends PageParam {
     @Schema(description = "类型",  example = "1")
     private Integer type;
 
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
 }

+ 16 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/wallet/vo/transaction/AppPayWalletTransactionSummaryRespVO.java

@@ -0,0 +1,16 @@
+package com.citu.module.pay.controller.app.wallet.vo.transaction;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "用户 APP - 钱包流水统计 Request VO")
+@Data
+public class AppPayWalletTransactionSummaryRespVO {
+
+    @Schema(description = "累计支出,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000")
+    private Integer totalExpense;
+
+    @Schema(description = "累计收入,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000")
+    private Integer totalIncome;
+
+}

+ 3 - 3
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/app/wallet/vo/wallet/AppPayWalletRespVO.java

@@ -7,13 +7,13 @@ import lombok.Data;
 @Data
 public class AppPayWalletRespVO {
 
-    @Schema(description = "钱包余额,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
+    @Schema(description = "钱包余额单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
     private Integer balance;
 
-    @Schema(description = "累计支出, 单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000")
+    @Schema(description = "累计支出单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000")
     private Integer totalExpense;
 
-    @Schema(description = "累计充值, 单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000")
+    @Schema(description = "累计充值单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000")
     private Integer totalRecharge;
 
 }

+ 2 - 2
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/package-info.java

@@ -1,6 +1,6 @@
 /**
  * 提供 RESTful API 给前端:
- * 1. admin 包:提供给管理后台 citu-ui-admin 前端项目
- * 2. app 包:提供给用户 APP citu-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分
+ * 1. admin 包:提供给管理后台 yudao-ui-admin 前端项目
+ * 2. app 包:提供给用户 APP yudao-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分
  */
 package com.citu.module.pay.controller;

+ 0 - 1
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/app/PayAppConvert.java

@@ -14,7 +14,6 @@ import org.mapstruct.factory.Mappers;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.function.Consumer;
 
 /**
  * 支付应用信息 Convert

+ 2 - 2
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/demo/PayDemoOrderConvert.java

@@ -1,8 +1,8 @@
 package com.citu.module.pay.convert.demo;
 
 import com.citu.framework.common.pojo.PageResult;
-import com.citu.module.pay.controller.admin.demo.vo.PayDemoOrderCreateReqVO;
-import com.citu.module.pay.controller.admin.demo.vo.PayDemoOrderRespVO;
+import com.citu.module.pay.controller.admin.demo.vo.order.PayDemoOrderCreateReqVO;
+import com.citu.module.pay.controller.admin.demo.vo.order.PayDemoOrderRespVO;
 import com.citu.module.pay.dal.dataobject.demo.PayDemoOrderDO;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;

+ 21 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/demo/PayDemoTransferConvert.java

@@ -0,0 +1,21 @@
+package com.citu.module.pay.convert.demo;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.pay.controller.admin.demo.vo.transfer.PayDemoTransferCreateReqVO;
+import com.citu.module.pay.controller.admin.demo.vo.transfer.PayDemoTransferRespVO;
+import com.citu.module.pay.dal.dataobject.demo.PayDemoTransferDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+/**
+ * @author jason
+ */
+@Mapper
+public interface PayDemoTransferConvert {
+
+    PayDemoTransferConvert INSTANCE = Mappers.getMapper(PayDemoTransferConvert.class);
+
+    PayDemoTransferDO convert(PayDemoTransferCreateReqVO bean);
+
+    PageResult<PayDemoTransferRespVO> convertPage(PageResult<PayDemoTransferDO> pageResult);
+}

+ 12 - 2
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/transfer/PayTransferConvert.java

@@ -1,10 +1,14 @@
 package com.citu.module.pay.convert.transfer;
 
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.pay.core.client.dto.transfer.PayTransferUnifiedReqDTO;
 import com.citu.module.pay.api.transfer.dto.PayTransferCreateReqDTO;
 import com.citu.module.pay.controller.admin.demo.vo.transfer.PayDemoTransferCreateReqVO;
+import com.citu.module.pay.controller.admin.transfer.vo.PayTransferCreateReqVO;
+import com.citu.module.pay.controller.admin.transfer.vo.PayTransferPageItemRespVO;
+import com.citu.module.pay.controller.admin.transfer.vo.PayTransferRespVO;
 import com.citu.module.pay.dal.dataobject.transfer.PayTransferDO;
 import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
 import org.mapstruct.factory.Mappers;
 
 @Mapper
@@ -12,9 +16,15 @@ public interface PayTransferConvert {
 
     PayTransferConvert INSTANCE = Mappers.getMapper(PayTransferConvert.class);
 
-    @Mapping(source = "title", target = "subject") // TODO @jason:是不是都改成 subject 完事呀?
     PayTransferDO convert(PayTransferCreateReqDTO dto);
 
+    PayTransferUnifiedReqDTO convert2(PayTransferDO dto);
+
+    PayTransferCreateReqDTO convert(PayTransferCreateReqVO vo);
+
     PayTransferCreateReqDTO convert(PayDemoTransferCreateReqVO vo);
 
+    PayTransferRespVO  convert(PayTransferDO bean);
+
+    PageResult<PayTransferPageItemRespVO> convertPage(PageResult<PayTransferDO> pageResult);
 }

+ 1 - 16
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/wallet/PayWalletConvert.java

@@ -1,16 +1,12 @@
 package com.citu.module.pay.convert.wallet;
 
 import com.citu.framework.common.pojo.PageResult;
-import com.citu.framework.common.util.collection.MapUtils;
-import com.citu.module.member.api.user.dto.MemberUserRespDTO;
 import com.citu.module.pay.controller.admin.wallet.vo.wallet.PayWalletRespVO;
 import com.citu.module.pay.controller.app.wallet.vo.wallet.AppPayWalletRespVO;
 import com.citu.module.pay.dal.dataobject.wallet.PayWalletDO;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
 
-import java.util.Map;
-
 @Mapper
 public interface PayWalletConvert {
 
@@ -18,19 +14,8 @@ public interface PayWalletConvert {
 
     AppPayWalletRespVO convert(PayWalletDO bean);
 
-    PayWalletRespVO convert02(String nickname,String avatar, PayWalletDO bean);
+    PayWalletRespVO convert02(PayWalletDO bean);
 
     PageResult<PayWalletRespVO> convertPage(PageResult<PayWalletDO> page);
 
-    default PageResult<PayWalletRespVO> convertPage(PageResult<PayWalletDO> page, Map<Long, MemberUserRespDTO> userMap){
-        PageResult<PayWalletRespVO> pageResult = convertPage(page);
-        pageResult.getList().forEach( wallet -> MapUtils.findAndThen(userMap, wallet.getUserId(),
-                user -> {
-            // TODO @jason:可以链式调用哈;
-                    wallet.setNickname(user.getNickname());
-                    wallet.setAvatar(user.getAvatar());
-                }));
-        return pageResult;
-    }
-
 }

+ 24 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/wallet/PayWalletRechargeConvert.java

@@ -1,11 +1,22 @@
 package com.citu.module.pay.convert.wallet;
 
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.collection.CollectionUtils;
+import com.citu.framework.common.util.collection.MapUtils;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.dict.core.DictFrameworkUtils;
 import com.citu.module.pay.controller.app.wallet.vo.recharge.AppPayWalletRechargeCreateRespVO;
+import com.citu.module.pay.controller.app.wallet.vo.recharge.AppPayWalletRechargeRespVO;
+import com.citu.module.pay.dal.dataobject.order.PayOrderDO;
 import com.citu.module.pay.dal.dataobject.wallet.PayWalletRechargeDO;
+import com.citu.module.pay.enums.DictTypeConstants;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 import org.mapstruct.factory.Mappers;
 
+import java.util.List;
+import java.util.Map;
+
 @Mapper
 public interface PayWalletRechargeConvert {
 
@@ -16,4 +27,17 @@ public interface PayWalletRechargeConvert {
 
     AppPayWalletRechargeCreateRespVO convert(PayWalletRechargeDO bean);
 
+    default PageResult<AppPayWalletRechargeRespVO> convertPage(PageResult<PayWalletRechargeDO> pageResult,
+                                                               List<PayOrderDO> payOrderList) {
+        PageResult<AppPayWalletRechargeRespVO> voPageResult = BeanUtils.toBean(pageResult, AppPayWalletRechargeRespVO.class);
+        Map<Long, PayOrderDO> payOrderMap = CollectionUtils.convertMap(payOrderList, PayOrderDO::getId);
+        voPageResult.getList().forEach(recharge -> {
+            recharge.setPayChannelName(DictFrameworkUtils.getDictDataLabel(
+                    DictTypeConstants.CHANNEL_CODE, recharge.getPayChannelCode()));
+            MapUtils.findAndThen(payOrderMap, recharge.getPayOrderId(),
+                    order -> recharge.setPayOrderChannelOrderNo(order.getChannelOrderNo()));
+        });
+        return voPageResult;
+    }
+
 }

+ 2 - 2
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/wallet/WalletRechargePackageConvert.java → citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/wallet/PayWalletRechargePackageConvert.java

@@ -11,9 +11,9 @@ import org.mapstruct.factory.Mappers;
 import java.util.List;
 
 @Mapper
-public interface WalletRechargePackageConvert {
+public interface PayWalletRechargePackageConvert {
 
-    WalletRechargePackageConvert INSTANCE = Mappers.getMapper(WalletRechargePackageConvert.class);
+    PayWalletRechargePackageConvert INSTANCE = Mappers.getMapper(PayWalletRechargePackageConvert.class);
 
     PayWalletRechargePackageDO convert(WalletRechargePackageCreateReqVO bean);
 

+ 0 - 3
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/wallet/PayWalletTransactionConvert.java

@@ -2,7 +2,6 @@ package com.citu.module.pay.convert.wallet;
 
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.pay.controller.admin.wallet.vo.transaction.PayWalletTransactionRespVO;
-import com.citu.module.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionRespVO;
 import com.citu.module.pay.dal.dataobject.wallet.PayWalletTransactionDO;
 import com.citu.module.pay.service.wallet.bo.WalletTransactionCreateReqBO;
 import org.mapstruct.Mapper;
@@ -13,8 +12,6 @@ public interface PayWalletTransactionConvert {
 
     PayWalletTransactionConvert INSTANCE = Mappers.getMapper(PayWalletTransactionConvert.class);
 
-    PageResult<AppPayWalletTransactionRespVO> convertPage(PageResult<PayWalletTransactionDO> page);
-
     PageResult<PayWalletTransactionRespVO> convertPage2(PageResult<PayWalletTransactionDO> page);
 
     PayWalletTransactionDO convert(WalletTransactionCreateReqBO bean);

+ 1 - 1
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md

@@ -1 +1 @@
-<http://www.iocoder.cn/Spring-Boot/MapStruct/?citu>
+<http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao>

+ 5 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/dataobject/app/PayAppDO.java

@@ -54,4 +54,9 @@ public class PayAppDO extends BaseDO {
      */
     private String refundNotifyUrl;
 
+    /**
+     * 转账结果的回调地址
+     */
+    private String transferNotifyUrl;
+
 }

+ 24 - 12
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/dataobject/demo/PayDemoTransferDO.java

@@ -1,16 +1,16 @@
 package com.citu.module.pay.dal.dataobject.demo;
 
 import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import com.citu.framework.pay.core.enums.transfer.PayTransferTypeEnum;
+import com.citu.module.pay.dal.dataobject.app.PayAppDO;
 import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import lombok.Data;
 
 import java.time.LocalDateTime;
-import java.util.Map;
 
+// TODO 芋艿:需要详细 review
 /**
  * 示例转账订单
  *
@@ -28,9 +28,18 @@ public class PayDemoTransferDO extends BaseDO {
     private Long id;
 
     /**
-     * 用户编号
+     * 应用编号
+     *
+     * 关联 {@link PayAppDO#getId()}
      */
-    private Long userId;
+    private Long appId;
+
+    /**
+     * 转账类型
+     * <p>
+     * 枚举 {@link PayTransferTypeEnum}
+     */
+    private Integer type;
 
     /**
      * 转账金额,单位:分
@@ -38,16 +47,19 @@ public class PayDemoTransferDO extends BaseDO {
     private Integer price;
 
     /**
-     * 转账类型
+     * 收款人姓名
      */
-    private Integer type;
+    private String userName;
+
+    /**
+     * 支付宝登录号
+     */
+    private String alipayLogonId;
 
-    // TODO @jason:要不字段还是弄成正确的平铺开?
     /**
-     * 收款人信息,不同类型和渠道不同
+     * 微信 openId
      */
-    @TableField(typeHandler = JacksonTypeHandler.class)
-    private Map<String, String> payeeInfo;
+    private String openid;
 
     /**
      * 转账状态
@@ -55,7 +67,7 @@ public class PayDemoTransferDO extends BaseDO {
     private Integer transferStatus;
 
     /**
-     * 转账单编号
+     * 转账单编号
      */
     private Long payTransferId;
 

+ 1 - 1
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/dataobject/notify/PayNotifyLogDO.java

@@ -1,7 +1,7 @@
 package com.citu.module.pay.dal.dataobject.notify;
 
-import com.citu.module.pay.enums.notify.PayNotifyStatusEnum;
 import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import com.citu.module.pay.enums.notify.PayNotifyStatusEnum;
 import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.*;

+ 4 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/dataobject/notify/PayNotifyTaskDO.java

@@ -66,6 +66,10 @@ public class PayNotifyTaskDO extends TenantBaseDO {
      * 商户订单编号
      */
     private String merchantOrderId;
+    /**
+     * 商户转账单编号
+     */
+    private String merchantTransferId;
     /**
      * 通知状态
      *

+ 1 - 1
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/dataobject/order/PayOrderExtensionDO.java

@@ -1,9 +1,9 @@
 package com.citu.module.pay.dal.dataobject.order;
 
+import com.citu.framework.mybatis.core.dataobject.BaseDO;
 import com.citu.framework.pay.core.client.dto.order.PayOrderRespDTO;
 import com.citu.module.pay.dal.dataobject.channel.PayChannelDO;
 import com.citu.module.pay.enums.order.PayOrderStatusEnum;
-import com.citu.framework.mybatis.core.dataobject.BaseDO;
 import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;

+ 70 - 18
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/dataobject/transfer/PayTransferDO.java

@@ -16,6 +16,7 @@ import lombok.Data;
 import java.time.LocalDateTime;
 import java.util.Map;
 
+// TODO 芋艿:需要详细 review
 /**
  * 转账单 DO
  *
@@ -31,76 +32,127 @@ public class PayTransferDO extends BaseDO {
      */
     @TableId
     private Long id;
+
+    /**
+     * 转账单号
+     *
+     */
+    private String no;
+
     /**
      * 应用编号
      *
      * 关联 {@link PayAppDO#getId()}
      */
     private Long appId;
+
     /**
      * 转账渠道编号
      *
      * 关联 {@link PayChannelDO#getId()}
      */
     private Long channelId;
+
     /**
      * 转账渠道编码
      *
      * 枚举 {@link PayChannelEnum}
      */
     private String channelCode;
+
+    // ========== 商户相关字段 ==========
     /**
-     * 类型
+     * 商户转账单编号
      *
-     * 枚举 {@link PayTransferTypeEnum}
+     * 例如说,内部系统 A 的订单号,需要保证每个 PayAppDO 唯一
      */
-    private Integer type;
+    private String merchantTransferId;
 
-    // ========== 商户相关字段 ==========
+    // ========== 转账相关字段 ==========
 
     /**
-     * 商户订单编号
+     * 类型
      *
-     * 例如说,内部系统 A 的订单号,需要保证每个 PayAppDO 唯一
+     * 枚举 {@link PayTransferTypeEnum}
      */
-    private String merchantOrderId;
+    private Integer type;
 
     /**
      * 转账标题
      */
     private String subject;
 
-    // ========== 转账相关字段 ==========
     /**
      * 转账金额,单位:分
      */
     private Integer price;
+
+    /**
+     * 收款人姓名
+     */
+    private String userName;
+
     /**
      * 转账状态
      *
      * 枚举 {@link PayTransferStatusRespEnum}
      */
     private Integer status;
+
     /**
      * 订单转账成功时间
      */
     private LocalDateTime successTime;
+
+    // ========== 支付宝转账相关字段 ==========
     /**
-     * 转账成功的转账拓展单编号
-     *
-     * 关联 {@link PayTransferExtensionDO#getId()}
+     * 支付宝登录号
      */
-    private Long extensionId;
+    private String alipayLogonId;
+
+
+    // ========== 微信转账相关字段 ==========
     /**
-     * 转账成功的转账拓展单号
-     *
-     * 关联 {@link PayTransferExtensionDO#getNo()}
+     * 微信 openId
      */
-    private String no;
+    private String openid;
+
+    // ========== 其它字段 ==========
+
+    /**
+     * 异步通知地址
+     */
+    private String notifyUrl;
+
+    /**
+     * 用户 IP
+     */
+    private String userIp;
+
     /**
-     * 收款人信息,不同类型和渠道不同
+     * 渠道的额外参数
      */
     @TableField(typeHandler = JacksonTypeHandler.class)
-    private Map<String, String> payeeInfo;
+    private Map<String, String> channelExtras;
+
+    /**
+     * 渠道转账单号
+     */
+    private String channelTransferNo;
+
+    /**
+     * 调用渠道的错误码
+     */
+    private String channelErrorCode;
+    /**
+     * 调用渠道的错误提示
+     */
+    private String channelErrorMsg;
+
+    /**
+     * 渠道的同步/异步通知的内容
+     *
+     */
+    private String channelNotifyData;
 
 }

+ 0 - 68
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/dataobject/transfer/PayTransferExtensionDO.java

@@ -1,68 +0,0 @@
-package com.citu.module.pay.dal.dataobject.transfer;
-
-import com.citu.framework.mybatis.core.dataobject.BaseDO;
-import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
-import lombok.Data;
-
-import java.util.Map;
-
-// TODO @jason:转账是不是类似 refund,不用拓展单呀?支付做拓展单的原因,是因为它存在不确定性,可以切换多种;转账和退款,都是明确方式的;
-// @芋艿 转账是不是也存在多种方式。 例如转账到银行卡。 可以使用微信,也可以使用支付宝。 支付宝账号余额不够,可以切换到微信;
-// TODO @jason:发起了,就不允许调整了,类似退款哈;
-/**
- * 转账拓展单 DO
- *
- * @author jason
- */
-@TableName(value ="pay_transfer_extension",autoResultMap = true)
-@KeySequence("pay_transfer_extension_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
-@Data
-public class PayTransferExtensionDO extends BaseDO {
-
-    /**
-     * 编号
-     */
-    @TableId
-    private Long id;
-
-    /**
-     * 转账单号
-     */
-    private String no;
-
-    /**
-     * 转账单编号
-     */
-    private Long transferId;
-
-    /**
-     * 转账渠道编号
-     */
-    private Long channelId;
-
-    /**
-     * 转账渠道编码
-     */
-    private String channelCode;
-
-    /**
-     * 支付渠道的额外参数
-     */
-    @TableField(typeHandler = JacksonTypeHandler.class)
-    private Map<String, String> channelExtras;
-
-    /**
-     * 转账状态
-     */
-    private Integer status;
-
-    /**
-     * 支付渠道异步通知的内容
-     */
-    private String channelNotifyData;
-
-}

+ 0 - 1
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/app/PayAppMapper.java

@@ -3,7 +3,6 @@ package com.citu.module.pay.dal.mysql.app;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.mybatis.core.mapper.BaseMapperX;
 import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
-import com.citu.framework.mybatis.core.query.QueryWrapperX;
 import com.citu.module.pay.controller.admin.app.vo.PayAppPageReqVO;
 import com.citu.module.pay.dal.dataobject.app.PayAppDO;
 import org.apache.ibatis.annotations.Mapper;

+ 8 - 1
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/demo/PayDemoTransferMapper.java

@@ -1,10 +1,17 @@
 package com.citu.module.pay.dal.mysql.demo;
 
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.citu.module.pay.dal.dataobject.demo.PayDemoTransferDO;
 import org.apache.ibatis.annotations.Mapper;
 
 @Mapper
 public interface PayDemoTransferMapper extends BaseMapperX<PayDemoTransferDO> {
 
-}
+    default  PageResult<PayDemoTransferDO> selectPage(PageParam pageParam){
+        return selectPage(pageParam, new LambdaQueryWrapperX<PayDemoTransferDO>()
+                .orderByDesc(PayDemoTransferDO::getId));
+    }
+}

+ 1 - 1
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/notify/PayNotifyLogMapper.java

@@ -1,7 +1,7 @@
 package com.citu.module.pay.dal.mysql.notify;
 
-import com.citu.module.pay.dal.dataobject.notify.PayNotifyLogDO;
 import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.module.pay.dal.dataobject.notify.PayNotifyLogDO;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;

+ 0 - 26
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/transfer/PayTransferExtensionMapper.java

@@ -1,26 +0,0 @@
-package com.citu.module.pay.dal.mysql.transfer;
-
-import com.citu.framework.mybatis.core.mapper.BaseMapperX;
-import com.citu.module.pay.dal.dataobject.transfer.PayTransferExtensionDO;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import org.apache.ibatis.annotations.Mapper;
-
-import java.util.List;
-
-@Mapper
-public interface PayTransferExtensionMapper extends BaseMapperX<PayTransferExtensionDO> {
-
-    default PayTransferExtensionDO selectByNo(String no){
-       return  selectOne(PayTransferExtensionDO::getNo, no);
-    }
-
-    default int updateByIdAndStatus(Long id, List<Integer> whereStatuses, PayTransferExtensionDO updateObj) {
-        return update(updateObj, new LambdaQueryWrapper<PayTransferExtensionDO>()
-                .eq(PayTransferExtensionDO::getId, id).in(PayTransferExtensionDO::getStatus, whereStatuses));
-    }
-
-}
-
-
-
-

+ 29 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/transfer/PayTransferMapper.java

@@ -1,6 +1,9 @@
 package com.citu.module.pay.dal.mysql.transfer;
 
+import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.citu.module.pay.controller.admin.transfer.vo.PayTransferPageReqVO;
 import com.citu.module.pay.dal.dataobject.transfer.PayTransferDO;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.apache.ibatis.annotations.Mapper;
@@ -15,6 +18,32 @@ public interface PayTransferMapper extends BaseMapperX<PayTransferDO> {
                 .eq(PayTransferDO::getId, id).in(PayTransferDO::getStatus, status));
     }
 
+    default PayTransferDO selectByAppIdAndMerchantTransferId(Long appId, String merchantTransferId){
+        return selectOne(PayTransferDO::getAppId, appId,
+                    PayTransferDO::getMerchantTransferId, merchantTransferId);
+    }
+
+    default PayTransferDO selectByNo(String no){
+        return selectOne(PayTransferDO::getNo, no);
+    }
+
+    default PageResult<PayTransferDO> selectPage(PayTransferPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<PayTransferDO>()
+                .eqIfPresent(PayTransferDO::getNo, reqVO.getNo())
+                .eqIfPresent(PayTransferDO::getAppId, reqVO.getAppId())
+                .eqIfPresent(PayTransferDO::getChannelCode, reqVO.getChannelCode())
+                .eqIfPresent(PayTransferDO::getMerchantTransferId, reqVO.getMerchantTransferId())
+                .eqIfPresent(PayTransferDO::getType, reqVO.getType())
+                .eqIfPresent(PayTransferDO::getStatus, reqVO.getStatus())
+                .likeIfPresent(PayTransferDO::getUserName, reqVO.getUserName())
+                .eqIfPresent(PayTransferDO::getChannelTransferNo, reqVO.getChannelTransferNo())
+                .betweenIfPresent(PayTransferDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(PayTransferDO::getId));
+    }
+
+    default List<PayTransferDO> selectListByStatus(Integer status){
+        return selectList(PayTransferDO::getStatus, status);
+    }
 }
 
 

+ 4 - 4
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/wallet/PayWalletMapper.java

@@ -17,10 +17,10 @@ public interface PayWalletMapper extends BaseMapperX<PayWalletDO> {
                 PayWalletDO::getUserType, userType);
     }
 
-    default PageResult<PayWalletDO> selectPage(Integer userType, PayWalletPageReqVO reqVO) {
+    default PageResult<PayWalletDO> selectPage(PayWalletPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<PayWalletDO>()
-                .inIfPresent(PayWalletDO::getUserId, reqVO.getUserIds())
-                .eqIfPresent(PayWalletDO::getUserType, userType)
+                .eqIfPresent(PayWalletDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(PayWalletDO::getUserType, reqVO.getUserType())
                 .betweenIfPresent(PayWalletDO::getCreateTime, reqVO.getCreateTime())
                 .orderByDesc(PayWalletDO::getId));
     }
@@ -31,7 +31,7 @@ public interface PayWalletMapper extends BaseMapperX<PayWalletDO> {
      * @param id 钱包 id
      * @param price 消费金额
      */
-    default int updateWhenConsumptionRefund(Long id, Integer price){
+    default int updateWhenConsumptionRefund(Long id, Integer price) {
         LambdaUpdateWrapper<PayWalletDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<PayWalletDO>()
                 .setSql(" balance = balance + " + price
                         + ", total_expense = total_expense - " + price)

+ 9 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/wallet/PayWalletRechargeMapper.java

@@ -1,5 +1,7 @@
 package com.citu.module.pay.dal.mysql.wallet;
 
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.mybatis.core.mapper.BaseMapperX;
 import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.citu.module.pay.dal.dataobject.wallet.PayWalletRechargeDO;
@@ -18,4 +20,11 @@ public interface PayWalletRechargeMapper extends BaseMapperX<PayWalletRechargeDO
                 .eq(PayWalletRechargeDO::getId, id).eq(PayWalletRechargeDO::getRefundStatus, whereRefundStatus));
     }
 
+    default PageResult<PayWalletRechargeDO> selectPage(PageParam pageReqVO, Long walletId, Boolean payStatus) {
+        return selectPage(pageReqVO, new LambdaQueryWrapperX<PayWalletRechargeDO>()
+                .eq(PayWalletRechargeDO::getWalletId, walletId)
+                .eq(PayWalletRechargeDO::getPayStatus, payStatus)
+                .orderByDesc(PayWalletRechargeDO::getId));
+    }
+
 }

+ 7 - 2
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/wallet/PayWalletRechargePackageMapper.java

@@ -8,6 +8,8 @@ import com.citu.module.pay.controller.admin.wallet.vo.rechargepackage.WalletRech
 import com.citu.module.pay.dal.dataobject.wallet.PayWalletRechargePackageDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
+
 @Mapper
 public interface PayWalletRechargePackageMapper extends BaseMapperX<PayWalletRechargePackageDO> {
 
@@ -19,9 +21,12 @@ public interface PayWalletRechargePackageMapper extends BaseMapperX<PayWalletRec
                 .orderByDesc(PayWalletRechargePackageDO::getPayPrice));
     }
 
-    // TODO @jason:这里要有空格哈;String name) {
-    default PayWalletRechargePackageDO selectByName(String name){
+    default PayWalletRechargePackageDO selectByName(String name) {
         return selectOne(PayWalletRechargePackageDO::getName, name);
     }
 
+    default List<PayWalletRechargePackageDO> selectListByStatus(Integer status) {
+        return selectList(PayWalletRechargePackageDO::getStatus, status);
+    }
+
 }

+ 26 - 4
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/wallet/PayWalletTransactionMapper.java

@@ -1,32 +1,54 @@
 package com.citu.module.pay.dal.mysql.wallet;
 
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
 import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.mybatis.core.mapper.BaseMapperX;
 import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
-import com.citu.module.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionPageReqVO;
+import com.citu.framework.mybatis.core.query.QueryWrapperX;
 import com.citu.module.pay.dal.dataobject.wallet.PayWalletTransactionDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
+import static com.citu.module.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionPageReqVO.TYPE_EXPENSE;
+import static com.citu.module.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionPageReqVO.TYPE_INCOME;
+
 @Mapper
 public interface PayWalletTransactionMapper extends BaseMapperX<PayWalletTransactionDO> {
 
     default PageResult<PayWalletTransactionDO> selectPage(Long walletId, Integer type,
-                                                          PageParam pageParam) {
+                                                          PageParam pageParam, LocalDateTime[] createTime) {
         LambdaQueryWrapperX<PayWalletTransactionDO> query = new LambdaQueryWrapperX<PayWalletTransactionDO>()
                 .eqIfPresent(PayWalletTransactionDO::getWalletId, walletId);
-        if (Objects.equals(type, AppPayWalletTransactionPageReqVO.TYPE_INCOME)) {
+        if (Objects.equals(type, TYPE_INCOME)) {
             query.gt(PayWalletTransactionDO::getPrice, 0);
-        } else if (Objects.equals(type, AppPayWalletTransactionPageReqVO.TYPE_EXPENSE)) {
+        } else if (Objects.equals(type, TYPE_EXPENSE)) {
             query.lt(PayWalletTransactionDO::getPrice, 0);
         }
+        query.betweenIfPresent(PayWalletTransactionDO::getCreateTime, createTime);
         query.orderByDesc(PayWalletTransactionDO::getId);
         return selectPage(pageParam, query);
     }
 
+    default Integer selectPriceSum(Long walletId, Integer type, LocalDateTime[] createTime) {
+        // SQL sum 查询
+        List<Map<String, Object>> result = selectMaps(new QueryWrapperX<PayWalletTransactionDO>()
+                .select("SUM(price) AS priceSum")
+                .gt(Objects.equals(type, TYPE_INCOME), "price", 0) // 收入
+                .lt(Objects.equals(type, TYPE_EXPENSE), "price", 0) // 支出
+                .eq("wallet_id", walletId)
+                .between("create_time", createTime[0], createTime[1]));
+        // 获得 sum 结果
+        Map<String, Object> first = CollUtil.getFirst(result);
+        return MapUtil.getInt(first, "priceSum", 0);
+    }
+
     default PayWalletTransactionDO selectByNo(String no) {
         return selectOne(PayWalletTransactionDO::getNo, no);
     }

+ 2 - 1
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/redis/no/PayNoRedisDAO.java

@@ -1,6 +1,7 @@
 package com.citu.module.pay.dal.redis.no;
 
-import cn.hutool.core.date.DatePattern;import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
 import com.citu.module.pay.dal.redis.RedisKeyConstants;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Repository;

+ 2 - 2
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/framework/pay/config/PayProperties.java

@@ -20,7 +20,7 @@ public class PayProperties {
      *
      * 实际上,对应的 PayNotifyController 的 notifyOrder 方法的 URL
      *
-     * 回调顺序:支付渠道(支付宝支付、微信支付) => citu-module-pay 的 orderNotifyUrl 地址 => 业务的 PayAppDO.orderNotifyUrl 地址
+     * 回调顺序:支付渠道(支付宝支付、微信支付) => yudao-module-pay 的 orderNotifyUrl 地址 => 业务的 PayAppDO.orderNotifyUrl 地址
      */
     @NotEmpty(message = "支付回调地址不能为空")
     @URL(message = "支付回调地址的格式必须是 URL")
@@ -31,7 +31,7 @@ public class PayProperties {
      *
      * 实际上,对应的 PayNotifyController 的 notifyRefund 方法的 URL
      *
-     * 回调顺序:支付渠道(支付宝支付、微信支付) => citu-module-pay 的 refundNotifyUrl 地址 => 业务的 PayAppDO.notifyRefundUrl 地址
+     * 回调顺序:支付渠道(支付宝支付、微信支付) => yudao-module-pay 的 refundNotifyUrl 地址 => 业务的 PayAppDO.notifyRefundUrl 地址
      */
     @NotEmpty(message = "支付回调地址不能为空")
     @URL(message = "支付回调地址的格式必须是 URL")

+ 7 - 1
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/framework/pay/core/WalletPayClient.java

@@ -14,11 +14,12 @@ import com.citu.framework.pay.core.client.impl.AbstractPayClient;
 import com.citu.framework.pay.core.client.impl.NonePayClientConfig;
 import com.citu.framework.pay.core.enums.channel.PayChannelEnum;
 import com.citu.framework.pay.core.enums.refund.PayRefundStatusRespEnum;
+import com.citu.framework.pay.core.enums.transfer.PayTransferTypeEnum;
 import com.citu.module.pay.dal.dataobject.order.PayOrderExtensionDO;
 import com.citu.module.pay.dal.dataobject.refund.PayRefundDO;
 import com.citu.module.pay.dal.dataobject.wallet.PayWalletTransactionDO;
-import com.citu.module.pay.enums.wallet.PayWalletBizTypeEnum;
 import com.citu.module.pay.enums.order.PayOrderStatusEnum;
+import com.citu.module.pay.enums.wallet.PayWalletBizTypeEnum;
 import com.citu.module.pay.service.order.PayOrderService;
 import com.citu.module.pay.service.refund.PayRefundService;
 import com.citu.module.pay.service.wallet.PayWalletService;
@@ -181,4 +182,9 @@ public class WalletPayClient extends AbstractPayClient<NonePayClientConfig> {
         throw new UnsupportedOperationException("待实现");
     }
 
+    @Override
+    protected PayTransferRespDTO doGetTransfer(String outTradeNo, PayTransferTypeEnum type) {
+        throw new UnsupportedOperationException("待实现");
+    }
+
 }

+ 2 - 2
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/framework/rpc/config/RpcConfiguration.java

@@ -1,10 +1,10 @@
 package com.citu.module.pay.framework.rpc.config;
 
-import com.citu.module.member.api.user.MemberUserApi;
+import com.citu.module.system.api.social.SocialClientApi;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.Configuration;
 
 @Configuration(proxyBeanMethods = false)
-@EnableFeignClients(clients = MemberUserApi.class)
+@EnableFeignClients(clients = {SocialClientApi.class})
 public class RpcConfiguration {
 }

+ 4 - 2
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/framework/security/config/SecurityConfiguration.java

@@ -20,8 +20,10 @@ public class SecurityConfiguration {
             @Override
             public void customize(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry) {
                 // Swagger 接口文档
-                registry.antMatchers("/v3/api-docs/**").permitAll() // 元数据
-                        .antMatchers("/swagger-ui.html").permitAll(); // Swagger UI
+                registry.antMatchers("/v3/api-docs/**").permitAll()
+                        .antMatchers("/webjars/**").permitAll()
+                        .antMatchers("/swagger-ui").permitAll()
+                        .antMatchers("/swagger-ui/**").permitAll();
                 // Spring Boot Actuator 的安全配置
                 registry.antMatchers("/actuator").anonymous()
                         .antMatchers("/actuator/**").anonymous();

+ 2 - 2
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/job/order/PayOrderSyncJob.java

@@ -22,9 +22,9 @@ import java.time.LocalDateTime;
 public class PayOrderSyncJob {
 
     /**
-     * 同步创建时间在 N 分钟之的订单
+     * 同步创建时间在 N 分钟之的订单
      *
-     * 为什么同步 10 分钟之的订单?
+     * 为什么同步 10 分钟之的订单?
      *  因为一个订单发起支付,到支付成功,大多数在 10 分钟内,需要保证轮询到。
      *  如果设置为 30、60 或者更大时间范围,会导致轮询的订单太多,影响性能。当然,你也可以根据自己的业务情况来处理。
      */

+ 31 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/job/transfer/PayTransferSyncJob.java

@@ -0,0 +1,31 @@
+package com.citu.module.pay.job.transfer;
+
+import com.citu.framework.tenant.core.job.TenantJob;
+import com.citu.module.pay.service.transfer.PayTransferService;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * 转账订单的同步 Job
+ *
+ * 由于转账订单的转账结果,有些渠道是异步通知进行同步的,考虑到异步通知可能会失败(小概率),所以需要定时进行同步。
+ *
+ * @author jason
+ */
+@Component
+@Slf4j
+public class PayTransferSyncJob {
+
+    @Resource
+    private PayTransferService transferService;
+
+    @XxlJob("payTransferSyncJob")
+    @TenantJob // 多租户
+    public void execute(String param) {
+        int count = transferService.syncTransfer();
+        log.info("[execute][同步转账订单 ({}) 个]", count);
+    }
+}

+ 2 - 40
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/service/channel/PayChannelServiceImpl.java

@@ -14,9 +14,6 @@ import com.citu.module.pay.convert.channel.PayChannelConvert;
 import com.citu.module.pay.dal.dataobject.channel.PayChannelDO;
 import com.citu.module.pay.dal.mysql.channel.PayChannelMapper;
 import com.citu.module.pay.framework.pay.core.WalletPayClient;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
@@ -24,12 +21,10 @@ import org.springframework.validation.annotation.Validated;
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 import javax.validation.Validator;
-import java.time.Duration;
 import java.util.Collection;
 import java.util.List;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static com.citu.framework.common.util.cache.CacheUtils.buildAsyncReloadingCache;
 import static com.citu.module.pay.enums.ErrorCodeConstants.*;
 
 /**
@@ -42,25 +37,6 @@ import static com.citu.module.pay.enums.ErrorCodeConstants.*;
 @Validated
 public class PayChannelServiceImpl implements PayChannelService {
 
-    /**
-     * {@link PayClient} 缓存,通过它异步清空 smsClientFactory
-     */
-    @Getter
-    private final LoadingCache<Long, PayClient> clientCache = buildAsyncReloadingCache(Duration.ofSeconds(10L),
-            new CacheLoader<Long, PayClient>() {
-
-                @Override
-                public PayClient load(Long id) {
-                    // 查询,然后尝试清空
-                    PayChannelDO channel = payChannelMapper.selectById(id);
-                    if (channel != null) {
-                        payClientFactory.createOrUpdatePayClient(channel.getId(), channel.getCode(), channel.getConfig());
-                    }
-                    return payClientFactory.getPayClient(id);
-                }
-
-            });
-
     @Resource
     private PayClientFactory payClientFactory;
 
@@ -102,9 +78,6 @@ public class PayChannelServiceImpl implements PayChannelService {
         PayChannelDO channel = PayChannelConvert.INSTANCE.convert(updateReqVO)
                 .setConfig(parseConfig(dbChannel.getCode(), updateReqVO.getConfig()));
         payChannelMapper.updateById(channel);
-
-        // 清空缓存
-        clearCache(channel.getId());
     }
 
     /**
@@ -135,18 +108,6 @@ public class PayChannelServiceImpl implements PayChannelService {
 
         // 删除
         payChannelMapper.deleteById(id);
-
-        // 清空缓存
-        clearCache(id);
-    }
-
-    /**
-     * 删除缓存
-     *
-     * @param id 渠道编号
-     */
-    private void clearCache(Long id) {
-        clientCache.invalidate(id);
     }
 
     private PayChannelDO validateChannelExists(Long id) {
@@ -202,7 +163,8 @@ public class PayChannelServiceImpl implements PayChannelService {
 
     @Override
     public PayClient getPayClient(Long id) {
-        return clientCache.getUnchecked(id);
+        PayChannelDO channel = validPayChannel(id);
+        return payClientFactory.createOrUpdatePayClient(id, channel.getCode(), channel.getConfig());
     }
 
 }

+ 1 - 1
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/service/demo/PayDemoOrderService.java

@@ -2,7 +2,7 @@ package com.citu.module.pay.service.demo;
 
 import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
-import com.citu.module.pay.controller.admin.demo.vo.PayDemoOrderCreateReqVO;
+import com.citu.module.pay.controller.admin.demo.vo.order.PayDemoOrderCreateReqVO;
 import com.citu.module.pay.dal.dataobject.demo.PayDemoOrderDO;
 
 import javax.validation.Valid;

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov