Quellcode durchsuchen

bugfix:过期自动退款+注销自动退款(待测试)

lyx vor 1 Monat
Ursprung
Commit
10ef8c8bfe

+ 1 - 2
alien-entity/src/main/java/shop/alien/mapper/LifeUserOrderMapper.java

@@ -1,7 +1,6 @@
 package shop.alien.mapper;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
@@ -71,5 +70,5 @@ public interface LifeUserOrderMapper extends BaseMapper<LifeUserOrder> {
      * @param selectWrapper
      * @return
      */
-    List<LifeUserOrderVo> selectRefundList(LambdaUpdateWrapper<LifeUserOrder> selectWrapper);
+    List<LifeUserOrderVo> selectRefundList(@Param(Constants.WRAPPER) QueryWrapper<LifeUserOrder> selectWrapper);
 }

+ 4 - 1
alien-entity/src/main/resources/mapper/LifeUserOrderMapper.xml

@@ -138,7 +138,10 @@
         left join life_user lu on lu.id = luo.user_id and lu.delete_flag = 0
         left join store_img simg on simg.id = tc.image_id and simg.delete_flag = 0
         left join store_business_info sbi on sbi.store_id = si.id and sbi.delete_flag = 0
-        where luo.status = 1
+        <where>
+            <!-- 引用 LambdaQueryWrapper 构建的条件 -->
+            ${ew.sqlSegment}
+        </where>
         order by luo.created_time desc
     </select>
 </mapper>

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

