This commit is contained in:
seesaw
2024-11-22 10:04:23 +08:00
parent 108a86bcc9
commit 29f1ade843
6 changed files with 111 additions and 52 deletions

View File

@ -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);
} }

View File

@ -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;
}

View File

@ -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());

View File

@ -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;
} }

View File

@ -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);

View File

@ -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);