|
|
@@ -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);
|