Explorar el Código

用户钱包新增消费分,可以抵扣支付,可以转让消费分,佣金转化消费分,提现分账

Yangzw hace 6 meses
padre
commit
96a99aed37
Se han modificado 93 ficheros con 2076 adiciones y 215 borrados
  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. 30 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ConsumptionEnum.java
  6. 4 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ErrorCodeConstants.java
  7. 1 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/config/orderPercentageConfig.java
  8. 0 68
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/orderpercentage/vo/OrderPercentageRespVO.java
  9. 9 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawal/vo/AppApplicationForWithdrawalPageReqVO.java
  10. 11 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawal/vo/AppApplicationForWithdrawalRespVO.java
  11. 9 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawal/vo/AppApplicationForWithdrawalSaveReqVO.java
  12. 6 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawalchannel/vo/AppApplicationForWithdrawalChannelPageReqVO.java
  13. 7 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawalchannel/vo/AppApplicationForWithdrawalChannelRespVO.java
  14. 6 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/applicationforwithdrawalchannel/vo/AppApplicationForWithdrawalChannelSaveReqVO.java
  15. 34 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptionchangelog/ConsumptionChangeLogController.java
  16. 39 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptionchangelog/vo/ConsumptionChangeLogPageReqVO.java
  17. 50 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptionchangelog/vo/ConsumptionChangeLogRespVO.java
  18. 40 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptionchangelog/vo/ConsumptionChangeLogSaveReqVO.java
  19. 43 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontopuplog/ConsumptionTopUpLogController.java
  20. 36 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontopuplog/vo/ConsumptionTopUpLogPageReqVO.java
  21. 41 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontopuplog/vo/ConsumptionTopUpLogRespVO.java
  22. 31 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontopuplog/vo/ConsumptionTopUpLogSaveReqVO.java
  23. 42 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontransferlog/ConsumptionTransferLogController.java
  24. 45 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontransferlog/vo/ConsumptionTransferLogPageReqVO.java
  25. 53 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontransferlog/vo/ConsumptionTransferLogRespVO.java
  26. 45 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/consumptiontransferlog/vo/ConsumptionTransferLogSaveReqVO.java
  27. 28 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/integral/IntegralController.java
  28. 4 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/integral/vo/IntegralPageReqVO.java
  29. 5 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/integral/vo/IntegralRespVO.java
  30. 4 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/integral/vo/IntegralSaveReqVO.java
  31. 33 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/OrderPercentageController.java
  32. 7 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/vo/OrderPercentageDoubleSaveReqVO.java
  33. 7 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/vo/OrderPercentagePageReqVO.java
  34. 1 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/vo/OrderPercentageRedisVO.java
  35. 18 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/vo/OrderPercentageRespVO.java
  36. 6 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/orderpercentage/vo/OrderPercentageSaveReqVO.java
  37. 6 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/ptdailywithdrawal/vo/AppPtDailyWithdrawalPageReqVO.java
  38. 7 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/ptdailywithdrawal/vo/AppPtDailyWithdrawalRespVO.java
  39. 7 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/ptdailywithdrawal/vo/AppPtDailyWithdrawalSaveReqVO.java
  40. 13 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/applicationforwithdrawal/ApplicationForWithdrawalDO.java
  41. 9 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/applicationforwithdrawalchannel/ApplicationForWithdrawalChannelDO.java
  42. 62 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/consumptionchangelog/ConsumptionChangeLogDO.java
  43. 48 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/consumptiontopuplog/ConsumptionTopUpLogDO.java
  44. 60 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/consumptiontransferlog/ConsumptionTransferLogDO.java
  45. 5 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/integral/IntegralDO.java
  46. 9 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/orderpercentage/OrderPercentageDO.java
  47. 9 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptdailywithdrawal/PtDailyWithdrawalDO.java
  48. 28 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/consumptionchangelog/ConsumptionChangeLogMapper.java
  49. 29 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/consumptiontopuplog/ConsumptionTopUpLogMapper.java
  50. 29 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/consumptiontransferlog/ConsumptionTransferLogMapper.java
  51. 1 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/integral/IntegralMapper.java
  52. 1 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/orderpercentage/OrderPercentageMapper.java
  53. 2 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofitlog/PtProfitLogMapper.java
  54. 38 4
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/applicationforwithdrawal/ApplicationForWithdrawalServiceImpl.java
  55. 56 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptionchangelog/ConsumptionChangeLogService.java
  56. 92 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptionchangelog/ConsumptionChangeLogServiceImpl.java
  57. 55 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptiontopuplog/ConsumptionTopUpLogService.java
  58. 72 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptiontopuplog/ConsumptionTopUpLogServiceImpl.java
  59. 55 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptiontransferlog/ConsumptionTransferLogService.java
  60. 153 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/consumptiontransferlog/ConsumptionTransferLogServiceImpl.java
  61. 1 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserServiceImpl.java
  62. 14 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralService.java
  63. 71 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralServiceImpl.java
  64. 2 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/orderpercentage/OrderPercentageService.java
  65. 5 5
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/orderpercentage/OrderPercentageServiceImpl.java
  66. 1 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/usersigninlog/UserSignInLogServiceImpl.java
  67. 12 0
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/consumptionchangelog/ConsumptionChangeLogMapper.xml
  68. 12 0
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/consumptiontopuplog/ConsumptionTopUpLogMapper.xml
  69. 12 0
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/consumptiontransferlog/ConsumptionTransferLogMapper.xml
  70. 1 0
      feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/ErrorCodeConstants.java
  71. 9 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/aftersale/vo/AppAfterSaleRespVO.java
  72. 8 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/AppTradeOrderController.java
  73. 3 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java
  74. 3 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/AppTradeOrderDetailRespVO.java
  75. 3 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/AppTradeOrderSettlementRespVO.java
  76. 13 20
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/aftersale/AfterSaleDO.java
  77. 9 30
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderDO.java
  78. 9 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderItemDO.java
  79. 3 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/aftersale/AfterSaleServiceImpl.java
  80. 10 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateService.java
  81. 131 31
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java
  82. 5 18
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/price/bo/TradePriceCalculateRespBO.java
  83. 7 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/user/AppMemberUserController.java
  84. 133 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/user/vo/UserRespVO.java
  85. 8 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserService.java
  86. 5 0
      feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserServiceImpl.java
  87. 1 1
      feifan-module-member/feifan-module-member-biz/src/main/resources/mapper/signin/MemberSignInRecordMapper.xml
  88. 1 2
      feifan-module-pay/feifan-module-pay-api/src/main/java/cn/newfeifan/mall/module/pay/api/order/dto/PayOrderCreateReqDTO.java
  89. 21 0
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/controller/app/order/vo/AppPayOrderSubmitZeroPurchaseReqVO.java
  90. 4 4
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/order/PayOrderService.java
  91. 3 5
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/order/PayOrderServiceImpl.java
  92. 0 1
      feifan-module-system/feifan-module-system-api/src/main/java/cn/newfeifan/mall/module/system/api/sms/dto/code/SmsCodeUseReqDTO.java
  93. 6 0
      feifan-module-system/feifan-module-system-api/src/main/java/cn/newfeifan/mall/module/system/enums/sms/SmsSceneEnum.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"),
     ;
 
     /**

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

@@ -0,0 +1,30 @@
+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,"退回退款返回"),
+    ;
+
+    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;
+    }
+}

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

@@ -35,5 +35,9 @@ 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, "消费分转让记录不存在");
+
 
 }

+ 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;
+
 
 }

+ 7 - 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,10 @@ public class OrderPercentagePageReqVO extends PageParam {
 
     @Schema(description = "收藏商品获取身价值,同一SPU商品收藏多次无效", example = "1")
     private String collectSocialStatus;
+
+    @Schema(description = "提现消费分百分比")
+    private String withdrawConsumption;
+
+    @Schema(description = "提现佣金百分比")
+    private String withdrawCommission;
 }

+ 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.*;

+ 18 - 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,18 @@
+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 withdrawConsumption;
+
+    @Schema(description = "提现佣金百分比")
+    @ExcelProperty("提现佣金百分比")
+    private String withdrawCommission;
+}

+ 6 - 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,10 @@ public class OrderPercentageSaveReqVO {
     @Schema(description = "收藏商品获取身价值,同一SPU商品收藏多次无效", example = "1")
     private String collectSocialStatus;
 
+    @Schema(description = "提现消费分百分比")
+    private String withdrawConsumption;
+
+    @Schema(description = "提现佣金百分比")
+    private String withdrawCommission;
 
 }

+ 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;
 }

+ 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;
 }

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

@@ -87,4 +87,13 @@ public class OrderPercentageDO extends BaseDO {
      */
     private String signInSocialStatus;
 
