Browse Source

Merge branch 'dev/2024/0822/update-app-Y' of feifan/mall-backend-app into master

修改充值消费分倍率计算规则
Yangzw 6 months ago
parent
commit
17ae0a531b
100 changed files with 2869 additions and 222 deletions
  1. 3 1
      feifan-framework/feifan-spring-boot-starter-biz-pay/src/main/java/cn/newfeifan/mall/framework/pay/core/client/impl/PayClientFactoryImpl.java
  2. 1 1
      feifan-framework/feifan-spring-boot-starter-biz-pay/src/main/java/cn/newfeifan/mall/framework/pay/core/enums/channel/PayChannelEnum.java
  3. 3 1
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/constant/DistriConstants.java
  4. 2 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/CaclEnum.java
  5. 31 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ConsumptionEnum.java
  6. 5 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ErrorCodeConstants.java
  7. 6 0
      feifan-module-distri/feifan-module-distri-biz/pom.xml
  8. 47 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/config/OrderProperties.java
  9. 1 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/config/orderPercentageConfig.java
  10. 0 68
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentageRespVO.java
  11. 9 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawal/vo/AppApplicationForWithdrawalPageReqVO.java
  12. 11 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawal/vo/AppApplicationForWithdrawalRespVO.java
  13. 9 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawal/vo/AppApplicationForWithdrawalSaveReqVO.java
  14. 6 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawalchannel/vo/AppApplicationForWithdrawalChannelPageReqVO.java
  15. 7 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawalchannel/vo/AppApplicationForWithdrawalChannelRespVO.java
  16. 6 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawalchannel/vo/AppApplicationForWithdrawalChannelSaveReqVO.java
  17. 34 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptionchangelog/ConsumptionChangeLogController.java
  18. 39 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptionchangelog/vo/ConsumptionChangeLogPageReqVO.java
  19. 50 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptionchangelog/vo/ConsumptionChangeLogRespVO.java
  20. 40 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptionchangelog/vo/ConsumptionChangeLogSaveReqVO.java
  21. 43 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontopuplog/ConsumptionTopUpLogController.java
  22. 36 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontopuplog/vo/ConsumptionTopUpLogPageReqVO.java
  23. 41 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontopuplog/vo/ConsumptionTopUpLogRespVO.java
  24. 31 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontopuplog/vo/ConsumptionTopUpLogSaveReqVO.java
  25. 42 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontransferlog/ConsumptionTransferLogController.java
  26. 45 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontransferlog/vo/ConsumptionTransferLogPageReqVO.java
  27. 53 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontransferlog/vo/ConsumptionTransferLogRespVO.java
  28. 45 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontransferlog/vo/ConsumptionTransferLogSaveReqVO.java
  29. 28 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/integral/IntegralController.java
  30. 4 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/integral/vo/IntegralPageReqVO.java
  31. 5 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/integral/vo/IntegralRespVO.java
  32. 4 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/integral/vo/IntegralSaveReqVO.java
  33. 33 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/OrderPercentageController.java
  34. 7 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/vo/OrderPercentageDoubleSaveReqVO.java
  35. 14 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/vo/OrderPercentagePageReqVO.java
  36. 1 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/vo/OrderPercentageRedisVO.java
  37. 30 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/vo/OrderPercentageRespVO.java
  38. 11 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/vo/OrderPercentageSaveReqVO.java
  39. 6 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/ptdailywithdrawal/vo/AppPtDailyWithdrawalPageReqVO.java
  40. 7 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/ptdailywithdrawal/vo/AppPtDailyWithdrawalRespVO.java
  41. 7 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/ptdailywithdrawal/vo/AppPtDailyWithdrawalSaveReqVO.java
  42. 44 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/usertopupconsumptionpointsorder/AppUserTopUpConsumptionPointsOrderController.java
  43. 12 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/usertopupconsumptionpointsorder/vo/UserTopUpConsumptionPointsOrderInfoRespVO.java
  44. 72 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/usertopupconsumptionpointsorder/vo/UserTopUpConsumptionPointsOrderPageReqVO.java
  45. 86 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/usertopupconsumptionpointsorder/vo/UserTopUpConsumptionPointsOrderRespVO.java
  46. 68 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/usertopupconsumptionpointsorder/vo/UserTopUpConsumptionPointsOrderSaveReqVO.java
  47. 35 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/convert/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderConvert.java
  48. 13 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/applicationforwithdrawal/ApplicationForWithdrawalDO.java
  49. 9 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/applicationforwithdrawalchannel/ApplicationForWithdrawalChannelDO.java
  50. 62 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/consumptionchangelog/ConsumptionChangeLogDO.java
  51. 48 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/consumptiontopuplog/ConsumptionTopUpLogDO.java
  52. 60 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/consumptiontransferlog/ConsumptionTransferLogDO.java
  53. 5 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/integral/IntegralDO.java
  54. 31 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/orderpercentage/OrderPercentageDO.java
  55. 9 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptdailywithdrawal/PtDailyWithdrawalDO.java
  56. 93 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderDO.java
  57. 28 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/consumptionchangelog/ConsumptionChangeLogMapper.java
  58. 29 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/consumptiontopuplog/ConsumptionTopUpLogMapper.java
  59. 29 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/consumptiontransferlog/ConsumptionTransferLogMapper.java
  60. 1 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/integral/IntegralMapper.java
  61. 1 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/orderpercentage/OrderPercentageMapper.java
  62. 3 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofitlog/PtProfitLogMapper.java
  63. 40 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderMapper.java
  64. 24 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/redis/RedisKeyConstants.java
  65. 44 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/redis/no/OrderNoRedisDAO.java
  66. 24 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/consumer/topupconsumptionpoints/TopUpConsumptionPointsConsumer.java
  67. 38 4
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/applicationforwithdrawal/ApplicationForWithdrawalServiceImpl.java
  68. 56 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptionchangelog/ConsumptionChangeLogService.java
  69. 92 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptionchangelog/ConsumptionChangeLogServiceImpl.java
  70. 55 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptiontopuplog/ConsumptionTopUpLogService.java
  71. 72 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptiontopuplog/ConsumptionTopUpLogServiceImpl.java
  72. 55 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptiontransferlog/ConsumptionTransferLogService.java
  73. 153 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptiontransferlog/ConsumptionTransferLogServiceImpl.java
  74. 1 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserServiceImpl.java
  75. 14 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralService.java
  76. 71 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralServiceImpl.java
  77. 2 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/orderpercentage/OrderPercentageService.java
  78. 5 5
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/orderpercentage/OrderPercentageServiceImpl.java
  79. 1 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/usersigninlog/UserSignInLogServiceImpl.java
  80. 60 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderService.java
  81. 209 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderServiceImpl.java
  82. 12 0
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/consumptionchangelog/ConsumptionChangeLogMapper.xml
  83. 12 0
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/consumptiontopuplog/ConsumptionTopUpLogMapper.xml
  84. 12 0
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/consumptiontransferlog/ConsumptionTransferLogMapper.xml
  85. 12 0
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderMapper.xml
  86. 1 0
      feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/ErrorCodeConstants.java
  87. 9 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/aftersale/vo/AppAfterSaleRespVO.java
  88. 40 19
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/AppTradeOrderController.java
  89. 3 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java
  90. 3 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/AppTradeOrderDetailRespVO.java
  91. 3 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/AppTradeOrderSettlementRespVO.java
  92. 3 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/item/AppTradeOrderItemRespVO.java
  93. 13 20
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/aftersale/AfterSaleDO.java
  94. 9 30
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderDO.java
  95. 9 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderItemDO.java
  96. 22 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/mq/consumer/order/OrderConsumer.java
  97. 3 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/aftersale/AfterSaleServiceImpl.java
  98. 10 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateService.java
  99. 131 31
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java
  100. 5 18
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/price/bo/TradePriceCalculateRespBO.java

+ 3 - 1
feifan-framework/feifan-spring-boot-starter-biz-pay/src/main/java/cn/newfeifan/mall/framework/pay/core/client/impl/PayClientFactoryImpl.java