@@ -160,11 +160,11 @@ public class LifeUserOrderJob {
         calendar.set(Calendar.SECOND, 0);
         calendar.set(Calendar.MILLISECOND, 0);
         now = calendar.getTime();
-        LambdaUpdateWrapper<LifeUserOrder> selectWrapper = new LambdaUpdateWrapper<>();
+        QueryWrapper<LifeUserOrder> selectWrapper = new QueryWrapper<>();
         // 查询状态为待使用的
         List<Integer> status = new ArrayList<>();
         status.add(OrderStatusEnum.WAIT_USE.getStatus());
-        selectWrapper.in(LifeUserOrder::getStatus, status);
+        selectWrapper.inSql("luo.id", "SELECT distinct order_id FROM order_coupon_middle WHERE status in ( "+String.join(",", status.stream().map(String::valueOf).collect(Collectors.toList()))+")");
         // 查询待使用的订单
         List<LifeUserOrderVo> orderList = lifeUserOrderMapper.selectRefundList(selectWrapper);
 

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

@@ -39,11 +39,15 @@ import shop.alien.store.service.*;
 import shop.alien.store.util.CommonConstant;
 import shop.alien.store.util.FileUploadUtil;
 import shop.alien.store.util.GroupConstant;
+import shop.alien.store.util.ali.AliApi;
 import shop.alien.util.ali.AliOSSUtil;
 import shop.alien.util.common.DistanceUtil;
+import shop.alien.util.common.UniqueRandomNumGenerator;
 import shop.alien.util.common.constant.CouponStatusEnum;
 import shop.alien.util.common.constant.CouponTypeEnum;
+import shop.alien.util.common.constant.DiscountCouponEnum;
 import shop.alien.util.common.constant.OrderStatusEnum;
+
 import javax.annotation.Resource;
 import java.io.File;
 import java.io.IOException;
@@ -146,6 +150,16 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
     @Autowired
     private StoreInfoUserMiddleMapper storeInfoUserMiddleMapper;
 
+
+    private final AliApi aliApi;
+
+    private final OrderCouponMiddleMapper orderCouponMiddleMapper;
+
+    private final LifeDiscountCouponUserMapper lifeDiscountCouponUserMapper;
+
+    private final LifeRefundOrderMapper lifeRefundOrderMapper;
+
+    private final LifeUserMapper lifeUserMapper;
     /**
      * 门店详情
      *
@@ -1189,9 +1203,7 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
         List<StoreBusinessInfo> storeBusinessInfos = storeBusinessInfoMapper.selectList(new LambdaQueryWrapper<StoreBusinessInfo>().eq(StoreBusinessInfo::getStoreId, storeId).eq(StoreBusinessInfo::getDeleteFlag, 0));
         if (ObjectUtils.isNotEmpty(storeBusinessInfos)) {
             result.setStoreBusinessInfo(storeBusinessInfos.get(0));
-            result.setStoreBusinessInfos(storeBusinessInfos);
-            //StoreBusinessInfo storeBusinessInfo = result.getStoreBusinessInfo();
-            StoreBusinessInfo storeBusinessInfo = result.getStoreBusinessInfos().stream().filter(item -> item.getBusinessType() == 1).findFirst().orElse(null) ;
+            StoreBusinessInfo storeBusinessInfo = result.getStoreBusinessInfo();
             if (ObjectUtils.isNotEmpty(storeBusinessInfo)) {
 
                 Calendar calendar = Calendar.getInstance(); // 获取Calendar实例
@@ -1783,6 +1795,113 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
             // 更新logout_flag状态为1
             storeIn.setLogoutFlag(1);
             int num = storeInfoMapper.updateById(storeIn);
+            // TODO 1.注销成功后删除与用户的关联关系(后续1对n的时候需要处理)
+            // TODO 2.注销后退款所有未核销订单
+            // 1. 查询所以未核销订单(待使用的订单)
+            // 查询状态为待使用的
+            Date now = new Date();
+            QueryWrapper<LifeUserOrder> selectWrapper = new QueryWrapper<>();
+            // 查询状态为待使用的
+            List<Integer> status = new ArrayList<>();
+            status.add(OrderStatusEnum.WAIT_USE.getStatus());
+            selectWrapper.in("luo.id", "SELECT distinct order_id FROM order_coupon_middle WHERE status in ( "+String.join(",", status.stream().map(String::valueOf).collect(Collectors.toList()))+")");
+            List<LifeUserOrderVo> orderList = lifeUserOrderMapper.selectRefundList(selectWrapper);
+            if (!orderList.isEmpty()) {
+                for (LifeUserOrderVo order : orderList) {
+                        // 过滤出退款的券列表
+                        List<OrderCouponMiddle> orderCouponMiddleList = order.getOrderCouponMiddleList();
+                        List<OrderCouponMiddle> refundList = orderCouponMiddleList.stream().filter(x -> x.getStatus() == OrderStatusEnum.WAIT_USE.getStatus() || x.getStatus() == OrderStatusEnum.REFUND_FAILED.getStatus()).collect(Collectors.toList());
+                        List<OrderCouponMiddle> refundedList = orderCouponMiddleList.stream().filter(x -> x.getStatus() == OrderStatusEnum.REFUND.getStatus()).collect(Collectors.toList());
+                        List<Integer> collect = refundList.stream().map(x -> x.getId()).collect(Collectors.toList());
+                        if (!refundList.isEmpty()) {
+                            // 调用退款接口
+                            // 统计退款金额
+                            BigDecimal totalRefundAmount = refundList.stream().map(x -> x.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+                            // 判断本次是否是全退 执行退款
+                            String refundResult = null;
+                            if (refundList.size() == orderCouponMiddleList.size()) {
+                                // 全退
+                                refundResult = aliApi.processRefund(order.getOrderNo(), totalRefundAmount.toString(), "店铺注销自动退", "");
+                            } else {
+                                // TODO 本次部分退款
+                                String partialRefundCode = UniqueRandomNumGenerator.generateUniqueCode(12);
+                                refundResult = aliApi.processRefund(order.getOrderNo(), totalRefundAmount.toString(), "店铺注销自动退",partialRefundCode);
+                            }
+                            if ("调用成功".equals(refundResult)) {
+                                //  1.更新中间表状态
+                                int updateNum = orderCouponMiddleMapper.update(null, new LambdaUpdateWrapper<OrderCouponMiddle>()
+                                        .set(OrderCouponMiddle::getStatus, OrderStatusEnum.REFUND.getStatus())
+                                        .in(OrderCouponMiddle::getId, collect));
+                                if (updateNum != collect.size()) {
+                                    log.error("expiredRefundTask更新中间表状态失败");
+                                    throw new RuntimeException("expiredRefundTask更新中间表状态失败");
+                                }
+                                // 2.过期后更新库存
+                                if (1 == order.getCouponType()) {
+                                    // 代金券
+                                    // 恢复库存
+                                    lifeCouponMapper.update(null, new LambdaUpdateWrapper<LifeCoupon>()
+                                            .setSql("single_qty=single_qty+" + updateNum)
+                                            .eq(LifeCoupon::getId, order.getCouponId()));
+                                } else {
+                                    // 团购
+                                    lifeGroupBuyMainMapper.update(null, new LambdaUpdateWrapper<LifeGroupBuyMain>()
+                                            .setSql("inventory_num=inventory_num+" + updateNum)
+                                            .eq(LifeGroupBuyMain::getId, order.getCouponId()));
+                                }
+                                // 3.更新订单状态 退款+已退 = 全部券则更新总订单状态
+                                if (refundList.size() + refundedList.size() == orderCouponMiddleList.size()) {
+                                    lifeUserOrderMapper.update(null, new LambdaUpdateWrapper<LifeUserOrder>()
+                                            .set(LifeUserOrder::getStatus, OrderStatusEnum.REFUND.getStatus())
+                                            .eq(LifeUserOrder::getId, order.getId()));
+                                    if (null != order.getQuanId()) {
+                                        // 更新优惠券状态
+                                        lifeDiscountCouponUserMapper.update(null, new LambdaUpdateWrapper<LifeDiscountCouponUser>()
+                                                .set(LifeDiscountCouponUser::getStatus, DiscountCouponEnum.WAITING_USED.getValue())
+                                                .eq(LifeDiscountCouponUser::getId, order.getQuanId()));
+                                    }
+                                }else {
+                                    // 累计退券个数+当前退券个数!=总个数 且 当前退券数量 = 可退券数
+                                    lifeUserOrderMapper.update(null,new UpdateWrapper<LifeUserOrder>().eq("id",order.getId())
+                                            .set("status",OrderStatusEnum.COMPLETE.getStatus())
+                                            .set("finish_time",now));
+                                }
+                                // 4.添加退款记录
+                                LifeRefundOrder refundOrder = new LifeRefundOrder()
+                                        .setOrderId(order.getId())
+                                        .setUserId(order.getUserId())
+                                        .setOrderId(order.getId())
+                                        .setRefundCouponAmount(updateNum)
+                                        .setReason("店铺注销自动退")
+                                        .setApplicationTime(now)
+                                        .setRefundTime(now)
+                                        .setStatus(0)
+                                        .setRefundMoney(totalRefundAmount.toString());
+                                if (lifeRefundOrderMapper.insert(refundOrder) > 0) {
+                                    // TODO 是否发送通知
+                                    // 发送通知
+                                    LifeNotice lifeMessage = new LifeNotice();
+                                    LifeUser lifeUser = lifeUserMapper.selectById(order.getUserId());
+                                    lifeMessage.setReceiverId("user_" + lifeUser.getUserPhone());
+                                    String text = "您的编号为" + order.getOrderNo() + "的订单店铺注销自动退款,退款金额为" + totalRefundAmount.toString() + "元";
+                                    lifeMessage.setContext(text);
+                                    lifeMessage.setSenderId("system");
+                                    lifeMessage.setIsRead(0);
+                                    lifeMessage.setNoticeType(2);
+                                    lifeNoticeMapper.insert(lifeMessage);
+                                }
+                            }
+                        } else {
+                            // 更新中间表状态
+                            //  1.更新中间表状态
+//                        int updateNum = orderCouponMiddleMapper.update(null, new LambdaUpdateWrapper<OrderCouponMiddle>()
+//                                .set(OrderCouponMiddle::getStatus, OrderStatusEnum.REFUND_FAILED.getStatus())
+//                                .in(OrderCouponMiddle::getId, collect));
+                            log.error("注销自动退款失败");
+                            throw new RuntimeException("注销自动退款失败");
+                        }
+                }
+            }
             if (num > 0) {
                 // 发送通知
                 LifeNotice lifeMessage = getLifeNotice(storeInfo);