+    /**
+     * 提现佣金百分比
+     */
+    private String withdrawCommission;
+    /**
+     * 提现消费分百分比
+     */
+    private String withdrawConsumption;
+
 }

+ 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;
+
 }

+ 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;
 

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

@@ -50,7 +50,8 @@ 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);
         } else {

+ 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));
+
+        // 记录变动日志
+        consumptionChangeLogService.createConsumptionChangeLog(
+                ConsumptionChangeLogSaveReqVO.builder()
+                        .userId(transferIntegral.getUserId())
+                        .consumptionPoints(-createReqVO.getConsumptionPoints())
+                        .afterConsumptionPoints(transferIntegral.getConsumptionPoints())
+                        .consumptionStatus(ConsumptionEnum.CONSUMPTION_TRANSFER.getType())
+                        .generateUserId(transferIntegral.getUserId())
+                        .build()
+        );
+
+        // 接收人钱包
+        IntegralDO recipientIntegral = integralService.selectByUser(createReqVO.getRecipientUserId());
+        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;

+ 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>

+ 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;
+
 }

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

@@ -5,6 +5,7 @@ import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.security.core.annotations.PreAuthenticated;
 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;
@@ -192,6 +193,7 @@ public class AppTradeOrderController {
 
         //设置订单支付的积分
         rs.getData().setPayIntegral(order.getPayIntegral());
+        rs.getData().setPayConsumptionPoints(order.getPayConsumptionPoints());
         tradeOrderQueryService.setSpuType(rs.getData().getItems());
 
         return rs;
@@ -293,4 +295,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;
 

+ 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;
+
 
     /**
      * 商品属性

+ 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 元”
          */

+ 7 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/user/AppMemberUserController.java

@@ -1,6 +1,7 @@
 package cn.newfeifan.mall.module.member.controller.app.user;
 
 import cn.newfeifan.mall.framework.common.pojo.CommonResult;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 import cn.newfeifan.mall.framework.security.core.annotations.PreAuthenticated;
 import cn.newfeifan.mall.module.member.controller.app.user.vo.*;
 import cn.newfeifan.mall.module.member.convert.user.MemberUserConvert;
@@ -102,5 +103,11 @@ public class AppMemberUserController {
         return success(true);
     }
 
+    @GetMapping("/getUserByUserNameWithMobile")
+    @Operation(summary = "根据用户名和手机号查询用户")
+    public CommonResult<UserRespVO> getUserByUserNameWithMobile(@RequestParam(value = "username") String username,@RequestParam(value = "mobile") String mobile) {
+        return success(BeanUtils.toBean(userService.getUserByUserNameWithMobile(username,mobile), UserRespVO.class));
+    }
+
 }
 

