Browse Source

订单:退款

lyx 3 tháng trước cách đây
mục cha
commit
bcece2c27a

+ 16 - 2
alien-entity/src/main/java/shop/alien/entity/store/LifeRefundOrder.java

@@ -25,8 +25,19 @@ public class LifeRefundOrder {
 
     private String orderId;
 
-    private String amount;
-
+    /**
+     * 退款券数量
+     */
+    private Integer refundCouponAmount;
+
+    /**
+     * 退款金额
+     */
+    private String refundMoney;
+
+    /**
+     * 退款原因
+     */
     private String reason;
 
     private String description;
@@ -35,6 +46,9 @@ public class LifeRefundOrder {
 
     private Date refundTime;
 
+    @ApiModelProperty(value = "退款状态(0 退款成功 1 退款失败)")
+    private Integer status;
+
     @TableField(exist = false)
     private String quanType;
 

+ 20 - 0
alien-job/src/main/java/shop/alien/job/store/LifeUserOrderJob.java

@@ -3,6 +3,7 @@ package shop.alien.job.store;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.xxl.job.core.handler.annotation.XxlJob;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -108,4 +109,23 @@ public class LifeUserOrderJob {
                 .in(OrderCouponMiddle::getOrderId,orderIds));
         return "success";
     }
+
+    /**
+     * 自动更新总订单状态
+     */
+    @XxlJob("autoUpdateOrderStatus")
+    @Transactional(rollbackFor = Exception.class)
+    public String autoUpdateOrderStatus(){
+        // 查询所以已完成的订单id
+        List<OrderCouponMiddle> orderCouponMiddles = orderCouponMiddleMapper.selectList(new LambdaQueryWrapper<OrderCouponMiddle>()
+                .select(OrderCouponMiddle::getOrderId)
+                .eq(OrderCouponMiddle::getDeleteFlag, 0)
+                .in(OrderCouponMiddle::getStatus, OrderStatusEnum.CANCEL.getStatus(), OrderStatusEnum.WAIT_PAY.getStatus(), OrderStatusEnum.WAIT_USE.getStatus(), OrderStatusEnum.REFUND_FAILED.getStatus())
+                .groupBy(OrderCouponMiddle::getOrderId));
+        // 批量更新为已完成
+        lifeUserOrderMapper.update(null,new UpdateWrapper<LifeUserOrder>()
+                .setSql("status=" + OrderStatusEnum.COMPLETE.getStatus())
+                .in("id",orderCouponMiddles.stream().map(OrderCouponMiddle::getOrderId).collect(Collectors.toList())));
+        return "success";
+    }
 }

+ 84 - 30
alien-store/src/main/java/shop/alien/store/service/LifeUserOrderService.java

@@ -397,33 +397,85 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
         return orders.stream().map(LifeUserOrder::getQuanCode).collect(Collectors.toList());
     }
 
