chunping 3 лет назад
Родитель
Сommit
701f107570

+ 10 - 10
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/GoodsMgrController.java

@@ -72,13 +72,13 @@ public class GoodsMgrController extends BaseApiController {
 
 	@Autowired
 	private IGoodsService goodsService;
-	
+
 	@Autowired
 	private IGoodsSkuService goodsSkuService;
-	
+
 	@Autowired
 	private IGoodsCategoryService goodsCategoryService;
-	
+
 	@Autowired
 	private ISysUserService sysUserService;
 
@@ -113,7 +113,7 @@ public class GoodsMgrController extends BaseApiController {
 		res.setRows(goodsList);
 		return res;
 	}
-	
+
 	/**
 	 * 获取商品详情信息
 	 *
@@ -170,7 +170,7 @@ public class GoodsMgrController extends BaseApiController {
 		goods.setStatus(GoodsStatusEnum.PUT_INIT);
 		// 多SKU
 		List<GoodsSku> skuList = goodsParam.getSkuList();
-		if(goods.getMultiSku() == 1) { // 
+		if(goods.getMultiSku() == 1) { //
 			if((null == skuList || skuList.size() == 0)) {
 				return AjaxResult.error("商品" + goods.getTitle() + "不满足多SKU条件!");
 			}else {
@@ -253,14 +253,14 @@ public class GoodsMgrController extends BaseApiController {
 		return AjaxResult.success("商品'" + goods.getTitle() + "'新增成功");
 	}
 
-	
-	
+
+
 	/**
 	 * 停用、启用商品
 	 * @param
 	 * @return
 	 */
-	@ApiOperation(value = "停用、启用代金券信息", notes = "代金券管理编辑代金券")
+	@ApiOperation(value = "停用、启用商品", notes = "停用、启用商品")
 	@PostMapping("/status")
 	public AjaxResult goodsStatus(@RequestBody Goods goods) {
 		String goodsId = (null != goods && StringUtils.isNotBlank(goods.getGoodsId()))?goods.getGoodsId():"";
@@ -277,8 +277,8 @@ public class GoodsMgrController extends BaseApiController {
 		}
 		return AjaxResult.success("操作成功");
 	}
-	
-	
+
+
 	/**
 	 * 删除商品(假删)
 	 *

+ 8 - 6
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java

@@ -141,7 +141,9 @@ public class TicketBoxMgrController extends BaseApiController {
 			if (ticketBox.getStatus() != TicketBoxStatusEnum.PUT_ON) {
 				return AjaxResult.error("当前状态不是已上架,不能下架");
 			}
-			ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getStatus, TicketBoxStatusEnum.PUT_OFF)
+			ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>()
+					.set(TicketBox::getStatus, TicketBoxStatusEnum.PUT_OFF)
+					.set(TicketBox::getManualOff, 1)
 					.eq(TicketBox::getBoxId, ticketBox.getBoxId()));
 		} else if (param.getStatus() == TicketBoxStatusEnum.PUT_ON) {
 			if (ticketBox.getStatus() != TicketBoxStatusEnum.PUT_OFF && ticketBox.getStatus() != TicketBoxStatusEnum.DONE) {
@@ -258,8 +260,8 @@ public class TicketBoxMgrController extends BaseApiController {
 			return AjaxResult.error("导入失败,请联系管理员");
 		}
 	}
-	
-	
+
+
 	@Log(title = "导出印刷", businessType = BusinessType.EXPORT)
 	@PostMapping("/exportDraw")
 	public AjaxResult exportDraw(@RequestBody BathIdParam ids) {
@@ -315,8 +317,8 @@ public class TicketBoxMgrController extends BaseApiController {
 		ExcelUtil<TicketExcel> util = new ExcelUtil<TicketExcel>(TicketExcel.class);
 		return util.exportExcel(excelList, ticketBox.getTitle(), false);
 	}
-	
-	
+
+
 	/**
 	 * 导出印刷格式化
 	 * @param drawNum
@@ -344,7 +346,7 @@ public class TicketBoxMgrController extends BaseApiController {
 			}
 		}
 		return "";
-		
+
 	}
 
 

+ 2 - 2
mp-quartz/src/main/java/com/qs/mp/quartz/task/ChannelOrderTask.java

@@ -23,7 +23,7 @@ public class ChannelOrderTask {
   @Autowired
   private IChannelOrderService channelOrderService;
 
-  private final int PAGE_SIZE = 1000;
+  private final int PAGE_SIZE = 500;
 
   /**
    * 订单取消到期任务
@@ -36,7 +36,7 @@ public class ChannelOrderTask {
       List<ChannelOrder> channelOrderList = channelOrderService.list(new LambdaQueryWrapper<ChannelOrder>().eq(ChannelOrder::getStatus,
               ChannelOrderStatusEnum.NOT_PAY)
           .lt(ChannelOrder::getCreatedTime, DateUtils.addMinutes(DateUtils.getNowDate(), -30))
-          .last("limt " + PAGE_SIZE));
+          .last("limit " + PAGE_SIZE));
       total = channelOrderList.size();
       for (ChannelOrder channelOrder : channelOrderList) {
         try {

+ 75 - 0
mp-quartz/src/main/java/com/qs/mp/quartz/task/TicketOrderTask.java

@@ -0,0 +1,75 @@
+package com.qs.mp.quartz.task;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
+import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.user.domain.UserTicketOrder;
+import com.qs.mp.user.service.IUserTicketOrderService;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author zhongcp
+ * @Date 2022/3/17
+ */
+@Component("ticketOrderTask")
+public class TicketOrderTask {
+
+  protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
+
+  @Autowired
+  private IUserTicketOrderService userTicketOrderService;
+
+  private final int PAGE_SIZE = 500;
+
+  /**
+   * 订单取消到期任务
+   */
+  public void cancel() {
+    LogUtil.info(logger, "...盲票购买未支付订单定时取消任务开始...");
+    int total = PAGE_SIZE;
+    while (total == PAGE_SIZE) {
+      // 捞取30分钟前未支付订单
+      List<UserTicketOrder> ticketOrderList = userTicketOrderService.list(
+          new QueryWrapper<UserTicketOrder>()
+              .select("distinct box_id")
+              .lambda().eq(UserTicketOrder::getStatus, UserTicketOrderStatusEnum.NOT_PAY)
+              .lt(UserTicketOrder::getCreatedTime,
+                  DateUtils.addMinutes(DateUtils.getNowDate(), -30))
+              .last("limit " + PAGE_SIZE));
+      total = ticketOrderList.size();
+      // 按票组分批次取消
+      for (UserTicketOrder ticketOrder : ticketOrderList) {
+        int boxTotal = 10;
+        while (boxTotal == 10) {
+          List<UserTicketOrder> orderList = userTicketOrderService.list(
+              new QueryWrapper<UserTicketOrder>()
+                  .select("order_id")
+                  .lambda().eq(UserTicketOrder::getBoxId, ticketOrder.getBoxId())
+                  .eq(UserTicketOrder::getStatus, UserTicketOrderStatusEnum.NOT_PAY)
+                  .lt(UserTicketOrder::getCreatedTime,
+                      DateUtils.addMinutes(DateUtils.getNowDate(), -30))
+                  .last("limit " + 10));
+          boxTotal = orderList.size();
+          try {
+            userTicketOrderService.batchCancelOrder(ticketOrder.getBoxId(),
+                orderList.stream().map(UserTicketOrder::getOrderId).collect(
+                    Collectors.toList()));
+          } catch (Exception e) {
+            LogUtil.error(logger, e, "定时取消未支付盲票购买订单异常。boxId:{0}, orderList:{1}",
+                ticketOrder.getBoxId(),
+                JSONObject.toJSONString(orderList));
+          }
+
+        }
+      }
+    }
+    LogUtil.info(logger, "...盲票购买未支付订单定时取消任务结束...");
+  }
+}

+ 1 - 1
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java

@@ -89,7 +89,7 @@ public class ChannelOrderServiceImpl extends
       title.append(ticketBox.getTitle()).append(",");
       // 更新盲票组的已销售数和状态,乐观锁
       boolean rst = ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>()
-          .set(ticketBox.getPkgSalePrice() + channelCartVO.getOrderNum() == ticketBox.getPkgQty(),
+          .set(ticketBox.getSalePkgQty() + channelCartVO.getOrderNum() == ticketBox.getPkgQty(),
               TicketBox::getStatus,
               TicketBoxStatusEnum.PUT_OFF)
           .set(TicketBox::getSalePkgQty, ticketBox.getSalePkgQty() + channelCartVO.getOrderNum())

+ 9 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderService.java

@@ -4,6 +4,7 @@ import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.user.domain.UserTicketOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qs.mp.user.domain.vo.TicketOrderSettleVO;
+import java.util.List;
 
 /**
  * <p>
@@ -23,6 +24,14 @@ public interface IUserTicketOrderService extends IService<UserTicketOrder> {
    */
   String submitOrder(Long userId, TicketOrderSettleVO orderSettleVO);
 
+  /**
+   * 批量取消一个票组(线上)的订单(恢复优惠券、票组销量)
+   * @param boxId
+   * @param orderIds
+   * @return
+   */
+  boolean batchCancelOrder(String boxId, List<String> orderIds);
+
   /**
    * 取消订单(恢复优惠券、票组销量)
    * @param orderId

+ 45 - 17
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -239,13 +239,54 @@ public class UserTicketOrderServiceImpl extends
     return sb.toString();
   }
 
+  @Override
+  @Transactional
+  public boolean batchCancelOrder(String boxId, List<String> orderIds) {
+    int sumTicket = 0;
+    for (String orderId : orderIds) {
+      UserTicketOrder userTicketOrder = getById(orderId);
+      Assert.isTrue(userTicketOrder.getResource() == TicketTypeEnum.ONLINE);
+      if (!rollbackOrder(userTicketOrder)) {
+        return false;
+      }
+      sumTicket += userTicketOrder.getTicketNum();
+    }
+    rollbackBoxQty(boxId, sumTicket);
+    return true;
+  }
+
+  private void rollbackBoxQty(String boxId, int qty) {
+    TicketBox ticketBox = ticketBoxService.getById(boxId);
+    boolean updateBox = ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getSaleQty,
+            ticketBox.getSaleQty() - qty)
+        .set(
+            ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF && ticketBox.getManualOff() != 1,
+            TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
+        .eq(TicketBox::getBoxId, ticketBox.getBoxId())
+        .eq(TicketBox::getSaleQty, ticketBox.getSaleQty()));
+    Assert.isTrue(updateBox, "取消过期未支付盲票购买订单,恢复票组销量失败。boxId:{0}" + boxId);
+  }
+
   @Override
   @Transactional
   public boolean cancelOrder(String orderId) {
     UserTicketOrder userTicketOrder = getById(orderId);
+
+    if (!rollbackOrder(userTicketOrder)) {
+      return false;
+    }
+
+    if (userTicketOrder.getResource() == TicketTypeEnum.ONLINE) {
+      rollbackBoxQty(userTicketOrder.getBoxId(), userTicketOrder.getTicketNum());
+    }
+
+    return true;
+  }
+
+  private boolean rollbackOrder(UserTicketOrder userTicketOrder) {
     if (userTicketOrder.getStatus() != UserTicketOrderStatusEnum.NOT_PAY) {
       LogUtil.warn(logger, "取消购票订单时,订单状态不是待支付,忽略。orderId:{0}, status:{1}",
-          orderId, userTicketOrder.getStatus());
+          userTicketOrder.getOrderId(), userTicketOrder.getStatus());
       return false;
     }
 
@@ -256,28 +297,15 @@ public class UserTicketOrderServiceImpl extends
           .set(UserCoupon::getStatus, UserCouponStatusEnum.UNUSED)
           .set(UserCoupon::getVerifyTime, null)
           .in(UserCoupon::getId, userCouponIds));
-      Assert.isTrue(rst, "盲票购买订单取消时,反核销优惠券失败。orderId:" + orderId + "userCouponIds:"
+      Assert.isTrue(rst, "盲票购买订单取消时,反核销优惠券失败。orderId:" + userTicketOrder.getOrderId() + "userCouponIds:"
           + userTicketOrder.getCouponInfo());
     }
-    if (userTicketOrder.getResource() == TicketTypeEnum.ONLINE) {
-      // TODO 线上票库存回滚,此处需要按票组累计起来回滚
-      TicketBox ticketBox = ticketBoxService.getById(userTicketOrder.getBoxId());
-      ticketBoxService.update(new LambdaUpdateWrapper<TicketBox>().set(TicketBox::getSaleQty,
-              ticketBox.getSaleQty() - userTicketOrder.getTicketNum())
-          .set(
-              ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF && ticketBox.getManualOff() != 1,
-              TicketBox::getStatus, TicketBoxStatusEnum.PUT_ON)
-          .eq(TicketBox::getBoxId, ticketBox.getBoxId())
-          .eq(TicketBox::getSaleQty, ticketBox.getSaleQty()));
-
-    }
 
     boolean rst = update(new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getStatus,
             UserTicketOrderStatusEnum.CANCELED)
-        .eq(UserTicketOrder::getOrderId, orderId)
+        .eq(UserTicketOrder::getOrderId, userTicketOrder.getOrderId())
         .eq(UserTicketOrder::getStatus, UserTicketOrderStatusEnum.NOT_PAY));
-    Assert.isTrue(rst, "盲票购买订单取消时,更新订单状态失败。orderId:" + orderId);
-
+    Assert.isTrue(rst, "盲票购买订单取消时,更新订单状态失败。orderId:" + userTicketOrder.getOrderId());
     return true;
   }