优化
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.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
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.StoreOrderDetailVO;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageVO;
|
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageVO;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderSaveReqVO;
|
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderSaveReqVO;
|
||||||
@ -126,7 +127,7 @@ public class StoreOrderController {
|
|||||||
|
|
||||||
@PostMapping("/customize")
|
@PostMapping("/customize")
|
||||||
@Operation(summary = "自定义扣款")
|
@Operation(summary = "自定义扣款")
|
||||||
public CommonResult<Boolean> customize(@RequestBody StoreOrderDto dto){
|
public CommonResult<Boolean> customize(@RequestBody StoreOrderCustomizeVO dto){
|
||||||
storeOrderService.customize(dto);
|
storeOrderService.customize(dto);
|
||||||
return CommonResult.success(true);
|
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<>();
|
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) {
|
public static Object getUserLock(Long userId) {
|
||||||
// 从 Map 中获取 WeakReference 对象
|
// 从 Map 中获取 WeakReference 对象
|
||||||
return userLocks.computeIfAbsent(userId, k -> new Object());
|
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.storegoods.StoreGoodsMapper;
|
||||||
import cn.iocoder.yudao.module.member.dal.mysql.storegoodsinventory.StoreGoodsInventoryMapper;
|
import cn.iocoder.yudao.module.member.dal.mysql.storegoodsinventory.StoreGoodsInventoryMapper;
|
||||||
import cn.iocoder.yudao.module.member.enums.InventoryTypeEnum;
|
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.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import org.springframework.stereotype.Service;
|
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.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.enums.ErrorCodeConstants.STORE_GOODS_INVENTORY_NOT_EXISTS;
|
||||||
|
import static cn.iocoder.yudao.module.member.service.amount.LockManager.getStoreOrderLock;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商品库存 Service 实现类
|
* 商品库存 Service 实现类
|
||||||
@ -46,8 +48,9 @@ public class StoreGoodsInventoryServiceImpl implements StoreGoodsInventoryServic
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public synchronized Integer createStoreGoodsInventory(@Valid AddReqVO createReqVO) {
|
public Integer createStoreGoodsInventory(@Valid AddReqVO createReqVO) {
|
||||||
Integer id = null;
|
Integer id = null;
|
||||||
|
synchronized (getStoreOrderLock(LockManager.INVENTORY_KEY)) {
|
||||||
List<GoodsInfoReqVO> list = createReqVO.getList();
|
List<GoodsInfoReqVO> list = createReqVO.getList();
|
||||||
for (GoodsInfoReqVO vo : list) {
|
for (GoodsInfoReqVO vo : list) {
|
||||||
LambdaQueryWrapper<StoreGoodsInventoryDO> wrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<StoreGoodsInventoryDO> wrapper = new LambdaQueryWrapper<>();
|
||||||
@ -62,11 +65,6 @@ public class StoreGoodsInventoryServiceImpl implements StoreGoodsInventoryServic
|
|||||||
storeGoodsInventoryMapper.updateById(storeGoodsInventoryDO);
|
storeGoodsInventoryMapper.updateById(storeGoodsInventoryDO);
|
||||||
id = storeGoodsInventoryDO.getId();
|
id = storeGoodsInventoryDO.getId();
|
||||||
}
|
}
|
||||||
// else {
|
|
||||||
// StoreGoodsInventoryDO storeGoodsInventory = BeanUtils.toBean(createReqVO, StoreGoodsInventoryDO.class);
|
|
||||||
// storeGoodsInventoryMapper.insert(storeGoodsInventory);
|
|
||||||
// id = storeGoodsInventory.getId();
|
|
||||||
// }
|
|
||||||
} else {// 出库
|
} else {// 出库
|
||||||
if (CollectionUtil.isEmpty(storeGoodsInventoryDOS)) {
|
if (CollectionUtil.isEmpty(storeGoodsInventoryDOS)) {
|
||||||
throw exception(STORE_GOODS_INVENTORY_NOT_EXISTS);
|
throw exception(STORE_GOODS_INVENTORY_NOT_EXISTS);
|
||||||
@ -86,7 +84,7 @@ public class StoreGoodsInventoryServiceImpl implements StoreGoodsInventoryServic
|
|||||||
id = storeGoodsInventoryDO.getId();
|
id = storeGoodsInventoryDO.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// 返回
|
// 返回
|
||||||
return id;
|
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.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.storegoodsinventory.vo.AddReqVO;
|
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.StoreOrderPageReqVO;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageVO;
|
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageVO;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderSaveReqVO;
|
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderSaveReqVO;
|
||||||
@ -80,7 +81,7 @@ public interface StoreOrderService {
|
|||||||
|
|
||||||
AddReqVO appCreate(CardDto dto);
|
AddReqVO appCreate(CardDto dto);
|
||||||
|
|
||||||
String customize(StoreOrderDto dto);
|
void customize(StoreOrderCustomizeVO dto);
|
||||||
|
|
||||||
String code(Integer orderId);
|
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.business.vo.StatisticsVo;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.storegoodsinventory.vo.AddReqVO;
|
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.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.StoreOrderPageReqVO;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageVO;
|
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageVO;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderSaveReqVO;
|
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.storeorderdetail.StoreOrderDetailDO;
|
||||||
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
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.dal.mysql.storeorder.StoreOrderMapper;
|
||||||
import cn.iocoder.yudao.module.member.enums.InventoryTypeEnum;
|
import cn.iocoder.yudao.module.member.enums.*;
|
||||||
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.service.amount.AmountService;
|
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.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.card.CardService;
|
||||||
import cn.iocoder.yudao.module.member.service.storebusiness.StoreBusinessService;
|
import cn.iocoder.yudao.module.member.service.storebusiness.StoreBusinessService;
|
||||||
import cn.iocoder.yudao.module.member.service.storegoodsinventory.StoreGoodsInventoryService;
|
import cn.iocoder.yudao.module.member.service.storegoodsinventory.StoreGoodsInventoryService;
|
||||||
@ -390,7 +389,7 @@ public class StoreOrderServiceImpl implements StoreOrderService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public String customize(StoreOrderDto dto) {
|
public void customize(StoreOrderCustomizeVO dto) {
|
||||||
|
|
||||||
MemberUserDO user = userService.getUserByMobile(dto.getJwt());
|
MemberUserDO user = userService.getUserByMobile(dto.getJwt());
|
||||||
|
|
||||||
@ -404,26 +403,54 @@ public class StoreOrderServiceImpl implements StoreOrderService {
|
|||||||
if(user.getMoney().compareTo(totalMoney) < 0){
|
if(user.getMoney().compareTo(totalMoney) < 0){
|
||||||
throw exception(AMOUNT_NOT_ENOUGH);
|
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());
|
BigDecimal compute = compute(total, user.getId());
|
||||||
if (compute.compareTo(BigDecimal.ZERO) < 0) {
|
if (compute.compareTo(BigDecimal.ZERO) < 0) {
|
||||||
storeOrderMapper.deleteById(order.getOrderId());
|
storeOrderMapper.deleteById(storeOrderDO.getOrderId());
|
||||||
orderDetailService.deleteByOrderNo(order.getOrderId());
|
orderDetailService.deleteByOrderNo(storeOrderDO.getOrderId());
|
||||||
throw exception(AMOUNT_NOT_ENOUGH);
|
throw exception(AMOUNT_NOT_ENOUGH);
|
||||||
}
|
}
|
||||||
//营业数据
|
//营业数据
|
||||||
StatisticsVo statisticsVo = new StatisticsVo();
|
StatisticsVo statisticsVo = new StatisticsVo();
|
||||||
statisticsVo.setCarteenId(order.getCarteenId());
|
statisticsVo.setCarteenId(storeOrderDO.getCarteenId());
|
||||||
statisticsVo.setTotalMoney(total);
|
statisticsVo.setTotalMoney(total);
|
||||||
statisticsVo.setOrderSum(1);
|
statisticsVo.setOrderSum(1);
|
||||||
statisticsVo.setTime(order.getCreateTime());
|
statisticsVo.setTime(storeOrderDO.getCreateTime());
|
||||||
statisticsVo.setOrderId(order.getOrderId().longValue());
|
statisticsVo.setOrderId(storeOrderDO.getOrderId().longValue());
|
||||||
storeBusinessService.updateStatistics(statisticsVo);
|
storeBusinessService.updateStatistics(statisticsVo);
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -463,7 +490,7 @@ public class StoreOrderServiceImpl implements StoreOrderService {
|
|||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public AddReqVO cancel(Integer orderId) {
|
public AddReqVO cancel(Integer orderId) {
|
||||||
StoreOrderDO storeOrderDO;
|
StoreOrderDO storeOrderDO;
|
||||||
synchronized (getStoreOrderLock("cancel")) {
|
synchronized (getStoreOrderLock(LockManager.CANCEL_KEY)) {
|
||||||
storeOrderDO = storeOrderMapper.selectById(orderId);
|
storeOrderDO = storeOrderMapper.selectById(orderId);
|
||||||
if(ObjectUtil.isEmpty(storeOrderDO)){
|
if(ObjectUtil.isEmpty(storeOrderDO)){
|
||||||
throw exception(STORE_ORDER_NOT_EXISTS);
|
throw exception(STORE_ORDER_NOT_EXISTS);
|
||||||
|
Reference in New Issue
Block a user