+    @Transactional(rollbackFor = Exception.class)
     public Map<String, Object> requestRefund(LifeRefundOrder refundOrder) {
         Map<String, Object> returnMap = new HashMap<>();
-        LifeUserOrder order = lifeUserOrderMapper.selectById(refundOrder.getOrderId());
-        if (StringUtils.isEmpty(refundOrder.getAmount()) || Double.parseDouble(refundOrder.getAmount()) == 0) {
+        if (StringUtils.isEmpty(refundOrder.getRefundMoney()) || Double.parseDouble(refundOrder.getRefundMoney()) == 0) {
             returnMap.put("fail", "无需退款或退款金额为0");
             return returnMap;
         }
-        String result = alipayTradeRefund.processRefund(order.getOrderNo(), refundOrder.getAmount(), refundOrder.getDescription());
-        if (result.equals("调用失败")) {
-            returnMap.put("success", "退款失败");
+        List<OrderCouponMiddle> orderCouponMiddles = orderCouponMiddleMapper.selectList(new QueryWrapper<OrderCouponMiddle>()
+                .eq("order_id", refundOrder.getOrderId()).eq("delete_flag",0));
+        // 待使用的券(可退款的券)
+        List<OrderCouponMiddle> orderCouponMiddles1 = orderCouponMiddles.stream().filter(orderCouponMiddle -> orderCouponMiddle.getStatus() == 1).collect(Collectors.toList());
+        if (orderCouponMiddles1.size() < refundOrder.getRefundCouponAmount()) {
+            returnMap.put("fail", "退款券数不足");
+            return returnMap;
+        }
+        // 判断累计退款金额
+        BigDecimal totalRefundMoney = new BigDecimal(refundOrder.getRefundMoney());
+        // 累计退款个数
+        int refundCouponCount = 0;
+        List<LifeRefundOrder> lifeRefundOrderList = lifeRefundOrderMapper.selectList(new QueryWrapper<LifeRefundOrder>().eq("order_id", refundOrder.getOrderId())
+                .eq("status", 0));
+        for (LifeRefundOrder lifeRefundOrder : lifeRefundOrderList) {
+            totalRefundMoney = totalRefundMoney.add(new BigDecimal(lifeRefundOrder.getRefundMoney()));
+            refundCouponCount += lifeRefundOrder.getRefundCouponAmount();
+        }
+        if(totalRefundMoney.compareTo(new BigDecimal(refundOrder.getRefundMoney()))>0){
+            returnMap.put("fail","退款金额(已退+当前退)不能大于订单金额");
             return returnMap;
         }
         Date now = new Date();
-        order.setStatus(4);
-        order.setUpdatedTime(now);
-        order.setRefundTime(now);
-        lifeUserOrderMapper.updateById(order);
-        refundOrder.setApplicationTime(now);
-        refundOrder.setRefundTime(now);
+        LifeUserOrder order = lifeUserOrderMapper.selectById(refundOrder.getOrderId());
+        String result = alipayTradeRefund.processRefund(order.getOrderNo(), refundOrder.getRefundMoney(), refundOrder.getDescription());
+        String refundMessage = "";
+
+        // 更新的中间表id
+        List<Integer> updateIds = orderCouponMiddles1.stream().limit(refundOrder.getRefundCouponAmount()).map(x -> x.getId()).collect(Collectors.toList());
+        if (result.equals("调用失败")) {
+            refundMessage = "退款失败";
+            orderCouponMiddleMapper.update(null,new UpdateWrapper<OrderCouponMiddle>().in("id",updateIds)
+                    .set("status",OrderStatusEnum.REFUND_FAILED.getStatus())
+                    .set("refund_time",now)
+                    .set("refund_reason",refundOrder.getReason()));
+            // 退款记录
+            refundOrder.setApplicationTime(now);
+            refundOrder.setRefundTime(now);
+            refundOrder.setStatus(1);
+        } else {
+            refundMessage = "退款成功";
+            orderCouponMiddleMapper.update(null,new UpdateWrapper<OrderCouponMiddle>().in("id",updateIds)
+                    .set("status",OrderStatusEnum.REFUND.getStatus())
+                    .set("refund_time",now)
+                    .set("refund_reason",refundOrder.getReason()));
+            // 退款记录
+            refundOrder.setApplicationTime(now);
+            refundOrder.setRefundTime(now);
+            refundOrder.setStatus(0);
+        }
+        // 更新数据(中间表数据+订单表数据:当已退款个数+当前退款个数=已使用的券数时,订单状态改为已退款)
+        if (refundCouponCount + refundOrder.getRefundCouponAmount() == orderCouponMiddles.size()) {
+            lifeUserOrderMapper.update(null,new UpdateWrapper<LifeUserOrder>().eq("id",order.getId())
+                    .set("status",OrderStatusEnum.REFUND.getStatus()));
+            if (null != order.getQuanId()) {
+                lifeDiscountCouponUserMapper.update(null,new UpdateWrapper<LifeDiscountCouponUser>().eq("id",order.getQuanId())
+                        .set("status",DiscountCouponEnum.WAITING_USED.getValue()).set("use_time",null));
+            }   else {
+                // 处理 quanId 为 null 的情况,例如日志记录
+                log.error("更新优惠券状态失败");
+            }
+        }
+
+        // 中间表数据更新
+        returnMap.put("success", refundMessage);
         // 将退款记录插入到数据库中
         if (lifeRefundOrderMapper.insert(refundOrder) > 0) {
-            returnMap.put("success", "退款成功");
             // 发送通知
             LifeNotice lifeMessage = new LifeNotice();
             LifeUser lifeUser = lifeUserMapper.selectById(order.getUserId());
             lifeMessage.setReceiverId("user_" + lifeUser.getUserPhone());
-            String text = "您的编号为" + order.getOrderNo() + "的订单退款成功了";
+            String text = "您的编号为" + order.getOrderNo() + "的订单"+refundMessage;
             lifeMessage.setContext(text);
             lifeMessage.setSenderId("system");
             lifeMessage.setIsRead(0);
@@ -431,20 +483,20 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             lifeNoticeMapper.insert(lifeMessage);
         }
         // 券核销完成后,退款的情况下,需要向 store_income_details_record 表插入一条记录
-        if (null != refundOrder.getStoreId()) {
-            BigDecimal amounts = new BigDecimal(refundOrder.getAmount()).multiply(new BigDecimal(100));
-            BigDecimal commission = amounts.multiply(new BigDecimal(0.04)).setScale(0, RoundingMode.HALF_UP);
-            BigDecimal money = amounts.subtract(commission);
-
-            StoreIncomeDetailsRecord record = new StoreIncomeDetailsRecord();
-            record.setStoreId(refundOrder.getStoreId());
-            record.setUserOrderId(Integer.parseInt(refundOrder.getOrderId()));
-            record.setIncomeType(Integer.parseInt(refundOrder.getQuanType()));
-            record.setBusinessId(Integer.parseInt(refundOrder.getQuanId()));
-            record.setCommission(-commission.intValue());
-            record.setMoney(-money.intValue());
-            storeIncomeDetailsRecordMapper.insert(record);
-        }
+//        if (null != refundOrder.getStoreId()) {
+//            BigDecimal amounts = new BigDecimal(refundOrder.getRefundMoney()).multiply(new BigDecimal(100));
+//            BigDecimal commission = amounts.multiply(new BigDecimal(0.04)).setScale(0, RoundingMode.HALF_UP);
+//            BigDecimal money = amounts.subtract(commission);
+//
+//            StoreIncomeDetailsRecord record = new StoreIncomeDetailsRecord();
+//            record.setStoreId(refundOrder.getStoreId());
+//            record.setUserOrderId(Integer.parseInt(refundOrder.getOrderId()));
+//            record.setIncomeType(Integer.parseInt(refundOrder.getQuanType()));
+//            record.setBusinessId(Integer.parseInt(refundOrder.getQuanId()));
+//            record.setCommission(-commission.intValue());
+//            record.setMoney(-money.intValue());
+//            storeIncomeDetailsRecordMapper.insert(record);
+//        }
         return returnMap;
     }
 
@@ -456,7 +508,7 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             returnMap.put("reason", "当前订单状态不是待消费");
             return returnMap;
         }
-        if (Double.parseDouble(order.getFinalPrice()) < Double.parseDouble(refundOrder.getAmount())) {
+        if (Double.parseDouble(order.getFinalPrice()) < Double.parseDouble(refundOrder.getRefundMoney())) {
             returnMap.put("success", "不可退款");
             returnMap.put("reason", "退款金额大于实付款");
             return returnMap;
@@ -903,7 +955,7 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             // 库存 inventory_num
             stockQty = lifeGroupBuyMain.getInventoryNum();
             endTime = lifeGroupBuyMain.getEndTime();
-        } else if (1 == CouponTypeEnum.COUPON.getCode()) {
+        } else if (couponType == CouponTypeEnum.COUPON.getCode()) {
             // 代金券
             LifeCoupon lifeCoupon = lifeCouponMapper.selectById(couponId);
             status = lifeCoupon.getStatus();
@@ -912,7 +964,7 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             // 已购数量
             buyCount = orderCouponMiddleMapper.selectCount(new QueryWrapper<OrderCouponMiddle>().eq("coupon_id", couponId).notIn("status", OrderStatusEnum.CANCEL.getStatus(), OrderStatusEnum.REFUND.getStatus())
                     .inSql("order_id", "select order_id from life_user_order where user_id = " + userId + " and store_id = " + storeId));
-            stockQty = lifeCoupon.getStockQty();
+            stockQty = lifeCoupon.getSingleQty();
             endTime = lifeCoupon.getEndDate();
         } else {
             log.error("buyCouponCheck-团购/代金券类型错误");
@@ -959,6 +1011,8 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             returnMap.put("reason", "活动已结束");
             return returnMap;
         }
+        returnMap.put("success", true);
+        returnMap.put("reason", "可以支付");
         return returnMap;
     }
 }

