Commit a70ffc20 by Jony.L

添加定时任务,将进行完的算力资源订单状态改为已结束,并将对应的算力资源spu状态改为回收;定时任务修改,现在过期支付订单的定时任务会同时过期业务订单;添加业务校…

添加定时任务,将进行完的算力资源订单状态改为已结束,并将对应的算力资源spu状态改为回收;定时任务修改,现在过期支付订单的定时任务会同时过期业务订单;添加业务校验 - 同一SPU下不能有相同租赁天数的SKU;移除库存管理 - 从库存控制改为SKU下架控制重复购买,给SPU添加订单完成后的回收状态
parent 7ff393a1
......@@ -74,10 +74,6 @@ public class ResourceOrderRespDTO {
*/
private String remark;
/**
* 算力资源状态:[0]未启用,[1]使用中,[2]已释放
*/
private Integer resourceStatus;
/**
* 退款状态
*/
private Integer refundStatus;
......
......@@ -10,6 +10,7 @@ import com.luhu.computility.framework.common.exception.ErrorCode;
public interface ErrorCodeConstants {
ErrorCode RESOURCE_CATEGORY_NOT_EXISTS = new ErrorCode(1_030_001_000, "算力资源分类表(仅用于算力服务器分类)不存在");
ErrorCode RESOURCE_SKU_NOT_EXISTS = new ErrorCode(1_030_002_000, "算力资源SKU表(价格和租赁信息)不存在");
ErrorCode RESOURCE_SKU_DUPLICATE_DURATION = new ErrorCode(1_030_002_001, "同一算力资源下已存在相同租赁天数的SKU");
ErrorCode RESOURCE_SPU_NOT_EXISTS = new ErrorCode(1_030_003_000, "算力资源SPU表(基础配置信息)不存在");
/**
* 算力资源SPU库存不足
......
......@@ -14,8 +14,9 @@ public enum ResourceOrderStatus {
UNPAID(0, "待支付"),
PAID(1, "已支付"),
CANCELED(2, "已取消"),
REFUNDED(3, "已退款");
FINISHED(2, "已结束"),
CANCELED(3, "已取消"),
REFUNDED(4, "已退款");
private final Integer value;
private final String label;
......
......@@ -67,10 +67,11 @@ public class ComputeWpgjPayController {
log.info("[notifyWpgjPay] 处理WPGJ支付结果,商户订单号: {}, 订单状态: {}", merOrderId, orderStatus);
// 2. 幂等处理:根据订单状态更新(与老接口保持一致逻辑)
// 2. 幂等处理:根据订单状态更新(包含销量统计和SKU下架逻辑)
if (WpgjOrderStatusEnum.isSuccess(orderStatus)) {
// 支付成功:更新订单状态、增加SPU销量、自动下架该SPU下所有SKU防止重复购买
resourceOrderService.updateOrderPaidByWpgj(Long.parseLong(merOrderId),notifyDTO);
log.info("[notifyWpgjPay] 支付成功处理完成,商户订单号: {}", merOrderId);
log.info("[notifyWpgjPay] 支付成功处理完成(含销量增加和SKU下架),商户订单号: {}", merOrderId);
} else if (WpgjOrderStatusEnum.isFailedOrClosed(orderStatus)) {
resourceOrderService.updateOrderFailedByWpgj(Long.parseLong(merOrderId), notifyDTO);
log.info("[notifyWpgjPay] 支付失败/关闭处理完成,商户订单号: {}", merOrderId);
......
......@@ -59,9 +59,6 @@ public class ResourceOrderPageReqVO extends PageParam {
@Schema(description = "备注", example = "你说的对")
private String remark;
@Schema(description = "算力资源状态:[0]未启用,[1]使用中,[2]已释放", example = "1")
private Integer resourceStatus;
@Schema(description = "退款状态", example = "1")
private Integer refundStatus;
......
......@@ -80,10 +80,6 @@ public class ResourceOrderRespVO {
@ExcelProperty("备注")
private String remark;
@Schema(description = "算力资源状态:[0]未启用,[1]使用中,[2]已释放", example = "1")
@ExcelProperty("算力资源状态:[0]未启用,[1]使用中,[2]已释放")
private Integer resourceStatus;
@Schema(description = "退款状态", example = "1")
@ExcelProperty("退款状态")
private Integer refundStatus;
......
......@@ -61,9 +61,6 @@ public class ResourceOrderSaveReqVO {
@Schema(description = "备注", example = "你说的对")
private String remark;
@Schema(description = "算力资源状态:[0]未启用,[1]使用中,[2]已释放", example = "1")
private Integer resourceStatus;
@Schema(description = "退款状态", example = "1")
private Integer refundStatus;
......
......@@ -28,6 +28,12 @@ public class ResourceSpuPageReqVO extends PageParam {
@Schema(description = "存储配置")
private String storage;
@Schema(description = "电源配置")
private String powerSupply;
@Schema(description = "网卡配置")
private String nic;
@Schema(description = "服务器ip")
private String ip;
......@@ -49,9 +55,6 @@ public class ResourceSpuPageReqVO extends PageParam {
@Schema(description = "商品轮播图地址,以逗号分隔,最多15张")
private String sliderPicUrls;
@Schema(description = "总库存数量")
private Integer stock;
@Schema(description = "商品销量")
private Integer sales;
......
......@@ -76,10 +76,6 @@ public class ResourceSpuRespVO {
@ExcelProperty("商品轮播图地址,以逗号分隔,最多15张")
private String sliderPicUrls;
@Schema(description = "总库存数量", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("总库存数量")
private Integer stock;
@Schema(description = "商品销量", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("商品销量")
private Integer sales;
......
......@@ -31,6 +31,14 @@ public class ResourceSpuSaveReqVO {
@NotEmpty(message = "存储配置不能为空")
private String storage;
@Schema(description = "电源配置", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "电源配置不能为空")
private String powerSupply;
@Schema(description = "网卡配置", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "网卡配置不能为空")
private String nic;
@Schema(description = "服务器ip", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "服务器ip不能为空")
private String ip;
......@@ -57,10 +65,6 @@ public class ResourceSpuSaveReqVO {
@Schema(description = "商品轮播图地址,以逗号分隔,最多15张")
private String sliderPicUrls;
@Schema(description = "总库存数量", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "总库存数量不能为空")
private Integer stock;
@Schema(description = "商品销量", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "商品销量不能为空")
private Integer sales;
......
......@@ -92,10 +92,6 @@ public class ResourceOrderDO extends BaseDO {
*/
private String remark;
/**
* 算力资源状态:[0]未启用,[1]使用中,[2]已释放
*/
private Integer resourceStatus;
/**
* 退款状态
*/
private Integer refundStatus;
......
......@@ -84,10 +84,6 @@ public class ResourceSpuDO extends BaseDO {
*/
private String sliderPicUrls;
/**
* 总库存数量
*/
private Integer stock;
/**
* 商品销量
*/
private Integer sales;
......
......@@ -44,7 +44,6 @@ public interface ResourceOrderMapper extends BaseMapperX<ResourceOrderDO> {
.betweenIfPresent(ResourceOrderDO::getRentEndTime, reqVO.getRentEndTime())
.betweenIfPresent(ResourceOrderDO::getCancelTime, reqVO.getCancelTime())
.eqIfPresent(ResourceOrderDO::getRemark, reqVO.getRemark())
.eqIfPresent(ResourceOrderDO::getResourceStatus, reqVO.getResourceStatus())
.eqIfPresent(ResourceOrderDO::getRefundStatus, reqVO.getRefundStatus())
.eqIfPresent(ResourceOrderDO::getRefundPrice, reqVO.getRefundPrice())
.eqIfPresent(ResourceOrderDO::getInvoiceStatus, reqVO.getInvoiceStatus())
......@@ -69,7 +68,6 @@ public interface ResourceOrderMapper extends BaseMapperX<ResourceOrderDO> {
.betweenIfPresent(ResourceOrderDO::getRentEndTime, reqVO.getRentEndTime())
.betweenIfPresent(ResourceOrderDO::getCancelTime, reqVO.getCancelTime())
.eqIfPresent(ResourceOrderDO::getRemark, reqVO.getRemark())
.eqIfPresent(ResourceOrderDO::getResourceStatus, reqVO.getResourceStatus())
.eqIfPresent(ResourceOrderDO::getRefundStatus, reqVO.getRefundStatus())
.eqIfPresent(ResourceOrderDO::getRefundPrice, reqVO.getRefundPrice())
.eqIfPresent(ResourceOrderDO::getInvoiceStatus, reqVO.getInvoiceStatus())
......@@ -98,4 +96,12 @@ public interface ResourceOrderMapper extends BaseMapperX<ResourceOrderDO> {
return BeanUtil.copyToList(list, ResourceOrderRespDTO.class);
}
default List<ResourceOrderDO> selectListByRentEndTimeBetweenAndStatus(LocalDateTime startTime, LocalDateTime endTime, Integer status) {
return selectList(new LambdaQueryWrapperX<ResourceOrderDO>()
.eq(ResourceOrderDO::getStatus, status)
.between(ResourceOrderDO::getRentEndTime, startTime, endTime)
.eq(ResourceOrderDO::getDeleted, false)
.orderByAsc(ResourceOrderDO::getId));
}
}
\ No newline at end of file
......@@ -29,6 +29,19 @@ public interface ResourceSkuMapper extends BaseMapperX<ResourceSkuDO> {
}
/**
* 检查指定SPU和租赁天数的SKU是否已存在
*
* @param spuId SPU ID
* @param durationDays 租赁天数
* @return 存在的SKU数量
*/
default long selectCountBySpuIdAndDuration(Long spuId, Integer durationDays) {
return selectCount(new LambdaQueryWrapperX<ResourceSkuDO>()
.eq(ResourceSkuDO::getSpuId, spuId)
.eq(ResourceSkuDO::getDurationDays, durationDays));
}
/**
* 将指定 SPU 下的所有 SKU 批量下架
*
* @param spuId 关联的 SPU ID
......
......@@ -30,6 +30,8 @@ public interface ResourceSpuMapper extends BaseMapperX<ResourceSpuDO> {
.eqIfPresent(ResourceSpuDO::getGpu, reqVO.getGpu())
.eqIfPresent(ResourceSpuDO::getRam, reqVO.getRam())
.eqIfPresent(ResourceSpuDO::getStorage, reqVO.getStorage())
.eqIfPresent(ResourceSpuDO::getPowerSupply, reqVO.getPowerSupply())
.eqIfPresent(ResourceSpuDO::getNic, reqVO.getNic())
.eqIfPresent(ResourceSpuDO::getIp, reqVO.getIp())
.likeIfPresent(ResourceSpuDO::getInitUsername, reqVO.getInitUsername())
.eqIfPresent(ResourceSpuDO::getInitPassword, reqVO.getInitPassword())
......@@ -37,20 +39,11 @@ public interface ResourceSpuMapper extends BaseMapperX<ResourceSpuDO> {
.eqIfPresent(ResourceSpuDO::getCategoryId, reqVO.getCategoryId())
.eqIfPresent(ResourceSpuDO::getPicUrl, reqVO.getPicUrl())
.eqIfPresent(ResourceSpuDO::getSliderPicUrls, reqVO.getSliderPicUrls())
.eqIfPresent(ResourceSpuDO::getStock, reqVO.getStock())
.eqIfPresent(ResourceSpuDO::getSales, reqVO.getSales())
.eqIfPresent(ResourceSpuDO::getStatus, reqVO.getStatus())
.betweenIfPresent(ResourceSpuDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ResourceSpuDO::getId));
}
/**
* 原子递减库存:仅当库存大于0时将库存-1
*
* @param id SPU 主键ID
* @return 受影响行数(1 表示成功递减,0 表示库存不足或不存在)
*/
@org.apache.ibatis.annotations.Update("UPDATE compute_resource_spu SET stock = stock - 1 WHERE id = #{id} AND stock > 0")
int decrementStock(@org.apache.ibatis.annotations.Param("id") Long id);
}
\ No newline at end of file
package com.luhu.computility.module.compute.job.order;
import cn.hutool.core.util.StrUtil;
import com.luhu.computility.framework.quartz.core.handler.JobHandler;
import com.luhu.computility.framework.tenant.core.job.TenantJob;
import com.luhu.computility.module.compute.service.resourceorder.ResourceOrderService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.LocalTime;
/**
* 算力资源回收 Job
*
* 每天00:01执行,将昨天到期的算力资源订单状态变更为已结束
*
* @author jony
*/
@Component
public class ComputeResourceRecycleJob implements JobHandler {
@Resource
private ResourceOrderService resourceOrderService;
@Override
@TenantJob
public String execute(String param) {
// 计算昨天的时间范围
LocalDateTime yesterdayStart = LocalDateTime.now().minusDays(1).with(LocalTime.MIN);
LocalDateTime yesterdayEnd = LocalDateTime.now().minusDays(1).with(LocalTime.MAX);
int count = resourceOrderService.expireFinishedOrders(yesterdayStart, yesterdayEnd);
return StrUtil.format("算力资源回收完成 {} 个", count);
}
}
\ No newline at end of file
package com.luhu.computility.module.compute.service.resourceorder;
import java.time.LocalDateTime;
import java.util.*;
import javax.validation.*;
import com.luhu.computility.module.compute.controller.admin.resourceorder.vo.*;
......@@ -157,4 +158,13 @@ public interface ResourceOrderService {
*/
void updateOrderFailedByWpgj(Long orderId, WpgjPayNotifyDTO notifyDTO);
/**
* 将指定时间范围内到期的已支付订单状态更新为已结束
*
* @param startTime 开始时间
* @param endTime 结束时间
* @return 更新的订单数量
*/
int expireFinishedOrders(LocalDateTime startTime, LocalDateTime endTime);
}
\ No newline at end of file
......@@ -197,10 +197,6 @@ public class ResourceOrderServiceImpl implements ResourceOrderService {
throw exception(RESOURCE_ORDER_SPU_NOT_EXISTS);
}
// 校验SPU库存是否充足(<= 0 视为无库存)
if (spu.getStock() == null || spu.getStock() <= 0) {
throw exception(RESOURCE_SPU_STOCK_NOT_ENOUGH);
}
// 构建订单数据
ResourceOrderDO order = new ResourceOrderDO();
......@@ -274,13 +270,6 @@ public class ResourceOrderServiceImpl implements ResourceOrderService {
updateOrder.setPayTime(LocalDateTime.now());
resourceOrderMapper.updateById(updateOrder);
// 4. 扣减库存并在库存为0时下架对应的 SPU 和其全部 SKU
try {
handleStockAndStatusAfterPaid(order);
} catch (Exception ex) {
log.error("[updateOrderPaid] 扣减库存或下架处理失败, orderId={}", orderId, ex);
}
}
@Override
......@@ -596,11 +585,11 @@ public class ResourceOrderServiceImpl implements ResourceOrderService {
resourceOrderMapper.updateById(updateResourceOrder);
payOrderWpgjMapper.updateById(updatePayOrder);
// 5. 扣减库存并在库存为0时下架对应的 SPU 和其全部 SKU
// 5. SPU被购买后,自动下架该SPU下的所有SKU并增加销量
try {
handleStockAndStatusAfterPaid(order);
handleSpuPurchaseAfterPayment(order);
} catch (Exception ex) {
log.error("[updateOrderPaidByWpgj] 扣减库存或下架处理失败, orderId={}", orderId, ex);
log.error("[updateOrderPaidByWpgj] SPU购买后处理失败, orderId={}", orderId, ex);
}
log.info("[updateOrderPaidByWpgj] WPGJ支付成功回调处理完成,订单ID: {}, WPGJ订单号: {}",
orderId, notifyDTO.getOrderId());
......@@ -614,52 +603,42 @@ public class ResourceOrderServiceImpl implements ResourceOrderService {
}
/**
* 支付完成后扣减 SPU 库存,若库存为 0 则下架对应 SPU 及其所有 SKU
* SPU被购买后,自动下架该SPU下的所有SKU并增加销量
*/
private void handleStockAndStatusAfterPaid(ResourceOrderDO order) {
private void handleSpuPurchaseAfterPayment(ResourceOrderDO order) {
// 仅当订单包含 SKU 时才处理
if (order.getSkuId() == null) {
return;
}
ResourceSkuDO sku = resourceSkuService.getResourceSku(order.getSkuId());
if (sku == null) {
log.warn("[handleStockAndStatusAfterPaid] SKU 不存在, skuId={}", order.getSkuId());
log.warn("[handleSpuPurchaseAfterPayment] SKU 不存在, skuId={}", order.getSkuId());
return;
}
Long spuId = sku.getSpuId();
if (spuId == null) {
log.warn("[handleStockAndStatusAfterPaid] SKU 未绑定 SPU, skuId={}", sku.getId());
log.warn("[handleSpuPurchaseAfterPayment] SKU 未绑定 SPU, skuId={}", sku.getId());
return;
}
// 原子扣减库存
int affected = resourceSpuMapper.decrementStock(spuId);
if (affected == 0) {
// 并发下可能库存已为0,记录日志即可
log.warn("[handleStockAndStatusAfterPaid] 库存递减失败,可能库存不足或已变更,spuId={}", spuId);
}
// 下架该 SPU 下所有 SKU
resourceSkuMapper.updateStatusBySpuId(spuId, ResourceSkuStatus.OFFLINE.getValue());
// 重新查询库存,若为 0 则下架 SPU 与其所有 SKU
ResourceSpuDO spuAfter = resourceSpuService.getResourceSpu(spuId);
if (spuAfter == null) {
log.warn("[handleStockAndStatusAfterPaid] SPU 不存在, spuId={}", spuId);
return;
}
Integer stock = spuAfter.getStock();
if (stock == null || stock <= 0) {
// 下架 SPU
// 增加SPU销量
ResourceSpuDO spu = resourceSpuService.getResourceSpu(spuId);
if (spu != null) {
ResourceSpuDO updateSpu = new ResourceSpuDO();
updateSpu.setId(spuId);
updateSpu.setStatus(ResourceSpuStatus.OFFLINE.getValue());
updateSpu.setSales((spu.getSales() != null ? spu.getSales() : 0) + 1);
resourceSpuMapper.updateById(updateSpu);
// 下架该 SPU 下所有 SKU
resourceSkuMapper.updateStatusBySpuId(spuId, ResourceSkuStatus.OFFLINE.getValue());
log.info("[handleStockAndStatusAfterPaid] 库存为0,已下架 SPU 及其所有 SKU,spuId={}", spuId);
}
log.info("[handleSpuPurchaseAfterPayment] SPU被购买后,已下架该SPU下的所有SKU并增加销量,spuId={}", spuId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateOrderFailedByWpgj(Long orderId, WpgjPayNotifyDTO notifyDTO) {
......@@ -699,4 +678,64 @@ public class ResourceOrderServiceImpl implements ResourceOrderService {
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public int expireFinishedOrders(LocalDateTime startTime, LocalDateTime endTime) {
try {
log.info("[expireFinishedOrders] 开始处理算力资源到期订单,时间范围: {} - {}", startTime, endTime);
// 查询指定时间范围内到期的已支付订单
List<ResourceOrderDO> expiredOrders = resourceOrderMapper.selectListByRentEndTimeBetweenAndStatus(
startTime, endTime, ResourceOrderStatus.PAID.getValue());
if (CollUtil.isEmpty(expiredOrders)) {
log.info("[expireFinishedOrders] 没有找到到期的算力资源订单");
return 0;
}
int count = 0;
for (ResourceOrderDO order : expiredOrders) {
try {
// 更新订单状态为已结束
ResourceOrderDO updateOrder = new ResourceOrderDO();
updateOrder.setId(order.getId());
updateOrder.setStatus(ResourceOrderStatus.FINISHED.getValue());
int updateCount = resourceOrderMapper.updateById(updateOrder);
if (updateCount > 0) {
count++;
// 同时更新对应的SPU状态为回收
if (order.getSkuId() != null) {
ResourceSkuDO sku = resourceSkuService.getResourceSku(order.getSkuId());
if (sku != null && sku.getSpuId() != null) {
try {
resourceSpuService.updateResourceSpuStatus(sku.getSpuId(), ResourceSpuStatus.RECYCLE.getValue());
log.info("[expireFinishedOrders] SPU状态更新为回收,SPU ID: {}", sku.getSpuId());
} catch (Exception spuEx) {
log.error("[expireFinishedOrders] SPU状态更新失败,SPU ID: {}", sku.getSpuId(), spuEx);
}
}
}
log.info("[expireFinishedOrders] 算力资源订单到期处理成功,订单ID: {}, 订单号: {}",
order.getId(), order.getOrderNo());
} else {
log.error("[expireFinishedOrders] 算力资源订单到期处理失败,更新数据库失败,订单ID: {}", order.getId());
}
} catch (Exception e) {
log.error("[expireFinishedOrders] 处理单个算力资源到期订单异常,订单ID: {}", order.getId(), e);
}
}
log.info("[expireFinishedOrders] 算力资源订单到期处理完成,时间范围: {} - {}, 处理成功数量: {}",
startTime, endTime, count);
return count;
} catch (Exception e) {
log.error("[expireFinishedOrders] 批量处理算力资源到期订单异常,时间范围: {} - {}", startTime, endTime, e);
return 0;
}
}
}
\ No newline at end of file
......@@ -2,6 +2,7 @@ package com.luhu.computility.module.compute.service.resourcesku;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.luhu.computility.framework.mybatis.core.query.LambdaQueryWrapperX;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
......@@ -37,6 +38,12 @@ public class ResourceSkuServiceImpl implements ResourceSkuService {
@Override
public Long createResourceSku(ResourceSkuSaveReqVO createReqVO) {
// 校验同一SPU下不能有相同租赁天数的SKU
long existingCount = resourceSkuMapper.selectCountBySpuIdAndDuration(createReqVO.getSpuId(), createReqVO.getDurationDays());
if (existingCount > 0) {
throw exception(RESOURCE_SKU_DUPLICATE_DURATION);
}
// 插入
ResourceSkuDO resourceSku = BeanUtils.toBean(createReqVO, ResourceSkuDO.class);
resourceSkuMapper.insert(resourceSku);
......@@ -49,6 +56,16 @@ public class ResourceSkuServiceImpl implements ResourceSkuService {
public void updateResourceSku(ResourceSkuSaveReqVO updateReqVO) {
// 校验存在
validateResourceSkuExists(updateReqVO.getId());
// 校验同一SPU下不能有相同租赁天数的SKU(排除自己)
long existingCount = resourceSkuMapper.selectCount(new LambdaQueryWrapperX<ResourceSkuDO>()
.eq(ResourceSkuDO::getSpuId, updateReqVO.getSpuId())
.eq(ResourceSkuDO::getDurationDays, updateReqVO.getDurationDays())
.ne(ResourceSkuDO::getId, updateReqVO.getId()));
if (existingCount > 0) {
throw exception(RESOURCE_SKU_DUPLICATE_DURATION);
}
// 更新
ResourceSkuDO updateObj = BeanUtils.toBean(updateReqVO, ResourceSkuDO.class);
resourceSkuMapper.updateById(updateObj);
......
......@@ -85,4 +85,12 @@ public interface ResourceSpuService {
*/
List<ResourceSpuDO> getOnlineResourceSpuList();
/**
* 更新算力资源SPU状态
*
* @param id SPU ID
* @param status 新状态
*/
void updateResourceSpuStatus(Long id, Integer status);
}
\ No newline at end of file
......@@ -135,4 +135,29 @@ public class ResourceSpuServiceImpl implements ResourceSpuService {
.eq(ResourceSpuDO::getDeleted, NOT_DELETED.getValue());
return resourceSpuMapper.selectList(wrapper);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateResourceSpuStatus(Long id, Integer status) {
// 校验SPU存在
validateResourceSpuExists(id);
// 获取更新前的状态
ResourceSpuDO existingSpu = resourceSpuMapper.selectById(id);
Integer oldStatus = existingSpu.getStatus();
// 如果状态没有变化,直接返回
if (Objects.equals(oldStatus, status)) {
return;
}
// 更新SPU状态
ResourceSpuDO updateObj = new ResourceSpuDO();
updateObj.setId(id);
updateObj.setStatus(status);
resourceSpuMapper.updateById(updateObj);
// 同步更新关联的SKU状态
resourceSkuMapper.updateStatusBySpuId(id, status);
}
}
\ No newline at end of file
......@@ -13,6 +13,9 @@ import javax.annotation.Resource;
*
* 支付超过过期时间时,支付渠道是不会通知进行过期,所以需要定时进行过期关闭。
*
*
* 这里会同时过期对应的业务订单! 这里会同时过期对应的业务订单!
*
* @author jonyl
*/
@Component
......@@ -24,7 +27,7 @@ public class PayOrderExpireJob implements JobHandler {
@Override
@TenantJob
public String execute(String param) {
int count = payOrderWpgjService.expireOrder();
int count = payOrderWpgjService.expirePayOrderAndBusinessOrder();
return StrUtil.format("WPGJ支付过期 {} 个", count);
}
......
......@@ -47,6 +47,6 @@ public interface PayOrderWpgjService {
*
* @return 过期的订单数量
*/
int expireOrder();
int expirePayOrderAndBusinessOrder();
}
\ No newline at end of file
......@@ -86,7 +86,7 @@ public class PayOrderWpgjServiceImpl implements PayOrderWpgjService {
}
@Override
public int expireOrder() {
public int expirePayOrderAndBusinessOrder() {
// 1. 查询过期的待支付订单(超过30分钟未支付的订单)
LocalDateTime expireTime = LocalDateTime.now().minusMinutes(30);
List<PayOrderWpgjDO> orders = payOrderWpgjMapper.selectListByOrderStatusAndCreateTimeLt(
......@@ -100,7 +100,7 @@ public class PayOrderWpgjServiceImpl implements PayOrderWpgjService {
for (PayOrderWpgjDO order : orders) {
if (expireOrder(order)) {
count++;
// 同时过期对应的业务订单
// ============同时过期对应的业务订单=============
expireBusinessOrder(order);
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment