src/main/java/cc/mrbird/febs/common/enumerates/OrderRefundStatusEnum.java
New file @@ -0,0 +1,42 @@ package cc.mrbird.febs.common.enumerates; import lombok.Getter; /** * @author wzy * @date 2021-09-23 **/ @Getter public enum OrderRefundStatusEnum { /** * 退款已提交 */ REFUND_APPLY(1), /** * 同意退款 */ AGREE(2), /** * 驳回退款 */ DISAGREE(3), /** * 物流信息已提交 */ EXPRESS_SUBMIT(4), /** * 已退款 */ FINISH(5), /** * 已取消 */ CANCEL(6); private final Integer value; OrderRefundStatusEnum(int value) { this.value = value; } } src/main/java/cc/mrbird/febs/common/enumerates/OrderStatusEnum.java
@@ -26,7 +26,7 @@ */ REFUNDING(5), /** * 已退款 * 退款处理完成 */ REFUNDED(6), /** src/main/java/cc/mrbird/febs/common/utils/AppContants.java
@@ -58,5 +58,9 @@ public static final String TIME_OUT = "time_out"; public static final int DEL_FLAG_Y = 1; public static final int DEL_FLAG_N = 2; } src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java
@@ -1,10 +1,7 @@ package cc.mrbird.febs.mall.controller; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.AddOrderDto; import cc.mrbird.febs.mall.dto.AddRefundDto; import cc.mrbird.febs.mall.dto.OrderListDto; import cc.mrbird.febs.mall.dto.PayOrderDto; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.service.IApiMallOrderInfoService; import cc.mrbird.febs.mall.vo.OrderDetailVo; import cc.mrbird.febs.mall.vo.OrderListVo; @@ -93,9 +90,16 @@ } @ApiOperation(value = "提交退款申请", notes = "提交退款申请") @PostMapping(value = "/addRefund") public FebsResponse addRefund(@RequestBody AddRefundDto addRefundDto) { return null; @PostMapping(value = "/applyRefund") public FebsResponse applyRefund(@RequestBody AddRefundDto addRefundDto) { mallOrderInfoService.applyRefund(addRefundDto); return new FebsResponse().success().message("提交成功"); } @ApiOperation(value = "提交退款物流信息", notes = "提交退款物流信息") @PostMapping(value = "/refundExpress") public FebsResponse refundExpress(@RequestBody RefundExpressDto refundExpressDto) { mallOrderInfoService.refundExpress(refundExpressDto); return new FebsResponse().success().message("提交成功"); } } src/main/java/cc/mrbird/febs/mall/conversion/MallOrderRefundConversion.java
New file @@ -0,0 +1,17 @@ package cc.mrbird.febs.mall.conversion; import cc.mrbird.febs.mall.entity.MallOrderRefund; import cc.mrbird.febs.mall.vo.OrderRefundVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; /** * @author wzy * @date 2021-09-23 **/ @Mapper public abstract class MallOrderRefundConversion { public static final MallOrderRefundConversion INSTANCE = Mappers.getMapper(MallOrderRefundConversion.class); public abstract OrderRefundVo entityToVo(MallOrderRefund orderRefund); } src/main/java/cc/mrbird/febs/mall/dto/RefundExpressDto.java
New file @@ -0,0 +1,24 @@ package cc.mrbird.febs.mall.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @author wzy * @date 2021-09-23 **/ @Data @ApiModel(value = "RefundExpressDto", description = "退款订单物流接收参数类") public class RefundExpressDto { @ApiModelProperty(value = "订单ID", example = "1") private Long id; @ApiModelProperty(value = "物流单号", example = "123") private String expressNo; @ApiModelProperty(value = "物流公司", example = "中通") private String expressCom; } src/main/java/cc/mrbird/febs/mall/entity/MallOrderRefund.java
@@ -23,7 +23,7 @@ private String remark; /** * 1-已申请 2-同意退款 3-驳回退款 4-已提交物流信息 5-已退款 * 1-已申请 2-同意退款 3-驳回退款 4-已提交物流信息 5-已退款 6-已取消 */ private Integer status; src/main/java/cc/mrbird/febs/mall/mapper/MallOrderRefundMapper.java
@@ -2,6 +2,9 @@ import cc.mrbird.febs.mall.entity.MallOrderRefund; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; public interface MallOrderRefundMapper extends BaseMapper<MallOrderRefund> { MallOrderRefund selectOrderRefundByOrderId(@Param("orderId") Long orderId); } src/main/java/cc/mrbird/febs/mall/mapper/MallShoppingCartMapper.java
@@ -15,4 +15,6 @@ List<MallShoppingCart> selectCartGoodsList(@Param("memberId") Long memberId); MallShoppingCart selectCartGoodsBySkuId(@Param("skuId") Long skuId, @Param("memberId") Long memberId); int delBySkuId(@Param("skuId") Long skuId, @Param("memberId") Long memberId); } src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java
@@ -1,8 +1,6 @@ package cc.mrbird.febs.mall.service; import cc.mrbird.febs.mall.dto.AddOrderDto; import cc.mrbird.febs.mall.dto.OrderListDto; import cc.mrbird.febs.mall.dto.PayOrderDto; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.entity.MallOrderInfo; import cc.mrbird.febs.mall.vo.OrderDetailVo; import cc.mrbird.febs.mall.vo.OrderListVo; @@ -23,4 +21,10 @@ OrderDetailVo findOrderDetailsById(Long id); void confirmOrder(Long id); void delOrder(Long id); void applyRefund(AddRefundDto addRefundDto); void refundExpress(RefundExpressDto refundExpressDto); } src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -1,20 +1,21 @@ package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.enumerates.OrderRefundStatusEnum; import cc.mrbird.febs.common.enumerates.OrderStatusEnum; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.mall.conversion.MallOrderInfoConversion; import cc.mrbird.febs.mall.dto.AddOrderDto; import cc.mrbird.febs.mall.dto.AddOrderItemDto; import cc.mrbird.febs.mall.dto.OrderListDto; import cc.mrbird.febs.mall.dto.PayOrderDto; import cc.mrbird.febs.mall.conversion.MallOrderRefundConversion; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.IApiMallOrderInfoService; import cc.mrbird.febs.mall.vo.OrderDetailVo; import cc.mrbird.febs.mall.vo.OrderListVo; import cc.mrbird.febs.mall.vo.OrderRefundVo; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; @@ -48,6 +49,9 @@ private final MallMemberMapper memberMapper; private final IApiMallMemberWalletService memberWalletService; private final MallExpressInfoMapper expressInfoMapper; private final MallOrderRefundMapper mallOrderRefundMapper; private final MallOrderRefundOperationMapper mallOrderRefundOperationMapper; private final MallShoppingCartMapper mallShoppingCartMapper; @Override @Transactional(rollbackFor = Exception.class) @@ -106,6 +110,10 @@ sku.setStock(sku.getStock() - item.getCnt()); mallGoodsSkuMapper.updateById(sku); if (addOrderDto.getType() == 1) { mallShoppingCartMapper.delBySkuId(sku.getId(), member.getId()); } } orderInfo.setAmount(total); @@ -119,7 +127,7 @@ public void cancelOrder(Long id) { MallMember member = LoginUserUtil.getLoginUser(); MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), id); if (orderInfo == null) { if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) { throw new FebsException("订单不存在"); } @@ -137,7 +145,7 @@ public String payOrder(PayOrderDto payOrderDto) { MallMember member = LoginUserUtil.getLoginUser(); MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), payOrderDto.getId()); if (orderInfo == null) { if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) { throw new FebsException("订单不存在"); } @@ -186,7 +194,7 @@ @Override public OrderDetailVo findOrderDetailsById(Long id) { MallOrderInfo orderInfo = this.baseMapper.selectOrderDetailsById(id); if (orderInfo == null) { if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) { throw new FebsException("订单不存在"); } @@ -197,6 +205,12 @@ orderDetailVo.setExpressNo(expressInfo.getExpressNo()); orderDetailVo.setExpressCom(expressInfo.getExpressCom()); } if (orderInfo.getStatus() == OrderStatusEnum.REFUNDING.getValue() || orderInfo.getStatus() == OrderStatusEnum.REFUNDED.getValue()) { MallOrderRefund orderRefund = mallOrderRefundMapper.selectOrderRefundByOrderId(orderInfo.getId()); OrderRefundVo orderRefundVo = MallOrderRefundConversion.INSTANCE.entityToVo(orderRefund); orderDetailVo.setOrderRefund(orderRefundVo); } return orderDetailVo; } @@ -205,12 +219,92 @@ public void confirmOrder(Long id) { MallMember member = LoginUserUtil.getLoginUser(); MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), id); if (orderInfo == null) { if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) { throw new FebsException("订单不存在"); } if (orderInfo.getStatus() != OrderStatusEnum.WAIT_FINISH.getValue()) { throw new FebsException("该状态不能确认收货"); } orderInfo.setStatus(OrderStatusEnum.FINISH.getValue()); orderInfo.setReceivingTime(new Date()); this.baseMapper.updateById(orderInfo); } @Override public void delOrder(Long id) { MallMember member = LoginUserUtil.getLoginUser(); MallOrderInfo orderInfo = this.baseMapper.selectOrderByMemberIdAndId(member.getId(), id); if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) { throw new FebsException("订单不存在"); } orderInfo.setDelFlag(AppContants.DEL_FLAG_Y); this.baseMapper.updateById(orderInfo); } @Override @Transactional(rollbackFor = Exception.class) public void applyRefund(AddRefundDto addRefundDto) { MallOrderInfo orderInfo = this.baseMapper.selectById(addRefundDto.getId()); if (orderInfo == null || AppContants.DEL_FLAG_Y == orderInfo.getDelFlag()) { throw new FebsException("订单不存在"); } if (orderInfo.getStatus() == OrderStatusEnum.REFUNDING.getValue()) { throw new FebsException("已提交退款, 请勿重复提交"); } if (orderInfo.getStatus() == OrderStatusEnum.WAIT_PAY.getValue()) { throw new FebsException("该订单不能退款"); } MallMember member = LoginUserUtil.getLoginUser(); orderInfo.setStatus(OrderStatusEnum.REFUNDING.getValue()); this.baseMapper.updateById(orderInfo); MallOrderRefund orderRefund = mallOrderRefundMapper.selectOrderRefundByOrderId(orderInfo.getId()); if (orderRefund == null) { orderRefund = new MallOrderRefund(); orderRefund.setOrderId(orderInfo.getId()); orderRefund.setMemberId(member.getId()); orderRefund.setDesp(addRefundDto.getDesp()); orderRefund.setReason(addRefundDto.getReason()); orderRefund.setStatus(OrderRefundStatusEnum.REFUND_APPLY.getValue()); mallOrderRefundMapper.insert(orderRefund); } else { orderRefund.setDesp(addRefundDto.getDesp()); orderRefund.setReason(addRefundDto.getReason()); orderRefund.setStatus(OrderRefundStatusEnum.REFUND_APPLY.getValue()); mallOrderRefundMapper.updateById(orderRefund); } MallOrderRefundOperation operation = new MallOrderRefundOperation(); operation.setOrderId(orderInfo.getId()); operation.setRefundId(orderRefund.getId()); operation.setContent(StrUtil.format("用户:{}提交退款申请", member.getName())); mallOrderRefundOperationMapper.insert(operation); } @Override public void refundExpress(RefundExpressDto refundExpressDto) { MallMember member = LoginUserUtil.getLoginUser(); MallOrderRefund orderRefund = mallOrderRefundMapper.selectOrderRefundByOrderId(refundExpressDto.getId()); if (!OrderRefundStatusEnum.AGREE.getValue().equals(orderRefund.getStatus())) { throw new FebsException("暂不能提交物流信息"); } orderRefund.setExpressNo(refundExpressDto.getExpressNo()); orderRefund.setExpressCom(refundExpressDto.getExpressCom()); mallOrderRefundMapper.updateById(orderRefund); MallOrderRefundOperation operation = new MallOrderRefundOperation(); operation.setOrderId(refundExpressDto.getId()); operation.setRefundId(orderRefund.getId()); operation.setContent(StrUtil.format("用户:{}提交物流信息,快递公司:{},单号:{}", member.getName(), refundExpressDto.getExpressCom(), refundExpressDto.getExpressNo())); mallOrderRefundOperationMapper.insert(operation); } } src/main/java/cc/mrbird/febs/mall/vo/OrderDetailVo.java
@@ -51,4 +51,7 @@ @ApiModelProperty(value = "订单明细") private List<OrderItemVo> items; @ApiModelProperty(value = "订单退款信息") private OrderRefundVo orderRefund; } src/main/java/cc/mrbird/febs/mall/vo/OrderListVo.java
@@ -25,7 +25,7 @@ @ApiModelProperty(value = "下单时间") private Date orderTime; @ApiModelProperty(value = "状态 1-待支付2-待发货3-待收货4-已完成5-退款中6-已退款7-已取消") @ApiModelProperty(value = "状态 1-待支付 2-待发货 3-待收货 4-已完成 5-退款中 6-退款处理完成 7-已取消") private Integer status; @ApiModelProperty(value = "订单金额") src/main/java/cc/mrbird/febs/mall/vo/OrderRefundVo.java
New file @@ -0,0 +1,32 @@ package cc.mrbird.febs.mall.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @author wzy * @date 2021-09-23 **/ @Data @ApiModel(value = "OrderRefundVo", description = "订单退款详情返回参数类") public class OrderRefundVo { @ApiModelProperty(value = "退款ID") private Long id; @ApiModelProperty(value = "退款理由") private String reason; @ApiModelProperty(value = "描述") private String desp; @ApiModelProperty(value = "退款状态 1-已申请 2-同意退款 3-驳回退款 4-已提交物流信息 5-已退款 6-已取消") private Integer status; @ApiModelProperty(value = "物流单号") private String expressNo; @ApiModelProperty(value = "物流公司") private String expressCom; } src/main/resources/mapper/modules/MallOrderRefundMapper.xml
@@ -2,4 +2,7 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cc.mrbird.febs.mall.mapper.MallOrderRefundMapper"> <select id="selectOrderRefundByOrderId" resultType="cc.mrbird.febs.mall.entity.MallOrderRefund"> select * from mall_order_refund where order_id=#{orderId} </select> </mapper> src/main/resources/mapper/modules/MallShoppingCartMapper.xml
@@ -20,4 +20,9 @@ select * from mall_shopping_cart where member_id=#{memberId} and sku_id=#{skuId} </select> <delete id="delBySkuId"> delete from mall_shopping_cart where member_id=#{memberId} and sku_id=#{skuId} </delete> </mapper>