+ 4 - 4
alien-store/src/main/java/shop/alien/store/service/impl/StoreInfoServiceImpl.java

@@ -25,7 +25,6 @@ import org.springframework.web.multipart.MultipartRequest;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.dto.NearMeDto;
 import shop.alien.entity.store.dto.StoreInfoDto;
-import shop.alien.entity.store.excelVo.StoreActivityExcelVo;
 import shop.alien.entity.store.excelVo.StoreInfoExcelVo;
 import shop.alien.entity.store.excelVo.StoreInfoExpiredRecordsExcelVo;
 import shop.alien.entity.store.excelVo.util.ExcelExporter;
@@ -41,6 +40,7 @@ import shop.alien.store.util.FileUploadUtil;
 import shop.alien.store.util.GroupConstant;
 import shop.alien.util.ali.AliOSSUtil;
 import shop.alien.util.common.DistanceUtil;
+import shop.alien.util.common.constant.CouponStatusEnum;
 
 import java.io.File;
 import java.io.IOException;
@@ -919,7 +919,7 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
         }
         // 获取店铺优惠券列表
         LambdaUpdateWrapper<LifeCoupon> quanWrapper = new LambdaUpdateWrapper<>();
-        quanWrapper.eq(LifeCoupon::getStoreId, storeId).eq(LifeCoupon::getStatus, 1).eq(LifeCoupon::getType, 1);
+        quanWrapper.eq(LifeCoupon::getStoreId, storeId).eq(LifeCoupon::getStatus, CouponStatusEnum.ONGOING.getCode()).eq(LifeCoupon::getType, 1);
         List<LifeCoupon> quanList = lifeCouponMapper.selectList(quanWrapper);
         List<LifeCouponVo> quanVoList = new ArrayList<>();
         List<String> collect = quanList.stream().map(LifeCoupon::getId).collect(Collectors.toList());
