Commit a62b4b53 by Jony.L

算力资源订单 支付成功更新销量和库存、 管理端算力资源订单页面展示手机号

parent 71743653
...@@ -18,5 +18,6 @@ public interface ErrorCodeConstants { ...@@ -18,5 +18,6 @@ public interface ErrorCodeConstants {
ErrorCode RESOURCE_ORDER_STATUS_NOT_UNPAID = new ErrorCode(1_030_006_000, "算力资源订单状态不是待支付"); ErrorCode RESOURCE_ORDER_STATUS_NOT_UNPAID = new ErrorCode(1_030_006_000, "算力资源订单状态不是待支付");
ErrorCode RESOURCE_ORDER_PAY_ORDER_ID_MISMATCH = new ErrorCode(1_030_007_000, "支付订单ID不匹配"); ErrorCode RESOURCE_ORDER_PAY_ORDER_ID_MISMATCH = new ErrorCode(1_030_007_000, "支付订单ID不匹配");
ErrorCode RESOURCE_ORDER_NOT_BELONGS_TO_USER = new ErrorCode(1_030_008_000, "算力资源订单不属于当前用户"); ErrorCode RESOURCE_ORDER_NOT_BELONGS_TO_USER = new ErrorCode(1_030_008_000, "算力资源订单不属于当前用户");
ErrorCode RESOURCE_SPU_STOCK_INSUFFICIENT = new ErrorCode(1_030_009_000, "算力资源SPU库存不足");
} }
\ No newline at end of file
...@@ -24,6 +24,10 @@ public class ResourceOrderRespVO { ...@@ -24,6 +24,10 @@ public class ResourceOrderRespVO {
@ExcelProperty("用户昵称") @ExcelProperty("用户昵称")
private String nickname; private String nickname;
@Schema(description = "用户手机号", example = "13800138000")
@ExcelProperty("用户手机号")
private String mobile;
@Schema(description = "算力资源SKU ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "31061") @Schema(description = "算力资源SKU ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "31061")
@ExcelProperty("算力资源SKU ID") @ExcelProperty("算力资源SKU ID")
private Long skuId; private Long skuId;
......
...@@ -31,6 +31,7 @@ import com.luhu.computility.module.compute.dal.dataobject.resourcespu.ResourceSp ...@@ -31,6 +31,7 @@ import com.luhu.computility.module.compute.dal.dataobject.resourcespu.ResourceSp
import com.luhu.computility.module.compute.service.resourcesku.ResourceSkuService; import com.luhu.computility.module.compute.service.resourcesku.ResourceSkuService;
import com.luhu.computility.module.compute.service.resourcespu.ResourceSpuService; import com.luhu.computility.module.compute.service.resourcespu.ResourceSpuService;
import com.luhu.computility.module.compute.service.resourcecategory.ResourceCategoryService; import com.luhu.computility.module.compute.service.resourcecategory.ResourceCategoryService;
import com.luhu.computility.module.system.service.member.MemberService;
import com.luhu.computility.module.compute.enums.ResourceOrderStatus; import com.luhu.computility.module.compute.enums.ResourceOrderStatus;
import com.luhu.computility.module.compute.enums.ResourceOrderRefundStatus; import com.luhu.computility.module.compute.enums.ResourceOrderRefundStatus;
import com.luhu.computility.module.compute.enums.ResourceOrderInvoiceStatus; import com.luhu.computility.module.compute.enums.ResourceOrderInvoiceStatus;
...@@ -81,6 +82,9 @@ public class ResourceOrderServiceImpl implements ResourceOrderService { ...@@ -81,6 +82,9 @@ public class ResourceOrderServiceImpl implements ResourceOrderService {
@Resource @Resource
private ResourceOrderNoRedisDAO resourceOrderNoRedisDAO; private ResourceOrderNoRedisDAO resourceOrderNoRedisDAO;
@Resource
private MemberService memberService;
@Override @Override
public Long createResourceOrder(ResourceOrderSaveReqVO createReqVO) { public Long createResourceOrder(ResourceOrderSaveReqVO createReqVO) {
// 插入 // 插入
...@@ -131,7 +135,19 @@ public class ResourceOrderServiceImpl implements ResourceOrderService { ...@@ -131,7 +135,19 @@ public class ResourceOrderServiceImpl implements ResourceOrderService {
@Override @Override
public PageResult<ResourceOrderRespVO> getResourceOrderPage(ResourceOrderPageReqVO pageReqVO) { public PageResult<ResourceOrderRespVO> getResourceOrderPage(ResourceOrderPageReqVO pageReqVO) {
return resourceOrderMapper.selectPage(pageReqVO); PageResult<ResourceOrderRespVO> pageResult = resourceOrderMapper.selectPage(pageReqVO);
// 为每个订单添加用户手机号
if (CollUtil.isNotEmpty(pageResult.getList())) {
pageResult.getList().forEach(order -> {
if (order.getUserId() != null) {
String mobile = memberService.getMemberUserMobile(order.getUserId());
order.setMobile(mobile);
}
});
}
return pageResult;
} }
@Override @Override
...@@ -242,6 +258,20 @@ public class ResourceOrderServiceImpl implements ResourceOrderService { ...@@ -242,6 +258,20 @@ public class ResourceOrderServiceImpl implements ResourceOrderService {
updateOrder.setPayTime(LocalDateTime.now()); updateOrder.setPayTime(LocalDateTime.now());
resourceOrderMapper.updateById(updateOrder); resourceOrderMapper.updateById(updateOrder);
// 4. 更新SPU销量和库存
try {
// 获取SKU信息,找到对应的SPU
ResourceSkuDO sku = resourceSkuService.getResourceSku(order.getSkuId());
if (sku != null && sku.getSpuId() != null) {
// 更新SPU销量和库存
resourceSpuService.updateSalesAndStock(sku.getSpuId());
log.info("[updateOrderPaid][order({}) 支付成功,已更新SPU({})的销量和库存]", orderId, sku.getSpuId());
}
} catch (Exception e) {
// 更新销量和库存失败不应该影响支付流程,只记录日志
log.error("[updateOrderPaid][order({}) 更新SPU销量和库存失败]", orderId, e);
}
} }
@Override @Override
...@@ -327,6 +357,12 @@ public class ResourceOrderServiceImpl implements ResourceOrderService { ...@@ -327,6 +357,12 @@ public class ResourceOrderServiceImpl implements ResourceOrderService {
List<AppResourceOrderRespVO> respList = convertList(pageResult.getList(), order -> { List<AppResourceOrderRespVO> respList = convertList(pageResult.getList(), order -> {
AppResourceOrderRespVO respVO = BeanUtils.toBean(order, AppResourceOrderRespVO.class); AppResourceOrderRespVO respVO = BeanUtils.toBean(order, AppResourceOrderRespVO.class);
// 获取用户手机号
if (order.getUserId() != null) {
String mobile = memberService.getMemberUserMobile(order.getUserId());
respVO.setMobile(mobile);
}
// 获取SKU和SPU信息 // 获取SKU和SPU信息
ResourceSkuDO sku = resourceSkuService.getResourceSku(order.getSkuId()); ResourceSkuDO sku = resourceSkuService.getResourceSku(order.getSkuId());
......
...@@ -85,4 +85,11 @@ public interface ResourceSpuService { ...@@ -85,4 +85,11 @@ public interface ResourceSpuService {
*/ */
List<ResourceSpuDO> getOnlineResourceSpuList(); List<ResourceSpuDO> getOnlineResourceSpuList();
/**
* 更新SPU销量和库存(支付成功后调用)
*
* @param spuId SPU编号
*/
void updateSalesAndStock(Long spuId);
} }
\ No newline at end of file
...@@ -2,6 +2,7 @@ package com.luhu.computility.module.compute.service.resourcespu; ...@@ -2,6 +2,7 @@ package com.luhu.computility.module.compute.service.resourcespu;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
...@@ -120,4 +121,31 @@ public class ResourceSpuServiceImpl implements ResourceSpuService { ...@@ -120,4 +121,31 @@ public class ResourceSpuServiceImpl implements ResourceSpuService {
return resourceSpuMapper.selectList(wrapper); return resourceSpuMapper.selectList(wrapper);
} }
@Override
@Transactional(rollbackFor = Exception.class)
public void updateSalesAndStock(Long spuId) {
// 校验SPU存在
ResourceSpuDO spu = resourceSpuMapper.selectById(spuId);
if (spu == null) {
throw exception(RESOURCE_SPU_NOT_EXISTS);
}
// 检查库存是否充足
if (spu.getStock() <= 0) {
throw exception(RESOURCE_SPU_STOCK_INSUFFICIENT);
}
// 使用LambdaUpdateWrapper实现原子性的销量+1和库存-1
LambdaUpdateWrapper<ResourceSpuDO> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(ResourceSpuDO::getId, spuId)
.gt(ResourceSpuDO::getStock, 0) // 确保库存大于0
.setSql("sales = sales + 1")
.setSql("stock = stock - 1");
int updateCount = resourceSpuMapper.update(null, updateWrapper);
if (updateCount == 0) {
throw exception(RESOURCE_SPU_STOCK_INSUFFICIENT);
}
}
} }
\ No newline at end of file
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