优化
This commit is contained in:
@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderCustomizeVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderDetailVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderSaveReqVO;
|
||||
@ -126,7 +127,7 @@ public class StoreOrderController {
|
||||
|
||||
@PostMapping("/customize")
|
||||
@Operation(summary = "自定义扣款")
|
||||
public CommonResult<Boolean> customize(@RequestBody StoreOrderDto dto){
|
||||
public CommonResult<Boolean> customize(@RequestBody StoreOrderCustomizeVO dto){
|
||||
storeOrderService.customize(dto);
|
||||
return CommonResult.success(true);
|
||||
}
|
||||
|
@ -0,0 +1,27 @@
|
||||
package cn.iocoder.yudao.module.member.controller.admin.storeorder.vo;
|
||||
|
||||
|
||||
import cn.iocoder.yudao.module.member.controller.app.store.dto.StoreGoodsDto;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class StoreOrderCustomizeVO {
|
||||
|
||||
private String cardNumber;
|
||||
|
||||
private String jwt;
|
||||
|
||||
private Long userId;
|
||||
|
||||
private List<StoreGoodsDto> equipmentGoodsCustoms;
|
||||
|
||||
private Long carteenId;
|
||||
|
||||
private String type;
|
||||
|
||||
private String date;
|
||||
|
||||
|
||||
}
|
@ -12,6 +12,11 @@ public class LockManager {
|
||||
|
||||
private static final ConcurrentHashMap<String, Object> storeOrderLock = new ConcurrentHashMap<>();
|
||||
|
||||
|
||||
public static final String CANCEL_KEY = "cancel";
|
||||
|
||||
public static final String INVENTORY_KEY = "inventory";
|
||||
|
||||
public static Object getUserLock(Long userId) {
|
||||
// 从 Map 中获取 WeakReference 对象
|
||||
return userLocks.computeIfAbsent(userId, k -> new Object());
|
||||
|
@ -14,6 +14,7 @@ import cn.iocoder.yudao.module.member.dal.dataobject.storegoodsinventory.StoreGo
|
||||
import cn.iocoder.yudao.module.member.dal.mysql.storegoods.StoreGoodsMapper;
|
||||
import cn.iocoder.yudao.module.member.dal.mysql.storegoodsinventory.StoreGoodsInventoryMapper;
|
||||
import cn.iocoder.yudao.module.member.enums.InventoryTypeEnum;
|
||||
import cn.iocoder.yudao.module.member.service.amount.LockManager;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import org.springframework.stereotype.Service;
|
||||
@ -29,6 +30,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.STORE_GOODS_INVENTORY_NOT_EXISTS;
|
||||
import static cn.iocoder.yudao.module.member.service.amount.LockManager.getStoreOrderLock;
|
||||
|
||||
/**
|
||||
* 商品库存 Service 实现类
|
||||
@ -46,47 +48,43 @@ public class StoreGoodsInventoryServiceImpl implements StoreGoodsInventoryServic
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public synchronized Integer createStoreGoodsInventory(@Valid AddReqVO createReqVO) {
|
||||
public Integer createStoreGoodsInventory(@Valid AddReqVO createReqVO) {
|
||||
Integer id = null;
|
||||
List<GoodsInfoReqVO> list = createReqVO.getList();
|
||||
for (GoodsInfoReqVO vo : list) {
|
||||
LambdaQueryWrapper<StoreGoodsInventoryDO> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(StoreGoodsInventoryDO::getGoodsId, vo.getGoodsId())
|
||||
.eq(StoreGoodsInventoryDO::getCarteenId, vo.getCarteenId());
|
||||
List<StoreGoodsInventoryDO> storeGoodsInventoryDOS = storeGoodsInventoryMapper.selectList(wrapper);
|
||||
if (InventoryTypeEnum.IN.getCode().equals(createReqVO.getType())) {
|
||||
if (CollectionUtil.isNotEmpty(storeGoodsInventoryDOS)) {
|
||||
synchronized (getStoreOrderLock(LockManager.INVENTORY_KEY)) {
|
||||
List<GoodsInfoReqVO> list = createReqVO.getList();
|
||||
for (GoodsInfoReqVO vo : list) {
|
||||
LambdaQueryWrapper<StoreGoodsInventoryDO> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(StoreGoodsInventoryDO::getGoodsId, vo.getGoodsId())
|
||||
.eq(StoreGoodsInventoryDO::getCarteenId, vo.getCarteenId());
|
||||
List<StoreGoodsInventoryDO> storeGoodsInventoryDOS = storeGoodsInventoryMapper.selectList(wrapper);
|
||||
if (InventoryTypeEnum.IN.getCode().equals(createReqVO.getType())) {
|
||||
if (CollectionUtil.isNotEmpty(storeGoodsInventoryDOS)) {
|
||||
StoreGoodsInventoryDO storeGoodsInventoryDO = storeGoodsInventoryDOS.get(0);
|
||||
storeGoodsInventoryDO.setNumber(storeGoodsInventoryDO.getNumber() + vo.getNumber());
|
||||
storeGoodsInventoryDO.setWeight(storeGoodsInventoryDO.getWeight() + vo.getWeight());
|
||||
storeGoodsInventoryMapper.updateById(storeGoodsInventoryDO);
|
||||
id = storeGoodsInventoryDO.getId();
|
||||
}
|
||||
} else {// 出库
|
||||
if (CollectionUtil.isEmpty(storeGoodsInventoryDOS)) {
|
||||
throw exception(STORE_GOODS_INVENTORY_NOT_EXISTS);
|
||||
}
|
||||
StoreGoodsInventoryDO storeGoodsInventoryDO = storeGoodsInventoryDOS.get(0);
|
||||
storeGoodsInventoryDO.setNumber(storeGoodsInventoryDO.getNumber() + vo.getNumber());
|
||||
storeGoodsInventoryDO.setWeight(storeGoodsInventoryDO.getWeight() + vo.getWeight());
|
||||
if (storeGoodsInventoryDO.getNumber() < vo.getNumber()) {
|
||||
StoreGoodsDO storeGoodsDO = storeGoodsMapper.selectById(storeGoodsInventoryDO.getGoodsId());
|
||||
throw exception(new ErrorCode(1_004_019_001, storeGoodsDO.getGoodsName()+"商品库存不足"));
|
||||
}
|
||||
if (storeGoodsInventoryDO.getWeight() < vo.getWeight()) {
|
||||
StoreGoodsDO storeGoodsDO = storeGoodsMapper.selectById(storeGoodsInventoryDO.getGoodsId());
|
||||
throw exception(new ErrorCode(1_004_019_001, storeGoodsDO.getGoodsName()+"商品库存不足"));
|
||||
}
|
||||
storeGoodsInventoryDO.setNumber(storeGoodsInventoryDO.getNumber() - vo.getNumber());
|
||||
storeGoodsInventoryDO.setWeight(storeGoodsInventoryDO.getWeight() - vo.getWeight());
|
||||
storeGoodsInventoryMapper.updateById(storeGoodsInventoryDO);
|
||||
id = storeGoodsInventoryDO.getId();
|
||||
}
|
||||
// else {
|
||||
// StoreGoodsInventoryDO storeGoodsInventory = BeanUtils.toBean(createReqVO, StoreGoodsInventoryDO.class);
|
||||
// storeGoodsInventoryMapper.insert(storeGoodsInventory);
|
||||
// id = storeGoodsInventory.getId();
|
||||
// }
|
||||
} else {// 出库
|
||||
if (CollectionUtil.isEmpty(storeGoodsInventoryDOS)) {
|
||||
throw exception(STORE_GOODS_INVENTORY_NOT_EXISTS);
|
||||
}
|
||||
StoreGoodsInventoryDO storeGoodsInventoryDO = storeGoodsInventoryDOS.get(0);
|
||||
if (storeGoodsInventoryDO.getNumber() < vo.getNumber()) {
|
||||
StoreGoodsDO storeGoodsDO = storeGoodsMapper.selectById(storeGoodsInventoryDO.getGoodsId());
|
||||
throw exception(new ErrorCode(1_004_019_001, storeGoodsDO.getGoodsName()+"商品库存不足"));
|
||||
}
|
||||
if (storeGoodsInventoryDO.getWeight() < vo.getWeight()) {
|
||||
StoreGoodsDO storeGoodsDO = storeGoodsMapper.selectById(storeGoodsInventoryDO.getGoodsId());
|
||||
throw exception(new ErrorCode(1_004_019_001, storeGoodsDO.getGoodsName()+"商品库存不足"));
|
||||
}
|
||||
storeGoodsInventoryDO.setNumber(storeGoodsInventoryDO.getNumber() - vo.getNumber());
|
||||
storeGoodsInventoryDO.setWeight(storeGoodsInventoryDO.getWeight() - vo.getWeight());
|
||||
storeGoodsInventoryMapper.updateById(storeGoodsInventoryDO);
|
||||
id = storeGoodsInventoryDO.getId();
|
||||
}
|
||||
}
|
||||
|
||||
// 返回
|
||||
return id;
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.member.service.storeorder;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storegoodsinventory.vo.AddReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderCustomizeVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderSaveReqVO;
|
||||
@ -80,7 +81,7 @@ public interface StoreOrderService {
|
||||
|
||||
AddReqVO appCreate(CardDto dto);
|
||||
|
||||
String customize(StoreOrderDto dto);
|
||||
void customize(StoreOrderCustomizeVO dto);
|
||||
|
||||
String code(Integer orderId);
|
||||
|
||||
|
@ -8,6 +8,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.business.vo.StatisticsVo;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storegoodsinventory.vo.AddReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storegoodsinventory.vo.GoodsInfoReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderCustomizeVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageReqVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageVO;
|
||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderSaveReqVO;
|
||||
@ -25,12 +26,10 @@ import cn.iocoder.yudao.module.member.dal.dataobject.storeorder.StoreOrderDO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.storeorderdetail.StoreOrderDetailDO;
|
||||
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
||||
import cn.iocoder.yudao.module.member.dal.mysql.storeorder.StoreOrderMapper;
|
||||
import cn.iocoder.yudao.module.member.enums.InventoryTypeEnum;
|
||||
import cn.iocoder.yudao.module.member.enums.OutTypeEnum;
|
||||
import cn.iocoder.yudao.module.member.enums.RefundStatusEnum;
|
||||
import cn.iocoder.yudao.module.member.enums.StoreOrderStatusEnum;
|
||||
import cn.iocoder.yudao.module.member.enums.*;
|
||||
import cn.iocoder.yudao.module.member.service.amount.AmountService;
|
||||
import cn.iocoder.yudao.module.member.service.amount.DeductionService;
|
||||
import cn.iocoder.yudao.module.member.service.amount.LockManager;
|
||||
import cn.iocoder.yudao.module.member.service.card.CardService;
|
||||
import cn.iocoder.yudao.module.member.service.storebusiness.StoreBusinessService;
|
||||
import cn.iocoder.yudao.module.member.service.storegoodsinventory.StoreGoodsInventoryService;
|
||||
@ -390,7 +389,7 @@ public class StoreOrderServiceImpl implements StoreOrderService {
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public String customize(StoreOrderDto dto) {
|
||||
public void customize(StoreOrderCustomizeVO dto) {
|
||||
|
||||
MemberUserDO user = userService.getUserByMobile(dto.getJwt());
|
||||
|
||||
@ -404,26 +403,54 @@ public class StoreOrderServiceImpl implements StoreOrderService {
|
||||
if(user.getMoney().compareTo(totalMoney) < 0){
|
||||
throw exception(AMOUNT_NOT_ENOUGH);
|
||||
}
|
||||
StoreOrderDO order = createOrder(dto,StoreOrderStatusEnum.COMPLETE.getCode());
|
||||
Double totalPrice = order.getTotalPrice();
|
||||
BigDecimal total = BigDecimal.valueOf(totalPrice).setScale(2, RoundingMode.HALF_UP);
|
||||
|
||||
//创建订单
|
||||
StoreOrderDO storeOrderDO = new StoreOrderDO();
|
||||
BeanUtil.copyProperties(dto, storeOrderDO);
|
||||
|
||||
//时间处理
|
||||
String type = dto.getType();
|
||||
String date = dto.getDate();
|
||||
if(CostTypeEnum.MORNING.getCode().equals(type)){
|
||||
date = date+" 08:00:00";
|
||||
}else if (CostTypeEnum.NOON.getCode().equals(type)){
|
||||
date = date+" 12:00:00";
|
||||
}else if (CostTypeEnum.NIGHT.getCode().equals(type)){
|
||||
date = date+" 17:00:00";
|
||||
}
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
LocalDateTime now = LocalDateTime.parse(date, formatter);
|
||||
|
||||
storeOrderDO.setStatus(StoreOrderStatusEnum.COMPLETE.getCode());
|
||||
storeOrderDO.setTotalPrice(sum);
|
||||
storeOrderDO.setCarteenId(dto.getCarteenId());
|
||||
storeOrderDO.setCreateTime(now);
|
||||
storeOrderMapper.insert(storeOrderDO);
|
||||
ArrayList<StoreOrderDetailDO> detailDOS = new ArrayList<>();
|
||||
for (StoreGoodsDto storeGoodsDto : equipmentGoodsCustoms) {
|
||||
StoreOrderDetailDO storeOrderDetailDO = new StoreOrderDetailDO();
|
||||
BeanUtil.copyProperties(storeGoodsDto, storeOrderDetailDO);
|
||||
storeOrderDetailDO.setOrderId(storeOrderDO.getOrderId());
|
||||
detailDOS.add(storeOrderDetailDO);
|
||||
}
|
||||
orderDetailService.saveBatch(detailDOS);
|
||||
|
||||
BigDecimal total = BigDecimal.valueOf(sum).setScale(2, RoundingMode.HALF_UP);
|
||||
|
||||
BigDecimal compute = compute(total, user.getId());
|
||||
if (compute.compareTo(BigDecimal.ZERO) < 0) {
|
||||
storeOrderMapper.deleteById(order.getOrderId());
|
||||
orderDetailService.deleteByOrderNo(order.getOrderId());
|
||||
storeOrderMapper.deleteById(storeOrderDO.getOrderId());
|
||||
orderDetailService.deleteByOrderNo(storeOrderDO.getOrderId());
|
||||
throw exception(AMOUNT_NOT_ENOUGH);
|
||||
}
|
||||
//营业数据
|
||||
StatisticsVo statisticsVo = new StatisticsVo();
|
||||
statisticsVo.setCarteenId(order.getCarteenId());
|
||||
statisticsVo.setCarteenId(storeOrderDO.getCarteenId());
|
||||
statisticsVo.setTotalMoney(total);
|
||||
statisticsVo.setOrderSum(1);
|
||||
statisticsVo.setTime(order.getCreateTime());
|
||||
statisticsVo.setOrderId(order.getOrderId().longValue());
|
||||
statisticsVo.setTime(storeOrderDO.getCreateTime());
|
||||
statisticsVo.setOrderId(storeOrderDO.getOrderId().longValue());
|
||||
storeBusinessService.updateStatistics(statisticsVo);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -463,7 +490,7 @@ public class StoreOrderServiceImpl implements StoreOrderService {
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public AddReqVO cancel(Integer orderId) {
|
||||
StoreOrderDO storeOrderDO;
|
||||
synchronized (getStoreOrderLock("cancel")) {
|
||||
synchronized (getStoreOrderLock(LockManager.CANCEL_KEY)) {
|
||||
storeOrderDO = storeOrderMapper.selectById(orderId);
|
||||
if(ObjectUtil.isEmpty(storeOrderDO)){
|
||||
throw exception(STORE_ORDER_NOT_EXISTS);
|
||||
|
Reference in New Issue
Block a user