@@ -27,7 +27,6 @@ public class PayClientFactoryImpl implements PayClientFactory {
 
     /**
      * 支付客户端 Map
-     *
      * key:渠道编号
      */
     private final ConcurrentMap<Long, AbstractPayClient<?>> clients = new ConcurrentHashMap<>();
@@ -55,6 +54,9 @@ public class PayClientFactoryImpl implements PayClientFactory {
 
         //富友支付
         clientClass.put(JSAPI, WxPubPayClient.class);
+
+        // 短信验证码支付
+        clientClass.put(ZERO_PURCHASE, MockPayClient.class);
     }
 
     @Override

+ 1 - 1
feifan-framework/feifan-spring-boot-starter-biz-pay/src/main/java/cn/newfeifan/mall/framework/pay/core/enums/channel/PayChannelEnum.java

@@ -31,12 +31,12 @@ public enum PayChannelEnum {
     MOCK("mock", "模拟支付", NonePayClientConfig.class),
 
     WALLET("wallet", "钱包支付", NonePayClientConfig.class),
+    ZERO_PURCHASE("zero_purchase", "零元购", NonePayClientConfig.class),
 
     JSAPI("JSAPI","富友微信公众号支付", NonePayClientConfig.class);
 
     /**
      * 编码
-     *
      * 参考 <a href="https://www.pingxx.com/api/支付渠道属性值.html">支付渠道属性值</a>
      */
     private final String code;

+ 3 - 1
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/constant/DistriConstants.java

@@ -8,13 +8,15 @@ public class DistriConstants {
 
     public static final Integer INTEGRAL_PAGE2DB = PERCENT*100;//积分数据库中的值,比页面显示的值,大了此倍数
 
+    public static final Integer ONE_HUNDRED = 100;
+
     // 数据库中,积分比金钱大的倍数,即钱转成积分要乘于此参数
     public static final Integer MONEY2INTEGRAL = PERCENT;
 
     // MONEY2INTEGRAL的BigDecimal版本
     public static final BigDecimal MONEY2INTEGRAL_BIG_DECIMAL = new BigDecimal(Integer.parseInt(MONEY2INTEGRAL.toString()));
 
-    public static final Double ONE_HUNDRED = 1d;
+    public static final Double ONE = 1d;
     public static final Long PT_ID = 1L;
 
     public static final Boolean IS_EFFECTIVE  = true;

+ 2 - 0
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/CaclEnum.java

@@ -32,6 +32,8 @@ public enum CaclEnum {
     MANUAL_RETURN_INTEGRAL(25, "人工返回最早七天未获得的超出额度的合赢奖","人工返回最早七天未获得的合赢奖,超额的"),
     WITHDRAWAL(26, "用户提现","用户将可用积分提现到账户"),
     WITHDRAWAL_ERROR(27, "提现失败退回","提现失败退回积分到用户"),
+    ORDER_SETTLEMENT(28,"订单结算利润","店铺订单结算,每笔订单结算出来的利润(成本价 - 结算价)"),
+    COMMISSION_TRANSITION(29,"佣金转化为消费分","佣金转化为消费分 1:1"),
     ;
 
     /**

+ 31 - 0
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ConsumptionEnum.java

@@ -0,0 +1,31 @@
+package cn.newfeifan.mall.module.distri.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum ConsumptionEnum {
+
+    PT_TOP_TUP(1,"平台充值"),
+    COMMISSION_TRANSITION(2,"佣金转化为消费分"),
+    CONSUMPTION_TRANSFER(3,"消费分转出"),
+    CONSUMPTION_RECIPIENT(4,"消费分转入"),
+    COMMISSION_WITHDRAWAL(5,"佣金提现"),
+    PAY_ORDER(6,"购物支付"),
+    REFUND_ORDER(7,"退回退款返回"),
+    TOP_UP_GET(8,"充值获得"),
+    ;
+
+    private final Integer type;
+    private final String name;
+
+    public static String getName(Integer type){
+        for (ConsumptionEnum value : ConsumptionEnum.values()) {
+            if(value.getType().equals(type)){
+                return value.getName();
+            }
+        }
+        return null;
+    }
+}

+ 5 - 0
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ErrorCodeConstants.java

@@ -35,5 +35,10 @@ public interface ErrorCodeConstants {
     ErrorCode APPLICATION_FOR_WITHDRAWAL_NOT_EXISTS = new ErrorCode(1_005_031_004, "提现申请记录不存在");
     ErrorCode PT_DAILY_WITHDRAWAL_NOT_EXISTS = new ErrorCode(1_005_031_005, "平台每日提现记录不存在");
     ErrorCode APPLICATION_FOR_WITHDRAWAL_CHANNEL_NOT_EXISTS = new ErrorCode(1_005_031_005, "提现渠道记录不存在");
+    ErrorCode CONSUMPTION_TOP_UP_LOG_NOT_EXISTS = new ErrorCode(1_002_030_035, "充值消费分记录不存在");
+    ErrorCode CONSUMPTION_CHANGE_LOG_NOT_EXISTS = new ErrorCode(1_002_030_036, "消费分变动记录不存在");
+    ErrorCode CONSUMPTION_TRANSFER_LOG_NOT_EXISTS = new ErrorCode(1_002_030_037, "消费分转让记录不存在");
+    ErrorCode USER_TOP_UP_CONSUMPTION_POINTS_ORDER_NOT_EXISTS = new ErrorCode(1_002_030_038, "用户充值消费分订单不存在");
+
 
 }

+ 6 - 0
feifan-module-distri/feifan-module-distri-biz/pom.xml

@@ -119,5 +119,11 @@
             <version>2.0.0-jdk8-snapshot</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>cn.newfeifan.zx</groupId>
+            <artifactId>feifan-module-pay-biz</artifactId>
+            <version>2.0.0-jdk8-snapshot</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 </project>

+ 47 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/config/OrderProperties.java

@@ -0,0 +1,47 @@
+package cn.newfeifan.mall.module.distri.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.validation.annotation.Validated;
+
+import javax.validation.constraints.NotNull;
+import java.time.Duration;
+
+/**
+ * 交易订单的配置项
+ *
+ * @author LeeYan9
+ * @since 2022-09-15
+ */
+@ConfigurationProperties(prefix = "feifan.trade.order")
+@Configuration
+@Data
+@Validated
+public class OrderProperties {
+
+    /**
+     * 应用编号
+     */
+    @NotNull(message = "应用编号不能为空")
+    private Long appId;
+
+    /**
+     * 支付超时时间
+     */
+    @NotNull(message = "支付超时时间不能为空")
+    private Duration payExpireTime;
+
+    /**
+     * 收货超时时间
+     */
+    @NotNull(message = "收货超时时间不能为空")
+    private Duration receiveExpireTime;
+
+    /**
+     * 评论超时时间
+     */
+    @NotNull(message = "评论超时时间不能为空")
+    private Duration commentExpireTime;
+
+}

+ 1 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/config/orderPercentageConfig.java

@@ -1,7 +1,7 @@
 package cn.newfeifan.mall.module.distri.config;
 
 import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
-import cn.newfeifan.mall.module.distri.controller.admin.orderpercentage.vo.OrderPercentageRedisVO;
+import cn.newfeifan.mall.module.distri.controller.app.orderpercentage.vo.OrderPercentageRedisVO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.orderpercentage.OrderPercentageDO;
 import cn.newfeifan.mall.module.distri.service.orderpercentage.OrderPercentageService;
 import lombok.extern.slf4j.Slf4j;

+ 0 - 68
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentageRespVO.java

@@ -1,68 +0,0 @@
-package cn.newfeifan.mall.module.distri.controller.admin.orderpercentage.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import java.time.LocalDateTime;
-import com.alibaba.excel.annotation.*;
-
-@Schema(description = "管理后台 - 积分相关计算浮动百分比设置 Response VO")
-@Data
-@ExcelIgnoreUnannotated
-public class OrderPercentageRespVO {
-
-    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2203")
-    @ExcelProperty("用户编号")
-    private Long id;
-
-    @Schema(description = "毛利 = 成本 * 0.38... (推广费用)")
-    @ExcelProperty("毛利 = 成本 * 0.38... (推广费用)")
-    private Integer grossProfitPerc;
-
-    @Schema(description = "推广-用户额度 百分比")
-    @ExcelProperty("推广-用户额度 百分比")
-    private Integer grossProfitUserQuotaPerc;
-
-    @Schema(description = "推广-推荐人额度 百分比")
-    @ExcelProperty("推广-推荐人额度 百分比")
-    private Integer grossProfitAncestorQuotaPerc;
-
-    @Schema(description = "推广-合赢奖额度(浮动) 百分比")
-    @ExcelProperty("推广-合赢奖额度(浮动) 百分比")
-    private Integer grossProfitBonusQuotaPerc;
-
-    @Schema(description = "推广-平台分成额度(浮动) 百分比")
-    @ExcelProperty("推广-平台分成额度(浮动) 百分比")
-    private Integer grossProfitPlatformQuotaPerc;
-
-    @Schema(description = "分成百分比")
-    @ExcelProperty("分成百分比")
-    private Integer divideIntoPerc;
-
-    @Schema(description = "购物订单:直推人身价提升", example = "1")
-    @ExcelProperty("购物订单:直推人身价提升")
-    private String orderAncestorSocialStatus;
-
-    @Schema(description = "购物订单:本人身价提升", example = "2")
-    @ExcelProperty("购物订单:本人身价提升")
-    private String orderUserSocialStatus;
-
-    @Schema(description = "新用户注册:直推人身价提升", example = "2")
-    @ExcelProperty("新用户注册:直推人身价提升")
-    private String registerAncestorSocialStatus;
-
-    @Schema(description = "新用户注册:本人身价提升", example = "2")
-    @ExcelProperty("新用户注册:本人身价提升")
-    private String registerSocialStatus;
-
-    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
-    @ExcelProperty("创建时间")
-    private LocalDateTime createTime;
-    @Schema(description = "是否启用 0关闭 1启动", example = "2")
-    private Integer status;
-
-    @Schema(description = "用户注册后,获得的基础最大合赢奖、直推奖积分限额")
-    private String baseMaxQuota;
-
-    @Schema(description = "收藏商品获取身价值,同一SPU商品收藏多次无效", example = "1")
-    private String collectSocialStatus;
-}

+ 9 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawal/vo/AppApplicationForWithdrawalPageReqVO.java

@@ -36,4 +36,13 @@ public class AppApplicationForWithdrawalPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+    @Schema(description = "提现总金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Long amountTotal;
+
+    @Schema(description = "提现消费分,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Long withdrawConsumption;
+
+    @Schema(description = "计算百分比模板")
+    private String percentTemplate;
+
 }

+ 11 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawal/vo/AppApplicationForWithdrawalRespVO.java

@@ -42,4 +42,15 @@ public class AppApplicationForWithdrawalRespVO {
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
+    @Schema(description = "提现总金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("提现总金额,单位:分")
+    private Long amountTotal;
+
+    @Schema(description = "提现消费分,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("提现消费分,单位:分")
+    private Long withdrawConsumption;
+
+    @Schema(description = "计算百分比模板")
+    @ExcelProperty("计算百分比模板")
+    private String percentTemplate;
 }

+ 9 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawal/vo/AppApplicationForWithdrawalSaveReqVO.java

@@ -19,7 +19,6 @@ public class AppApplicationForWithdrawalSaveReqVO {
     private Integer withdrawalType;
 
     @Schema(description = "提现金额,单位:元", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotNull(message = "提现金额,单位:元不能为空")
     private Long amount;
 
     @Schema(description = "支付宝账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "30303")
@@ -31,4 +30,13 @@ public class AppApplicationForWithdrawalSaveReqVO {
     @Schema(description = "提现渠道记录id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19322")
     private Long applicationForWithdrawalChannelId;
 
+    @Schema(description = "提现总金额,单位:分")
+    @NotNull(message = "提现金额,不能为空")
+    private Long amountTotal;
+
+    @Schema(description = "提现消费分,单位:分")
+    private Long withdrawConsumption;
+
+    @Schema(description = "计算百分比模板")
+    private String percentTemplate;
 }

+ 6 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawalchannel/vo/AppApplicationForWithdrawalChannelPageReqVO.java

@@ -39,4 +39,10 @@ public class AppApplicationForWithdrawalChannelPageReqVO extends PageParam {
     @Schema(description = "导出状态,已导出是1,未导出为0", example = "2")
     private Boolean excelStatus;
 
+    @Schema(description = "提现总金额,单位:分")
+    private Long amountTotal;
+
+    @Schema(description = "提现消费分,单位:分")
+    private Long withdrawConsumption;
+
 }

+ 7 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawalchannel/vo/AppApplicationForWithdrawalChannelRespVO.java

@@ -46,4 +46,11 @@ public class AppApplicationForWithdrawalChannelRespVO {
     @ExcelProperty("导出状态,已导出是1,未导出为0")
     private Boolean excelStatus;
 
+    @Schema(description = "提现总金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("提现总金额,单位:分")
+    private Long amountTotal;
+
+    @Schema(description = "提现消费分,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("提现消费分,单位:分")
+    private Long withdrawConsumption;
 }

+ 6 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawalchannel/vo/AppApplicationForWithdrawalChannelSaveReqVO.java

@@ -20,7 +20,6 @@ public class AppApplicationForWithdrawalChannelSaveReqVO {
     private String withdrawalName;
 
     @Schema(description = "提现金额,单位:元", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotNull(message = "提现金额,单位:元不能为空")
     private Long amount;
 
     @Schema(description = "提现笔数", requiredMode = Schema.RequiredMode.REQUIRED, example = "6693")
@@ -38,4 +37,10 @@ public class AppApplicationForWithdrawalChannelSaveReqVO {
     @NotNull(message = "导出状态,已导出是1,未导出为0不能为空")
     private Boolean excelStatus;
 
+    @Schema(description = "提现总金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "提现总金额,单位:分不能为空")
+    private Long amountTotal;
+
+    @Schema(description = "提现消费分,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Long withdrawConsumption;
 }

+ 34 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptionchangelog/ConsumptionChangeLogController.java

@@ -0,0 +1,34 @@
+package cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog;
+
+import cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog.vo.ConsumptionChangeLogPageReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog.vo.ConsumptionChangeLogRespVO;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.*;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.pojo.CommonResult;
+import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
+
+import cn.newfeifan.mall.module.distri.service.consumptionchangelog.ConsumptionChangeLogService;
+
+@Tag(name = "管理后台 - 平台消费分变动记录")
+@RestController
+@RequestMapping("/distri/consumption-change-log")
+@Validated
+public class ConsumptionChangeLogController {
+
+    @Resource
+    private ConsumptionChangeLogService consumptionChangeLogService;
+
+    @GetMapping("/page")
+    @Operation(summary = "获得消费分变动记录分页")
+    public CommonResult<PageResult<ConsumptionChangeLogRespVO>> getConsumptionChangeLogPage(@Valid ConsumptionChangeLogPageReqVO pageReqVO) {
+        PageResult<ConsumptionChangeLogRespVO> pageResult = consumptionChangeLogService.getConsumptionChangeLogPage(pageReqVO);
+        return success(pageResult);
+    }
+
+}

+ 39 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptionchangelog/vo/ConsumptionChangeLogPageReqVO.java

@@ -0,0 +1,39 @@
+package cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog.vo;
+
+import lombok.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.newfeifan.mall.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 ConsumptionChangeLogPageReqVO extends PageParam {
+
+    @Schema(description = "用户ID", example = "10871")
+    private Long userId;
+
+    @Schema(description = "变动的消费分")
+    private Long consumptionPoints;
+
+    @Schema(description = "变动后消费分")
+    private Long afterConsumptionPoints;
+
+    @Schema(description = "消费分变动类型", example = "2")
+    private Integer consumptionStatus;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "实际消费分")
+    private Long practicalConsumptionPoints;
+
+    @Schema(description = "消费分产生对象", example = "23323")
+    private Long generateUserId;
+
+}

+ 50 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptionchangelog/vo/ConsumptionChangeLogRespVO.java

@@ -0,0 +1,50 @@
+package cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 平台消费分变动记录 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ConsumptionChangeLogRespVO {
+
+    @Schema(description = "日志编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7160")
+    @ExcelProperty("日志编号")
+    private Long id;
+
+    @Schema(description = "用户ID", example = "10871")
+    @ExcelProperty("用户ID")
+    private Long userId;
+
+    @Schema(description = "变动的消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("变动的消费分")
+    private Long consumptionPoints;
+
+    @Schema(description = "变动后消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("变动后消费分")
+    private Long afterConsumptionPoints;
+
+    @Schema(description = "消费分变动类型", example = "2")
+    @ExcelProperty("消费分变动类型")
+    private Integer consumptionStatus;
+
+    @Schema(description = "类型名称")
+    private String consumptionStatusName;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "实际消费分")
+    @ExcelProperty("实际消费分")
+    private Long practicalConsumptionPoints;
+
+    @Schema(description = "消费分产生对象", example = "23323")
+    private Long generateUserId;
+
+    private String generateUserName;
+
+
+}

+ 40 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptionchangelog/vo/ConsumptionChangeLogSaveReqVO.java

@@ -0,0 +1,40 @@
+package cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 平台消费分变动记录新增/修改 Request VO")
+@Data
+@Builder
+public class ConsumptionChangeLogSaveReqVO {
+
+    @Schema(description = "日志编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7160")
+    private Long id;
+
+    @Schema(description = "用户ID", example = "10871")
+    private Long userId;
+
+    @Schema(description = "变动的消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "变动的消费分不能为空")
+    private Long consumptionPoints;
+
+    @Schema(description = "变动后消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "变动后消费分不能为空")
+    private Long afterConsumptionPoints;
+
+    @Schema(description = "消费分变动类型", example = "2")
+    private Integer consumptionStatus;
+
+    @Schema(description = "实际消费分")
+    private Long practicalConsumptionPoints;
+
+    @Schema(description = "消费分产生对象", example = "23323")
+    private Long generateUserId;
+
+    @Schema(description = "订单Id", example = "18715")
+    private Long orderId;
+
+    @Schema(description = "订单编号")
+    private String orderNo;
+}

+ 43 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontopuplog/ConsumptionTopUpLogController.java

@@ -0,0 +1,43 @@
+package cn.newfeifan.mall.module.distri.controller.app.consumptiontopuplog;
+
+import cn.newfeifan.mall.module.distri.controller.app.consumptiontopuplog.vo.ConsumptionTopUpLogPageReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.consumptiontopuplog.vo.ConsumptionTopUpLogRespVO;
+import cn.newfeifan.mall.module.distri.controller.app.consumptiontopuplog.vo.ConsumptionTopUpLogSaveReqVO;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.*;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.pojo.CommonResult;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
+
+import cn.newfeifan.mall.module.distri.dal.dataobject.consumptiontopuplog.ConsumptionTopUpLogDO;
+import cn.newfeifan.mall.module.distri.service.consumptiontopuplog.ConsumptionTopUpLogService;
+
+@Tag(name = "管理后台 - 平台消费分充值记录")
+@RestController
+@RequestMapping("/distri/consumption-top-up-log")
+@Validated
+public class ConsumptionTopUpLogController {
+
+    @Resource
+    private ConsumptionTopUpLogService consumptionTopUpLogService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建平台消费分充值记录")
+    public CommonResult<Long> createConsumptionTopUpLog(@Valid @RequestBody ConsumptionTopUpLogSaveReqVO createReqVO) {
+        return success(consumptionTopUpLogService.createConsumptionTopUpLog(createReqVO));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得平台消费分充值记录分页")
+    public CommonResult<PageResult<ConsumptionTopUpLogRespVO>> getConsumptionTopUpLogPage(@Valid ConsumptionTopUpLogPageReqVO pageReqVO) {
+        PageResult<ConsumptionTopUpLogDO> pageResult = consumptionTopUpLogService.getConsumptionTopUpLogPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, ConsumptionTopUpLogRespVO.class));
+    }
+
+}

+ 36 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontopuplog/vo/ConsumptionTopUpLogPageReqVO.java

@@ -0,0 +1,36 @@
+package cn.newfeifan.mall.module.distri.controller.app.consumptiontopuplog.vo;
+
+import lombok.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.newfeifan.mall.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 ConsumptionTopUpLogPageReqVO extends PageParam {
+
+    @Schema(description = "用户ID", example = "22163")
+    private Long userId;
+
+    @Schema(description = "转账凭证附件")
+    private String attachment;
+
+    @Schema(description = "消费分")
+    private Long consumptionPoints;
+
+    @Schema(description = "实际消费分")
+    private Long practicalConsumptionPoints;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "用户名", example = "赵六")
+    private String userName;
+
+}

+ 41 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontopuplog/vo/ConsumptionTopUpLogRespVO.java

@@ -0,0 +1,41 @@
+package cn.newfeifan.mall.module.distri.controller.app.consumptiontopuplog.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 平台消费分充值记录 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ConsumptionTopUpLogRespVO {
+
+    @Schema(description = "充值编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "5725")
+    @ExcelProperty("充值编号")
+    private Long id;
+
+    @Schema(description = "用户ID", example = "22163")
+    @ExcelProperty("用户ID")
+    private Long userId;
+
+    @Schema(description = "转账凭证附件")
+    @ExcelProperty("转账凭证附件")
+    private String attachment;
+
+    @Schema(description = "消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("消费分")
+    private Long consumptionPoints;
+
+    @Schema(description = "实际消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("实际消费分")
+    private Long practicalConsumptionPoints;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "用户名", example = "赵六")
+    @ExcelProperty("用户名")
+    private String userName;
+
+}

+ 31 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontopuplog/vo/ConsumptionTopUpLogSaveReqVO.java

@@ -0,0 +1,31 @@
+package cn.newfeifan.mall.module.distri.controller.app.consumptiontopuplog.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 平台消费分充值记录新增/修改 Request VO")
+@Data
+public class ConsumptionTopUpLogSaveReqVO {
+
+    @Schema(description = "充值编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "5725")
+    private Long id;
+
+    @Schema(description = "用户ID", example = "22163")
+    private Long userId;
+
+    @Schema(description = "转账凭证附件")
+    private String attachment;
+
+    @Schema(description = "消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "消费分不能为空")
+    private Long consumptionPoints;
+
+    @Schema(description = "实际消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "实际消费分不能为空")
+    private Long practicalConsumptionPoints;
+
+    @Schema(description = "用户名", example = "赵六")
+    private String userName;
+
+}

+ 42 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontransferlog/ConsumptionTransferLogController.java

@@ -0,0 +1,42 @@
+package cn.newfeifan.mall.module.distri.controller.app.consumptiontransferlog;
+
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.*;
+
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.pojo.CommonResult;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
+
+import cn.newfeifan.mall.module.distri.controller.app.consumptiontransferlog.vo.*;
+import cn.newfeifan.mall.module.distri.dal.dataobject.consumptiontransferlog.ConsumptionTransferLogDO;
+import cn.newfeifan.mall.module.distri.service.consumptiontransferlog.ConsumptionTransferLogService;
+
+@Tag(name = "管理后台 - 消费分转让记录")
+@RestController
+@RequestMapping("/distri/consumption-transfer-log")
+@Validated
+public class ConsumptionTransferLogController {
+
+    @Resource
+    private ConsumptionTransferLogService consumptionTransferLogService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建消费分转让记录")
+    public CommonResult<Long> createConsumptionTransferLog(@Valid @RequestBody ConsumptionTransferLogSaveReqVO createReqVO) {
+        return success(consumptionTransferLogService.createConsumptionTransferLog(createReqVO));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得消费分转让记录分页")
+    public CommonResult<PageResult<ConsumptionTransferLogRespVO>> getConsumptionTransferLogPage(@Valid ConsumptionTransferLogPageReqVO pageReqVO) {
+        PageResult<ConsumptionTransferLogDO> pageResult = consumptionTransferLogService.getConsumptionTransferLogPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, ConsumptionTransferLogRespVO.class));
+    }
+
+}

+ 45 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontransferlog/vo/ConsumptionTransferLogPageReqVO.java

@@ -0,0 +1,45 @@
+package cn.newfeifan.mall.module.distri.controller.app.consumptiontransferlog.vo;
+
+import lombok.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.newfeifan.mall.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 ConsumptionTransferLogPageReqVO extends PageParam {
+
+    @Schema(description = "转让用户ID", example = "7655")
+    private Long transferUserId;
+
+    @Schema(description = "转让人用户名", example = "王五")
+    private String transferUserName;
+
+    @Schema(description = "接收用户ID", example = "26720")
+    private Long recipientUserId;
+
+    @Schema(description = "接收人用户名", example = "张三")
+    private String recipientUserName;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "转让的消费分")
+    private Long consumptionPoints;
+
+    @Schema(description = "变动后消费分(余额)")
+    private Long afterTransferConsumptionPoints;
+
+    @Schema(description = "接收的消费分")
+    private Long recipientPoints;
+
+    @Schema(description = "变动后消费分(余额)")
+    private Long afterRecipientConsumptionPoints;
+
+}

+ 53 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontransferlog/vo/ConsumptionTransferLogRespVO.java

@@ -0,0 +1,53 @@
+package cn.newfeifan.mall.module.distri.controller.app.consumptiontransferlog.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 消费分转让记录 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ConsumptionTransferLogRespVO {
+
+    @Schema(description = "日志编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "5320")
+    @ExcelProperty("日志编号")
+    private Long id;
+
+    @Schema(description = "转让用户ID", example = "7655")
+    @ExcelProperty("转让用户ID")
+    private Long transferUserId;
+
+    @Schema(description = "转让人用户名", example = "王五")
+    @ExcelProperty("转让人用户名")
+    private String transferUserName;
+
+    @Schema(description = "接收用户ID", example = "26720")
+    @ExcelProperty("接收用户ID")
+    private Long recipientUserId;
+
+    @Schema(description = "接收人用户名", example = "张三")
+    @ExcelProperty("接收人用户名")
+    private String recipientUserName;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "转让的消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("转让的消费分")
+    private Long consumptionPoints;
+
+    @Schema(description = "变动后消费分(余额)", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("变动后消费分(余额)")
+    private Long afterTransferConsumptionPoints;
+
+    @Schema(description = "接收的消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("接收的消费分")
+    private Long recipientPoints;
+
+    @Schema(description = "变动后消费分(余额)", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("变动后消费分(余额)")
+    private Long afterRecipientConsumptionPoints;
+
+}

+ 45 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontransferlog/vo/ConsumptionTransferLogSaveReqVO.java

@@ -0,0 +1,45 @@
+package cn.newfeifan.mall.module.distri.controller.app.consumptiontransferlog.vo;
+
+import cn.newfeifan.mall.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 消费分转让记录新增/修改 Request VO")
+@Data
+public class ConsumptionTransferLogSaveReqVO {
+
+    @Schema(description = "日志编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "5320")
+    private Long id;
+
+    @Schema(description = "转让用户ID", example = "7655")
+    private Long transferUserId;
+
+    @Schema(description = "转让人用户名", example = "王五")
+    private String transferUserName;
+
+    @Schema(description = "接收用户ID", example = "26720")
+    @NotNull(message = "接收用户编号不能为空")
+    private Long recipientUserId;
+
+    @Schema(description = "接收人用户名", example = "张三")
+    private String recipientUserName;
+
+    @Schema(description = "转让的消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "转让的消费分不能为空")
+    private Long consumptionPoints;
+
+    @Schema(description = "变动后消费分(余额)", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Long afterTransferConsumptionPoints;
+
+    @Schema(description = "接收的消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Long recipientPoints;
+
+    @Schema(description = "变动后消费分(余额)", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Long afterRecipientConsumptionPoints;
+
+    @Schema(description = "短信验证码 DTO")
+    private SmsCodeUseReqDTO smsCodeUseReqDTO;
+
+
+}

+ 28 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/integral/IntegralController.java

@@ -0,0 +1,28 @@
+package cn.newfeifan.mall.module.distri.controller.app.integral;
+
+import cn.newfeifan.mall.framework.common.pojo.CommonResult;
+import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
+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.*;
+
+import javax.annotation.Resource;
+import javax.validation.constraints.NotNull;
+import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 推荐用户积分")
+@RestController
+@RequestMapping("/distri/integral")
+@Validated
+public class IntegralController {
+
+    @Resource
+    private IntegralService integralService;
+
+    @PutMapping("/quotaTransition")
+    @Operation(summary = "佣金转化")
+    public CommonResult<Boolean> quotaTransition(@RequestParam(value = "quota") @NotNull(message = "输入的佣金不能为空") Long quota) {
+        return success(integralService.quotaTransition(quota));
+    }
+}

+ 4 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/integral/vo/IntegralPageReqVO.java → feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/integral/vo/IntegralPageReqVO.java

@@ -1,4 +1,4 @@
-package cn.newfeifan.mall.module.distri.controller.admin.integral.vo;
+package cn.newfeifan.mall.module.distri.controller.app.integral.vo;
 
 import lombok.*;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -32,4 +32,7 @@ public class IntegralPageReqVO extends PageParam {
 
     @Schema(description = "累计获取的峰值")
     private Long highQuotaTotal;
+
+    @Schema(description = "当前消费分")
+    private Long consumptionPoints;
 }

+ 5 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/integral/vo/IntegralRespVO.java → feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/integral/vo/IntegralRespVO.java

@@ -1,4 +1,4 @@
-package cn.newfeifan.mall.module.distri.controller.admin.integral.vo;
+package cn.newfeifan.mall.module.distri.controller.app.integral.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
@@ -37,4 +37,8 @@ public class IntegralRespVO {
     @Schema(description = "累计获取的峰值")
     @ExcelProperty("累计获取的峰值")
     private Long highQuotaTotal;
+
+    @Schema(description = "当前消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("当前消费分")
+    private Long consumptionPoints;
 }

+ 4 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/integral/vo/IntegralSaveReqVO.java → feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/integral/vo/IntegralSaveReqVO.java

@@ -1,4 +1,4 @@
-package cn.newfeifan.mall.module.distri.controller.admin.integral.vo;
+package cn.newfeifan.mall.module.distri.controller.app.integral.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
@@ -49,4 +49,7 @@ public class IntegralSaveReqVO {
 
     @Schema(description = "累计获取的峰值")
     private Long highQuotaTotal;
+
+    @Schema(description = "当前消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Long consumptionPoints;
 }

+ 33 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/OrderPercentageController.java

@@ -0,0 +1,33 @@
+package cn.newfeifan.mall.module.distri.controller.app.orderpercentage;
+
+import cn.newfeifan.mall.framework.common.pojo.CommonResult;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+import cn.newfeifan.mall.module.distri.controller.app.orderpercentage.vo.*;
+import cn.newfeifan.mall.module.distri.dal.dataobject.orderpercentage.OrderPercentageDO;
+import cn.newfeifan.mall.module.distri.service.orderpercentage.OrderPercentageService;
+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.*;
+
+import javax.annotation.Resource;
+
+import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 积分相关计算浮动百分比设置")
+@RestController
+@RequestMapping("/distri/order-percentage")
+@Validated
+public class OrderPercentageController {
+
+    @Resource
+    private OrderPercentageService orderPercentageService;
+
+    @GetMapping("/get")
+    @Operation(summary = "获得积分相关计算浮动百分比设置")
+    public CommonResult<OrderPercentageRespVO> getOrderPercentage() {
+        OrderPercentageDO orderPercentage = orderPercentageService.queryStatus();
+        return success(BeanUtils.toBean(orderPercentage, OrderPercentageRespVO.class));
+    }
+
+}

+ 7 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentageDoubleSaveReqVO.java → feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/vo/OrderPercentageDoubleSaveReqVO.java

@@ -1,4 +1,4 @@
-package cn.newfeifan.mall.module.distri.controller.admin.orderpercentage.vo;
+package cn.newfeifan.mall.module.distri.controller.app.orderpercentage.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
@@ -49,5 +49,11 @@ public class OrderPercentageDoubleSaveReqVO {
     @Schema(description = "收藏商品获取身价值,同一SPU商品收藏多次无效", example = "1")
     private String collectSocialStatus;
 
+    @Schema(description = "提现佣金百分比")
+    private String withdrawCommission;
+
+    @Schema(description = "提现消费分百分比")
+    private String withdrawConsumption;
+
 
 }

+ 14 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentagePageReqVO.java → feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/vo/OrderPercentagePageReqVO.java

@@ -1,4 +1,4 @@
-package cn.newfeifan.mall.module.distri.controller.admin.orderpercentage.vo;
+package cn.newfeifan.mall.module.distri.controller.app.orderpercentage.vo;
 
 import lombok.*;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -55,4 +55,17 @@ public class OrderPercentagePageReqVO extends PageParam {
 
     @Schema(description = "收藏商品获取身价值,同一SPU商品收藏多次无效", example = "1")
     private String collectSocialStatus;
+
+    @Schema(description = "提现消费分百分比")
+    private String withdrawConsumption;
+
+    @Schema(description = "提现佣金百分比")
+    private String withdrawCommission;
+
+    @Schema(description = "用户充值消费分的额度")
+    private String userTopUpConsumptionPoints;
+
+    @Schema(description = "触发倍率的最低金额")
+    private String triggerMagnificationPoints;
+
 }

+ 1 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentageRedisVO.java → feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/vo/OrderPercentageRedisVO.java

@@ -1,4 +1,4 @@
-package cn.newfeifan.mall.module.distri.controller.admin.orderpercentage.vo;
+package cn.newfeifan.mall.module.distri.controller.app.orderpercentage.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;

+ 30 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/vo/OrderPercentageRespVO.java

@@ -0,0 +1,30 @@
+package cn.newfeifan.mall.module.distri.controller.app.orderpercentage.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 积分相关计算浮动百分比设置 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class OrderPercentageRespVO {
+    @Schema(description = "充值消费分的倍率")
+    @ExcelProperty("充值消费分的倍率")
+    private String consumptionMagnification;
+
+    @Schema(description = "提现消费分百分比")
+    @ExcelProperty("提现消费分百分比")
+    private String withdrawConsumption;
+
+    @Schema(description = "提现佣金百分比")
+    @ExcelProperty("提现佣金百分比")
+    private String withdrawCommission;
+
+    @Schema(description = "用户充值消费分的额度")
+    @ExcelProperty("用户充值消费分的额度")
+    private String userTopUpConsumptionPoints;
+
+    @Schema(description = "触发倍率的最低金额")
+    @ExcelProperty("触发倍率的最低金额")
+    private String triggerMagnificationPoints;
+}

+ 11 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentageSaveReqVO.java → feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/vo/OrderPercentageSaveReqVO.java

@@ -1,4 +1,4 @@
-package cn.newfeifan.mall.module.distri.controller.admin.orderpercentage.vo;
+package cn.newfeifan.mall.module.distri.controller.app.orderpercentage.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
@@ -50,5 +50,15 @@ public class OrderPercentageSaveReqVO {
     @Schema(description = "收藏商品获取身价值,同一SPU商品收藏多次无效", example = "1")
     private String collectSocialStatus;
 
+    @Schema(description = "提现消费分百分比")
+    private String withdrawConsumption;
 
+    @Schema(description = "提现佣金百分比")
+    private String withdrawCommission;
+
+    @Schema(description = "用户充值消费分的额度")
+    private String userTopUpConsumptionPoints;
+
+    @Schema(description = "触发倍率的最低金额")
+    private String triggerMagnificationPoints;
 }

+ 6 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/ptdailywithdrawal/vo/AppPtDailyWithdrawalPageReqVO.java

@@ -35,4 +35,10 @@ public class AppPtDailyWithdrawalPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+    @Schema(description = "提现总金额,单位:分")
+    private Long amountTotal;
+
+    @Schema(description = "提现消费分,单位:分")
+    private Long withdrawConsumption;
+
 }

+ 7 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/ptdailywithdrawal/vo/AppPtDailyWithdrawalRespVO.java

@@ -38,4 +38,11 @@ public class AppPtDailyWithdrawalRespVO {
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
+    @Schema(description = "提现总金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("提现总金额,单位:分")
+    private Long amountTotal;
+
+    @Schema(description = "提现消费分,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("提现消费分,单位:分")
+    private Long withdrawConsumption;
 }

+ 7 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/ptdailywithdrawal/vo/AppPtDailyWithdrawalSaveReqVO.java

@@ -31,4 +31,11 @@ public class AppPtDailyWithdrawalSaveReqVO {
     @NotNull(message = "提现截止时间不能为空")
     private LocalDateTime endTime;
 
+    @Schema(description = "提现总金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "提现总金额,单位:分不能为空")
+    private Long amountTotal;
+
+    @Schema(description = "提现消费分,单位:分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "提现消费分,单位:分不能为空")
+    private Long withdrawConsumption;
 }

+ 44 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/usertopupconsumptionpointsorder/AppUserTopUpConsumptionPointsOrderController.java

@@ -0,0 +1,44 @@
+package cn.newfeifan.mall.module.distri.controller.app.usertopupconsumptionpointsorder;
+
+import cn.newfeifan.mall.framework.security.core.annotations.PreAuthenticated;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.*;
+
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.pojo.CommonResult;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
+
+import cn.newfeifan.mall.module.distri.controller.app.usertopupconsumptionpointsorder.vo.*;
+import cn.newfeifan.mall.module.distri.dal.dataobject.usertopupconsumptionpointsorder.UserTopUpConsumptionPointsOrderDO;
+import cn.newfeifan.mall.module.distri.service.usertopupconsumptionpointsorder.UserTopUpConsumptionPointsOrderService;
+
+@Tag(name = "用户 APP - 用户充值消费分订单")
+@RestController
+@RequestMapping("/distri/user-top-up-consumption-points-order")
+@Validated
+public class AppUserTopUpConsumptionPointsOrderController {
+
+    @Resource
+    private UserTopUpConsumptionPointsOrderService userTopUpConsumptionPointsOrderService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建用户充值消费分订单")
+    @PreAuthenticated
+    public CommonResult<UserTopUpConsumptionPointsOrderInfoRespVO> createUserTopUpConsumptionPointsOrder(@Valid @RequestBody UserTopUpConsumptionPointsOrderSaveReqVO createReqVO) {
+        return success(userTopUpConsumptionPointsOrderService.createUserTopUpConsumptionPointsOrder(createReqVO));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得用户充值消费分订单分页")
+    public CommonResult<PageResult<UserTopUpConsumptionPointsOrderRespVO>> getUserTopUpConsumptionPointsOrderPage(@Valid UserTopUpConsumptionPointsOrderPageReqVO pageReqVO) {
+        PageResult<UserTopUpConsumptionPointsOrderDO> pageResult = userTopUpConsumptionPointsOrderService.getUserTopUpConsumptionPointsOrderPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, UserTopUpConsumptionPointsOrderRespVO.class));
+    }
+}

+ 12 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/usertopupconsumptionpointsorder/vo/UserTopUpConsumptionPointsOrderInfoRespVO.java

@@ -0,0 +1,12 @@
+package cn.newfeifan.mall.module.distri.controller.app.usertopupconsumptionpointsorder.vo;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class UserTopUpConsumptionPointsOrderInfoRespVO {
+
+    private Long id;
+    private Long payOrderId;
+}

+ 72 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/usertopupconsumptionpointsorder/vo/UserTopUpConsumptionPointsOrderPageReqVO.java

@@ -0,0 +1,72 @@
+package cn.newfeifan.mall.module.distri.controller.app.usertopupconsumptionpointsorder.vo;
+
+import lombok.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.newfeifan.mall.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "用户 APP - 用户充值消费分订单分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class UserTopUpConsumptionPointsOrderPageReqVO extends PageParam {
+
+    @Schema(description = "订单流水号")
+    private String no;
+
+    @Schema(description = "订单来源终端")
+    private Integer terminal;
+
+    @Schema(description = "用户编号", example = "29707")
+    private Long userId;
+
+    @Schema(description = "用户 IP")
+    private String userIp;
+
+    @Schema(description = "商品标题")
+    private String subject;
+
+    @Schema(description = "充值消费分")
+    private Long topUpConsumptionPoints;
+
+    @Schema(description = "到账消费分")
+    private Long practicalConsumptionPoints;
+
+    @Schema(description = "用户名", example = "李四")
+    private String userName;
+
+    @Schema(description = "支付订单编号", example = "9840")
+    private Long payOrderId;
+
+    @Schema(description = "是否已支付:[0:未支付 1:已经支付过]", example = "2")
+    private Boolean payStatus;
+
+    @Schema(description = "订单支付时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] payTime;
+
+    @Schema(description = "支付成功的支付渠道")
+    private String payChannelCode;
+
+    @Schema(description = "订单完成时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] finishTime;
+
+    @Schema(description = "订单取消时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] cancelTime;
+
+    @Schema(description = "应付金额(总),单位:分", example = "5880")
+    private Long payPrice;
+
+    @Schema(description = "计算百分比模板")
+    private String percentTemplate;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 86 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/usertopupconsumptionpointsorder/vo/UserTopUpConsumptionPointsOrderRespVO.java

@@ -0,0 +1,86 @@
+package cn.newfeifan.mall.module.distri.controller.app.usertopupconsumptionpointsorder.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "用户 APP - 用户充值消费分订单 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class UserTopUpConsumptionPointsOrderRespVO {
+
+    @Schema(description = "用户充值消费分订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3828")
+    @ExcelProperty("用户充值消费分订单编号")
+    private Long id;
+
+    @Schema(description = "订单流水号", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("订单流水号")
+    private String no;
+
+    @Schema(description = "订单来源终端", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("订单来源终端")
+    private Integer terminal;
+
+    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "29707")
+    @ExcelProperty("用户编号")
+    private Long userId;
+
+    @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("用户 IP")
+    private String userIp;
+
+    @Schema(description = "商品标题", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("商品标题")
+    private String subject;
+
+    @Schema(description = "充值消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("充值消费分")
+    private Long topUpConsumptionPoints;
+
+    @Schema(description = "到账消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("到账消费分")
+    private Long practicalConsumptionPoints;
+
+    @Schema(description = "用户名", example = "李四")
+    @ExcelProperty("用户名")
+    private String userName;
+
+    @Schema(description = "支付订单编号", example = "9840")
+    @ExcelProperty("支付订单编号")
+    private Long payOrderId;
+
+    @Schema(description = "是否已支付:[0:未支付 1:已经支付过]", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @ExcelProperty("是否已支付:[0:未支付 1:已经支付过]")
+    private Boolean payStatus;
+
+    @Schema(description = "订单支付时间")
+    @ExcelProperty("订单支付时间")
+    private LocalDateTime payTime;
+
+    @Schema(description = "支付成功的支付渠道")
+    @ExcelProperty("支付成功的支付渠道")
+    private String payChannelCode;
+
+    @Schema(description = "订单完成时间")
+    @ExcelProperty("订单完成时间")
+    private LocalDateTime finishTime;
+
+    @Schema(description = "订单取消时间")
+    @ExcelProperty("订单取消时间")
+    private LocalDateTime cancelTime;
+
+    @Schema(description = "应付金额(总),单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5880")
+    @ExcelProperty("应付金额(总),单位:分")
+    private Long payPrice;
+
+    @Schema(description = "计算百分比模板")
+    @ExcelProperty("计算百分比模板")
+    private String percentTemplate;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 68 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/usertopupconsumptionpointsorder/vo/UserTopUpConsumptionPointsOrderSaveReqVO.java

@@ -0,0 +1,68 @@
+package cn.newfeifan.mall.module.distri.controller.app.usertopupconsumptionpointsorder.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import javax.validation.constraints.*;
+import java.time.LocalDateTime;
+
+@Schema(description = "用户 APP - 用户充值消费分订单新增/修改 Request VO")
+@Data
+public class UserTopUpConsumptionPointsOrderSaveReqVO {
+
+    @Schema(description = "用户充值消费分订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3828")
+    private Long id;
+
+    @Schema(description = "订单流水号", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String no;
+
+    @Schema(description = "订单来源终端", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Integer terminal;
+
+    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "29707")
+    private Long userId;
+
+    @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String userIp;
+
+    @Schema(description = "商品标题", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String subject;
+
+    @Schema(description = "充值消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "充值消费分不能为空")
+    private Double topUpConsumptionPoints;
+
+    @Schema(description = "到账消费分", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Long practicalConsumptionPoints;
+
+    @Schema(description = "用户名", example = "李四")
+    private String userName;
+
+    @Schema(description = "支付订单编号", example = "9840")
+    private Long payOrderId;
+
+    @Schema(description = "是否已支付:[0:未支付 1:已经支付过]", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    private Boolean payStatus;
+
+    @Schema(description = "订单支付时间")
+    private LocalDateTime payTime;
+
+    @Schema(description = "支付成功的支付渠道")
+    private String payChannelCode;
+
+    @Schema(description = "订单完成时间")
+    private LocalDateTime finishTime;
+
+    @Schema(description = "订单取消时间")
+    private LocalDateTime cancelTime;
+
+    @Schema(description = "应付金额(总),单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5880")
+    @NotNull(message = "应付金额(总),单位:分不能为空")
+    @Max(value = 99999999, message = "金额不能超过 99999999")
+//    @Min(value = 1, message = "金额不能小于 1")
+    private Double payPrice;
+
+    @Schema(description = "计算百分比模板")
+    private String percentTemplate;
+
+}

+ 35 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/convert/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderConvert.java

@@ -0,0 +1,35 @@
+package cn.newfeifan.mall.module.distri.convert.usertopupconsumptionpointsorder;
+
+import cn.newfeifan.mall.framework.common.util.string.StrUtils;
+import cn.newfeifan.mall.module.distri.config.OrderProperties;
+import cn.newfeifan.mall.module.distri.dal.dataobject.usertopupconsumptionpointsorder.UserTopUpConsumptionPointsOrderDO;
+import cn.newfeifan.mall.module.pay.api.order.dto.PayOrderCreateReqDTO;
+import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderDO;
+import cn.newfeifan.mall.module.pay.enums.order.PayOrderStatusEnum;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import static cn.newfeifan.mall.framework.common.util.date.LocalDateTimeUtils.addTime;
+
+@Mapper
+public interface UserTopUpConsumptionPointsOrderConvert {
+
+    UserTopUpConsumptionPointsOrderConvert INSTANCE = Mappers.getMapper(UserTopUpConsumptionPointsOrderConvert.class);
+    default PayOrderDO convert(UserTopUpConsumptionPointsOrderDO saveReqVO, OrderProperties orderProperties)
+    {
+        PayOrderDO payOrderDO = new PayOrderDO()
+                .setAppId(orderProperties.getAppId()).setUserIp(saveReqVO.getUserIp());
+        // 商户相关字段
+        payOrderDO.setMerchantOrderId(String.valueOf(saveReqVO.getId()));
+        String subject = saveReqVO.getSubject();
+        subject = StrUtils.maxLength(subject, PayOrderCreateReqDTO.SUBJECT_MAX_LENGTH); // 避免超过 32 位
+        payOrderDO.setSubject(subject);
+        payOrderDO.setBody(subject);
+        payOrderDO.setStatus(PayOrderStatusEnum.WAITING.getStatus()).setRefundPrice(0);
+        payOrderDO.setMerchantOrderId(saveReqVO.getId().toString());
+
+        // 订单相关字段
+        payOrderDO.setPrice(saveReqVO.getPayPrice().intValue()).setExpireTime(addTime(orderProperties.getPayExpireTime()));
+        return payOrderDO;
+    }
+}

+ 13 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/applicationforwithdrawal/ApplicationForWithdrawalDO.java

@@ -48,5 +48,18 @@ public class ApplicationForWithdrawalDO extends BaseDO {
      * 提现渠道记录id
      */
     private Long applicationForWithdrawalChannelId;
+    /**
+     * 提现总金额,单位:分
+     */
+    private Long amountTotal;
+    /**
+     * 提现消费分,单位:分
+     */
+    private Long withdrawConsumption;
+    /**
+     * 计算百分比模板
+     */
+    private String percentTemplate;
+
 
 }

+ 9 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/applicationforwithdrawalchannel/ApplicationForWithdrawalChannelDO.java

@@ -53,5 +53,14 @@ public class ApplicationForWithdrawalChannelDO extends BaseDO {
      * 导出状态,已导出是1,未导出为0
      */
     private Boolean excelStatus;
+    /**
+     * 提现总金额,单位:分
+     */
+    private Long amountTotal;
+    /**
+     * 提现消费分,单位:分
+     */
+    private Long withdrawConsumption;
+
 
 }

+ 62 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/consumptionchangelog/ConsumptionChangeLogDO.java

@@ -0,0 +1,62 @@
+package cn.newfeifan.mall.module.distri.dal.dataobject.consumptionchangelog;
+
+import lombok.*;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.newfeifan.mall.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 平台消费分变动记录 DO
+ *
+ * @author 非繁人
+ */
+@TableName("distri_consumption_change_log")
+@KeySequence("distri_consumption_change_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ConsumptionChangeLogDO extends BaseDO {
+
+    /**
+     * 日志编号
+     */
+    @TableId
+    private Long id;
+    /**
+     * 用户ID
+     */
+    private Long userId;
+    /**
+     * 变动的消费分
+     */
+    private Long consumptionPoints;
+    /**
+     * 变动后消费分
+     */
+    private Long afterConsumptionPoints;
+    /**
+     * 消费分变动类型
+     */
+    private Integer consumptionStatus;
+    /**
+     * 实际消费分
+     */
+    private Long practicalConsumptionPoints;
+
+    /**
+     * 消费分产生对象
+     */
+    private Long generateUserId;
+
+    /**
+     * 订单Id
+     */
+    private Long orderId;
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+
+}

+ 48 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/consumptiontopuplog/ConsumptionTopUpLogDO.java

@@ -0,0 +1,48 @@
+package cn.newfeifan.mall.module.distri.dal.dataobject.consumptiontopuplog;
+
+import lombok.*;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.newfeifan.mall.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 平台消费分充值记录 DO
+ *
+ * @author 非繁人
+ */
+@TableName("distri_consumption_top_up_log")
+@KeySequence("distri_consumption_top_up_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ConsumptionTopUpLogDO extends BaseDO {
+
+    /**
+     * 充值编号
+     */
+    @TableId
+    private Long id;
+    /**
+     * 用户ID
+     */
+    private Long userId;
+    /**
+     * 转账凭证附件
+     */
+    private String attachment;
+    /**
+     * 消费分
+     */
+    private Long consumptionPoints;
+    /**
+     * 实际消费分
+     */
+    private Long practicalConsumptionPoints;
+    /**
+     * 用户名
+     */
+    private String userName;
+
+}

+ 60 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/consumptiontransferlog/ConsumptionTransferLogDO.java

@@ -0,0 +1,60 @@
+package cn.newfeifan.mall.module.distri.dal.dataobject.consumptiontransferlog;
+
+import lombok.*;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.newfeifan.mall.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 消费分转让记录 DO
+ *
+ * @author 非繁人
+ */
+@TableName("distri_consumption_transfer_log")
+@KeySequence("distri_consumption_transfer_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ConsumptionTransferLogDO extends BaseDO {
+
+    /**
+     * 日志编号
+     */
+    @TableId
+    private Long id;
+    /**
+     * 转让用户ID
+     */
+    private Long transferUserId;
+    /**
+     * 转让人用户名
+     */
+    private String transferUserName;
+    /**
+     * 接收用户ID
+     */
+    private Long recipientUserId;
+    /**
+     * 接收人用户名
+     */
+    private String recipientUserName;
+    /**
+     * 转让的消费分
+     */
+    private Long consumptionPoints;
+    /**
+     * 变动后消费分(余额)
+     */
+    private Long afterTransferConsumptionPoints;
+    /**
+     * 接收的消费分
+     */
+    private Long recipientPoints;
+    /**
+     * 变动后消费分(余额)
+     */
+    private Long afterRecipientConsumptionPoints;
+
+}

+ 5 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/integral/IntegralDO.java

@@ -64,4 +64,9 @@ public class IntegralDO extends BaseDO {
      * 累计获取的峰值
      */
     private Long highQuotaTotal;
+
+    /**
+     * 当前消费分
+     */
+    private Long consumptionPoints;
 }

+ 31 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/orderpercentage/OrderPercentageDO.java

@@ -87,4 +87,35 @@ public class OrderPercentageDO extends BaseDO {
      */
     private String signInSocialStatus;
 
+    /**
+     * 充值消费分的倍率
+     */
+    private String consumptionMagnification;
+    /**
+     * 首次充值消费分的额度
+     */
+    private String firstTopUpConsumption;
+    /**
+     * 后续充值消费分的额度
+     */
+    private String followUpConsumption;
+
+    /**
+     * 提现佣金百分比
+     */
+    private String withdrawCommission;
+    /**
+     * 提现消费分百分比
+     */
+    private String withdrawConsumption;
+
+    /**
+     * 用户充值消费分的额度
+     */
+    private String userTopUpConsumptionPoints;
+
+    /**
+     * 触发倍率的最低金额
+     */
+    private String triggerMagnificationPoints;
 }

+ 9 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptdailywithdrawal/PtDailyWithdrawalDO.java

@@ -46,4 +46,13 @@ public class PtDailyWithdrawalDO extends BaseDO {
      */
     private LocalDateTime endTime;
 
+    /**
+     * 提现总金额,单位:分
+     */
+    private Long amountTotal;
+    /**
+     * 提现消费分,单位:分
+     */
+    private Long withdrawConsumption;
+
 }

+ 93 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderDO.java

@@ -0,0 +1,93 @@
+package cn.newfeifan.mall.module.distri.dal.dataobject.usertopupconsumptionpointsorder;
+
+import lombok.*;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.newfeifan.mall.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 用户充值消费分订单 DO
+ *
+ * @author 非繁人
+ */
+@TableName("distri_user_top_up_consumption_points_order")
+@KeySequence("distri_user_top_up_consumption_points_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserTopUpConsumptionPointsOrderDO extends BaseDO {
+
+    /**
+     * 用户充值消费分订单编号
+     */
+    @TableId
+    private Long id;
+    /**
+     * 订单流水号
+     */
+    private String no;
+    /**
+     * 订单来源终端
+     */
+    private Integer terminal;
+    /**
+     * 用户编号
+     */
+    private Long userId;
+    /**
+     * 用户 IP
+     */
+    private String userIp;
+    /**
+     * 商品标题
+     */
+    private String subject;
+    /**
+     * 充值消费分
+     */
+    private Long topUpConsumptionPoints;
+    /**
+     * 到账消费分
+     */
+    private Long practicalConsumptionPoints;
+    /**
+     * 用户名
+     */
+    private String userName;
+    /**
+     * 支付订单编号
+     */
+    private Long payOrderId;
+    /**
+     * 是否已支付:[0:未支付 1:已经支付过]
+     */
+    private Boolean payStatus;
+    /**
+     * 订单支付时间
+     */
+    private LocalDateTime payTime;
+    /**
+     * 支付成功的支付渠道
+     */
+    private String payChannelCode;
+    /**
+     * 订单完成时间
+     */
+    private LocalDateTime finishTime;
+    /**
+     * 订单取消时间
+     */
+    private LocalDateTime cancelTime;
+    /**
+     * 应付金额(总),单位:分
+     */
+    private Long payPrice;
+    /**
+     * 计算百分比模板
+     */
+    private String percentTemplate;
+
+}

+ 28 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/consumptionchangelog/ConsumptionChangeLogMapper.java

@@ -0,0 +1,28 @@
+package cn.newfeifan.mall.module.distri.dal.mysql.consumptionchangelog;
+
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
+import cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog.vo.ConsumptionChangeLogPageReqVO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.consumptionchangelog.ConsumptionChangeLogDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 平台消费分变动记录 Mapper
+ *
+ * @author 非繁人
+ */
+@Mapper
+public interface ConsumptionChangeLogMapper extends BaseMapperX<ConsumptionChangeLogDO> {
+
+    default PageResult<ConsumptionChangeLogDO> selectPage(ConsumptionChangeLogPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<ConsumptionChangeLogDO>()
+                .eqIfPresent(ConsumptionChangeLogDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(ConsumptionChangeLogDO::getConsumptionPoints, reqVO.getConsumptionPoints())
+                .eqIfPresent(ConsumptionChangeLogDO::getAfterConsumptionPoints, reqVO.getAfterConsumptionPoints())
+                .eqIfPresent(ConsumptionChangeLogDO::getConsumptionStatus, reqVO.getConsumptionStatus())
+                .betweenIfPresent(ConsumptionChangeLogDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(ConsumptionChangeLogDO::getId));
+    }
+
+}

+ 29 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/consumptiontopuplog/ConsumptionTopUpLogMapper.java

@@ -0,0 +1,29 @@
+package cn.newfeifan.mall.module.distri.dal.mysql.consumptiontopuplog;
+
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
+import cn.newfeifan.mall.module.distri.controller.app.consumptiontopuplog.vo.ConsumptionTopUpLogPageReqVO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.consumptiontopuplog.ConsumptionTopUpLogDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 平台消费分充值记录 Mapper
+ *
+ * @author 非繁人
+ */
+@Mapper
+public interface ConsumptionTopUpLogMapper extends BaseMapperX<ConsumptionTopUpLogDO> {
+
+    default PageResult<ConsumptionTopUpLogDO> selectPage(ConsumptionTopUpLogPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<ConsumptionTopUpLogDO>()
+                .eqIfPresent(ConsumptionTopUpLogDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(ConsumptionTopUpLogDO::getAttachment, reqVO.getAttachment())
+                .eqIfPresent(ConsumptionTopUpLogDO::getConsumptionPoints, reqVO.getConsumptionPoints())
+                .eqIfPresent(ConsumptionTopUpLogDO::getPracticalConsumptionPoints, reqVO.getPracticalConsumptionPoints())
+                .betweenIfPresent(ConsumptionTopUpLogDO::getCreateTime, reqVO.getCreateTime())
+                .likeIfPresent(ConsumptionTopUpLogDO::getUserName, reqVO.getUserName())
+                .orderByDesc(ConsumptionTopUpLogDO::getId));
+    }
+
+}

+ 29 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/consumptiontransferlog/ConsumptionTransferLogMapper.java

@@ -0,0 +1,29 @@
+package cn.newfeifan.mall.module.distri.dal.mysql.consumptiontransferlog;
+
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
+import cn.newfeifan.mall.module.distri.controller.app.consumptiontransferlog.vo.ConsumptionTransferLogPageReqVO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.consumptiontransferlog.ConsumptionTransferLogDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 消费分转让记录 Mapper
+ *
+ * @author 非繁人
+ */
+@Mapper
+public interface ConsumptionTransferLogMapper extends BaseMapperX<ConsumptionTransferLogDO> {
+
+    default PageResult<ConsumptionTransferLogDO> selectPage(ConsumptionTransferLogPageReqVO reqVO) {
+        LambdaQueryWrapperX<ConsumptionTransferLogDO> queryWrapper = new LambdaQueryWrapperX<ConsumptionTransferLogDO>()
+                .likeIfPresent(ConsumptionTransferLogDO::getTransferUserName, reqVO.getTransferUserName())
+                .eqIfPresent(ConsumptionTransferLogDO::getConsumptionPoints, reqVO.getConsumptionPoints())
+                .likeIfPresent(ConsumptionTransferLogDO::getRecipientUserName, reqVO.getRecipientUserName())
+                .betweenIfPresent(ConsumptionTransferLogDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(ConsumptionTransferLogDO::getId);
+        queryWrapper.apply("(transfer_user_id = '"+reqVO.getTransferUserId()+"' or recipient_user_id = '"+reqVO.getTransferUserId()+"')");
+        return selectPage(reqVO, queryWrapper);
+    }
+
+}

+ 1 - 3
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/integral/IntegralMapper.java

@@ -1,13 +1,11 @@
 package cn.newfeifan.mall.module.distri.dal.mysql.integral;
 
-import java.util.*;
-
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
 import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
 import org.apache.ibatis.annotations.Mapper;
-import cn.newfeifan.mall.module.distri.controller.admin.integral.vo.*;
+import cn.newfeifan.mall.module.distri.controller.app.integral.vo.*;
 
 /**
  * 推荐用户积分 Mapper

+ 1 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/orderpercentage/OrderPercentageMapper.java

@@ -3,7 +3,7 @@ package cn.newfeifan.mall.module.distri.dal.mysql.orderpercentage;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
-import cn.newfeifan.mall.module.distri.controller.admin.orderpercentage.vo.OrderPercentagePageReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.orderpercentage.vo.OrderPercentagePageReqVO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.orderpercentage.OrderPercentageDO;
 import org.apache.ibatis.annotations.Mapper;
 

+ 3 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofitlog/PtProfitLogMapper.java

@@ -50,9 +50,10 @@ public interface PtProfitLogMapper extends BaseMapperX<PtProfitLogDO> {
                     ORDER_REFUND_INTEGRAL_ANCESTER.getType(),
                     MANUAL_RETURN_INTEGRAL.getType(),
                     WITHDRAWAL.getType(),
-                    WITHDRAWAL_ERROR.getType()
+                    WITHDRAWAL_ERROR.getType(),
+                    COMMISSION_TRANSITION.getType()
             );
-//            queryWrapper.ne(PtProfitLogDO::getAmount,0);
+            queryWrapper.ne(PtProfitLogDO::getAmount,0);
         } else {
             //冻结
             profitStatus = Arrays.asList(

+ 40 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderMapper.java

@@ -0,0 +1,40 @@
+package cn.newfeifan.mall.module.distri.dal.mysql.usertopupconsumptionpointsorder;
+
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
+import cn.newfeifan.mall.module.distri.dal.dataobject.usertopupconsumptionpointsorder.UserTopUpConsumptionPointsOrderDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.newfeifan.mall.module.distri.controller.app.usertopupconsumptionpointsorder.vo.*;
+
+/**
+ * 用户充值消费分订单 Mapper
+ *
+ * @author 非繁人
+ */
+@Mapper
+public interface UserTopUpConsumptionPointsOrderMapper extends BaseMapperX<UserTopUpConsumptionPointsOrderDO> {
+
+    default PageResult<UserTopUpConsumptionPointsOrderDO> selectPage(UserTopUpConsumptionPointsOrderPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<UserTopUpConsumptionPointsOrderDO>()
+                .eqIfPresent(UserTopUpConsumptionPointsOrderDO::getNo, reqVO.getNo())
+                .eqIfPresent(UserTopUpConsumptionPointsOrderDO::getTerminal, reqVO.getTerminal())
+                .eqIfPresent(UserTopUpConsumptionPointsOrderDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(UserTopUpConsumptionPointsOrderDO::getUserIp, reqVO.getUserIp())
+                .eqIfPresent(UserTopUpConsumptionPointsOrderDO::getSubject, reqVO.getSubject())
+                .eqIfPresent(UserTopUpConsumptionPointsOrderDO::getTopUpConsumptionPoints, reqVO.getTopUpConsumptionPoints())
+                .eqIfPresent(UserTopUpConsumptionPointsOrderDO::getPracticalConsumptionPoints, reqVO.getPracticalConsumptionPoints())
+                .likeIfPresent(UserTopUpConsumptionPointsOrderDO::getUserName, reqVO.getUserName())
+                .eqIfPresent(UserTopUpConsumptionPointsOrderDO::getPayOrderId, reqVO.getPayOrderId())
+                .eqIfPresent(UserTopUpConsumptionPointsOrderDO::getPayStatus, reqVO.getPayStatus())
+                .betweenIfPresent(UserTopUpConsumptionPointsOrderDO::getPayTime, reqVO.getPayTime())
+                .eqIfPresent(UserTopUpConsumptionPointsOrderDO::getPayChannelCode, reqVO.getPayChannelCode())
+                .betweenIfPresent(UserTopUpConsumptionPointsOrderDO::getFinishTime, reqVO.getFinishTime())
+                .betweenIfPresent(UserTopUpConsumptionPointsOrderDO::getCancelTime, reqVO.getCancelTime())
+                .eqIfPresent(UserTopUpConsumptionPointsOrderDO::getPayPrice, reqVO.getPayPrice())
+                .eqIfPresent(UserTopUpConsumptionPointsOrderDO::getPercentTemplate, reqVO.getPercentTemplate())
+                .betweenIfPresent(UserTopUpConsumptionPointsOrderDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(UserTopUpConsumptionPointsOrderDO::getId));
+    }
+
+}

+ 24 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/redis/RedisKeyConstants.java

@@ -0,0 +1,24 @@
+package cn.newfeifan.mall.module.distri.dal.redis;
+
+/**
+ * 交易 Redis Key 枚举类
+ *
+ * @author 非繁源码
+ */
+public interface RedisKeyConstants {
+
+    /**
+     * 交易序号的缓存
+     * KEY 格式:trade_no:{prefix}
+     * VALUE 数据格式:编号自增
+     */
+    String TRADE_NO = "trade_no:";
+
+    /**
+     * 交易序号的缓存
+     * KEY 格式:express_track:{code-logisticsNo-receiverMobile}
+     * VALUE 数据格式 String, 物流信息集合
+     */
+    String EXPRESS_TRACK = "express_track";
+
+}

+ 44 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/redis/no/OrderNoRedisDAO.java

@@ -0,0 +1,44 @@
+package cn.newfeifan.mall.module.distri.dal.redis.no;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import cn.newfeifan.mall.module.distri.dal.redis.RedisKeyConstants;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Repository;
+
+import javax.annotation.Resource;
+import java.time.Duration;
+import java.time.LocalDateTime;
+
+/**
+ * 订单序号的 Redis DAO
+ *
+ * @author HUIHUI
+ */
+@Repository
+public class OrderNoRedisDAO {
+
+    public static final String TRADE_ORDER_NO_PREFIX = "o";
+
+    public static final String AFTER_SALE_NO_PREFIX = "r";
+
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+
+    /**
+     * 生成序号
+     *
+     * @param prefix 前缀
+     * @return 序号
+     */
+    public String generate(String prefix) {
+        // 递增序号
+        String noPrefix = prefix + DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN);
+        String key = RedisKeyConstants.TRADE_NO + noPrefix;
+        Long no = stringRedisTemplate.opsForValue().increment(key);
+        // 设置过期时间
+        stringRedisTemplate.expire(key, Duration.ofMinutes(1L));
+        return noPrefix + no;
+    }
+
+}

+ 24 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/mq/consumer/topupconsumptionpoints/TopUpConsumptionPointsConsumer.java

@@ -0,0 +1,24 @@
+package cn.newfeifan.mall.module.distri.mq.consumer.topupconsumptionpoints;
+
+import cn.newfeifan.mall.module.distri.service.usertopupconsumptionpointsorder.UserTopUpConsumptionPointsOrderService;
+import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderDO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Component
+@Slf4j
+public class TopUpConsumptionPointsConsumer {
+
+    @Resource
+    private UserTopUpConsumptionPointsOrderService userTopUpConsumptionPointsOrderService;
+
+    @EventListener
+    public void onMessage(PayOrderDO payOrderDO) {
+        //修改订单状态,并计算权益
+        log.info("app消费者开始消费:对象:{}",payOrderDO);
+        userTopUpConsumptionPointsOrderService.topUpConsumptionPoints(payOrderDO);
+    }
+}

+ 38 - 4
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/applicationforwithdrawal/ApplicationForWithdrawalServiceImpl.java

@@ -1,18 +1,24 @@
 package cn.newfeifan.mall.module.distri.service.applicationforwithdrawal;
 
 import cn.newfeifan.mall.framework.common.exception.ErrorCode;
+import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
 import cn.newfeifan.mall.module.distri.constant.DistriConstants;
-import cn.newfeifan.mall.module.distri.controller.admin.integral.vo.IntegralSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog.vo.ConsumptionChangeLogSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.integral.vo.IntegralSaveReqVO;
 import cn.newfeifan.mall.module.distri.controller.app.applicationforwithdrawalchannel.vo.AppApplicationForWithdrawalChannelSaveReqVO;
 import cn.newfeifan.mall.module.distri.controller.app.ptdailywithdrawal.vo.AppPtDailyWithdrawalSaveReqVO;
 import cn.newfeifan.mall.module.distri.controller.app.ptprofitlog.vo.PtProfitLogSaveReqVO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.applicationforwithdrawalchannel.ApplicationForWithdrawalChannelDO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.orderpercentage.OrderPercentageDO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ptdailywithdrawal.PtDailyWithdrawalDO;
 import cn.newfeifan.mall.module.distri.enums.CaclEnum;
+import cn.newfeifan.mall.module.distri.enums.ConsumptionEnum;
 import cn.newfeifan.mall.module.distri.enums.WithdrawalChannelTypeEnum;
 import cn.newfeifan.mall.module.distri.service.applicationforwithdrawalchannel.ApplicationForWithdrawalChannelService;
+import cn.newfeifan.mall.module.distri.service.consumptionchangelog.ConsumptionChangeLogService;
 import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
+import cn.newfeifan.mall.module.distri.service.orderpercentage.OrderPercentageService;
 import cn.newfeifan.mall.module.distri.service.ptdailywithdrawal.PtDailyWithdrawalService;
 import cn.newfeifan.mall.module.distri.service.ptprofitlog.PtProfitLogService;
 import cn.newfeifan.mall.module.member.dal.dataobject.user.MemberUserDO;
@@ -62,14 +68,26 @@ public class ApplicationForWithdrawalServiceImpl implements ApplicationForWithdr
     @Resource
     private PtProfitLogService ptProfitLogService;
 
+    @Resource
+    private OrderPercentageService orderPercentageService;
+
+    @Resource
+    private ConsumptionChangeLogService consumptionChangeLogService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createApplicationForWithdrawal(AppApplicationForWithdrawalSaveReqVO reqVO) {
+        // 百倍为 元,单位 : 分
+        reqVO.setAmountTotal(reqVO.getAmountTotal() * DistriConstants.ONE_HUNDRED);
+        OrderPercentageDO orderPercentageDO = orderPercentageService.queryStatus();
+        reqVO.setPercentTemplate(JsonUtils.toJsonString(orderPercentageDO));
+        reqVO.setAmount((long) (reqVO.getAmountTotal() * Double.parseDouble(orderPercentageDO.getWithdrawCommission())));
+        reqVO.setWithdrawConsumption((long) (reqVO.getAmountTotal() * Double.parseDouble(orderPercentageDO.getWithdrawConsumption())));
 
         // 获取用户钱包
         IntegralDO integralDO = integralService.selectByUser(getLoginUserId());
 
-        if(integralDO.getCurrentQuota() < reqVO.getAmount() * DistriConstants.INTEGRAL_PAGE2DB){
+        if(integralDO.getCurrentQuota() < reqVO.getAmount() * DistriConstants.PERCENT){
             ErrorCode ERROR = new ErrorCode(1_005_031_005, "积分不足!");
             throw exception(ERROR);
         }
@@ -99,25 +117,31 @@ public class ApplicationForWithdrawalServiceImpl implements ApplicationForWithdr
         }
 
         ApplicationForWithdrawalDO applicationForWithdrawal = BeanUtils.toBean(reqVO, ApplicationForWithdrawalDO.class);
+        applicationForWithdrawal.setWithdrawConsumption(reqVO.getWithdrawConsumption() * DistriConstants.PERCENT);
         applicationForWithdrawalMapper.insert(applicationForWithdrawal);
 
         // 每一次申请就会改变二级表总数据
         applicationForWithdrawalChannelDO.setAmount(applicationForWithdrawalChannelDO.getAmount() + reqVO.getAmount());
+        applicationForWithdrawalChannelDO.setAmountTotal(applicationForWithdrawalChannelDO.getAmountTotal() + reqVO.getAmountTotal());
+        applicationForWithdrawalChannelDO.setWithdrawConsumption(applicationForWithdrawalChannelDO.getWithdrawConsumption() + reqVO.getWithdrawConsumption() * DistriConstants.PERCENT);
         applicationForWithdrawalChannelDO.setCount(applicationForWithdrawalChannelDO.getCount() + 1);
         applicationForWithdrawalChannelService.updateApplicationForWithdrawalChannel(BeanUtils.toBean(applicationForWithdrawalChannelDO, AppApplicationForWithdrawalChannelSaveReqVO.class));
 
         // 每一次申请就会改变一级表总数据
         ptDailyWithdrawalDO.setAmount(ptDailyWithdrawalDO.getAmount() + reqVO.getAmount());
+        ptDailyWithdrawalDO.setAmountTotal(ptDailyWithdrawalDO.getAmountTotal() + reqVO.getAmountTotal());
+        ptDailyWithdrawalDO.setWithdrawConsumption(ptDailyWithdrawalDO.getWithdrawConsumption() + reqVO.getWithdrawConsumption() * DistriConstants.PERCENT);
         ptDailyWithdrawalDO.setCount(ptDailyWithdrawalDO.getCount() + 1);
         ptDailyWithdrawalService.updatePtDailyWithdrawal(BeanUtils.toBean(ptDailyWithdrawalDO, AppPtDailyWithdrawalSaveReqVO.class));
 
         // 修改用户钱包余额
-        integralDO.setCurrentQuota(integralDO.getCurrentQuota() - reqVO.getAmount() * DistriConstants.INTEGRAL_PAGE2DB);
+        integralDO.setCurrentQuota(integralDO.getCurrentQuota() - reqVO.getAmountTotal() * DistriConstants.PERCENT);
+        integralDO.setConsumptionPoints(integralDO.getConsumptionPoints() + reqVO.getWithdrawConsumption() * DistriConstants.PERCENT);
         integralService.updateIntegral(BeanUtils.toBean(integralDO, IntegralSaveReqVO.class));
 
         // 记录用户积分变动日志
         PtProfitLogSaveReqVO ptProfitLogSaveReqVO = PtProfitLogSaveReqVO.builder()
-                .amount(-reqVO.getAmount() * DistriConstants.INTEGRAL_PAGE2DB)
+                .amount(-reqVO.getAmountTotal() * DistriConstants.PERCENT)
                 .afterAmount(integralDO.getCurrentQuota())
                 .profitStatus(CaclEnum.WITHDRAWAL.getType())
                 .userId(user.getId())
@@ -125,6 +149,16 @@ public class ApplicationForWithdrawalServiceImpl implements ApplicationForWithdr
                 .build();
         ptProfitLogService.createPtProfitLog(ptProfitLogSaveReqVO);
 
+        // 消费分变动日志
+        ConsumptionChangeLogSaveReqVO changeLogSaveReqVO = ConsumptionChangeLogSaveReqVO.builder()
+                .consumptionPoints(reqVO.getWithdrawConsumption() * DistriConstants.PERCENT)
+                .afterConsumptionPoints(integralDO.getConsumptionPoints())
+                .consumptionStatus(ConsumptionEnum.COMMISSION_WITHDRAWAL.getType())
+                .userId(user.getId())
+                .generateUserId(user.getId())
+                .build();
+        consumptionChangeLogService.createConsumptionChangeLog(changeLogSaveReqVO);
+
         // 返回
         return applicationForWithdrawal.getId();
     }

+ 56 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptionchangelog/ConsumptionChangeLogService.java

@@ -0,0 +1,56 @@
+package cn.newfeifan.mall.module.distri.service.consumptionchangelog;
+
+import javax.validation.*;
+
+import cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog.vo.ConsumptionChangeLogPageReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog.vo.ConsumptionChangeLogRespVO;
+import cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog.vo.ConsumptionChangeLogSaveReqVO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.consumptionchangelog.ConsumptionChangeLogDO;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+
+/**
+ * 平台消费分变动记录 Service 接口
+ *
+ * @author 非繁人
+ */
+public interface ConsumptionChangeLogService {
+
+    /**
+     * 创建平台消费分变动记录
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createConsumptionChangeLog(@Valid ConsumptionChangeLogSaveReqVO createReqVO);
+
+    /**
+     * 更新平台消费分变动记录
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateConsumptionChangeLog(@Valid ConsumptionChangeLogSaveReqVO updateReqVO);
+
+    /**
+     * 删除平台消费分变动记录
+     *
+     * @param id 编号
+     */
+    void deleteConsumptionChangeLog(Long id);
+
+    /**
+     * 获得平台消费分变动记录
+     *
+     * @param id 编号
+     * @return 平台消费分变动记录
+     */
+    ConsumptionChangeLogDO getConsumptionChangeLog(Long id);
+
+    /**
+     * 获得平台消费分变动记录分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 平台消费分变动记录分页
+     */
+    PageResult<ConsumptionChangeLogRespVO> getConsumptionChangeLogPage(ConsumptionChangeLogPageReqVO pageReqVO);
+
+}

+ 92 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptionchangelog/ConsumptionChangeLogServiceImpl.java

@@ -0,0 +1,92 @@
+package cn.newfeifan.mall.module.distri.service.consumptionchangelog;
+
+import cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog.vo.ConsumptionChangeLogPageReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog.vo.ConsumptionChangeLogRespVO;
+import cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog.vo.ConsumptionChangeLogSaveReqVO;
+import cn.newfeifan.mall.module.distri.enums.ConsumptionEnum;
+import cn.newfeifan.mall.module.member.dal.dataobject.user.MemberUserDO;
+import cn.newfeifan.mall.module.member.service.user.MemberUserService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+import org.springframework.validation.annotation.Validated;
+
+import cn.newfeifan.mall.module.distri.dal.dataobject.consumptionchangelog.ConsumptionChangeLogDO;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+
+import cn.newfeifan.mall.module.distri.dal.mysql.consumptionchangelog.ConsumptionChangeLogMapper;
+
+import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
+
+/**
+ * 平台消费分变动记录 Service 实现类
+ *
+ * @author 非繁人
+ */
+@Service
+@Validated
+public class ConsumptionChangeLogServiceImpl implements ConsumptionChangeLogService {
+
+    @Resource
+    private ConsumptionChangeLogMapper consumptionChangeLogMapper;
+
+    @Resource
+    private MemberUserService memberUserService;
+
+    @Override
+    public Long createConsumptionChangeLog(ConsumptionChangeLogSaveReqVO createReqVO) {
+        // 插入
+        ConsumptionChangeLogDO consumptionChangeLog = BeanUtils.toBean(createReqVO, ConsumptionChangeLogDO.class);
+        consumptionChangeLogMapper.insert(consumptionChangeLog);
+        // 返回
+        return consumptionChangeLog.getId();
+    }
+
+    @Override
+    public void updateConsumptionChangeLog(ConsumptionChangeLogSaveReqVO updateReqVO) {
+        // 校验存在
+        validateConsumptionChangeLogExists(updateReqVO.getId());
+        // 更新
+        ConsumptionChangeLogDO updateObj = BeanUtils.toBean(updateReqVO, ConsumptionChangeLogDO.class);
+        consumptionChangeLogMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteConsumptionChangeLog(Long id) {
+        // 校验存在
+        validateConsumptionChangeLogExists(id);
+        // 删除
+        consumptionChangeLogMapper.deleteById(id);
+    }
+
+    private void validateConsumptionChangeLogExists(Long id) {
+        if (consumptionChangeLogMapper.selectById(id) == null) {
+            throw exception(CONSUMPTION_CHANGE_LOG_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public ConsumptionChangeLogDO getConsumptionChangeLog(Long id) {
+        return consumptionChangeLogMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<ConsumptionChangeLogRespVO> getConsumptionChangeLogPage(ConsumptionChangeLogPageReqVO pageReqVO) {
+        pageReqVO.setUserId(getLoginUserId());
+        PageResult<ConsumptionChangeLogRespVO> bean = BeanUtils.toBean(consumptionChangeLogMapper.selectPage(pageReqVO), ConsumptionChangeLogRespVO.class);
+
+        for (ConsumptionChangeLogRespVO consumptionChangeLogRespVO : bean.getList()) {
+            consumptionChangeLogRespVO.setConsumptionStatusName(ConsumptionEnum.getName(consumptionChangeLogRespVO.getConsumptionStatus()));
+            if(consumptionChangeLogRespVO.getGenerateUserId() != null){
+                MemberUserDO user = memberUserService.getUser(consumptionChangeLogRespVO.getGenerateUserId());
+                consumptionChangeLogRespVO.setGenerateUserName(user.getUsername());
+            }
+        }
+        return bean;
+    }
+
+}

+ 55 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptiontopuplog/ConsumptionTopUpLogService.java

@@ -0,0 +1,55 @@
+package cn.newfeifan.mall.module.distri.service.consumptiontopuplog;
+
+import javax.validation.*;
+
+import cn.newfeifan.mall.module.distri.controller.app.consumptiontopuplog.vo.ConsumptionTopUpLogPageReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.consumptiontopuplog.vo.ConsumptionTopUpLogSaveReqVO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.consumptiontopuplog.ConsumptionTopUpLogDO;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+
+/**
+ * 平台消费分充值记录 Service 接口
+ *
+ * @author 非繁人
+ */
+public interface ConsumptionTopUpLogService {
+
+    /**
+     * 创建平台消费分充值记录
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createConsumptionTopUpLog(@Valid ConsumptionTopUpLogSaveReqVO createReqVO);
+
+    /**
+     * 更新平台消费分充值记录
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateConsumptionTopUpLog(@Valid ConsumptionTopUpLogSaveReqVO updateReqVO);
+
+    /**
+     * 删除平台消费分充值记录
+     *
+     * @param id 编号
+     */
+    void deleteConsumptionTopUpLog(Long id);
+
+    /**
+     * 获得平台消费分充值记录
+     *
+     * @param id 编号
+     * @return 平台消费分充值记录
+     */
+    ConsumptionTopUpLogDO getConsumptionTopUpLog(Long id);
+
+    /**
+     * 获得平台消费分充值记录分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 平台消费分充值记录分页
+     */
+    PageResult<ConsumptionTopUpLogDO> getConsumptionTopUpLogPage(ConsumptionTopUpLogPageReqVO pageReqVO);
+
+}

+ 72 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptiontopuplog/ConsumptionTopUpLogServiceImpl.java

@@ -0,0 +1,72 @@
+package cn.newfeifan.mall.module.distri.service.consumptiontopuplog;
+
+import cn.newfeifan.mall.module.distri.controller.app.consumptiontopuplog.vo.ConsumptionTopUpLogPageReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.consumptiontopuplog.vo.ConsumptionTopUpLogSaveReqVO;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+
+import cn.newfeifan.mall.module.distri.dal.dataobject.consumptiontopuplog.ConsumptionTopUpLogDO;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+
+import cn.newfeifan.mall.module.distri.dal.mysql.consumptiontopuplog.ConsumptionTopUpLogMapper;
+
+import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
+
+/**
+ * 平台消费分充值记录 Service 实现类
+ *
+ * @author 非繁人
+ */
+@Service
+@Validated
+public class ConsumptionTopUpLogServiceImpl implements ConsumptionTopUpLogService {
+
+    @Resource
+    private ConsumptionTopUpLogMapper consumptionTopUpLogMapper;
+
+    @Override
+    public Long createConsumptionTopUpLog(ConsumptionTopUpLogSaveReqVO createReqVO) {
+        // 插入
+        ConsumptionTopUpLogDO consumptionTopUpLog = BeanUtils.toBean(createReqVO, ConsumptionTopUpLogDO.class);
+        consumptionTopUpLogMapper.insert(consumptionTopUpLog);
+        // 返回
+        return consumptionTopUpLog.getId();
+    }
+
+    @Override
+    public void updateConsumptionTopUpLog(ConsumptionTopUpLogSaveReqVO updateReqVO) {
+        // 校验存在
+        validateConsumptionTopUpLogExists(updateReqVO.getId());
+        // 更新
+        ConsumptionTopUpLogDO updateObj = BeanUtils.toBean(updateReqVO, ConsumptionTopUpLogDO.class);
+        consumptionTopUpLogMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteConsumptionTopUpLog(Long id) {
+        // 校验存在
+        validateConsumptionTopUpLogExists(id);
+        // 删除
+        consumptionTopUpLogMapper.deleteById(id);
+    }
+
+    private void validateConsumptionTopUpLogExists(Long id) {
+        if (consumptionTopUpLogMapper.selectById(id) == null) {
+            throw exception(CONSUMPTION_TOP_UP_LOG_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public ConsumptionTopUpLogDO getConsumptionTopUpLog(Long id) {
+        return consumptionTopUpLogMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<ConsumptionTopUpLogDO> getConsumptionTopUpLogPage(ConsumptionTopUpLogPageReqVO pageReqVO) {
+        return consumptionTopUpLogMapper.selectPage(pageReqVO);
+    }
+
+}

+ 55 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptiontransferlog/ConsumptionTransferLogService.java

@@ -0,0 +1,55 @@
+package cn.newfeifan.mall.module.distri.service.consumptiontransferlog;
+
+import javax.validation.*;
+
+import cn.newfeifan.mall.module.distri.controller.app.consumptiontransferlog.vo.ConsumptionTransferLogPageReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.consumptiontransferlog.vo.ConsumptionTransferLogSaveReqVO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.consumptiontransferlog.ConsumptionTransferLogDO;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+
+/**
+ * 消费分转让记录 Service 接口
+ *
+ * @author 非繁人
+ */
+public interface ConsumptionTransferLogService {
+
+    /**
+     * 创建消费分转让记录
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createConsumptionTransferLog(@Valid ConsumptionTransferLogSaveReqVO createReqVO);
+
+    /**
+     * 更新消费分转让记录
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateConsumptionTransferLog(@Valid ConsumptionTransferLogSaveReqVO updateReqVO);
+
+    /**
+     * 删除消费分转让记录
+     *
+     * @param id 编号
+     */
+    void deleteConsumptionTransferLog(Long id);
+
+    /**
+     * 获得消费分转让记录
+     *
+     * @param id 编号
+     * @return 消费分转让记录
+     */
+    ConsumptionTransferLogDO getConsumptionTransferLog(Long id);
+
+    /**
+     * 获得消费分转让记录分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 消费分转让记录分页
+     */
+    PageResult<ConsumptionTransferLogDO> getConsumptionTransferLogPage(ConsumptionTransferLogPageReqVO pageReqVO);
+
+}

+ 153 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptiontransferlog/ConsumptionTransferLogServiceImpl.java

@@ -0,0 +1,153 @@
+package cn.newfeifan.mall.module.distri.service.consumptiontransferlog;
+
+import cn.newfeifan.mall.framework.common.exception.ErrorCode;
+import cn.newfeifan.mall.module.distri.constant.DistriConstants;
+import cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog.vo.ConsumptionChangeLogSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.consumptiontransferlog.vo.ConsumptionTransferLogPageReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.consumptiontransferlog.vo.ConsumptionTransferLogSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.integral.vo.IntegralSaveReqVO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
+import cn.newfeifan.mall.module.distri.enums.ConsumptionEnum;
+import cn.newfeifan.mall.module.distri.service.consumptionchangelog.ConsumptionChangeLogService;
+import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
+import cn.newfeifan.mall.module.member.dal.dataobject.user.MemberUserDO;
+import cn.newfeifan.mall.module.member.service.user.MemberUserService;
+import cn.newfeifan.mall.module.system.service.sms.SmsCodeService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import cn.newfeifan.mall.module.distri.dal.dataobject.consumptiontransferlog.ConsumptionTransferLogDO;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+
+import cn.newfeifan.mall.module.distri.dal.mysql.consumptiontransferlog.ConsumptionTransferLogMapper;
+
+import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.framework.common.util.servlet.ServletUtils.getClientIP;
+import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
+
+/**
+ * 消费分转让记录 Service 实现类
+ *
+ * @author 非繁人
+ */
+@Service
+@Validated
+public class ConsumptionTransferLogServiceImpl implements ConsumptionTransferLogService {
+
+    @Resource
+    private ConsumptionTransferLogMapper consumptionTransferLogMapper;
+
+    @Resource
+    private SmsCodeService smsCodeService;
+
+    @Resource
+    private IntegralService integralService;
+
+    @Resource
+    private ConsumptionChangeLogService consumptionChangeLogService;
+
+    @Resource
+    private MemberUserService memberUserService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createConsumptionTransferLog(ConsumptionTransferLogSaveReqVO createReqVO) {
+        // 自己不能转账自己
+        Long loginUserId = getLoginUserId();
+        if (loginUserId != null && loginUserId.equals(createReqVO.getRecipientUserId())) {
+            ErrorCode ERROR = new ErrorCode(1_002_030_037, "自己不能转账给自己");
+            throw exception(ERROR);
+        }
+
+        // 短信验证码校验
+        smsCodeService.useSmsCode(createReqVO.getSmsCodeUseReqDTO().setUsedIp(getClientIP()));
+        // 消费分转成数据库存储的单位
+        createReqVO.setConsumptionPoints(createReqVO.getConsumptionPoints() * DistriConstants.INTEGRAL_PAGE2DB);
+        createReqVO.setTransferUserId(loginUserId);
+        MemberUserDO user = memberUserService.getUser(loginUserId);
+        createReqVO.setTransferUserName(user.getUsername());
+
+        // 转让人钱包
+        IntegralDO transferIntegral = integralService.selectByUser(createReqVO.getTransferUserId());
+        transferIntegral.setConsumptionPoints(transferIntegral.getConsumptionPoints() - createReqVO.getConsumptionPoints());
+        integralService.updateIntegral(BeanUtils.toBean(transferIntegral, IntegralSaveReqVO.class));
+        // 接收人钱包
+        IntegralDO recipientIntegral = integralService.selectByUser(createReqVO.getRecipientUserId());
+
+        // 记录变动日志
+        consumptionChangeLogService.createConsumptionChangeLog(
+                ConsumptionChangeLogSaveReqVO.builder()
+                        .userId(transferIntegral.getUserId())
+                        .consumptionPoints(-createReqVO.getConsumptionPoints())
+                        .afterConsumptionPoints(transferIntegral.getConsumptionPoints())
+                        .consumptionStatus(ConsumptionEnum.CONSUMPTION_TRANSFER.getType())
+                        .generateUserId(recipientIntegral.getUserId())
+                        .build()
+        );
+
+        recipientIntegral.setConsumptionPoints(recipientIntegral.getConsumptionPoints() + createReqVO.getConsumptionPoints());
+        integralService.updateIntegral(BeanUtils.toBean(recipientIntegral, IntegralSaveReqVO.class));
+
+        // 记录变动日志
+        consumptionChangeLogService.createConsumptionChangeLog(
+                ConsumptionChangeLogSaveReqVO.builder()
+                        .userId(recipientIntegral.getUserId())
+                        .consumptionPoints(createReqVO.getConsumptionPoints())
+                        .afterConsumptionPoints(recipientIntegral.getConsumptionPoints())
+                        .consumptionStatus(ConsumptionEnum.CONSUMPTION_RECIPIENT.getType())
+                        .generateUserId(transferIntegral.getUserId())
+                        .build()
+        );
+
+        // 插入
+        ConsumptionTransferLogDO consumptionTransferLog = BeanUtils.toBean(createReqVO, ConsumptionTransferLogDO.class);
+        consumptionTransferLog.setConsumptionPoints(-consumptionTransferLog.getConsumptionPoints());
+        consumptionTransferLog.setRecipientPoints(-consumptionTransferLog.getConsumptionPoints());
+        consumptionTransferLog.setAfterTransferConsumptionPoints(transferIntegral.getConsumptionPoints());
+        consumptionTransferLog.setAfterRecipientConsumptionPoints(recipientIntegral.getConsumptionPoints());
+        consumptionTransferLogMapper.insert(consumptionTransferLog);
+        // 返回
+        return consumptionTransferLog.getId();
+    }
+
+    @Override
+    public void updateConsumptionTransferLog(ConsumptionTransferLogSaveReqVO updateReqVO) {
+        // 校验存在
+        validateConsumptionTransferLogExists(updateReqVO.getId());
+        // 更新
+        ConsumptionTransferLogDO updateObj = BeanUtils.toBean(updateReqVO, ConsumptionTransferLogDO.class);
+        consumptionTransferLogMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteConsumptionTransferLog(Long id) {
+        // 校验存在
+        validateConsumptionTransferLogExists(id);
+        // 删除
+        consumptionTransferLogMapper.deleteById(id);
+    }
+
+    private void validateConsumptionTransferLogExists(Long id) {
+        if (consumptionTransferLogMapper.selectById(id) == null) {
+            throw exception(CONSUMPTION_TRANSFER_LOG_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public ConsumptionTransferLogDO getConsumptionTransferLog(Long id) {
+        return consumptionTransferLogMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<ConsumptionTransferLogDO> getConsumptionTransferLogPage(ConsumptionTransferLogPageReqVO pageReqVO) {
+        pageReqVO.setTransferUserId(getLoginUserId());
+        return consumptionTransferLogMapper.selectPage(pageReqVO);
+    }
+
+}

+ 1 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserServiceImpl.java

@@ -1,7 +1,7 @@
 package cn.newfeifan.mall.module.distri.service.duser;
 
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
-import cn.newfeifan.mall.module.distri.controller.admin.integral.vo.IntegralSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.integral.vo.IntegralSaveReqVO;
 import cn.newfeifan.mall.module.distri.controller.admin.socialstatus.bo.SocialStatusBO;
 import cn.newfeifan.mall.module.distri.controller.app.sharepath.vo.SharePathSaveReqVO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;

+ 14 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralService.java

@@ -1,7 +1,7 @@
 package cn.newfeifan.mall.module.distri.service.integral;
 
 import javax.validation.*;
-import cn.newfeifan.mall.module.distri.controller.admin.integral.vo.*;
+import cn.newfeifan.mall.module.distri.controller.app.integral.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.module.distri.enums.CaclEnum;
@@ -107,4 +107,17 @@ public interface IntegralService {
      * @param orderNum 订单号
      */
     void updateUserIntegral(Long userId, CaclEnum caclEnum, Long payIntegral, Long tradeOrderId, String orderNum);
+
+    /**
+     * 佣金转化
+     * @param quota 佣金
+     * @return 结果
+     */
+    Boolean quotaTransition(Long quota);
+
+    Boolean updateUserConsumptionPoints(Long generateUserId,//导致产生积分变动的用户ID
+                                        Long userId, Long amount,
+                                        Long tradeOrderId,
+                                        String orderNum
+    );
 }

+ 71 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralServiceImpl.java

@@ -1,12 +1,17 @@
 package cn.newfeifan.mall.module.distri.service.integral;
 
+import cn.newfeifan.mall.framework.common.exception.ErrorCode;
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.newfeifan.mall.module.distri.constant.DistriConstants;
+import cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog.vo.ConsumptionChangeLogSaveReqVO;
 import cn.newfeifan.mall.module.distri.controller.app.ptprofitlog.vo.PtProfitLogSaveReqVO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.duser.DuserDO;
 import cn.newfeifan.mall.module.distri.dal.mysql.duser.DuserMapper;
 import cn.newfeifan.mall.module.distri.dal.mysql.ptprofit.PtProfitMapper;
 import cn.newfeifan.mall.module.distri.enums.CaclEnum;
+import cn.newfeifan.mall.module.distri.enums.ConsumptionEnum;
 import cn.newfeifan.mall.module.distri.enums.SocialStatusUpdateEnum;
+import cn.newfeifan.mall.module.distri.service.consumptionchangelog.ConsumptionChangeLogService;
 import cn.newfeifan.mall.module.distri.service.ptprofitlog.PtProfitLogService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.stereotype.Service;
@@ -17,7 +22,7 @@ import org.springframework.validation.annotation.Validated;
 
 import java.util.*;
 
-import cn.newfeifan.mall.module.distri.controller.admin.integral.vo.*;
+import cn.newfeifan.mall.module.distri.controller.app.integral.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
@@ -25,6 +30,7 @@ import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 import cn.newfeifan.mall.module.distri.dal.mysql.integral.IntegralMapper;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
 
 /**
@@ -48,6 +54,9 @@ public class IntegralServiceImpl implements IntegralService {
     @Resource
     private PtProfitLogService ptProfitLogService;
 
+    @Resource
+    private ConsumptionChangeLogService consumptionChangeLogService;
+
     @Override
     public Long createIntegral(IntegralSaveReqVO createReqVO) {
         // 插入
@@ -203,4 +212,65 @@ public class IntegralServiceImpl implements IntegralService {
 
         ptProfitLogService.addMessage(userId,userId,caclEnum,payIntegral,integralDO.getCurrentQuota(),0L,0L,null,tradeOrderId,orderNum);
     }
+
+    @Override
+    public Boolean quotaTransition(Long quota) {
+        Long userId = getLoginUserId();
+
+        // 输入的佣金要放大才能与数据库中匹配
+        quota = quota * DistriConstants.INTEGRAL_PAGE2DB;
+        IntegralDO integralDO = integralMapper.selectOne(IntegralDO::getUserId,userId);
+
+        if(integralDO.getCurrentQuota() < quota){
+            ErrorCode ERROR = new ErrorCode(1_002_030_003, "可用积分不足");
+            throw exception(ERROR);
+        }
+
+        integralDO.setCurrentQuota(integralDO.getCurrentQuota() - quota);
+        integralDO.setConsumptionPoints(integralDO.getConsumptionPoints() + quota);
+        integralMapper.updateById(integralDO);
+
+        consumptionChangeLogService.createConsumptionChangeLog(
+                ConsumptionChangeLogSaveReqVO.builder()
+                        .userId(userId)
+                        .consumptionStatus(ConsumptionEnum.COMMISSION_TRANSITION.getType())
+                        .consumptionPoints(quota)
+                        .afterConsumptionPoints(integralDO.getConsumptionPoints())
+                        .build());
+
+        ptProfitLogService.createPtProfitLog(
+                PtProfitLogSaveReqVO.builder()
+                        .amount(-quota)
+                        .afterAmount(integralDO.getCurrentQuota())
+                        .userId(userId)
+                        .generateUserId(userId)
+                        .profitStatus(CaclEnum.COMMISSION_TRANSITION.getType())
+                        .build());
+
+        return true;
+    }
+
+    @Override
+    public Boolean updateUserConsumptionPoints(Long generateUserId, Long userId, Long amount, Long tradeOrderId, String orderNum) {
+        IntegralDO integralDO = integralMapper.selectOne(IntegralDO::getUserId, userId);
+        // 消费分不足
+        if(integralDO.getConsumptionPoints() < amount){
+            return false;
+        }
+
+        // 修改用户消费积分
+        integralDO.setConsumptionPoints(integralDO.getConsumptionPoints() - amount);
+        integralMapper.updateById(integralDO);
+
+        consumptionChangeLogService.createConsumptionChangeLog(
+                ConsumptionChangeLogSaveReqVO.builder()
+                        .userId(userId)
+                        .generateUserId(generateUserId)
+                        .consumptionStatus(ConsumptionEnum.PAY_ORDER.getType())
+                        .consumptionPoints(-amount)
+                        .afterConsumptionPoints(integralDO.getConsumptionPoints())
+                        .build());
+
+        return true;
+    }
 }

+ 2 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/orderpercentage/OrderPercentageService.java

@@ -2,8 +2,8 @@ package cn.newfeifan.mall.module.distri.service.orderpercentage;
 
 import javax.validation.*;
 
-import cn.newfeifan.mall.module.distri.controller.admin.orderpercentage.vo.OrderPercentageDoubleSaveReqVO;
-import cn.newfeifan.mall.module.distri.controller.admin.orderpercentage.vo.OrderPercentagePageReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.orderpercentage.vo.OrderPercentageDoubleSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.orderpercentage.vo.OrderPercentagePageReqVO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.orderpercentage.OrderPercentageDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 

+ 5 - 5
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/orderpercentage/OrderPercentageServiceImpl.java

@@ -1,9 +1,9 @@
 package cn.newfeifan.mall.module.distri.service.orderpercentage;
 
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
-import cn.newfeifan.mall.module.distri.controller.admin.orderpercentage.vo.OrderPercentageDoubleSaveReqVO;
-import cn.newfeifan.mall.module.distri.controller.admin.orderpercentage.vo.OrderPercentagePageReqVO;
-import cn.newfeifan.mall.module.distri.controller.admin.orderpercentage.vo.OrderPercentageSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.orderpercentage.vo.OrderPercentageDoubleSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.orderpercentage.vo.OrderPercentagePageReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.orderpercentage.vo.OrderPercentageSaveReqVO;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -19,7 +19,7 @@ import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 import cn.newfeifan.mall.module.distri.dal.mysql.orderpercentage.OrderPercentageMapper;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.newfeifan.mall.module.distri.constant.DistriConstants.ONE_HUNDRED;
+import static cn.newfeifan.mall.module.distri.constant.DistriConstants.ONE;
 import static cn.newfeifan.mall.module.distri.constant.DistriConstants.PERCENT;
 import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
 
@@ -58,7 +58,7 @@ public class OrderPercentageServiceImpl implements OrderPercentageService {
         // 判断是否等于1
         Double total =  createReqVO.getGrossProfitUserQuotaPerc()+createReqVO.getGrossProfitAncestorQuotaPerc()+createReqVO.getGrossProfitPlatformQuotaPerc()
                 +createReqVO.getGrossProfitBonusQuotaPerc();
-        return total > ONE_HUNDRED;
+        return total > ONE;
     }
 
 

+ 1 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/usersigninlog/UserSignInLogServiceImpl.java

@@ -1,6 +1,6 @@
 package cn.newfeifan.mall.module.distri.service.usersigninlog;
 
-import cn.newfeifan.mall.module.distri.controller.admin.orderpercentage.vo.OrderPercentageRedisVO;
+import cn.newfeifan.mall.module.distri.controller.app.orderpercentage.vo.OrderPercentageRedisVO;
 import cn.newfeifan.mall.module.distri.controller.app.usersigninlog.vo.UserSignInLogPageReqVO;
 import cn.newfeifan.mall.module.distri.controller.app.usersigninlog.vo.UserSignInLogSaveReqVO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.orderpercentage.OrderPercentageDO;

+ 60 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderService.java

@@ -0,0 +1,60 @@
+package cn.newfeifan.mall.module.distri.service.usertopupconsumptionpointsorder;
+
+import javax.validation.*;
+import cn.newfeifan.mall.module.distri.controller.app.usertopupconsumptionpointsorder.vo.*;
+import cn.newfeifan.mall.module.distri.dal.dataobject.usertopupconsumptionpointsorder.UserTopUpConsumptionPointsOrderDO;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderDO;
+
+/**
+ * 用户充值消费分订单 Service 接口
+ *
+ * @author 非繁人
+ */
+public interface UserTopUpConsumptionPointsOrderService {
+
+    /**
+     * 创建用户充值消费分订单
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    UserTopUpConsumptionPointsOrderInfoRespVO createUserTopUpConsumptionPointsOrder(@Valid UserTopUpConsumptionPointsOrderSaveReqVO createReqVO);
+
+    /**
+     * 更新用户充值消费分订单
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateUserTopUpConsumptionPointsOrder(@Valid UserTopUpConsumptionPointsOrderSaveReqVO updateReqVO);
+
+    /**
+     * 删除用户充值消费分订单
+     *
+     * @param id 编号
+     */
+    void deleteUserTopUpConsumptionPointsOrder(Long id);
+
+    /**
+     * 获得用户充值消费分订单
+     *
+     * @param id 编号
+     * @return 用户充值消费分订单
+     */
+    UserTopUpConsumptionPointsOrderDO getUserTopUpConsumptionPointsOrder(Long id);
+
+    /**
+     * 获得用户充值消费分订单分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 用户充值消费分订单分页
+     */
+    PageResult<UserTopUpConsumptionPointsOrderDO> getUserTopUpConsumptionPointsOrderPage(UserTopUpConsumptionPointsOrderPageReqVO pageReqVO);
+
+    /**
+     * 充值消费
+     * @param payOrderDO 支付订单
+     */
+    void topUpConsumptionPoints(PayOrderDO payOrderDO);
+
+}

+ 209 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderServiceImpl.java

@@ -0,0 +1,209 @@
+package cn.newfeifan.mall.module.distri.service.usertopupconsumptionpointsorder;
+
+import cn.newfeifan.mall.framework.common.exception.ErrorCode;
+import cn.newfeifan.mall.module.distri.config.OrderProperties;
+import cn.newfeifan.mall.module.distri.constant.DistriConstants;
+import cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog.vo.ConsumptionChangeLogSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.integral.vo.IntegralSaveReqVO;
+import cn.newfeifan.mall.module.distri.convert.usertopupconsumptionpointsorder.UserTopUpConsumptionPointsOrderConvert;
+import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.orderpercentage.OrderPercentageDO;
+import cn.newfeifan.mall.module.distri.dal.redis.no.OrderNoRedisDAO;
+import cn.newfeifan.mall.module.distri.enums.ConsumptionEnum;
+import cn.newfeifan.mall.module.distri.service.consumptionchangelog.ConsumptionChangeLogService;
+import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
+import cn.newfeifan.mall.module.distri.service.orderpercentage.OrderPercentageService;
+import cn.newfeifan.mall.module.pay.dal.dataobject.app.PayAppDO;
+import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderDO;
+import cn.newfeifan.mall.module.pay.dal.mysql.order.PayOrderMapper;
+import cn.newfeifan.mall.module.pay.service.app.PayAppService;
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+import org.springframework.validation.annotation.Validated;
+
+import cn.newfeifan.mall.module.distri.controller.app.usertopupconsumptionpointsorder.vo.*;
+import cn.newfeifan.mall.module.distri.dal.dataobject.usertopupconsumptionpointsorder.UserTopUpConsumptionPointsOrderDO;
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+
+import cn.newfeifan.mall.module.distri.dal.mysql.usertopupconsumptionpointsorder.UserTopUpConsumptionPointsOrderMapper;
+
+
+import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.framework.common.util.servlet.ServletUtils.getClientIP;
+import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+import static cn.newfeifan.mall.framework.web.core.util.WebFrameworkUtils.getTerminal;
+import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
+
+/**
+ * 用户充值消费分订单 Service 实现类
+ *
+ * @author 非繁人
+ */
+@Service
+@Validated
+@Slf4j
+public class UserTopUpConsumptionPointsOrderServiceImpl implements UserTopUpConsumptionPointsOrderService {
+
+    @Resource
+    private UserTopUpConsumptionPointsOrderMapper userTopUpConsumptionPointsOrderMapper;
+    @Resource
+    private OrderPercentageService orderPercentageService;
+    @Resource
+    private IntegralService integralService;
+    @Resource
+    private ConsumptionChangeLogService consumptionChangeLogService;
+    @Resource
+    private OrderNoRedisDAO orderNoRedisDAO;
+    @Resource
+    private OrderProperties orderProperties;
+    @Resource
+    private PayAppService appService;
+    @Resource
+    private PayOrderMapper payOrderMapper;
+
+    @Override
+    public UserTopUpConsumptionPointsOrderInfoRespVO createUserTopUpConsumptionPointsOrder(UserTopUpConsumptionPointsOrderSaveReqVO createReqVO) {
+        // 初始化订单
+        orderInit(createReqVO);
+
+        UserTopUpConsumptionPointsOrderDO userTopUpConsumptionPointsOrder = BeanUtils.toBean(createReqVO, UserTopUpConsumptionPointsOrderDO.class);
+        userTopUpConsumptionPointsOrderMapper.insert(userTopUpConsumptionPointsOrder);
+
+        // 创建支付订单
+        PayOrderDO payOrder = createPayOrder(userTopUpConsumptionPointsOrder);
+        userTopUpConsumptionPointsOrder.setPayOrderId(payOrder.getId());
+
+        // 同步支付订单id
+        userTopUpConsumptionPointsOrderMapper.updateById(userTopUpConsumptionPointsOrder);
+
+        // 返回
+        return UserTopUpConsumptionPointsOrderInfoRespVO.builder()
+                .id(userTopUpConsumptionPointsOrder.getId())
+                .payOrderId(userTopUpConsumptionPointsOrder.getPayOrderId())
+                .build();
+    }
+
+    /**
+     * 创建支付订单
+     *
+     * @param createReqVO 充值订单信息
+     * @return 支付订单
+     */
+    private PayOrderDO createPayOrder(UserTopUpConsumptionPointsOrderDO createReqVO) {
+        // 校验 App
+        PayAppDO app = appService.validPayApp(orderProperties.getAppId());
+
+        PayOrderDO payOrderDO = UserTopUpConsumptionPointsOrderConvert.INSTANCE.convert(createReqVO, orderProperties);
+        payOrderDO.setNotifyUrl(app.getOrderNotifyUrl());
+        payOrderMapper.insert(payOrderDO);
+        return payOrderDO;
+    }
+
+    /**
+     * 订单转换
+     *
+     * @param createReqVO       订单信息
+     */
+    private void orderInit(UserTopUpConsumptionPointsOrderSaveReqVO createReqVO) {
+        // 计算百分比
+        OrderPercentageDO orderPercentageDO = orderPercentageService.queryStatus();
+
+        if(createReqVO.getPayPrice() < Double.parseDouble(orderPercentageDO.getUserTopUpConsumptionPoints())){
+            ErrorCode ERROR = new ErrorCode(1_002_030_038, "用户充值金额不得小于:" + orderPercentageDO.getUserTopUpConsumptionPoints());
+            throw exception(ERROR);
+        }
+
+        createReqVO.setUserId(getLoginUserId());
+        createReqVO.setUserIp(getClientIP());
+        createReqVO.setTerminal(getTerminal());
+        createReqVO.setSubject("消费分");
+        createReqVO.setPayStatus(false);
+        createReqVO.setNo(orderNoRedisDAO.generate(OrderNoRedisDAO.TRADE_ORDER_NO_PREFIX));
+
+        // 转换金额
+        createReqVO.setPayPrice(createReqVO.getPayPrice() * DistriConstants.ONE_HUNDRED);
+        createReqVO.setTopUpConsumptionPoints(createReqVO.getPayPrice() * DistriConstants.PERCENT);
+
+        // 根据充值金额计算实际到账金额
+        if(createReqVO.getTopUpConsumptionPoints() >= Double.parseDouble(orderPercentageDO.getTriggerMagnificationPoints()) * DistriConstants.INTEGRAL_PAGE2DB){
+        createReqVO.setPracticalConsumptionPoints((long) (createReqVO.getTopUpConsumptionPoints() * Double.parseDouble(orderPercentageDO.getConsumptionMagnification())));
+        } else {
+            createReqVO.setPracticalConsumptionPoints(createReqVO.getTopUpConsumptionPoints().longValue());
+        }
+        createReqVO.setPercentTemplate(JSON.toJSONString(orderPercentageDO));
+    }
+
+    @Override
+    public void updateUserTopUpConsumptionPointsOrder(UserTopUpConsumptionPointsOrderSaveReqVO updateReqVO) {
+        // 校验存在
+        validateUserTopUpConsumptionPointsOrderExists(updateReqVO.getId());
+        // 更新
+        UserTopUpConsumptionPointsOrderDO updateObj = BeanUtils.toBean(updateReqVO, UserTopUpConsumptionPointsOrderDO.class);
+        userTopUpConsumptionPointsOrderMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteUserTopUpConsumptionPointsOrder(Long id) {
+        // 校验存在
+        validateUserTopUpConsumptionPointsOrderExists(id);
+        // 删除
+        userTopUpConsumptionPointsOrderMapper.deleteById(id);
+    }
+
+    private void validateUserTopUpConsumptionPointsOrderExists(Long id) {
+        if (userTopUpConsumptionPointsOrderMapper.selectById(id) == null) {
+            throw exception(USER_TOP_UP_CONSUMPTION_POINTS_ORDER_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public UserTopUpConsumptionPointsOrderDO getUserTopUpConsumptionPointsOrder(Long id) {
+        return userTopUpConsumptionPointsOrderMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<UserTopUpConsumptionPointsOrderDO> getUserTopUpConsumptionPointsOrderPage(UserTopUpConsumptionPointsOrderPageReqVO pageReqVO) {
+        return userTopUpConsumptionPointsOrderMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public void topUpConsumptionPoints(PayOrderDO payOrderDO) {
+        UserTopUpConsumptionPointsOrderDO topUpOrder = userTopUpConsumptionPointsOrderMapper.selectById(payOrderDO.getMerchantOrderId());
+
+        log.info("充值订单对象:{}", topUpOrder);
+        if(topUpOrder.getPayStatus()){
+            log.info("充值订单状态为已支付,return结束!");
+            return;
+        }
+
+        // 修改订单状态
+        userTopUpConsumptionPointsOrderMapper.updateById(UserTopUpConsumptionPointsOrderDO.builder()
+                .id(topUpOrder.getId())
+                .payStatus(true)
+                .payTime(payOrderDO.getSuccessTime())
+                .payChannelCode(payOrderDO.getChannelCode())
+                .finishTime(payOrderDO.getSuccessTime())
+                .build());
+
+        // 获取钱包
+        IntegralDO integralDO = integralService.selectByUser(topUpOrder.getUserId());
+        integralDO.setConsumptionPoints(integralDO.getConsumptionPoints() + topUpOrder.getPracticalConsumptionPoints());
+        integralService.updateIntegral(BeanUtils.toBean(integralDO, IntegralSaveReqVO.class));
+
+        // 消费分变动日志
+        consumptionChangeLogService.createConsumptionChangeLog(ConsumptionChangeLogSaveReqVO.builder()
+                .userId(topUpOrder.getUserId())
+                .consumptionStatus(ConsumptionEnum.TOP_UP_GET.getType())
+                .consumptionPoints(topUpOrder.getPracticalConsumptionPoints())
+                .afterConsumptionPoints(integralDO.getConsumptionPoints())
+                .practicalConsumptionPoints(topUpOrder.getTopUpConsumptionPoints())
+                .generateUserId(topUpOrder.getUserId())
+                .build());
+    }
+
+}

+ 12 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/consumptionchangelog/ConsumptionChangeLogMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.newfeifan.mall.module.distri.dal.mysql.consumptionchangelog.ConsumptionChangeLogMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.zhongxing.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>

+ 12 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/consumptiontopuplog/ConsumptionTopUpLogMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.newfeifan.mall.module.distri.dal.mysql.consumptiontopuplog.ConsumptionTopUpLogMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.zhongxing.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>

+ 12 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/consumptiontransferlog/ConsumptionTransferLogMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.newfeifan.mall.module.distri.dal.mysql.consumptiontransferlog.ConsumptionTransferLogMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.zhongxing.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>

+ 12 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.newfeifan.mall.module.distri.dal.mysql.usertopupconsumptionpointsorder.UserTopUpConsumptionPointsOrderMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.zhongxing.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>

+ 1 - 0
feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/ErrorCodeConstants.java

@@ -95,5 +95,6 @@ public interface ErrorCodeConstants {
 
     ErrorCode MESSAGE_LOG_NOT_EXISTS = new ErrorCode(1_011_008_004, "微信模板消息日志不存在");
     ErrorCode ORDER_PAY_ERROR = new ErrorCode(1_011_008_005, "钱包积分不够支付");
+    ErrorCode ORDER_PAY_CONSUMPTION_POINTS_ERROR = new ErrorCode(1_011_008_006, "钱包消费分不够支付");
 
 }

+ 9 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/aftersale/vo/AppAfterSaleRespVO.java

@@ -76,7 +76,6 @@ public class AppAfterSaleRespVO {
 
     /**
      * 审批备注
-     *
      * 注意,只有审批不通过才会填写
      */
     private String auditReason;
@@ -112,4 +111,13 @@ public class AppAfterSaleRespVO {
     @Schema(description = "商户id", example = "27067")
     private Long merchantId;
 
+    @Schema(description = "退还的使用的消费分")
+    private Long refundConsumptionPoints;
+
+    @Schema(description = "退款总金额,单位:分")
+    private Long refundPriceTotal;
+
+    @Schema(description = "退还的使用的积分")
+    private Long refundIntegral;
+
 }

+ 40 - 19
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/AppTradeOrderController.java

@@ -3,11 +3,14 @@ package cn.newfeifan.mall.module.trade.controller.app.order;
 import cn.newfeifan.mall.framework.common.pojo.CommonResult;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.security.core.annotations.PreAuthenticated;
+import cn.newfeifan.mall.module.distri.service.usertopupconsumptionpointsorder.UserTopUpConsumptionPointsOrderService;
 import cn.newfeifan.mall.module.pay.api.notify.dto.PayOrderNotifyReqDTO;
 import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderRespVO;
+import cn.newfeifan.mall.module.pay.controller.app.order.vo.AppPayOrderSubmitZeroPurchaseReqVO;
 import cn.newfeifan.mall.module.pay.convert.order.PayOrderConvert;
 import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderDO;
 import cn.newfeifan.mall.module.pay.dal.mysql.order.PayOrderMapper;
+import cn.newfeifan.mall.module.pay.enums.DictTypeConstants;
 import cn.newfeifan.mall.module.pay.enums.order.PayOrderStatusEnum;
 import cn.newfeifan.mall.module.pay.service.fuyouorder.FuYouPayOrderService;
 import cn.newfeifan.mall.module.pay.service.order.PayOrderService;
@@ -73,14 +76,16 @@ public class AppTradeOrderController {
 
     @Resource
     private FuYouPayOrderService fuYouPayOrderService;
+    @Resource
+    private UserTopUpConsumptionPointsOrderService userTopUpConsumptionPointsOrderService;
 
     @GetMapping("/getPayOrderByStatus2")
     @Operation(summary = "获得支付订单2")
     @Parameter(name = "id", description = "支付订单编号", required = true, example = "1024")
     public CommonResult<PayOrderRespVO> getPayOrderByStatus2(@RequestParam("id") Long id) {
-        log.info("getPayOrderByStatus2:=========id:{}",id);
+        log.info("getPayOrderByStatus2:=========id:{}", id);
         PayOrderDO oldPayOrderDO = payOrderMapper.selectById(id);
-        log.info("getPayOrderByStatus2:oldPayOrderDO===========:{}",oldPayOrderDO);
+        log.info("getPayOrderByStatus2:oldPayOrderDO===========:{}", oldPayOrderDO);
         PayOrderDO newPayOrderDO = payOrderService.getOrderByStatus(oldPayOrderDO);
 
         return getPayOrderRespVOCommonResult(id, newPayOrderDO, oldPayOrderDO);
@@ -90,11 +95,11 @@ public class AppTradeOrderController {
     @Operation(summary = "查询富友支付订单状态")
     @Parameter(name = "payOrderNo", description = "支付订单编号", required = true, example = "16103-202407151500201")
     public CommonResult<PayOrderRespVO> getFuYouPayOrderByStatus(@RequestParam("payOrderNo") String payOrderNo) {
-        log.info("getPayOrderByStatus2:=========id:{}",payOrderNo);
+        log.info("getPayOrderByStatus2:=========id:{}", payOrderNo);
         PayOrderDO oldPayOrderDO = payOrderMapper.selectByPayOrderNo(payOrderNo);
 
         // 若查无此订单
-        if(oldPayOrderDO == null){
+        if (oldPayOrderDO == null) {
             throw exception(PAY_ORDER_NOT_FOUND);
         }
 
@@ -108,24 +113,28 @@ public class AppTradeOrderController {
         CommonResult<PayOrderRespVO> success = success(PayOrderConvert.INSTANCE.convert(newPayOrderDO));
 
         //如果在上一行代码,把支付订单状态从“待支付”,改为“已支付”,则证明订单支付成功,则改trade_order表状态为待发货,并且分配积分
-        if(oldPayOrderDO.getStatus().equals(PayOrderStatusEnum.WAITING.getStatus())
+        if (oldPayOrderDO.getStatus().equals(PayOrderStatusEnum.WAITING.getStatus())
                 &&
                 newPayOrderDO.getStatus().equals(PayOrderStatusEnum.SUCCESS.getStatus())
-        )
-        {
-            //只有支付订单id参数payOrderId是有用的。
-            List list = tradeOrderUpdateService.updateOrderPaid(id);
-            Object jfObj = list.get(0);
-            Object sjObj = list.get(1);
-
-            Long jf = (Long)jfObj;//待确权积分
-            Double sj = (Double)sjObj;//待确权身价
-
-            success.getData().setJf(jf);
-            success.getData().setSj(sj);
+        ) {
+            // 判断是否是商品订单
+            if (newPayOrderDO.getNo().contains(DictTypeConstants.TUP_UP_NO) || (newPayOrderDO.getPayOrderNo() != null && newPayOrderDO.getPayOrderNo().contains(DictTypeConstants.TUP_UP_NO))) {
+                userTopUpConsumptionPointsOrderService.topUpConsumptionPoints(newPayOrderDO);
+            } else {
+                //只有支付订单id参数payOrderId是有用的。
+                List list = tradeOrderUpdateService.updateOrderPaid(id);
+                Object jfObj = list.get(0);
+                Object sjObj = list.get(1);
+
+                Long jf = (Long) jfObj;//待确权积分
+                Double sj = (Double) sjObj;//待确权身价
+
+                success.getData().setJf(jf);
+                success.getData().setSj(sj);
+            }
         }
 
-        log.info("getPayOrderByStatus2:success===========:{}",success);
+        log.info("getPayOrderByStatus2:success===========:{}", success);
         return success;
     }
 
@@ -133,6 +142,7 @@ public class AppTradeOrderController {
     /**
      * add by Ben
      * 待支付订单,点支付时的新增方法
+     *
      * @param tradeOrderId 订单id
      * @return 支付订单
      */
@@ -187,11 +197,16 @@ public class AppTradeOrderController {
         DeliveryExpressDO express = order.getLogisticsId() != null && order.getLogisticsId() > 0 ?
                 deliveryExpressService.getDeliveryExpress(order.getLogisticsId()) : null;
         // 最终组合
-        CommonResult<AppTradeOrderDetailRespVO> rs=
+        CommonResult<AppTradeOrderDetailRespVO> rs =
                 success(TradeOrderConvert.INSTANCE.convert02(order, orderItems, tradeOrderProperties, express));
+        for (AppTradeOrderItemRespVO item : rs.getData().getItems()) {
+            if (item.getAfterSaleId() != null)
+                item.setRefundStatus(afterSaleService.getAfterSale(item.getAfterSaleId()).getStatus());
+        }
 
         //设置订单支付的积分
         rs.getData().setPayIntegral(order.getPayIntegral());
+        rs.getData().setPayConsumptionPoints(order.getPayConsumptionPoints());
         tradeOrderQueryService.setSpuType(rs.getData().getItems());
 
         return rs;
@@ -293,4 +308,10 @@ public class AppTradeOrderController {
         return success(tradeOrderUpdateService.createOrderItemCommentByMember(getLoginUserId(), createReqVO));
     }
 
+    @PostMapping("/submit-ZeroPurchase")
+    @Operation(summary = "提交支付订单(零元购)")
+    public CommonResult<PayOrderRespVO> submitOrderByZeroPurchase(@RequestBody AppPayOrderSubmitZeroPurchaseReqVO reqVO) {
+        return success(tradeOrderUpdateService.submitOrderByZeroPurchase(reqVO));
+    }
+
 }

+ 3 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java

@@ -19,6 +19,9 @@ public class AppTradeOrderCreateReqVO extends AppTradeOrderSettlementReqVO {
     @Schema(description = "本订单使用积分,为一整数", example = "36")
     private Double payIntegral;
 
+    @Schema(description = "本订单使用消费分", example = "36")
+    private Double payConsumptionPoints;
+
     @Schema(description = "【本属性已不作页面与后台传值使用,被shopRemarks替代。本属性只作java内部使用】备注", example = "这个是我的订单哟")
     private String remark;
 

+ 3 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/AppTradeOrderDetailRespVO.java

@@ -15,6 +15,9 @@ public class AppTradeOrderDetailRespVO {
     @Schema(description = "订单使用积分", example = "8900000")
     private Double payIntegral;
 
+    @Schema(description = "本订单使用消费分", example = "36")
+    private Long payConsumptionPoints;
+
     // ========== 订单基本信息 ==========
 
     @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")

+ 3 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/AppTradeOrderSettlementRespVO.java

@@ -28,6 +28,9 @@ public class AppTradeOrderSettlementRespVO {
     @Schema(description = "用户当前积分值", requiredMode = Schema.RequiredMode.REQUIRED, example = "98760000")
     private Long currentQuota;
 
+    @Schema(description = "当前消费分", example = "10")
+    private Long consumePoints;
+
     @Schema(description = "交易类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") // 对应 TradeOrderTypeEnum 枚举
     private Integer type;
 

+ 3 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/item/AppTradeOrderItemRespVO.java

@@ -68,4 +68,7 @@ public class AppTradeOrderItemRespVO {
     @Schema(description = "商品支付类别", example = "1")
     private Integer spuPayType;
 
+    @Schema(description = "退款状态")
+    private Integer refundStatus;
+
 }

+ 13 - 20
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/aftersale/AfterSaleDO.java

@@ -33,37 +33,31 @@ public class AfterSaleDO extends BaseDO {
     private Long id;
     /**
      * 售后单号
-     *
      * 例如说,1146347329394184195
      */
     private String no;
     /**
      * 退款状态
-     *
      * 枚举 {@link AfterSaleStatusEnum}
      */
     private Integer status;
     /**
      * 售后方式
-     *
      * 枚举 {@link AfterSaleWayEnum}
      */
     private Integer way;
     /**
      * 售后类型
-     *
      * 枚举 {@link AfterSaleTypeEnum}
      */
     private Integer type;
     /**
      * 用户编号
-     *
      * 关联 MemberUserDO 的 id 编号
      */
     private Long userId;
     /**
      * 申请原因
-     *
      * type = 退款,对应 trade_after_sale_refund_reason 类型
      * type = 退货退款,对应 trade_after_sale_refund_and_return_reason 类型
      */
@@ -74,7 +68,6 @@ public class AfterSaleDO extends BaseDO {
     private String applyDescription;
     /**
      * 补充凭证图片
-     *
      * 数组,以逗号分隔
      */
     @TableField(typeHandler = JacksonTypeHandler.class)
@@ -83,52 +76,44 @@ public class AfterSaleDO extends BaseDO {
     // ========== 交易订单相关 ==========
     /**
      * 交易订单编号
-     *
      * 关联 {@link TradeOrderDO#getId()}
      */
     private Long orderId;
     /**
      * 订单流水号
-     *
      * 冗余 {@link TradeOrderDO#getNo()}
      */
     private String orderNo;
     /**
      * 交易订单项编号
-     *
      * 关联 {@link TradeOrderItemDO#getId()}
      */
     private Long orderItemId;
     /**
      * 商品 SPU 编号
-     *
      * 关联 ProductSpuDO 的 id 字段
      * 冗余 {@link TradeOrderItemDO#getSpuId()}
      */
     private Long spuId;
     /**
      * 商品 SPU 名称
-     *
      * 关联 ProductSkuDO 的 name 字段
      * 冗余 {@link TradeOrderItemDO#getSpuName()}
      */
     private String spuName;
     /**
      * 商品 SKU 编号
-     *
      * 关联 ProductSkuDO 的编号
      */
     private Long skuId;
     /**
      * 属性数组,JSON 格式
-     *
      * 冗余 {@link TradeOrderItemDO#getProperties()}
      */
     @TableField(typeHandler = TradeOrderItemDO.PropertyTypeHandler.class)
     private List<TradeOrderItemDO.Property> properties;
     /**
      * 商品图片
-     *
      * 冗余 {@link TradeOrderItemDO#getPicUrl()}
      */
     private String picUrl;
@@ -145,13 +130,11 @@ public class AfterSaleDO extends BaseDO {
     private LocalDateTime auditTime;
     /**
      * 审批人
-     *
      * 关联 AdminUserDO 的 id 编号
      */
     private Long auditUserId;
     /**
      * 审批备注
-     *
      * 注意,只有审批不通过才会填写
      */
     private String auditReason;
@@ -163,7 +146,6 @@ public class AfterSaleDO extends BaseDO {
     private Integer refundPrice;
     /**
      * 支付退款编号
-     *
      * 对接 pay-module-biz 支付服务的退款订单编号,即 PayRefundDO 的 id 编号
      */
     private Long payRefundId;
@@ -175,7 +157,6 @@ public class AfterSaleDO extends BaseDO {
     // ========== 退货相关 ==========
     /**
      * 退货物流公司编号
-     *
      * 关联 LogisticsDO 的 id 编号
      */
     private Long logisticsId;
@@ -193,7 +174,6 @@ public class AfterSaleDO extends BaseDO {
     private LocalDateTime receiveTime;
     /**
      * 收货备注
-     *
      * 注意,只有拒绝收货才会填写
      */
     private String receiveReason;
@@ -207,4 +187,17 @@ public class AfterSaleDO extends BaseDO {
      */
     private Long merchantId;
 
+    /**
+     * 退还的使用的消费分
+     */
+    private Long refundConsumptionPoints;
+    /**
+     * 退款总金额,单位:分
+     */
+    private Long refundPriceTotal;
+    /**
+     * 退还的使用的积分
+     */
+    private Long refundIntegral;
+
 }

+ 9 - 30
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderDO.java

@@ -69,25 +69,21 @@ public class TradeOrderDO extends BaseDO {
     private Long id;
     /**
      * 订单流水号
-     *
      * 例如说,1146347329394184195
      */
     private String no;
     /**
      * 订单类型
-     *
      * 枚举 {@link TradeOrderTypeEnum}
      */
     private Integer type;
     /**
      * 订单来源
-     *
      * 枚举 {@link TerminalEnum}
      */
     private Integer terminal;
     /**
      * 用户编号
-     *
      * 关联 MemberUserDO 的 id 编号
      */
     private Long userId;
@@ -101,7 +97,6 @@ public class TradeOrderDO extends BaseDO {
     private String userRemark;
     /**
      * 订单状态
-     *
      * 枚举 {@link TradeOrderStatusEnum}
      */
     private Integer status;
@@ -119,7 +114,6 @@ public class TradeOrderDO extends BaseDO {
     private LocalDateTime cancelTime;
     /**
      * 取消类型
-     *
      * 枚举 {@link TradeOrderCancelTypeEnum}
      */
     private Integer cancelType;
@@ -129,7 +123,6 @@ public class TradeOrderDO extends BaseDO {
     private String remark;
     /**
      * 是否评价
-     *
      * true - 已评价
      * false - 未评价
      */
@@ -137,7 +130,6 @@ public class TradeOrderDO extends BaseDO {
 
     /**
      * 推广人编号
-     *
      * 关联 {@link BrokerageUserDO#getId()} 字段,即 {@link MemberUserRespDTO#getId()} 字段
      */
     private Long brokerageUserId;
@@ -150,13 +142,11 @@ public class TradeOrderDO extends BaseDO {
 
     /**
      * 支付订单编号
-     *
      * 对接 pay-module-biz 支付服务的支付订单编号,即 PayOrderDO 的 id 编号
      */
     private Long payOrderId;
     /**
      * 是否已支付
-     *
      * true - 已经支付过
      * false - 没有支付过
      */
@@ -174,15 +164,12 @@ public class TradeOrderDO extends BaseDO {
 
     /**
      * 商品原价,单位:分
-     *
      * totalPrice = {@link TradeOrderItemDO#getPrice()} * {@link TradeOrderItemDO#getCount()} 求和
-     *
      * 对应 taobao 的 trade.total_fee 字段
      */
     private Integer totalPrice;
     /**
      * 优惠金额,单位:分
-     *
      * 对应 taobao 的 order.discount_fee 字段
      */
     private Integer discountPrice;
@@ -192,13 +179,11 @@ public class TradeOrderDO extends BaseDO {
     private Integer deliveryPrice;
     /**
      * 订单调价,单位:分
-     *
      * 正数,加价;负数,减价
      */
     private Integer adjustPrice;
     /**
      * 应付金额(总),单位:分
-     *
      * = {@link #totalPrice}
      * - {@link #couponPrice}
      * - {@link #pointPrice}
@@ -212,21 +197,17 @@ public class TradeOrderDO extends BaseDO {
     // ========== 收件 + 物流基本信息 ==========
     /**
      * 配送方式
-     *
      * 枚举 {@link DeliveryTypeEnum}
      */
     private Integer deliveryType;
     /**
      * 发货物流公司编号
-     *
      * 如果无需发货,则 logisticsId 设置为 0。原因是,不想再添加额外字段
-     *
      * 关联 {@link DeliveryExpressDO#getId()}
      */
     private Long logisticsId;
     /**
      * 发货物流单号
-     *
      * 如果无需发货,则 logisticsNo 设置 ""。原因是,不想再添加额外字段
      */
     private String logisticsNo;
@@ -258,7 +239,6 @@ public class TradeOrderDO extends BaseDO {
 
     /**
      * 自提门店编号
-     *
      * 关联 {@link DeliveryPickUpStoreDO#getId()}
      */
     private Long pickUpStoreId;
@@ -270,13 +250,11 @@ public class TradeOrderDO extends BaseDO {
     // ========== 售后基本信息 ==========
     /**
      * 售后状态
-     *
      * 枚举 {@link TradeOrderRefundStatusEnum}
      */
     private Integer refundStatus;
     /**
      * 退款金额,单位:分
-     *
      * 注意,退款并不会影响 {@link #payPrice} 实际支付金额
      * 也就说,一个订单最终产生多少金额的收入 = payPrice - refundPrice
      */
@@ -289,7 +267,6 @@ public class TradeOrderDO extends BaseDO {
     private Long couponId;
     /**
      * 优惠劵减免金额,单位:分
-     *
      * 对应 taobao 的 trade.coupon_fee 字段
      */
     private Integer couponPrice;
@@ -299,7 +276,6 @@ public class TradeOrderDO extends BaseDO {
     private Integer usePoint;
     /**
      * 积分抵扣的金额,单位:分
-     *
      * 对应 taobao 的 trade.point_fee 字段
      */
     private Integer pointPrice;
@@ -318,39 +294,33 @@ public class TradeOrderDO extends BaseDO {
 
     /**
      * 秒杀活动编号
-     *
      * 关联 SeckillActivityDO 的 id 字段
      */
     private Long seckillActivityId;
 
     /**
      * 砍价活动编号
-     *
      * 关联 BargainActivityDO 的 id 字段
      */
     private Long bargainActivityId;
     /**
      * 砍价记录编号
-     *
      * 关联 BargainRecordDO 的 id 字段
      */
     private Long bargainRecordId;
 
     /**
      * 拼团活动编号
-     *
      * 关联 CombinationActivityDO 的 id 字段
      */
     private Long combinationActivityId;
     /**
      * 拼团团长编号
-     *
      * 关联 CombinationRecordDO 的 headId 字段
      */
     private Long combinationHeadId;
     /**
      * 拼团记录编号
-     *
      * 关联 CombinationRecordDO 的 id 字段
      */
     private Long combinationRecordId;
@@ -364,4 +334,13 @@ public class TradeOrderDO extends BaseDO {
      */
     private LocalDateTime receivingTime;
 
+    /**
+     * 支付消费分
+     */
+    private Long payConsumptionPoints;
+    /**
+     * 退还的使用的消费分
+     */
+    private Long refundConsumption;
+
 }

+ 9 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderItemDO.java

@@ -215,6 +215,15 @@ public class TradeOrderItemDO extends BaseDO {
      */
     private BigDecimal highPrecisionSettlementPrice;
 
+    /**
+     * 支付消费分
+     */
+    private Long payConsumptionPoints;
+    /**
+     * 退还的使用的消费分
+     */
+    private Long refundConsumption;
+
 
     /**
      * 商品属性

+ 22 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/mq/consumer/order/OrderConsumer.java

@@ -0,0 +1,22 @@
+package cn.newfeifan.mall.module.trade.mq.consumer.order;
+
+import cn.newfeifan.mall.module.trade.service.order.TradeOrderUpdateService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Component
+@Slf4j
+public class OrderConsumer {
+
+    @Resource
+    private TradeOrderUpdateService tradeOrderUpdateService;
+
+    @EventListener
+    public void onMessage(Long payOrderId) {
+        //修改订单状态,并计算权益
+        tradeOrderUpdateService.updateOrderPaid(payOrderId);
+    }
+}

+ 3 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/aftersale/AfterSaleServiceImpl.java

@@ -175,6 +175,9 @@ public class AfterSaleServiceImpl implements AfterSaleService {
                 ? AfterSaleTypeEnum.AFTER_SALE.getType() : AfterSaleTypeEnum.IN_SALE.getType());
         afterSale.setShopId(order.getShopId());
         afterSale.setMerchantId(order.getMerchantId());
+        afterSale.setRefundPriceTotal((long) orderItem.getPrice() * orderItem.getCount());
+        afterSale.setRefundConsumptionPoints(orderItem.getPayConsumptionPoints());
+        afterSale.setRefundIntegral(orderItem.getPayIntegral());
 
         tradeAfterSaleMapper.insert(afterSale);
 

+ 10 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateService.java

@@ -1,6 +1,7 @@
 package cn.newfeifan.mall.module.trade.service.order;
 
-import cn.newfeifan.mall.framework.common.enums.TerminalEnum;
+import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderRespVO;
+import cn.newfeifan.mall.module.pay.controller.app.order.vo.AppPayOrderSubmitZeroPurchaseReqVO;
 import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderDO;
 import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO;
 import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderRemarkReqVO;
@@ -208,4 +209,12 @@ public interface TradeOrderUpdateService {
     void cancelPaidOrder(Long userId, Long orderId);
 
     PayOrderDO getPayOrder(Long tradeOrderId);
+
+    /**
+     * 提交支付订单(零元购)
+     *
+     * @param reqVO 请求
+     * @return 订单
+     */
+    PayOrderRespVO submitOrderByZeroPurchase(AppPayOrderSubmitZeroPurchaseReqVO reqVO);
 }

+ 131 - 31
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java

@@ -12,8 +12,9 @@ import cn.newfeifan.mall.framework.common.enums.UserTypeEnum;
 import cn.newfeifan.mall.framework.common.exception.ErrorCode;
 import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
 import cn.newfeifan.mall.framework.common.util.number.MoneyUtils;
+import cn.newfeifan.mall.framework.pay.core.enums.channel.PayChannelEnum;
 import cn.newfeifan.mall.module.distri.constant.DistriConstants;
-import cn.newfeifan.mall.module.distri.controller.admin.integral.vo.IntegralSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.app.integral.vo.IntegralSaveReqVO;
 import cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo.PtProfitSaveReqVO;
 import cn.newfeifan.mall.module.distri.controller.app.ptprofitlog.vo.PtProfitLogSaveReqVO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
@@ -35,9 +36,17 @@ import cn.newfeifan.mall.module.member.service.user.MemberUserService;
 import cn.newfeifan.mall.module.pay.api.order.PayOrderApi;
 import cn.newfeifan.mall.module.pay.api.order.dto.PayOrderCreateReqDTO;
 import cn.newfeifan.mall.module.pay.api.order.dto.PayOrderRespDTO;
-import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderDO;
-import cn.newfeifan.mall.module.pay.dal.mysql.order.PayOrderMapper;
+import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderRespVO;
+import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderSubmitReqVO;
+import cn.newfeifan.mall.module.pay.controller.app.order.vo.AppPayOrderSubmitZeroPurchaseReqVO;
+import cn.newfeifan.mall.module.pay.convert.order.PayOrderConvert;
+import cn.newfeifan.mall.module.pay.dal.dataobject.channel.PayChannelDO;
+import cn.newfeifan.mall.module.pay.dal.dataobject.order.*;
+import cn.newfeifan.mall.module.pay.dal.mysql.order.*;
+import cn.newfeifan.mall.module.pay.dal.redis.no.PayNoRedisDAO;
 import cn.newfeifan.mall.module.pay.enums.order.PayOrderStatusEnum;
+import cn.newfeifan.mall.module.pay.framework.pay.config.PayProperties;
+import cn.newfeifan.mall.module.pay.service.order.PayOrderService;
 import cn.newfeifan.mall.module.product.api.comment.ProductCommentApi;
 import cn.newfeifan.mall.module.product.api.comment.dto.ProductCommentCreateReqDTO;
 import cn.newfeifan.mall.module.product.dal.dataobject.sku.ProductSkuDO;
@@ -46,15 +55,11 @@ import cn.newfeifan.mall.module.product.dal.mysql.sku.ProductSkuMapper;
 import cn.newfeifan.mall.module.product.dal.mysql.spu.ProductSpuMapper;
 import cn.newfeifan.mall.module.sale.dal.dataobject.shop.ShopDO;
 import cn.newfeifan.mall.module.sale.dal.mysql.shop.ShopMapper;
+import cn.newfeifan.mall.module.system.service.sms.SmsCodeService;
 import cn.newfeifan.mall.module.system.service.user.AdminUserService;
-import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO;
-import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderRemarkReqVO;
-import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderUpdateAddressReqVO;
-import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderUpdatePriceReqVO;
+import cn.newfeifan.mall.module.trade.controller.admin.order.vo.*;
 import cn.newfeifan.mall.module.trade.controller.app.base.property.AppProductPropertyValueDetailRespVO;
-import cn.newfeifan.mall.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO;
-import cn.newfeifan.mall.module.trade.controller.app.order.vo.AppTradeOrderSettlementReqVO;
-import cn.newfeifan.mall.module.trade.controller.app.order.vo.AppTradeOrderSettlementRespVO;
+import cn.newfeifan.mall.module.trade.controller.app.order.vo.*;
 import cn.newfeifan.mall.module.trade.controller.app.order.vo.item.AppTradeOrderItemCommentCreateReqVO;
 import cn.newfeifan.mall.module.trade.convert.order.TradeOrderConvert;
 import cn.newfeifan.mall.module.trade.dal.dataobject.cart.CartDO;
@@ -166,6 +171,16 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
     @Resource
     private PayOrderMapper payOrderMapper;
 
+    @Resource
+    private PayOrderService payOrderService;
+    @Resource
+    private PayOrderExtensionMapper orderExtensionMapper;
+
+    @Resource
+    private PayNoRedisDAO noRedisDAO;
+    @Resource
+    private PayProperties payProperties;
+
     @Resource
     private IntegralService integralService;
 
@@ -192,6 +207,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
     @Lazy
     private DuserService duserService;
 
+    @Resource
+    private SmsCodeService smsCodeService;
+
     // =================== Order ===================
 
     /**
@@ -246,6 +264,50 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         return thisPayOrderDO;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public PayOrderRespVO submitOrderByZeroPurchase(AppPayOrderSubmitZeroPurchaseReqVO reqVO) {
+        reqVO.setChannelCode(PayChannelEnum.ZERO_PURCHASE.getCode());
+        // 获得 PayOrderDO ,并校验其是否存在
+        PayOrderDO order = payOrderService.validateOrderCanSubmit(reqVO.getId());
+        // 验证码校验
+        smsCodeService.useSmsCode(reqVO.getSmsCodeUseReqDTO().setUsedIp(getClientIP()));
+
+        PayChannelDO channel = payOrderService.validateChannelCanSubmit(order.getAppId(), reqVO.getChannelCode());
+        // 2. 插入 PayOrderExtensionDO
+        String no = noRedisDAO.generate(payProperties.getOrderNoPrefix());
+        PayOrderExtensionDO orderExtension = PayOrderConvert.INSTANCE.convert(cn.newfeifan.mall.framework.common.util.object.BeanUtils.toBean(reqVO, PayOrderSubmitReqVO.class), getClientIP())
+                .setOrderId(order.getId()).setNo(no)
+                .setStatus(PayOrderStatusEnum.SUCCESS.getStatus())
+                .setChannelId(channel.getId())
+                .setChannelCode(channel.getCode());
+        orderExtensionMapper.insert(orderExtension);
+
+        // 修改订单信息
+        order.setStatus(PayOrderStatusEnum.SUCCESS.getStatus());
+        order.setExtensionId(orderExtension.getId());
+        order.setNo(orderExtension.getNo());
+        order.setChannelCode(reqVO.getChannelCode());
+        order.setChannelId(channel.getId());
+        order.setChannelOrderNo("88888888");        // 短信支付没有通道编号
+
+        payOrderService.updatePayOrder(order);
+
+        List list = updateOrderPaid(reqVO.getId());
+
+        PayOrderRespVO convert = PayOrderConvert.INSTANCE.convert(order);
+
+        Object jfObj = list.get(0);
+        Object sjObj = list.get(1);
+
+        Long jf = (Long) jfObj;//待确权积分
+        Double sj = (Double) sjObj;//待确权身价
+
+        convert.setJf(jf);
+        convert.setSj(sj);
+        return convert;
+    }
+
 
     @Override
     public AppTradeOrderSettlementRespVO settlementOrder(Long userId, AppTradeOrderSettlementReqVO settlementReqVO) {
@@ -375,6 +437,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         respVO.setShopSkuIds(shopSkuIds);//把sku根据店聚合放到map中
         respVO.setShopNameMap(shopNameMap);
         respVO.setCurrentQuota(currentQuota);//用户当前积分
+        respVO.setConsumePoints(integralDO.getConsumptionPoints());//用户当前消费分
 
 //        System.out.println("shopSkuIds@@@@@@@@"+shopSkuIds);
 //        System.out.println("shopNameMap@@@@@@@@"+shopNameMap);
@@ -445,6 +508,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         IntegralDO integralDO = integralMapper.selectOne("user_id", getLoginUserId());//查询出用户积分相关信息
         Long currentQuota = integralDO.getCurrentQuota();//获取用户当前积分
         respVO.setCurrentQuota(currentQuota);
+        respVO.setConsumePoints(integralDO.getConsumptionPoints());//用户当前消费分
 
         //保存每个店铺返回页面的 订单信息汇总
         Map<Long, AppTradeOrderSettlementRespVO> shopRespVOMap = new HashMap<>();
@@ -572,11 +636,16 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
     @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_CREATE)
     public TradeOrderDO createOrder(Long userId, AppTradeOrderCreateReqVO createReqVO) {
 
-        if(createReqVO.getPayIntegral() != null && createReqVO.getPayIntegral() < 0){
-            ErrorCode ERROR = new ErrorCode(1_011_000_013, "抵扣佣金不能小于0");
+        if (createReqVO.getPayIntegral() != null && createReqVO.getPayIntegral() > 0 && createReqVO.getPayConsumptionPoints() != null && createReqVO.getPayConsumptionPoints() > 0) {
+            ErrorCode ERROR = new ErrorCode(1_011_000_013, "佣金和消费分只能选择一种");
             throw exception(ERROR);
         }
 
+//        if(createReqVO.getPayIntegral() != null && createReqVO.getPayIntegral() < 0){
+//            ErrorCode ERROR = new ErrorCode(1_011_000_013, "抵扣佣金不能小于0");
+//            throw exception(ERROR);
+//        }
+
         //校验最大值 start  add by Ben
         //查询订单提成比例
         QueryWrapper<OrderPercentageDO> queryWrapper = new QueryWrapper<>();
@@ -663,6 +732,14 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         } else {//把页面传入的,1积分=1元钱的积分,转换为后台保存到数据库的积分值
             payPoints = payPoints * DistriConstants.INTEGRAL_PAGE2DB;
         }
+        //消费者在页面录入的,要使用的消费分
+        Double consumptionPoints = createReqVO.getPayConsumptionPoints();
+
+        if (consumptionPoints == null) {
+            consumptionPoints = (double) 0;
+        } else {//把页面传入的,1消费分=1元钱的消费分,转换为后台保存到数据库的消费分值
+            consumptionPoints = consumptionPoints * DistriConstants.INTEGRAL_PAGE2DB;
+        }
 
 
 //        payPoints = 3;//为了测试方便,临时写死
@@ -671,6 +748,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         TradePriceCalculateRespBO tradePriceCalculateRespBO = calculatePriceWithPoints(userId, createReqVO);
         //计算分摊的积分金额
         List<Integer> dividePoints = TradePriceCalculatorHelper.dividePrice(tradePriceCalculateRespBO.getItems(), integral2Money(payPoints.longValue()));
+        List<Integer> divideConsumptionPoints = TradePriceCalculatorHelper.dividePrice(tradePriceCalculateRespBO.getItems(), integral2Money(consumptionPoints.longValue()));
         //键为skuId,value为单个商品项信息
         Map<Long, TradePriceCalculateRespBO.OrderItem> itemPayPointsMap = new HashMap<>();
 
@@ -680,6 +758,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
             TradePriceCalculateRespBO.OrderItem orderItem = priceOrderItems.get(i);
             Long itemPoint = money2Integral(dividePoints.get(i));//每项商品使用的积分
             orderItem.setPayPoints(itemPoint);
+            orderItem.setPayConsumptionPoints(money2Integral(divideConsumptionPoints.get(i)));
             itemPayPointsMap.put(orderItem.getSkuId(), orderItem);
         }
 
@@ -725,6 +804,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 
             // 3. 保存一间店铺的订单
             Long shopPayPoints = 0L;//一间店铺订单总支付积分
+            Long shopConsumptionPoints = 0L;//一间店铺订单总支付消费分
             Integer shopPayPrice = 0;//一间店铺订单总支付价格
 
             for (TradeOrderItemDO orderItem : orderItems) {//一间店铺订单的所有商品项
@@ -735,9 +815,15 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
                 Long skuId = orderItem.getSkuId();
                 TradePriceCalculateRespBO.OrderItem orderItemTmp = itemPayPointsMap.get(skuId);
                 orderItem.setPayIntegral(orderItemTmp.getPayPoints()); //本商品使用积分
+                orderItem.setPayConsumptionPoints(orderItemTmp.getPayConsumptionPoints()); //本商品使用消费分
                 Integer payRmb;
                 if (orderItem.getHighPrecisionPrice().compareTo(BigDecimal.ZERO) == 0) {
-                    payRmb = orderItem.getPrice() * orderItem.getCount() - integral2Money(orderItemTmp.getPayPoints());//本商品实付人民币
+                    if (orderItemTmp.getPayPoints() > 0) {
+                        payRmb = orderItem.getPrice() * orderItem.getCount() - integral2Money(orderItemTmp.getPayPoints());//本商品实付人民币
+                    } else {
+                        payRmb = orderItem.getPrice() * orderItem.getCount() - integral2Money(orderItemTmp.getPayConsumptionPoints());//本商品实付人民币
+
+                    }
                 } else {
                     double rmb = (orderItem.getHighPrecisionPrice().doubleValue() * orderItem.getCount()) - integral2Money(orderItemTmp.getPayPoints());
                     if (rmb > 0 && rmb < 1) {
@@ -753,6 +839,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
                 orderItem.setPayPrice(payRmb);//本商品实付人民币
 
                 shopPayPoints += orderItemTmp.getPayPoints();//一间店铺订单总支付积分
+                shopConsumptionPoints += orderItemTmp.getPayConsumptionPoints();//一间店铺订单总支付消费分
                 shopPayPrice += payRmb;//一间店铺订单总支付价格
             }
 
@@ -767,6 +854,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
             order.setPayPrice(shopPayPrice);
             order.setPayRmb(shopPayPrice);
             order.setPayIntegral(shopPayPoints.doubleValue());
+            order.setPayConsumptionPoints(shopConsumptionPoints);
 
             tradeOrderMapper.insert(order);
 
@@ -794,23 +882,19 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
             List<Long> deliveryTemplateIds = productSpuMapper.selectList(ProductSpuDO::getId, spuIds).stream().map(ProductSpuDO::getDeliveryTemplateId)
                     .distinct().collect(Collectors.toList());
             Map<Long, Long> templateIdMap = new HashMap<>();
-            deliveryTemplateIds.forEach(id -> {
-                templateIdMap.put(id, 0L);
-            });
+            deliveryTemplateIds.forEach(id -> templateIdMap.put(id, 0L));
 
             Map<Long, Integer> deliveryPriceMap = new HashMap<>();
-            templateIdMap.forEach((id, count) -> {
-                orderItems.forEach(item -> {
-                    ProductSpuDO spu = productSpuMapper.selectById(item.getSpuId());
-                    if (spu.getDeliveryTemplateId().equals(id)) {
-                        templateIdMap.put(id, templateIdMap.get(id) + 1);
-
-                        if (item.getDeliveryPrice() != 0) {
-                            deliveryPriceMap.put(spu.getDeliveryTemplateId(), item.getDeliveryPrice());
-                        }
+            templateIdMap.forEach((id, count) -> orderItems.forEach(item -> {
+                ProductSpuDO spu = productSpuMapper.selectById(item.getSpuId());
+                if (spu.getDeliveryTemplateId().equals(id)) {
+                    templateIdMap.put(id, templateIdMap.get(id) + 1);
+
+                    if (item.getDeliveryPrice() != 0) {
+                        deliveryPriceMap.put(spu.getDeliveryTemplateId(), item.getDeliveryPrice());
                     }
-                });
-            });
+                }
+            }));
 
             orderItems.forEach(itemDO -> {
                 ProductSpuDO spuDO = productSpuMapper.selectById(itemDO.getSpuId());
@@ -847,7 +931,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         virtualOrder.setPayPrice(allShopPayRMB);
         virtualOrder.setPayRmb(allShopPayRMB);
 
-        Integer shopCount = shopSkuIds.keySet().size();//订单对应的店铺数目
+        int shopCount = shopSkuIds.keySet().size();//订单对应的店铺数目
         if (shopCount > 1) {//如果多店铺拆分订单,则支付订单的商户订单id为0
             virtualOrder.setId(0L);//为了让payOrder中的tradeOrderId为0;
         } else if (shopCount == 1) {
@@ -879,6 +963,21 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
             }
         }
 
+        //如果订单有使用消费分,则抵扣用户的消费分。
+        if (consumptionPoints > 0) {
+            for (Map<String, Object> m : orderMapList) {
+                TradeOrderDO order = (TradeOrderDO) (m.get("order"));
+                Long tradeOrderId = order.getId();
+                String OrderNum = order.getNo();
+                Long payConsumptionPoints = order.getPayConsumptionPoints();//每个订单使用的积分
+                Boolean flag = integralService.updateUserConsumptionPoints(userId, userId, payConsumptionPoints, tradeOrderId, OrderNum);
+                if (!flag) {
+                    throw exception(ORDER_PAY_CONSUMPTION_POINTS_ERROR);
+                }
+            }
+        }
+
+
 //        boolean caculateFreezeAmount = false;//增加冻结积分
 
         //增加冻结积分这分部分,是订单微信支付成功后,才执行的,下面的代码只是为了测试方便写在这,实际永远不会执行。add by Ben
@@ -1274,7 +1373,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 
         // 七天获得变为即算即得,后续如果恢复把这里注释即可,并打开平台定时任务得订单结算
 //        CompletableFuture.runAsync(() -> {
-            calc(TradeOrderDOList, orderPercentageDO, JsonUtils.toJsonString(orderPercentageDO));
+        calc(TradeOrderDOList, orderPercentageDO, JsonUtils.toJsonString(orderPercentageDO));
 //        });
 
         return rs;
@@ -1282,9 +1381,10 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 
     /**
      * 计算订单支付成功后,订单项的冻结积分转换
-     * @param tradeOrderDOList 订单列表
+     *
+     * @param tradeOrderDOList  订单列表
      * @param orderPercentageDO 参数百分比
-     * @param percentTemplate 计算百分比模板
+     * @param percentTemplate   计算百分比模板
      */
     private void calc(List<TradeOrderDO> tradeOrderDOList, OrderPercentageDO orderPercentageDO, String percentTemplate) {
         // 平台收益日志

+ 5 - 18
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/price/bo/TradePriceCalculateRespBO.java

@@ -9,7 +9,6 @@ import java.util.List;
 
 /**
  * 价格计算 Response BO
- *
  * 整体设计,参考 taobao 的技术文档:
  * 1. <a href="https://developer.alibaba.com/docs/doc.htm?treeId=1&articleId=1029&docType=1">订单管理</a>
  * 2. <a href="https://open.taobao.com/docV3.htm?docId=108471&docType=1">常用订单金额说明</a>
@@ -24,7 +23,6 @@ public class TradePriceCalculateRespBO {
 
     /**
      * 订单类型
-     *
      * 枚举 {@link TradeOrderTypeEnum}
      */
     private Integer type;
@@ -41,7 +39,6 @@ public class TradePriceCalculateRespBO {
 
     /**
      * 营销活动数组
-     *
      * 只对应 {@link Price#items} 商品匹配的活动
      */
     private List<Promotion> promotions;
@@ -74,15 +71,12 @@ public class TradePriceCalculateRespBO {
 
         /**
          * 商品原价(总),单位:分
-         *
          * 基于 {@link OrderItem#getPrice()} * {@link OrderItem#getCount()} 求和
-         *
          * 对应 taobao 的 trade.total_fee 字段
          */
         private Integer totalPrice;
         /**
          * 订单优惠(总),单位:分
-         *
          * 对应 taobao 的 order.discount_fee 字段
          */
         private Integer discountPrice;
@@ -92,13 +86,11 @@ public class TradePriceCalculateRespBO {
         private Integer deliveryPrice;
         /**
          * 优惠劵减免金额(总),单位:分
-         *
          * 对应 taobao 的 trade.coupon_fee 字段
          */
         private Integer couponPrice;
         /**
          * 积分抵扣的金额,单位:分
-         *
          * 对应 taobao 的 trade.point_fee 字段
          */
         private Integer pointPrice;
@@ -108,7 +100,6 @@ public class TradePriceCalculateRespBO {
         private Integer vipPrice;
         /**
          * 最终购买金额(总),单位:分
-         *
          * = {@link #totalPrice}
          * - {@link #couponPrice}
          * - {@link #pointPrice}
@@ -132,6 +123,11 @@ public class TradePriceCalculateRespBO {
          */
         private Long payPoints;
 
+        /**
+         * 消费分
+         */
+        private Long PayConsumptionPoints;
+
         /**
          * SPU 编号
          */
@@ -155,14 +151,12 @@ public class TradePriceCalculateRespBO {
 
         /**
          * 商品原价(单),单位:分
-         *
          * 对应 ProductSkuDO 的 price 字段
          * 对应 taobao 的 order.price 字段
          */
         private Integer price;
         /**
          * 优惠金额(总),单位:分
-         *
          * 对应 taobao 的 order.discount_fee 字段
          */
         private Integer discountPrice;
@@ -172,13 +166,11 @@ public class TradePriceCalculateRespBO {
         private Integer deliveryPrice;
         /**
          * 优惠劵减免金额,单位:分
-         *
          * 对应 taobao 的 trade.coupon_fee 字段
          */
         private Integer couponPrice;
         /**
          * 积分抵扣的金额,单位:分
-         *
          * 对应 taobao 的 trade.point_fee 字段
          */
         private Integer pointPrice;
@@ -192,7 +184,6 @@ public class TradePriceCalculateRespBO {
         private Integer vipPrice;
         /**
          * 应付金额(总),单位:分
-         *
          * = {@link #price} * {@link #count}
          * - {@link #couponPrice}
          * - {@link #pointPrice}
@@ -209,7 +200,6 @@ public class TradePriceCalculateRespBO {
         private String spuName;
         /**
          * 商品图片
-         *
          * 优先级:SKU.picUrl > SPU.picUrl
          */
         private String picUrl;
@@ -253,7 +243,6 @@ public class TradePriceCalculateRespBO {
 
         /**
          * 营销编号
-         *
          * 例如说:营销活动的编号、优惠劵的编号
          */
         private Long id;
@@ -263,7 +252,6 @@ public class TradePriceCalculateRespBO {
         private String name;
         /**
          * 营销类型
-         *
          * 枚举 {@link PromotionTypeEnum}
          */
         private Integer type;
@@ -288,7 +276,6 @@ public class TradePriceCalculateRespBO {
         private Boolean match;
         /**
          * 满足条件的提示
-         *
          * 如果 {@link #match} = true 满足,则提示“圣诞价:省 150.00 元”
          * 如果 {@link #match} = false 不满足,则提示“购满 85 元,可减 40 元”
          */

Some files were not shown because too many files changed in this diff