Browse Source

订单逻辑调整,退款记录新增接口及查询接口增加

lijun 2 years ago
parent
commit
f1ed803922

+ 15 - 0
doc/sql/update/bt-2302-4月份需求.sql

@@ -0,0 +1,15 @@
+create table bt_refund_record
+(
+   id                   bigint(20) not null  comment '主键',
+   order_id             bigint(20) not null  comment '订单ID',
+   refund_type          char(1) not null  comment '退款类型: 0 -> 自动退款, 1 -> 人工退款',
+   refund_reason        varchar(200)  comment '退款原因',
+   refund_amount        decimal(20,2) not null  comment '退款金额',
+   create_time          datetime not null  comment '创建时间',
+   create_user          bigint(20) not null  comment '创建人',
+   update_time          datetime not null  comment '修改时间',
+   update_user          bigint(20) not null  comment '修改人',
+   primary key (id)
+);
+
+alter table bt_refund_record comment '退款记录';

+ 2 - 25
imcs-bt-be/imcs-authority-server/src/main/java/com/github/zuihou/api/AndroidApi.java

@@ -149,7 +149,6 @@ public class AndroidApi
         long speId = param.get("speId");
         long equId = param.get("equId");
         Spe spe = speService.getById(speId);
-        Long orderMemberCouponId = param.get("orderMemberCouponId");
 
 //        生成本地订单
         Order preOrder = new Order();
@@ -158,16 +157,8 @@ public class AndroidApi
         preOrder.setOrderGoodsAmount(1);
         preOrder.setOrderAmount(spe.getSpecSPrice());
         preOrder.setOrderUnitPrice(spe.getSpecSPrice());
-        // 实付金额计算
-        BigDecimal payerTotal = preOrder.getOrderAmount();
-        if (orderMemberCouponId != null) {
-            MemberCoupon memberCoupon = memberCouponService.getMemberCoupon(orderMemberCouponId);
-            preOrder.setOrderMemberCouponId(orderMemberCouponId);
-            preOrder.setOrderPreferentialAmount(memberCoupon.getReceivePreferentialAmount());
-            // 如果存在客户优惠券,则实付金额  = 应付金额 - 客户优惠券的优惠金额
-            payerTotal = payerTotal.subtract(preOrder.getOrderPreferentialAmount());
-        }
-        preOrder.setPayerTotal(payerTotal);
+        // 实付金额
+        preOrder.setPayerTotal(spe.getSpecSPrice());
         preOrder.setOrderGoodsId(spe.getGoodsId());
         preOrder.setOrderEquId(equId);
         orderService.save(preOrder);
@@ -263,14 +254,6 @@ public class AndroidApi
 
                 });
             }
-            // 支付成功后, 回写客户优惠券状态
-            if (localOrder.getOrderMemberCouponId() != null) {
-                MemberCoupon memberCoupon = new MemberCoupon();
-                memberCoupon.setId(localOrder.getOrderMemberCouponId());
-                // 设置客户优惠券使用状态为:已使用
-                memberCoupon.setStatus("1");
-                memberCouponService.updateById(memberCoupon);
-            }
             System.out.println("支付成功,配方是" + JSON.toJSONString(formulaList));
             resultMap.put("productConfig", formulaList);
             resultMap.put("order", localOrder);
@@ -458,13 +441,11 @@ public class AndroidApi
         UpdateWrapper<Order> updateWrapper = new UpdateWrapper<>();
         updateWrapper.eq("id", orderId).set("order_status", orderStatus);
         boolean update = orderService.update(updateWrapper);
-
         if (orderStatus.equals("3")) {
             System.out.println("订单" + orderId + "生产完成,准备扣减物料");
             barrelService.updateBarrel(speId, equId);
             return R.success(update);
         }
