From 29f1ade843aac6d877f34c27da7ccea1de927a77 Mon Sep 17 00:00:00 2001 From: seesaw Date: Fri, 22 Nov 2024 10:04:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../storeorder/StoreOrderController.java | 3 +- .../storeorder/vo/StoreOrderCustomizeVO.java | 27 ++++++++ .../member/service/amount/LockManager.java | 5 ++ .../StoreGoodsInventoryServiceImpl.java | 66 +++++++++---------- .../service/storeorder/StoreOrderService.java | 3 +- .../storeorder/StoreOrderServiceImpl.java | 59 ++++++++++++----- 6 files changed, 111 insertions(+), 52 deletions(-) create mode 100644 yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storeorder/vo/StoreOrderCustomizeVO.java diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storeorder/StoreOrderController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storeorder/StoreOrderController.java index b0a2b7df..1180d263 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storeorder/StoreOrderController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storeorder/StoreOrderController.java @@ -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 customize(@RequestBody StoreOrderDto dto){ + public CommonResult customize(@RequestBody StoreOrderCustomizeVO dto){ storeOrderService.customize(dto); return CommonResult.success(true); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storeorder/vo/StoreOrderCustomizeVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storeorder/vo/StoreOrderCustomizeVO.java new file mode 100644 index 00000000..1e597031 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storeorder/vo/StoreOrderCustomizeVO.java @@ -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 equipmentGoodsCustoms; + + private Long carteenId; + + private String type; + + private String date; + + +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/LockManager.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/LockManager.java index b6990947..aa295782 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/LockManager.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/LockManager.java @@ -12,6 +12,11 @@ public class LockManager { private static final ConcurrentHashMap 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()); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoodsinventory/StoreGoodsInventoryServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoodsinventory/StoreGoodsInventoryServiceImpl.java index c94e44eb..d04e15a9 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoodsinventory/StoreGoodsInventoryServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoodsinventory/StoreGoodsInventoryServiceImpl.java @@ -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 list = createReqVO.getList(); - for (GoodsInfoReqVO vo : list) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(StoreGoodsInventoryDO::getGoodsId, vo.getGoodsId()) - .eq(StoreGoodsInventoryDO::getCarteenId, vo.getCarteenId()); - List storeGoodsInventoryDOS = storeGoodsInventoryMapper.selectList(wrapper); - if (InventoryTypeEnum.IN.getCode().equals(createReqVO.getType())) { - if (CollectionUtil.isNotEmpty(storeGoodsInventoryDOS)) { + synchronized (getStoreOrderLock(LockManager.INVENTORY_KEY)) { + List list = createReqVO.getList(); + for (GoodsInfoReqVO vo : list) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(StoreGoodsInventoryDO::getGoodsId, vo.getGoodsId()) + .eq(StoreGoodsInventoryDO::getCarteenId, vo.getCarteenId()); + List 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; } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderService.java index 56e0ed6b..afdd8875 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderService.java @@ -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); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderServiceImpl.java index e59bb207..31031cff 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderServiceImpl.java @@ -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 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);