wangming 6 päivää sitten
vanhempi
commit
6424577f76

+ 168 - 0
yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderRefundController.java

@@ -38,6 +38,7 @@ import ma.glasnost.orika.MapperFacade;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
@@ -113,6 +114,173 @@ public class OrderRefundController {
         }
     }
 
+    @GetMapping("/queryOrderRefundById")
+    @ApiOperation(value = "查询申请退款单")
+    public ResponseEntity<OrderRefund> queryOrderRefundById(Long refundId) {
+        OrderRefund orderRefund = orderRefundService.getById(refundId);
+        if (orderRefund == null) {
+            throw new GlobalException("退款信息不存在...");
+        }
+        orderRefund.setOrderRefundSkuList(orderRefundSkuMapper.selectList(new LambdaQueryWrapper<OrderRefundSku>().eq(OrderRefundSku::getOrderRefundId,refundId)));
+        return ResponseEntity.ok(orderRefund);
+    }
+
+    @PostMapping("/applyAgain")
+    @Transactional(rollbackFor = Exception.class)
+    @ApiOperation(value = "申请退款(再次提交)", notes = "申请退款(再次提交)")
+    public ResponseEntity<String> applyAgain(@Valid @RequestBody OrderRefundParam orderRefundParam) {
+        Long refundId = orderRefundParam.getRefundId();
+        CullenUtils.validateDataThrowException(refundId==null,"请输入旧退款订单ID...");
+        List<OrderRefundSku> orderRefundSkuList = orderRefundParam.getOrderRefundSkuList();
+        CullenUtils.validateDataThrowException(orderRefundSkuList.isEmpty(),"退款商品不能为空...");
+        String userId = SecurityUtils.getUser().getUserId();
+        Order order = orderService.getOrderByOrderNumberAndUserId(orderRefundParam.getOrderNumber(), userId, true);
+
+        if (!Objects.equals(order.getIsPayed(), 1)) {
+            throw new GlobalException("当前订单还未付款,无法申请");
+        }
+
+        if (Objects.equals(order.getHbOrderStatus(), OrderStatus.CLOSE.value())) {
+            throw new GlobalException("当前订单已失败,不允许退款");
+        }
+
+        if (Objects.equals(order.getHbOrderStatus(), OrderStatus.WAIT_GROUP.value())) {
+            throw new GlobalException("当前订单正在等待成团状态,需等待成团才能进行下一步操作");
+        }
+
+        if (orderRefundParam.getRefundAmount() > (order.getActualTotal())) {
+            throw new GlobalException("退款金额已超出订单金额,无法申请");
+        }
+
+        if (!orderRefundService.checkRefundDate(order)) {
+            throw new GlobalException("当前订单已确认收货超过" + Constant.MAX_FINALLY_REFUND_TIME + "天,无法退款");
+        }
+        if (Objects.equals(order.getOrderType(), Constant.ORDER_TYPE_SCORE)) {
+            throw new GlobalException("积分商品,无法退款");
+        }
+        if (Objects.equals(orderRefundParam.getRefundType(), RefundType.ALL.value()) && (!Objects.isNull(order.getRefundStatus()) && !Objects.equals(order.getRefundStatus(), RefundStatusEnum.DISAGREE.value()))) {
+            throw new GlobalException("该订单已有商品正在退款中,不能再进行整单退款");
+        }
+
+        OrderRefund newOrderRefund = new OrderRefund();
+
+        // 获取所有正在进行中的退款订单
+        List<OrderRefund> orderRefunds = orderRefundService.getProcessingOrderRefundByOrderId(order.getOrderId());
+
+        for (OrderRefund orderRefund : orderRefunds) {
+            if (Objects.equals(RefundType.ALL.value(), orderRefund.getRefundType())) {
+                throw new GlobalException("该订单正在进行整单退款,无法进行新的退款操作");
+            }
+            if (Objects.equals(orderRefund.getOrderItemId(), orderRefundParam.getOrderItemId())) {
+                throw new GlobalException("该商品正在进行退款中,无法进行新的退款操作");
+            }
+        }
+
+        // 如果存在分销订单,则计算分销总金额
+        List<OrderItem> orderItemList = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
+        // 判断退款单类型(1:整单退款,2:单个物品退款)
+        if (orderRefundParam.getRefundType().equals(RefundType.ALL.value())) {
+            // 全部物品退款
+            // 计算该订单项的分销金额
+            newOrderRefund.setDistributionTotalAmount(orderService.sumTotalDistributionAmountByOrderItem(orderItemList));
+            // 计算平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)
+            newOrderRefund.setPlatformRefundAmount(order.getPlatformAmount());
+        } else {
+            // 部分物品退款
+            OrderItem orderItem = orderItemService.getOne(new LambdaQueryWrapper<OrderItem>()
+                    .eq(OrderItem::getOrderItemId, orderRefundParam.getOrderItemId())
+                    .eq(OrderItem::getOrderNumber, orderRefundParam.getOrderNumber()));
+            if (orderItem == null) {
+                throw new GlobalException("该物品在订单中不存在");
+            }
+            boolean isCanRefund = false;
+            //  查看是否有支付金额和积分都为空的订单,有则抛出异常
+            for (OrderItem item : orderItemList) {
+                if (item.getActualTotal() <= 0.0 && item.getUseScore() <= 0.0) {
+                    isCanRefund = true;
+                    break;
+                }
+            }
+            if (isCanRefund) {
+                throw new GlobalException("该订单部分订单项支付金额和积分为0,无法使用部分退款!");
+            }
+
+            if (order.getPlatformAmount() > 0 && !Arith.isEquals(orderRefundParam.getRefundAmount(), orderItem.getActualTotal())) {
+                throw new GlobalException("该订单有使用平台优惠,无法使用部分退款!");
+            }
+            // 计算该订单项的分销金额
+            newOrderRefund.setDistributionTotalAmount(orderService.sumTotalDistributionAmountByOrderItem(Collections.singletonList(orderItem)));
+
+            // 计算平台退款金额(退款时将这部分钱退回给平台,所以商家要扣除从平台这里获取的金额)
+            newOrderRefund.setPlatformRefundAmount(orderItem.getPlatformShareReduce());
+
+            // 退款物品数量为null或者0时,则为退款全部数量
+            if (orderRefundParam.getGoodsNum() <= 0) {
+                orderRefundParam.setGoodsNum(orderItem.getProdCount());
+            }
+
+            // 判断退款数量是否溢出
+            if (orderRefundParam.getGoodsNum() > orderItem.getProdCount()) {
+                throw new GlobalException("退款物品数量已超出订单中的数量,不允许申请");
+            }
+
+            // 判断退款金额是否超出订单金额
+            double refundSingleAmount = Arith.div(orderRefundParam.getRefundAmount(), orderRefundParam.getGoodsNum(), 3);
+            double singleAmount = Arith.div(orderItem.getActualTotal(), orderItem.getProdCount(), 3);
+            if (refundSingleAmount > orderItem.getProductTotalAmount() || refundSingleAmount > singleAmount) {
+                throw new GlobalException("退款金额已超出订单金额,无法申请");
+            }
+        }
+
+        newOrderRefund.setShopId(order.getShopId());
+        newOrderRefund.setUserId(order.getUserId());
+        newOrderRefund.setOrderId(order.getOrderId());
+        newOrderRefund.setOrderNumber(order.getOrderNumber());
+        newOrderRefund.setRefundSn(String.valueOf(snowflake.nextId()));
+        newOrderRefund.setRefundType(orderRefundParam.getRefundType());
+
+        newOrderRefund.setRefundAmount(orderRefundParam.getRefundAmount());
+        if (Objects.equals(RefundType.ALL.value(), orderRefundParam.getRefundType())) {
+            newOrderRefund.setOrderItemId(0L);
+        } else {
+            newOrderRefund.setOrderItemId(orderRefundParam.getOrderItemId());
+            // 待发货状态-最后一件商品进行退款,退款金额 =  商品金额 + 订单运费金额
+            if (Objects.equals(order.getHbOrderStatus(), OrderStatus.PADYED.value()) && order.getFreightAmount() > 0) {
+                int orderItenCount = orderItemService.count(new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getOrderNumber, order.getOrderNumber()));
+                if (Objects.equals(orderRefunds.size(), orderItenCount - 1)) {
+                    newOrderRefund.setRefundAmount(Arith.add(newOrderRefund.getRefundAmount(), order.getFreightAmount()));
+                }
+            }
+        }
+
+        newOrderRefund.setGoodsNum(orderRefundParam.getGoodsNum());
+        newOrderRefund.setApplyType(orderRefundParam.getApplyType());
+        if (Objects.equals(orderRefundParam.getApplyType(), 2)) {
+            newOrderRefund.setIsReceiver(true);
+        } else {
+            newOrderRefund.setIsReceiver(orderRefundParam.getIsReceiver());
+        }
+        newOrderRefund.setBuyerReason(orderRefundParam.getBuyerReason());
+        newOrderRefund.setBuyerDesc(orderRefundParam.getBuyerDesc());
+        newOrderRefund.setBuyerMobile(orderRefundParam.getBuyerMobile());
+        newOrderRefund.setPhotoFiles(orderRefundParam.getPhotoFiles());
+        newOrderRefund.setReturnMoneySts(ReturnMoneyStsType.APPLY.value());
+        newOrderRefund.setApplyTime(new Date());
+        newOrderRefund.setUpdateTime(new Date());
+        OrderRefund orderRefund = orderRefundService.applyRefund(newOrderRefund);
+        if (!orderRefundSkuList.isEmpty()){
+            orderRefundSkuList.forEach(c->{
+                c.setOrderRefundId(orderRefund.getRefundId());
+                orderRefundSkuMapper.insert(c);
+            });
+        }
+
+        orderRefundService.removeById(refundId);
+        orderRefundSkuMapper.delete(new LambdaQueryWrapper<OrderRefundSku>().eq(OrderRefundSku::getOrderRefundId,refundId));
+        return ResponseEntity.ok(newOrderRefund.getRefundSn());
+    }
+
+
     @PostMapping("/apply")
     @ApiOperation(value = "申请退款", notes = "申请退款")
     public ResponseEntity<String> apply(@Valid @RequestBody OrderRefundParam orderRefundParam) {

+ 3 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/OrderRefundParam.java

@@ -12,6 +12,9 @@ import java.util.List;
 @Data
 public class OrderRefundParam {
 
+    @ApiModelProperty(value = "记录ID")
+    private Long refundId;
+
     @ApiModelProperty(value = "订单编号", required = true)
     @NotEmpty(message = "订单编号不能为空")
     private String orderNumber;

+ 7 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderRefund.java

@@ -11,10 +11,12 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 /**
  *
@@ -157,4 +159,9 @@ public class OrderRefund implements Serializable{
      */
     private Double platformRefundAmount = 0.0;
 
+    @TableField(exist = false)
+    @ApiModelProperty(value = "退款商品详情")
+    private List<OrderRefundSku> orderRefundSkuList;
+
+
 }

+ 0 - 1
yami-shop-bean/src/main/java/com/yami/shop/bean/model/OrderRefundSku.java

@@ -22,7 +22,6 @@ import java.io.Serializable;
 @Data
 @TableName("tz_order_refund_sku")
 public class OrderRefundSku implements Serializable{
-    private static final long serialVersionUID = 1L;
 
     /**
      * 记录ID