-
         if (orderStatus.equals("4")) {
             //调用微信支付api,发起退款
             System.out.println("进入申请退款流程");
@@ -473,7 +454,6 @@ public class AndroidApi
             refundsDto.setReason("生产异常");
             String s = IdUtil.getSnowflake(0, 0).nextIdStr();
             refundsDto.setOut_refund_no(s);
-
             RefundsAmount refundsAmount = new RefundsAmount();
             BigDecimal orderAmount = order.getOrderAmount();
             int total = orderAmount.movePointRight(2).intValue();
@@ -483,10 +463,7 @@ public class AndroidApi
 
             refundsDto.setAmount(refundsAmount);
             Map<String, String> refunds = wxPayService.refunds(refundsDto);
-
         }
-
-
         return R.success(update);
     }
 

+ 28 - 4
imcs-bt-be/imcs-authority-server/src/main/java/com/github/zuihou/api/MiniApp.java

@@ -10,6 +10,7 @@ import com.github.zuihou.business.coupon.service.CouponService;
 import com.github.zuihou.business.member.entity.Member;
 import com.github.zuihou.business.member.service.MemberService;
 import com.github.zuihou.business.memberCoupon.entity.MemberCoupon;
+import com.github.zuihou.business.memberCoupon.service.MemberCouponService;
 import com.github.zuihou.business.order.entity.Order;
 import com.github.zuihou.business.order.service.OrderService;
 import com.github.zuihou.business.productionresource.entity.ProductionResource;