+ 133 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/controller/app/user/vo/UserRespVO.java

@@ -0,0 +1,133 @@
+package cn.newfeifan.mall.module.member.controller.app.user.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 UserRespVO {
+
+    @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "28922")
+    @ExcelProperty("编号")
+    private Long id;
+
+    @Schema(description = "手机号")
+    @ExcelProperty("手机号")
+    private String mobile;
+
+    @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
+    @ExcelProperty("用户昵称")
+    private String nickname;
+
+    @Schema(description = "头像", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("头像")
+    private String avatar;
+
+    @Schema(description = "真实名字", example = "芋艿")
+    @ExcelProperty("真实名字")
+    private String name;
+
+    @Schema(description = "用户性别")
+    @ExcelProperty("用户性别")
+    private Integer sex;
+
+    @Schema(description = "所在地", example = "14161")
+    @ExcelProperty("所在地")
+    private Long areaId;
+
+    @Schema(description = "出生日期")
+    @ExcelProperty("出生日期")
+    private LocalDateTime birthday;
+
+    @Schema(description = "会员备注")
+    @ExcelProperty("会员备注")
+    private String mark;
+
+    @Schema(description = "积分", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("积分")
+    private Integer point;
+
+    @Schema(description = "用户标签编号列表,以逗号分隔")
+    @ExcelProperty("用户标签编号列表,以逗号分隔")
+    private String tagIds;
+
+    @Schema(description = "等级编号", example = "11461")
+    @ExcelProperty("等级编号")
+    private Long levelId;
+
+    @Schema(description = "经验", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("经验")
+    private Integer experience;
+
+    @Schema(description = "用户分组编号", example = "3306")
+    @ExcelProperty("用户分组编号")
+    private Long groupId;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "直接推荐人id", example = "15893")
+    @ExcelProperty("直接推荐人id")
+    private Long recommenderdId;
+
+    @Schema(description = "当前身价值")
+    @ExcelProperty("当前身价值")
+    private Long currentMemberWorthValue;
+
+    @Schema(description = "预增加身价值")
+    @ExcelProperty("预增加身价值")
+    private Long preAddedMemberWorthValue;
+
+    @Schema(description = "未来身价值,未来身价值=当前身价值+预增加身价值")
+    @ExcelProperty("未来身价值,未来身价值=当前身价值+预增加身价值")
+    private Long futureMemberWorthValue;
+
+    @Schema(description = "当前身价级别名称", example = "张三")
+    @ExcelProperty("当前身价级别名称")
+    private String currentMemberWorthLevelName;
+
+    @Schema(description = "当前身价级别id", example = "24146")
+    @ExcelProperty("当前身价级别id")
+    private Long currentMemberWorthLevelId;
+
+    @Schema(description = "最后签到时间")
+    @ExcelProperty("最后签到时间")
+    private LocalDateTime lastSignInTime;
+
+    @Schema(description = "连续签到天数")
+    @ExcelProperty("连续签到天数")
+    private LocalDateTime continuousSignInDays;
+
+    @Schema(description = "当前积分值")
+    @ExcelProperty("当前积分值")
+    private Long currentMemberPoints;
+
+    @Schema(description = "预增加积分值")
+    @ExcelProperty("预增加积分值")
+    private Long preAddedMemberWorth;
+
+    @Schema(description = "累计消费金额(只算人民币,单位为分)")
+    @ExcelProperty("累计消费金额(只算人民币,单位为分)")
+    private Long cumulativeSpending;
+
+    @Schema(description = "关联系统用户ID", example = "23316")
+    @ExcelProperty("关联系统用户ID")
+    private Long systemUsersId;
+
+    @Schema(description = "登录用的用户名", example = "张三")
+    @ExcelProperty("登录用的用户名")
+    private String username;
+
+    @Schema(description = "电话号码国家前缀")
+    @ExcelProperty("电话号码国家前缀")
+    private String mobileCountryCode;
+
+    @Schema(description = "电话号码国家名", example = "张三")
+    @ExcelProperty("电话号码国家名")
+    private String mobileCountryName;
+
+}

+ 8 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserService.java

@@ -244,4 +244,12 @@ public interface MemberUserService {
     void updateUserByBankAccount(Long loginUserId, AppMemberUserUpdateBankAccountReqVO reqVO);
 
     List<MemberUserDO> selectListByMobile(String mobile);
+
+    /**
+     * 根据用户名和手机号查询用户
+     * @param username 用户名
+     * @param mobile 电话
+     * @return 用户
+     */
+    MemberUserDO getUserByUserNameWithMobile(String username,String mobile);
 }

+ 5 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/service/user/MemberUserServiceImpl.java

@@ -433,6 +433,11 @@ public class MemberUserServiceImpl implements MemberUserService {
         return memberUserMapper.selectList(MemberUserDO::getMobile,mobile);
     }
 
+    @Override
+    public MemberUserDO getUserByUserNameWithMobile(String username, String mobile) {
+        return memberUserMapper.selectOne(MemberUserDO::getUsername,username,MemberUserDO::getMobile,mobile);
+    }
+
     /**
      * 校验手机号码
      * @param phoneNumber 手机号

+ 1 - 1
feifan-module-member/feifan-module-member-biz/src/main/resources/mapper/signin/MemberSignInRecordMapper.xml

@@ -4,7 +4,7 @@
 
     <select id="getSignSocial"
             resultType="cn.newfeifan.mall.module.member.controller.admin.signin.vo.config.OrderPercentageRedisVO">
-        select sign_in_social_status,sign_in_social_status_max from distri_order_percentage LIMIT 0,1
+        SELECT sign_in_social_status as signInSocialStatus,sign_in_social_status_max as signInSocialStatusMax FROM distri_order_percentage LIMIT 0,1
     </select>
 
 </mapper>

+ 1 - 2
feifan-module-pay/feifan-module-pay-api/src/main/java/cn/newfeifan/mall/module/pay/api/order/dto/PayOrderCreateReqDTO.java

@@ -3,7 +3,6 @@ package cn.newfeifan.mall.module.pay.api.order.dto;
 import lombok.Data;
 import org.hibernate.validator.constraints.Length;
 
-import javax.validation.constraints.DecimalMin;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.io.Serializable;
@@ -58,7 +57,7 @@ public class PayOrderCreateReqDTO implements Serializable {
      * 支付金额,单位:分
      */
     @NotNull(message = "支付金额不能为空")
-    @DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零")
+//    @DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零")
     private Integer price;
 
     /**

+ 21 - 0
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/controller/app/order/vo/AppPayOrderSubmitZeroPurchaseReqVO.java

@@ -0,0 +1,21 @@
+package cn.newfeifan.mall.module.pay.controller.app.order.vo;
+
+import cn.newfeifan.mall.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 支付订单提交(零元购) Request VO")
+@Data
+public class AppPayOrderSubmitZeroPurchaseReqVO {
+    @Schema(description = "支付单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    @NotNull(message = "支付单编号不能为空")
+    private Long id;
+
+    @Schema(description = "支付渠道", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx_pub")
+    private String channelCode;
+
+    @Schema(description = "短信验证码 DTO")
+    private SmsCodeUseReqDTO smsCodeUseReqDTO;
+}

+ 4 - 4
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/order/PayOrderService.java

@@ -3,10 +3,8 @@ package cn.newfeifan.mall.module.pay.service.order;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.pay.core.client.dto.order.PayOrderRespDTO;
 import cn.newfeifan.mall.module.pay.api.order.dto.PayOrderCreateReqDTO;
-import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderExportReqVO;
-import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderPageReqVO;
-import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderSubmitReqVO;
-import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderSubmitRespVO;
+import cn.newfeifan.mall.module.pay.controller.admin.order.vo.*;
+import cn.newfeifan.mall.module.pay.dal.dataobject.channel.PayChannelDO;
 import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderDO;
 import cn.newfeifan.mall.module.pay.dal.dataobject.order.PayOrderExtensionDO;
 
@@ -108,6 +106,8 @@ public interface PayOrderService {
      */
     PayOrderDO validateOrderCanSubmit(Long id);
 
+    PayChannelDO validateChannelCanSubmit(Long appId, String channelCode);
+
     /**
      * 通知支付单成功
      *

+ 3 - 5
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/order/PayOrderServiceImpl.java

@@ -13,10 +13,7 @@ import cn.newfeifan.mall.framework.pay.core.client.dto.order.PayOrderUnifiedReqD
 import cn.newfeifan.mall.framework.pay.core.enums.order.PayOrderStatusRespEnum;
 import cn.newfeifan.mall.framework.tenant.core.util.TenantUtils;
 import cn.newfeifan.mall.module.pay.api.order.dto.PayOrderCreateReqDTO;
-import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderExportReqVO;
-import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderPageReqVO;
-import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderSubmitReqVO;
-import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderSubmitRespVO;
+import cn.newfeifan.mall.module.pay.controller.admin.order.vo.*;
 import cn.newfeifan.mall.module.pay.convert.order.PayOrderConvert;
 import cn.newfeifan.mall.module.pay.dal.dataobject.app.PayAppDO;
 import cn.newfeifan.mall.module.pay.dal.dataobject.channel.PayChannelDO;
@@ -283,7 +280,8 @@ public class PayOrderServiceImpl implements PayOrderService {
         });
     }
 
-    private PayChannelDO validateChannelCanSubmit(Long appId, String channelCode) {
+    @Override
+    public PayChannelDO validateChannelCanSubmit(Long appId, String channelCode) {
         // 校验 App
         appService.validPayApp(appId);
         // 校验支付渠道是否有效

+ 0 - 1
feifan-module-system/feifan-module-system-api/src/main/java/cn/newfeifan/mall/module/system/api/sms/dto/code/SmsCodeUseReqDTO.java

@@ -36,7 +36,6 @@ public class SmsCodeUseReqDTO {
     /**
      * 使用 IP
      */
-    @NotEmpty(message = "使用 IP 不能为空")
     private String usedIp;
 
 }

