Bladeren bron

用户自充值消费分

Yangzw 6 maanden geleden
bovenliggende
commit
f6ab152569
9 gewijzigde bestanden met toevoegingen van 676 en 0 verwijderingen
  1. 44 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/usertopupconsumptionpointsorder/AppUserTopUpConsumptionPointsOrderController.java
  2. 72 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/usertopupconsumptionpointsorder/vo/UserTopUpConsumptionPointsOrderPageReqVO.java
  3. 86 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/usertopupconsumptionpointsorder/vo/UserTopUpConsumptionPointsOrderRespVO.java
  4. 68 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/app/usertopupconsumptionpointsorder/vo/UserTopUpConsumptionPointsOrderSaveReqVO.java
  5. 93 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderDO.java
  6. 40 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderMapper.java
  7. 60 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderService.java
  8. 201 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderServiceImpl.java
  9. 12 0
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/usertopupconsumptionpointsorder/UserTopUpConsumptionPointsOrderMapper.xml

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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