@@ -70,6 +71,9 @@ public class MiniApp {
     @Autowired
     private CouponService couponService;
 
+    @Resource
+    private MemberCouponService memberCouponService;
+
     @Autowired
     private BaseConfigService baseConfigService;
 
@@ -189,6 +193,11 @@ public class MiniApp {
         String openId = (String) BaseContextHandler.get("openId");
 
         String orderId = param.get("orderId");
+        // 获取用户选择的优惠券ID
+        Long orderMemberCouponId = null;
+        if (StringUtils.isNotBlank(param.get("orderMemberCouponId"))) {
+            orderMemberCouponId =  Long.valueOf(param.get("orderMemberCouponId"));
+        }
 
         QueryWrap<Member> memberQueryWrap = new QueryWrap<>();
         memberQueryWrap.eq("member_openId", openId);
@@ -197,12 +206,20 @@ public class MiniApp {
 
         Order localOrder = orderService.getById(orderId);
         localOrder.setOrderMemberId(member.getId());
-
+        // 获取实付金额
         BigDecimal payerTotal = localOrder.getPayerTotal();
-
+        if (orderMemberCouponId != null) {
+            MemberCoupon memberCoupon = memberCouponService.getMemberCoupon(orderMemberCouponId);
+            localOrder.setOrderMemberCouponId(orderMemberCouponId);
+            localOrder.setOrderPreferentialAmount(memberCoupon.getReceivePreferentialAmount());
+            // 如果存在客户优惠券,则实付金额  = 应付金额 - 客户优惠券的优惠金额
+            payerTotal = payerTotal.subtract(localOrder.getOrderPreferentialAmount());
+            // 实付金额更新
+            localOrder.setPayerTotal(payerTotal);
+        }
+        // 实付金额单位换算为分
         int fenAmount = payerTotal.movePointRight(2).intValue();
 
-
         String speId = localOrder.getOrderSpecs() + "";
         Map<String, String> goodsMap = speService.getGoods(speId);
         String goodsName = goodsMap.get("goodsName");
@@ -280,7 +297,14 @@ public class MiniApp {
 
         localOrder.setOrderPrepayId(prepayId);
         boolean b = orderService.updateById(localOrder);
-
+        // 回写客户优惠券状态
+        if (localOrder.getOrderMemberCouponId() != null) {
+            MemberCoupon memberCoupon = new MemberCoupon();
+            memberCoupon.setId(localOrder.getOrderMemberCouponId());
+            // 设置客户优惠券使用状态为:已使用
+            memberCoupon.setStatus("1");
+            memberCouponService.updateById(memberCoupon);
+        }
 
         return R.success(returnMap);
 

+ 23 - 0
imcs-bt-be/imcs-business-biz/src/main/java/com/github/zuihou/business/refund/dao/RefundRecordMapper.java

@@ -0,0 +1,23 @@
+package com.github.zuihou.business.refund.dao;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.zuihou.base.mapper.SuperMapper;
+import com.github.zuihou.business.refund.dto.RefundRecordPageDTO;
+import com.github.zuihou.business.refund.entity.RefundRecord;
+import com.github.zuihou.database.mybatis.auth.DataScope;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface RefundRecordMapper extends SuperMapper<RefundRecord> {
+    /**
+     * 查询退款记录列表
+     *
+     * @param page 分页参数
+     * @param model 查询入参
+     * @param dataScope 数据范围
+     * @return 查询结果
+     */
+    IPage<RefundRecord> selcetPage(Page<RefundRecord> page, @Param("model") RefundRecordPageDTO model, DataScope dataScope);
+}

+ 20 - 0
imcs-bt-be/imcs-business-biz/src/main/java/com/github/zuihou/business/refund/service/RefundRecordService.java

@@ -0,0 +1,20 @@
+package com.github.zuihou.business.refund.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.zuihou.base.request.PageParams;
+import com.github.zuihou.base.service.SuperService;
+import com.github.zuihou.business.refund.dto.RefundRecordPageDTO;
+import com.github.zuihou.business.refund.entity.RefundRecord;
+
+/**
+ *
+ */
+public interface RefundRecordService extends SuperService<RefundRecord> {
+    /**
+     * 查询退款记录列表
+     *
+     * @param pageParams 查询入参
+     * @return 结果
+     */
+    IPage<RefundRecord> selcetPage(PageParams<RefundRecordPageDTO> pageParams);
+}

+ 36 - 0
imcs-bt-be/imcs-business-biz/src/main/java/com/github/zuihou/business/refund/service/impl/RefundRecordServiceImpl.java

@@ -0,0 +1,36 @@
+package com.github.zuihou.business.refund.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.zuihou.base.request.PageParams;
+import com.github.zuihou.base.service.SuperServiceImpl;
+import com.github.zuihou.business.coupon.entity.Coupon;
+import com.github.zuihou.business.refund.dao.RefundRecordMapper;
+import com.github.zuihou.business.refund.dto.RefundRecordPageDTO;
+import com.github.zuihou.business.refund.entity.RefundRecord;
+import com.github.zuihou.business.refund.service.RefundRecordService;
+import com.github.zuihou.database.mybatis.auth.DataScope;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 退款记录业务接口实现类
+ */
+@Service
+@Slf4j
+public class RefundRecordServiceImpl extends SuperServiceImpl<RefundRecordMapper, RefundRecord> implements RefundRecordService {
+    @Autowired
+    private RefundRecordMapper refundRecordMapper;
+
+    @Override
+    public IPage<RefundRecord> selcetPage(PageParams<RefundRecordPageDTO> pageParams) {
+        Page<RefundRecord> page = new Page<>(pageParams.getCurrent(), pageParams.getSize());
+        if (StringUtils.isBlank(pageParams.getModel().getRefundType())) {
+            // 设置退款类型查询默认值, -1 -> 查询所有状态
+            pageParams.getModel().setRefundType("-1");
+        }
+        return baseMapper.selcetPage(page, pageParams.getModel(), new DataScope());
+    }
+}

+ 49 - 0
imcs-bt-be/imcs-business-biz/src/main/resources/mapper_business/base/refundRecord/RefundRecordMapper.xml

@@ -0,0 +1,49 @@
+<?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="com.github.zuihou.business.refund.dao.RefundRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.github.zuihou.business.refund.entity.RefundRecord">
+        <id column="id" jdbcType="BIGINT" property="id"/>
+        <result column="order_id" jdbcType="BIGINT" property="orderId"/>
+        <result column="refund_type" jdbcType="VARCHAR" property="refundType"/>
+        <result column="refund_reason" jdbcType="VARCHAR" property="refundReason"/>
+        <result column="refund_amount" jdbcType="DECIMAL" property="refundAmount"/>
+        <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
+        <result column="create_user" jdbcType="BIGINT" property="createUser"/>
+        <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
+        <result column="update_user" jdbcType="BIGINT" property="updateUser"/>
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+
+    </sql>
+
+    <sql id="Base_selectPage">
+        select
+            rr.id,
+            rr.order_id,
+            rr.refund_type,
+            rr.refund_reason,
+            rr.create_time,
+            rr.create_user,
+            rr.update_time,
+            rr.update_user
+        from bt_refund_record rr
+        <trim prefix="WHERE" prefixOverrides="AND">
+            <if test="model.refundType!= null and model.refundType!= '-1'">
+                and rr.refund_type = #{model.refundType,jdbcType=VARCHAR }
+            </if>
+        </trim>
+        ORDER BY rr.create_time DESC
+    </sql>
+
+    <select id="selcetPage" resultMap="BaseResultMap">
+        <!-- 嵌套作为扩展,用于前端动态传递的排序字段 -->
+        select *
+        from (
+           <include refid="Base_selectPage" />
+        ) s
+    </select>
+</mapper>

+ 79 - 0
imcs-bt-be/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/refund/RefundRecordController.java

@@ -0,0 +1,79 @@
+package com.github.zuihou.business.controller.refund;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.zuihou.base.R;
+import com.github.zuihou.base.controller.SuperController;
+import com.github.zuihou.base.request.PageParams;
+import com.github.zuihou.business.order.entity.Order;
+import com.github.zuihou.business.order.service.OrderService;
+import com.github.zuihou.business.refund.dto.RefundRecordPageDTO;
+import com.github.zuihou.business.refund.dto.RefundRecordSaveDTO;
+import com.github.zuihou.business.refund.dto.RefundRecordUpdateDTO;
+import com.github.zuihou.business.refund.entity.RefundRecord;
+import com.github.zuihou.business.refund.service.RefundRecordService;
+import com.github.zuihou.business.spe.entity.Spe;
+import com.github.zuihou.database.mybatis.conditions.query.QueryWrap;
+import com.github.zuihou.log.annotation.SysLog;
+import com.github.zuihou.security.annotation.PreAuth;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ *
+ */
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/refundRecord")
+@Api(value = "RefundRecord", tags = "退款记录表")
+@PreAuth(replace = "refundRecord:")
+public class RefundRecordController extends SuperController<RefundRecordService, Long, RefundRecord, RefundRecordPageDTO, RefundRecordSaveDTO, RefundRecordUpdateDTO> {
+    @Autowired
+    private OrderService orderService;
+
+    @Override
+    @PostMapping({"/page"})
+    @ApiOperation(value = "退款记录分页列表查询", notes = "退款记录分页列表查询")
+    @SysLog(value = "'分页列表查询:第' + #params?.current + '页, 显示' + #params?.size + '行'", response = false)
+    public R<IPage<RefundRecord>> page(@RequestBody @Validated PageParams<RefundRecordPageDTO> pageParams) {
+        return this.success(baseService.selcetPage(pageParams));
+    }
+
+    @PostMapping("/save")
+    @SysLog(value = "新增退款", request = false)
+    @ApiOperation(value = "新增退款", notes = "新增退款")
+    public R saveRefundRecord(@RequestBody @Validated RefundRecordSaveDTO saveDTO) {
+        Order order = orderService.getById(saveDTO.getOrderId());
+        if (order == null) {
+            return R.fail("订单不存在");
+        }
+        if (!order.getOrderStatus().equals("4")) {
+            return R.fail("非异常订单不能退款");
+        }
+        if (order.getPayerTotal().compareTo(saveDTO.getRefundAmount()) < 0 ) {
+            return R.fail("退款金额不能大于订单支付金额");
+        }
+
+        QueryWrap<RefundRecord> refundRecordQueryWrap = new QueryWrap<>();
+        refundRecordQueryWrap.eq("order_id", saveDTO.getOrderId());
+        RefundRecord dbRefundRecord = baseService.getOne(refundRecordQueryWrap);
+        if (dbRefundRecord != null) {
+            return R.fail("该订单已退款");
+        }
+        RefundRecord model = BeanUtil.toBean(saveDTO, this.getEntityClass());
+        // 运维页面调用,全部为人工退款
+        model.setRefundType("1");
+        baseService.save(model);
+        return R.success();
+    }
+}

+ 28 - 0
imcs-bt-be/imcs-business-entity/src/main/java/com/github/zuihou/business/refund/dto/RefundRecordPageDTO.java

@@ -0,0 +1,28 @@
+package com.github.zuihou.business.refund.dto;
+
+import com.github.zuihou.business.coupon.validate.EnumValue;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@ApiModel(value = "RefundRecordPageDTO", description = "退款记录分页dto")
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = false)
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class RefundRecordPageDTO implements Serializable {
+    private static final long serialVersionUID = 6230876998065708555L;
+
+    /**
+     * 退款类型: 0 -> 自动退款, 1 -> 人工退款
+     */
+    @ApiModelProperty(value = "退款类型: 0 -> 自动退款, 1 -> 人工退款")
+    @EnumValue(strValues = {"-1", "0", "1"}, message = "状态只能是-1、0或者1")
+    private String refundType;
+}

+ 48 - 0
imcs-bt-be/imcs-business-entity/src/main/java/com/github/zuihou/business/refund/dto/RefundRecordSaveDTO.java

@@ -0,0 +1,48 @@
+package com.github.zuihou.business.refund.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.github.zuihou.business.refund.entity.RefundRecord;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.DecimalMin;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@ApiModel(value = "RefundRecordSaveDTO", description = "退款记录保存dto")
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = false)
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class RefundRecordSaveDTO implements Serializable {
+    private static final long serialVersionUID = -6450736153943893826L;
+
+    /**
+     * 订单ID
+     */
+    @ApiModelProperty(value = "订单ID")
+    @NotNull(message = "订单ID不能为空")
+    private Long orderId;
+
+    /**
+     * 退款原因
+     */
+    @ApiModelProperty(value = "退款原因")
+    @Size(max = 200, message = "退款原因最大长度不超过200")
+    private String refundReason;
+
+    /**
+     * 退款金额
+     */
+    @ApiModelProperty(value = "退款金额")
+    @NotNull(message = "退款金额不可为空")
+    @DecimalMin(value = "0.01", message = "退款金额必须大于0.00元")
+    private BigDecimal refundAmount;
+}

+ 9 - 0
imcs-bt-be/imcs-business-entity/src/main/java/com/github/zuihou/business/refund/dto/RefundRecordUpdateDTO.java

@@ -0,0 +1,9 @@
+package com.github.zuihou.business.refund.dto;
+
+import com.github.zuihou.business.refund.entity.RefundRecord;
+
+import java.io.Serializable;
+
+public class RefundRecordUpdateDTO extends RefundRecord implements Serializable {
+    private static final long serialVersionUID = -6144186856351877305L;
+}

+ 62 - 0
imcs-bt-be/imcs-business-entity/src/main/java/com/github/zuihou/business/refund/entity/RefundRecord.java

@@ -0,0 +1,62 @@
+package com.github.zuihou.business.refund.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.github.zuihou.base.entity.Entity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+/**
+ * 退款记录实体表
+ */
+@TableName("bt_refund_record")
+@ApiModel(value = "RefundRecord", description = "退款记录表")
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class RefundRecord extends Entity<Long> {
+    private static final long serialVersionUID = -8191068394502456640L;
+
+    /**
+     * 退款记录ID
+     */
+    @ApiModelProperty(value = "退款记录id")
+    @TableField("id")
+    private Long id;
+
+    /**
+     * 订单ID
+     */
+    @ApiModelProperty(value = "订单ID")
+    @TableField("order_id")
+    private Long orderId;
+
+    /**
+     * 退款类型: 0 -> 自动退款, 1 -> 人工退款
+     */
+    @ApiModelProperty(value = "退款类型: 0 -> 自动退款, 1 -> 人工退款")
+    @TableField("refund_type")
+    private String refundType;
+
+    /**
+     * 退款原因
+     */
+    @ApiModelProperty(value = "退款原因")
+    @TableField("refund_reason")
+    private String refundReason;
+
+    /**
+     * 退款金额
+     */
+    @ApiModelProperty(value = "退款金额")
+    @TableField("refund_amount")
+    private BigDecimal refundAmount;
+}