+ 6 - 0
feifan-module-system/feifan-module-system-api/src/main/java/cn/newfeifan/mall/module/system/enums/sms/SmsSceneEnum.java

@@ -22,6 +22,12 @@ public enum SmsSceneEnum implements IntArrayValuable {
     MEMBER_RESET_PASSWORD(4, "user-reset-password", "会员用户 - 忘记密码"),
     MEMBER_UPDATE_NEW_MOBILE(5, "user-update-mobile", "会员用户 - 修改手机号时新输入的手机号"),
     MEMBER_WITHDRAWAL_ERROR(6, "user-withdrawal-error", "会员用户 - 提现失败时发送通知给用户"),
+    SPU_APPLY_INFORM(7, "spu-apply-inform", "系统用户 - 商品审核申请通知"),
+    SPU_APPLY_ERROR(8, "spu-apply-error", "系统用户 - 商品审核驳回通知"),
+    SPU_APPLY_SUCCESS(9, "spu-apply-success", "系统用户 - 商品审核通过通知"),
+    TOP_UP_CONSUMPTION(10, "top-up-consumption", "系统用户 - 充值消费分"),
+    CONSUMPTION_TRANSFER(11, "consumption-transfer", "会员用户 - 消费分转让"),
+    ZERO_PURCHASE(12, "zero-purchase", "会员用户 - 零元购"),
 
     ADMIN_MEMBER_LOGIN(21, "admin-sms-login", "后台用户 - 手机号登录");