@@ -940,7 +940,7 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
 
         // 获取店铺团购
         LambdaUpdateWrapper<LifeGroupBuyMain> tuangouWrapper = new LambdaUpdateWrapper<>();
-        tuangouWrapper.eq(LifeGroupBuyMain::getStoreId, storeId).eq(LifeGroupBuyMain::getStatus, 5).orderByDesc(LifeGroupBuyMain::getCreatedTime);
+        tuangouWrapper.eq(LifeGroupBuyMain::getStoreId, storeId).eq(LifeGroupBuyMain::getStatus, CouponStatusEnum.ONGOING.getCode()).orderByDesc(LifeGroupBuyMain::getCreatedTime);
         List<LifeGroupBuyMain> tuangouList = lifeGroupBuyMainMapper.selectList(tuangouWrapper);
         List<LifeGroupBuyMainVo> tuangouVOList = new ArrayList<>();
         for (LifeGroupBuyMain lifeGroupBuyMain : tuangouList) {
@@ -1368,7 +1368,7 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
         // 添加门店ID筛选条件
         quanWrapper.in(LifeCoupon::getStoreId, storeIds)
                 // 添加优惠券状态筛选条件
-                .eq(LifeCoupon::getStatus, 1)
+                .eq(LifeCoupon::getStatus, CouponStatusEnum.ONGOING.getCode())
                 // 按照创建时间降序排序
                 .orderByDesc(LifeCoupon::getCreatedTime);
         // 查询符合条件的优惠券列表

+ 11 - 1
alien-util/src/main/java/shop/alien/util/common/constant/OrderStatusEnum.java

@@ -28,7 +28,17 @@ public enum OrderStatusEnum {
     /**
      * 已退款
      */
-    REFUND(5, "已退款");
+    REFUND(5, "已退款"),
+
+    /**
+     * 退款失败
+     */
+    REFUND_FAILED(6, "退款失败"),
+
+    /**
+     * 已完成
+     */
+    COMPLETE(7, "已完成");
 
 
     private final Integer status;