From d32f9705a00e9eefa383e56b52a9636551fe6519 Mon Sep 17 00:00:00 2001 From: SongZhang <2064194730@qq.com> Date: Fri, 16 Aug 2024 11:12:25 +0800 Subject: [PATCH 1/4] =?UTF-8?q?1.=E4=BB=A3=E5=AE=A2=E4=B8=8B=E5=8D=95?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E4=BB=98=EF=BC=8C=E6=8C=82=E8=B5=B7=EF=BC=8C?= =?UTF-8?q?=E4=B8=8B=E5=8D=95=E6=8E=A5=E5=8F=A3=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cashier/cons/rabbit/RabbitConstants.java | 12 + .../controller/product/TbPlaceController.java | 45 ++ .../cn/ysk/cashier/dto/shoptable/CarDTO.java | 11 + .../cashier/dto/shoptable/CreateOrderDTO.java | 2 +- .../cn/ysk/cashier/dto/shoptable/PayDTO.java | 16 + .../ysk/cashier/dto/shoptable/PendingDTO.java | 20 + .../mybatis/mapper/TbCashierCartMapper.java | 11 + .../repository/TbShopPayTypeRepository.java | 7 +- .../impl/shopimpl/TbShopTableServiceImpl.java | 403 ++++++++++++------ .../service/shop/TbShopTableService.java | 8 + .../cn/ysk/cashier/utils/SnowFlakeUtil.java | 48 +++ .../main/java/cn/ysk/cashier/vo/CarVO.java | 17 + 12 files changed, 462 insertions(+), 138 deletions(-) create mode 100644 eladmin-system/src/main/java/cn/ysk/cashier/dto/shoptable/CarDTO.java create mode 100644 eladmin-system/src/main/java/cn/ysk/cashier/dto/shoptable/PayDTO.java create mode 100644 eladmin-system/src/main/java/cn/ysk/cashier/dto/shoptable/PendingDTO.java create mode 100644 eladmin-system/src/main/java/cn/ysk/cashier/utils/SnowFlakeUtil.java create mode 100644 eladmin-system/src/main/java/cn/ysk/cashier/vo/CarVO.java diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/cons/rabbit/RabbitConstants.java b/eladmin-system/src/main/java/cn/ysk/cashier/cons/rabbit/RabbitConstants.java index 1a2c423a..5f622ddc 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/cons/rabbit/RabbitConstants.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/cons/rabbit/RabbitConstants.java @@ -7,4 +7,16 @@ public interface RabbitConstants { String CONS_MSG_COLLECT_PUT = "cons_msg_collect_put"; String CONS_MSG_COLLECT_ROUTINGKEY_PUT = "cons_msg_collect_routingkey_put"; + + String CART_ORDER_COLLECT_PUT = "cart_order_collect_put"; + String CART_ORDER_COLLECT_ROUTINGKEY_PUT = "cart_order_collect_routingkey_put"; + + // 打印 + String PRINT_MECHINE_COLLECT_PUT="print_mechine_collect_put"; + String PRINT_MECHINE_COLLECT_QUEUE_PUT = "print_mechine_collect_queue_put"; + String PRINT_MECHINE_COLLECT_ROUTINGKEY_PUT = "print_mechine_collect_routingkey_put"; + + // 售出记录 + String EXCHANGE_STOCK_RECORD = "exchange.stock.record"; + String ROUTING_STOCK_RECORD_SALE = "routing.stock.record.sale"; } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/TbPlaceController.java b/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/TbPlaceController.java index 1b28da7c..118f6870 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/TbPlaceController.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/controller/product/TbPlaceController.java @@ -125,4 +125,49 @@ public class TbPlaceController { return ResponseEntity.ok(tbShopTableService.createOrder(createOrderDTO)); } + @AnonymousAccess + + @PostMapping("/pending") + @Log("代客下单 查询购物车") + @ApiOperation("代客下单 查询购物车 /shop/table") + public ResponseEntity pending( + @RequestBody PendingDTO pendingDTO + ) { + return ResponseEntity.ok(tbShopTableService.pending(pendingDTO)); + } + + @AnonymousAccess + + @GetMapping("/car") + @Log("代客下单 查询购物车") + @ApiOperation("代客下单 查询购物车 /shop/table") + public ResponseEntity getCar( + @RequestParam Integer shopId + ) { + return ResponseEntity.ok(tbShopTableService.getCar(shopId)); + } + + @AnonymousAccess + + @GetMapping("/payType") + @Log("代客下单 查询购物车") + @ApiOperation("代客下单 查询购物车 /shop/table") + public ResponseEntity getPayType( + @RequestParam Integer shopId + ) { + return ResponseEntity.ok(tbShopTableService.getPayType(shopId)); + } + + + @AnonymousAccess + + @PutMapping("/pay") + @Log("代客下单 查询购物车") + @ApiOperation("代客下单 查询购物车 /shop/table") + public ResponseEntity pay( + @Validated @RequestBody PayDTO payDTO + ) { + return ResponseEntity.ok(tbShopTableService.pay(payDTO)); + } + } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/dto/shoptable/CarDTO.java b/eladmin-system/src/main/java/cn/ysk/cashier/dto/shoptable/CarDTO.java new file mode 100644 index 00000000..54a8d3f1 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/dto/shoptable/CarDTO.java @@ -0,0 +1,11 @@ +package cn.ysk.cashier.dto.shoptable; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +public class CarDTO { + @NotNull + private Integer shopId; +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/dto/shoptable/CreateOrderDTO.java b/eladmin-system/src/main/java/cn/ysk/cashier/dto/shoptable/CreateOrderDTO.java index d60ed3b2..00ef438b 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/dto/shoptable/CreateOrderDTO.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/dto/shoptable/CreateOrderDTO.java @@ -13,6 +13,6 @@ public class CreateOrderDTO { @NotNull private Integer shopId; @NotEmpty - private String tableId; + private Long tableId; private String note; } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/dto/shoptable/PayDTO.java b/eladmin-system/src/main/java/cn/ysk/cashier/dto/shoptable/PayDTO.java new file mode 100644 index 00000000..06c11ba7 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/dto/shoptable/PayDTO.java @@ -0,0 +1,16 @@ +package cn.ysk.cashier.dto.shoptable; + +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@Data +public class PayDTO { + @NotNull + private Integer shopId; + @NotNull + private Integer orderId; + @NotEmpty + private String payType; +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/dto/shoptable/PendingDTO.java b/eladmin-system/src/main/java/cn/ysk/cashier/dto/shoptable/PendingDTO.java new file mode 100644 index 00000000..773e3af5 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/dto/shoptable/PendingDTO.java @@ -0,0 +1,20 @@ +package cn.ysk.cashier.dto.shoptable; + +import lombok.Data; +import org.bouncycastle.asn1.cmc.PendInfo; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@Data +public class PendingDTO { + @NotEmpty + private String masterId; + @NotNull + private Integer shopId; + @NotNull + private Long tableId; + private Integer vipUserId; + @NotNull + private Boolean isPending; +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/mapper/TbCashierCartMapper.java b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/mapper/TbCashierCartMapper.java index 82fb89d2..b0056e9f 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/mapper/TbCashierCartMapper.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/mapper/TbCashierCartMapper.java @@ -2,9 +2,20 @@ package cn.ysk.cashier.mybatis.mapper; import cn.ysk.cashier.mybatis.entity.Activate; import cn.ysk.cashier.pojo.order.TbCashierCart; +import cn.ysk.cashier.vo.CarVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; public interface TbCashierCartMapper extends BaseMapper { + @Select("select table_id tableId,user_id userId, shop_Id as shopId,master_id as masterId,uuid,\n" + + " TRIM(TRAILING ', ' FROM GROUP_CONCAT(name ORDER BY id SEPARATOR ', ')) AS productName,\n" + + " pending_at as pendingAt,\n" + + " ifnull(sum(total_amount),0) as totalAmount\n" + + " from tb_cashier_cart where table_id is not null and shop_id = #{shopId} and status = 'refund' group by shop_Id, master_id order by trade_day desc") + List selectCar(@Param("shopId") Integer shopId); } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/repository/TbShopPayTypeRepository.java b/eladmin-system/src/main/java/cn/ysk/cashier/repository/TbShopPayTypeRepository.java index 41277964..6697b2e0 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/repository/TbShopPayTypeRepository.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/repository/TbShopPayTypeRepository.java @@ -22,6 +22,8 @@ import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.util.List; + /** * @website https://eladmin.vip * @author lyf @@ -67,4 +69,7 @@ public interface TbShopPayTypeRepository extends JpaRepository findByShopId(String s); +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java index 18eab7a8..19344eab 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/shopimpl/TbShopTableServiceImpl.java @@ -18,6 +18,7 @@ package cn.ysk.cashier.service.impl.shopimpl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; import cn.ysk.cashier.config.security.security.TokenProvider; import cn.ysk.cashier.cons.RedisConstant; import cn.ysk.cashier.cons.rabbit.RabbitConstants; @@ -34,6 +35,7 @@ import cn.ysk.cashier.pojo.product.TbProductSku; import cn.ysk.cashier.pojo.shop.TbMerchantAccount; import cn.ysk.cashier.pojo.shop.TbShopInfo; import cn.ysk.cashier.pojo.shop.TbShopTable; +import cn.ysk.cashier.repository.TbShopPayTypeRepository; import cn.ysk.cashier.repository.order.TbCashierCartRepository; import cn.ysk.cashier.repository.product.TbProductRepository; import cn.ysk.cashier.repository.product.TbProductSkuRepository; @@ -41,6 +43,7 @@ import cn.ysk.cashier.repository.shop.TbShopInfoRepository; import cn.ysk.cashier.utils.*; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.dianguang.cloud.ossservice.model.DateUtils; import lombok.RequiredArgsConstructor; import cn.ysk.cashier.repository.shop.TbShopTableRepository; @@ -95,6 +98,7 @@ public class TbShopTableServiceImpl implements TbShopTableService { private final TbShopOpenIdMapper shopOpenIdMapper; private final WxAccountUtil wxAccountUtil; private final WxMsgUtils wxMsgUtils; + private final TbShopPayTypeRepository payTypeRepository; /** * 桌码前缀 @@ -290,11 +294,15 @@ public class TbShopTableServiceImpl implements TbShopTableService { throw new BadRequestException("桌码不存在,桌码" + addCartDTO.getTableId()); } - LambdaQueryWrapper query = new LambdaQueryWrapper().eq(TbCashierCart::getShopId, addCartDTO.getShopId()) + LambdaQueryWrapper query = new LambdaQueryWrapper() + .eq(TbCashierCart::getShopId, addCartDTO.getShopId()) + .eq(TbCashierCart::getSkuId, addCartDTO.getSkuId()) + .eq(TbCashierCart::getProductId, addCartDTO.getProductId()) .eq(TbCashierCart::getTableId, addCartDTO.getTableId()); if (addCartDTO.getVipUserId() != null) { query.eq(TbCashierCart::getUserId, addCartDTO.getVipUserId()); } else { + query.eq(TbCashierCart::getMasterId, addCartDTO.getMasterId()); query.isNull(TbCashierCart::getUserId); } @@ -455,138 +463,6 @@ public class TbShopTableServiceImpl implements TbShopTableService { } - @Override - public Object createOrder(CreateOrderDTO createOrderDTO) { - String day = DateUtils.getDay(); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() - .eq(TbCashierCart::getShopId, createOrderDTO.getShopId()) - .eq(TbCashierCart::getTableId, createOrderDTO.getTableId()) - .eq(TbCashierCart::getStatus, "create"); - if (createOrderDTO.getVipUserId() != null) { - queryWrapper.eq(TbCashierCart::getUserId, createOrderDTO.getVipUserId()); - }else { - queryWrapper.eq(TbCashierCart::getMasterId, createOrderDTO.getMasterId()) - .isNull(TbCashierCart::getUserId); - } - List cashierCarts = cashierCartMapper - .selectList(queryWrapper); - if (cashierCarts.isEmpty()) { - throw new BadRequestException("购物车为空,请先添加商品"); - } - - BigDecimal totalAmount = BigDecimal.ZERO; - BigDecimal packAMount = BigDecimal.ZERO; - BigDecimal feeAmount = BigDecimal.ZERO; - BigDecimal saleAmount = BigDecimal.ZERO; - List orderDetails = new ArrayList<>(); - Integer orderId = null; - for (TbCashierCart cashierCart : cashierCarts) { - totalAmount = totalAmount.add(cashierCart.getTotalAmount()); - packAMount = packAMount.add(cashierCart.getPackFee()); - feeAmount = cashierCart.getPackFee(); - TbProductSku productSku = productSkuRepository.findById(Integer.valueOf(cashierCart.getSkuId())).orElse(null); - TbOrderDetail orderDetail = new TbOrderDetail(); - - if (Objects.nonNull(productSku)) { - saleAmount = saleAmount.add(productSku.getSalePrice()); - orderDetail.setProductSkuName(productSku.getSpecSnap()); - } - - orderDetail.setCreateTime(DateUtil.date().toTimestamp()); - orderDetail.setNum(cashierCart.getNumber()); - orderDetail.setPrice(cashierCart.getSalePrice()); - orderDetail.setPriceAmount(cashierCart.getTotalAmount()); - orderDetail.setProductId(Integer.valueOf(cashierCart.getProductId())); - orderDetail.setProductSkuId(Integer.valueOf(cashierCart.getSkuId())); - orderDetail.setProductName(cashierCart.getName()); - orderDetail.setShopId(Integer.valueOf(cashierCart.getShopId())); - orderDetail.setPackAmount(cashierCart.getPackFee()); - orderDetail.setStatus("unpaid"); - orderDetail.setProductImg(cashierCart.getCoverImg()); - orderDetails.add(orderDetail); - if (cashierCart.getOrderId() != null) { - orderId = cashierCart.getOrderId(); - } - } - - TbOrderInfo orderInfo = null; - if (orderId != null) { - orderInfo = orderInfoMapper.selectById(orderId); - } - - // 修改订单信息 - if (orderInfo != null) { - // 删除历史订单 - orderDetailMapper.delete(new LambdaQueryWrapper().eq(TbOrderDetail::getOrderId, orderId)); - orderInfo.setUpdatedAt(System.currentTimeMillis()); - orderInfo.setSettlementAmount(totalAmount); - orderInfo.setAmount(totalAmount); - orderInfo.setOriginAmount(totalAmount); - orderInfo.setStatus("unpaid"); - orderInfo.setOrderAmount(totalAmount); - orderInfo.setRemark(createOrderDTO.getNote()); - orderInfo.setFreightAmount(feeAmount); - orderInfo.setProductAmount(saleAmount); - orderInfo.setTradeDay(DateUtils.getDay()); - orderInfoMapper.updateById(orderInfo); - }else { - String orderNo = generateOrderNumber(); - orderInfo = new TbOrderInfo(); - orderInfo.setOrderNo(orderNo); - orderInfo.setAmount(totalAmount); - orderInfo.setPackFee(packAMount); - orderInfo.setSettlementAmount(totalAmount); - orderInfo.setOriginAmount(totalAmount); - orderInfo.setProductAmount(saleAmount); - orderInfo.setOrderAmount(totalAmount); - orderInfo.setFreightAmount(feeAmount); - orderInfo.setTableId(createOrderDTO.getTableId()); - orderInfo.setSendType("table"); - orderInfo.setOrderType("cash"); - orderInfo.setShopId(createOrderDTO.getShopId().toString()); - orderInfo.setRefundAble(1); - orderInfo.setTradeDay(day); - orderInfo.setMasterId(createOrderDTO.getMasterId()); - orderInfo.setRemark(createOrderDTO.getNote()); - } - - // 更新取餐号 - orderInfo.setOutNumber(updateOutNumber(String.valueOf(createOrderDTO.getShopId())).toString()); - orderInfoMapper.insert(orderInfo); - - // 添加订单详细数据 - orderId = orderInfo.getId(); - for (TbOrderDetail orderDetail : orderDetails) { - orderDetail.setOrderId(orderId); - orderDetailMapper.insert(orderDetail); - } - - // 更新购物车记录的orderId - // 是否是第一次添加的商品 - boolean isFirst = true; - for (TbCashierCart cashierCart : cashierCarts) { - TbProduct product = productMapper.selectById(cashierCart.getProductId()); - TbProductSku productSku = productSkuRepository.findById(Integer.valueOf(cashierCart.getSkuId())).orElse(null); - - log.info("下单,开始校验库存预警,购物车id:{}", cashierCart.getId()); - CompletableFuture.runAsync(() -> checkWarnLineAndSendMsg(productSku, product, Integer.valueOf(cashierCart.getShopId()), cashierCart.getNumber())); - - // 已经添加的商品,修改数量 - isFirst = updateStock(cashierCart); - cashierCart.setOrderId(orderId); - cashierCart.setUpdatedAt(System.currentTimeMillis()); - cashierCartMapper.updateById(cashierCart); - } - if (isFirst) { - redisTemplate.delete("SHOP:CODE:USER:pc:" + createOrderDTO.getShopId() + ":" - + day + ":" + createOrderDTO.getTableId() + ":" + (createOrderDTO.getVipUserId() == null ? "" : createOrderDTO.getVipUserId())); - } - - // 推送耗材信息 - pushConsMsg(orderInfo, cashierCarts); - return orderInfo; - } - /** * 增加库存 @@ -754,18 +630,18 @@ public class TbShopTableServiceImpl implements TbShopTableService { String date = DateUtils.getSdfTimes(); Random random = new Random(); int randomNum = random.nextInt(900) + 100; - return "DD" + date + randomNum; + return "DDPL" + date + randomNum; } public synchronized String generateOrderCode(String day, String clientType, String shopId) { - String code = redisUtils.get("SHOP:CODE:" + clientType + ":" + shopId + ":" + day) + ""; + String code = redisTemplate.opsForValue().get("SHOP:CODE:" + clientType + ":" + shopId + ":" + day); // 使用顺序递增的计数器生成取餐码 String orderCode = ""; if (StringUtils.isEmpty(code) || "null".equals(code)) { orderCode = "1"; redisTemplate.opsForValue().set("SHOP:CODE:" + clientType + ":" + shopId + ":" + day, "1"); } else { - orderCode = String.valueOf(Integer.parseInt(code) + 1); + orderCode = String.valueOf(Integer.parseInt(code.replace("#", "")) + 1); } redisTemplate.opsForValue().set("SHOP:CODE:" + clientType + ":" + shopId + ":" + day, "#" + Integer.parseInt(code.replace("#", "")) + 2); boolean flag = Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent("SHOP:CODE:SET" + clientType + ":" + shopId + ":" + day, orderCode)); @@ -777,6 +653,7 @@ public class TbShopTableServiceImpl implements TbShopTableService { return orderCode; } + private final StringRedisTemplate redisTemplate; @Override @@ -802,4 +679,258 @@ public class TbShopTableServiceImpl implements TbShopTableService { } + @Override + public TbOrderInfo createOrder(CreateOrderDTO createOrderDTO) { + String day = DateUtils.getDay(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(TbCashierCart::getShopId, createOrderDTO.getShopId()) + .eq(TbCashierCart::getTableId, createOrderDTO.getTableId()) + .eq(TbCashierCart::getStatus, "create"); + if (createOrderDTO.getVipUserId() != null) { + queryWrapper.eq(TbCashierCart::getUserId, createOrderDTO.getVipUserId()); + }else { + queryWrapper.eq(TbCashierCart::getMasterId, createOrderDTO.getMasterId()) + .isNull(TbCashierCart::getUserId); + } + List cashierCarts = cashierCartMapper + .selectList(queryWrapper); + if (cashierCarts.isEmpty()) { + throw new BadRequestException("购物车为空,请先添加商品"); + } + + BigDecimal totalAmount = BigDecimal.ZERO; + BigDecimal packAMount = BigDecimal.ZERO; + BigDecimal feeAmount = BigDecimal.ZERO; + BigDecimal saleAmount = BigDecimal.ZERO; + List orderDetails = new ArrayList<>(); + Integer orderId = null; + for (TbCashierCart cashierCart : cashierCarts) { + totalAmount = totalAmount.add(cashierCart.getTotalAmount()); + packAMount = packAMount.add(cashierCart.getPackFee()); + feeAmount = cashierCart.getPackFee(); + TbProductSku productSku = productSkuRepository.findById(Integer.valueOf(cashierCart.getSkuId())).orElse(null); + TbOrderDetail orderDetail = new TbOrderDetail(); + + if (Objects.nonNull(productSku)) { + saleAmount = saleAmount.add(productSku.getSalePrice()); + orderDetail.setProductSkuName(productSku.getSpecSnap()); + } + + orderDetail.setCreateTime(DateUtil.date().toTimestamp()); + orderDetail.setNum(cashierCart.getNumber()); + orderDetail.setPrice(cashierCart.getSalePrice()); + orderDetail.setPriceAmount(cashierCart.getTotalAmount()); + orderDetail.setProductId(Integer.valueOf(cashierCart.getProductId())); + orderDetail.setProductSkuId(Integer.valueOf(cashierCart.getSkuId())); + orderDetail.setProductName(cashierCart.getName()); + orderDetail.setShopId(Integer.valueOf(cashierCart.getShopId())); + orderDetail.setPackAmount(cashierCart.getPackFee()); + orderDetail.setStatus("unpaid"); + orderDetail.setProductImg(cashierCart.getCoverImg()); + orderDetails.add(orderDetail); + if (cashierCart.getOrderId() != null) { + orderId = cashierCart.getOrderId(); + } + } + + TbOrderInfo orderInfo = null; + if (orderId != null) { + orderInfo = orderInfoMapper.selectById(orderId); + } + + // 修改订单信息 + if (orderInfo != null) { + // 删除历史订单 + // 更新取餐号 + orderInfo.setOutNumber(updateOutNumber(String.valueOf(createOrderDTO.getShopId())).toString()); + orderDetailMapper.delete(new LambdaQueryWrapper().eq(TbOrderDetail::getOrderId, orderId)); + orderInfo.setUpdatedAt(System.currentTimeMillis()); + orderInfo.setSettlementAmount(totalAmount); + orderInfo.setAmount(totalAmount); + orderInfo.setOriginAmount(totalAmount); + orderInfo.setStatus("unpaid"); + orderInfo.setOrderAmount(totalAmount); + orderInfo.setRemark(createOrderDTO.getNote()); + orderInfo.setFreightAmount(feeAmount); + orderInfo.setProductAmount(saleAmount); + orderInfo.setTradeDay(DateUtils.getDay()); + orderInfoMapper.updateById(orderInfo); + + }else { + String orderNo = generateOrderNumber(); + orderInfo = new TbOrderInfo(); + orderInfo.setOrderNo(orderNo); + orderInfo.setAmount(totalAmount); + orderInfo.setPackFee(packAMount); + orderInfo.setSettlementAmount(totalAmount); + orderInfo.setOriginAmount(totalAmount); + orderInfo.setProductAmount(saleAmount); + orderInfo.setOrderAmount(totalAmount); + orderInfo.setFreightAmount(feeAmount); + orderInfo.setTableId(String.valueOf(createOrderDTO.getTableId())); + orderInfo.setSendType("table"); + orderInfo.setOrderType("cash"); + orderInfo.setShopId(createOrderDTO.getShopId().toString()); + orderInfo.setRefundAble(1); + orderInfo.setTradeDay(day); + orderInfo.setMasterId(createOrderDTO.getMasterId()); + orderInfo.setRemark(createOrderDTO.getNote()); + orderInfoMapper.insert(orderInfo); + } + + + + // 添加订单详细数据 + orderId = orderInfo.getId(); + for (TbOrderDetail orderDetail : orderDetails) { + orderDetail.setOrderId(orderId); + orderDetailMapper.insert(orderDetail); + } + + // 更新购物车记录的orderId + // 是否是第一次添加的商品 + boolean isFirst = true; + for (TbCashierCart cashierCart : cashierCarts) { + TbProduct product = productMapper.selectById(cashierCart.getProductId()); + TbProductSku productSku = productSkuRepository.findById(Integer.valueOf(cashierCart.getSkuId())).orElse(null); + + log.info("下单,开始校验库存预警,购物车id:{}", cashierCart.getId()); + CompletableFuture.runAsync(() -> checkWarnLineAndSendMsg(productSku, product, Integer.valueOf(cashierCart.getShopId()), cashierCart.getNumber())); + + // 已经添加的商品,修改数量 + isFirst = updateStock(cashierCart); + cashierCart.setOrderId(orderId); + cashierCart.setUpdatedAt(System.currentTimeMillis()); + cashierCartMapper.updateById(cashierCart); + } + if (isFirst) { + redisTemplate.delete("SHOP:CODE:USER:pc:" + createOrderDTO.getShopId() + ":" + + day + ":" + createOrderDTO.getTableId() + ":" + (createOrderDTO.getVipUserId() == null ? "" : createOrderDTO.getVipUserId())); + } + + // 推送耗材信息 + pushConsMsg(orderInfo, cashierCarts); + return orderInfo; + } + + + + + @Override + public Object pending(PendingDTO pendingDTO) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(TbCashierCart::getShopId, pendingDTO.getShopId()) + .eq(TbCashierCart::getTableId, pendingDTO.getTableId()) + .eq(TbCashierCart::getStatus, "create"); + if (pendingDTO.getVipUserId() != null) { + queryWrapper.eq(TbCashierCart::getUserId, pendingDTO.getVipUserId()); + }else { + queryWrapper.eq(TbCashierCart::getMasterId, pendingDTO.getMasterId()) + .isNull(TbCashierCart::getUserId); + } + List cashierCarts = cashierCartMapper + .selectList(queryWrapper); + + Integer orderId = null; + for (TbCashierCart item : cashierCarts) { + if (item.getOrderId() == null) { + orderId = null; + break; + } + + orderId = item.getOrderId(); + } + + if (orderId == null) { + CreateOrderDTO createOrderDTO = new CreateOrderDTO(); + createOrderDTO.setTableId(pendingDTO.getTableId()); + createOrderDTO.setShopId(pendingDTO.getShopId()); + createOrderDTO.setMasterId(pendingDTO.getMasterId()); + createOrderDTO.setVipUserId(pendingDTO.getVipUserId()); + orderId = createOrder(createOrderDTO).getId(); + + } + + + TbOrderDetail orderDetail = new TbOrderDetail(); + orderDetail.setStatus(pendingDTO.getIsPending() ? "pending" : "cancelled"); + orderDetailMapper.update(orderDetail, new LambdaUpdateWrapper() + .eq(TbOrderDetail::getShopId, pendingDTO.getIsPending()) + .eq(TbOrderDetail::getOrderId, orderId)); + + TbOrderInfo orderInfo = new TbOrderInfo(); + orderInfo.setId(orderId); + orderInfo.setStatus(pendingDTO.getIsPending() ? "pending" : "cancelled"); + orderInfoMapper.updateById(orderInfo); + + TbCashierCart cashierCart = new TbCashierCart(); + cashierCart.setStatus(pendingDTO.getIsPending() ? "refund" : "create"); + cashierCartMapper.update(cashierCart, new LambdaUpdateWrapper() + .eq(TbCashierCart::getOrderId, orderId)); + return orderInfo; + } + + @Override + public Object getCar(Integer shopId) { + return cashierCartMapper.selectCar(shopId); + } + + @Override + public Object getPayType(Integer shopId) { + return payTypeRepository.findByShopId(String.valueOf(shopId)); + } + + @Override + public Object pay(PayDTO payDTO) { + TbOrderInfo orderInfo = orderInfoMapper.selectOne(new LambdaUpdateWrapper() + .eq(TbOrderInfo::getId, payDTO.getOrderId()) + .eq(TbOrderInfo::getShopId, payDTO.getShopId())); + + if (orderInfo == null) { + throw new BadRequestException("订单信息不存在"); + } + + if (!"unpaid".equals(orderInfo.getStatus())) { + return new BadRequestException("此订单不处于未支付状态"); + } + +// int count = shopInfoRepository.countSelectByShopIdAndPayType(orderInfo.getShopId(), "cash"); +// if (count < 1) { +// return Result.fail(CodeEnum.PAYTYPENOEXIST); +// } + + orderInfo.setPayAmount(orderInfo.getOrderAmount()); + orderInfo.setPayType("cash"); + orderInfo.setStatus("closed"); + orderInfo.setPayOrderNo("cash".concat(SnowFlakeUtil.generateOrderNo())); + orderInfoMapper.updateById(orderInfo); + + //更新购物车状态 + TbCashierCart cashierCart = new TbCashierCart(); + cashierCart.setStatus("final"); + int cartCount = cashierCartMapper.update(cashierCart, new LambdaUpdateWrapper() + .eq(TbCashierCart::getOrderId, payDTO.getOrderId())); + + TbOrderDetail orderDetail = new TbOrderDetail(); + orderDetail.setStatus("closed"); + orderDetailMapper.update(orderDetail, new LambdaUpdateWrapper() + .eq(TbOrderDetail::getOrderId, payDTO.getOrderId())); + + log.info("更新购物车:{}", cartCount); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "create"); + jsonObject.put("orderId", payDTO.getOrderId()); + rabbitTemplate.convertAndSend(RabbitConstants.CART_ORDER_COLLECT_PUT, RabbitConstants.CART_ORDER_COLLECT_ROUTINGKEY_PUT, jsonObject.toJSONString(), new CorrelationData(UUID.randomUUID().toString())); + + // 打印消息 + rabbitTemplate.convertAndSend(RabbitConstants.PRINT_MECHINE_COLLECT_PUT, RabbitConstants.PRINT_MECHINE_COLLECT_ROUTINGKEY_PUT, payDTO.getOrderId().toString(), new CorrelationData(UUID.randomUUID().toString())); + + // 发送库存记录mq消息 + JSONObject mqData = new JSONObject(); + mqData.put("orderId", payDTO.getOrderId()); + mqData.put("type", "pc"); + rabbitTemplate.convertAndSend(RabbitConstants.EXCHANGE_STOCK_RECORD, RabbitConstants.ROUTING_STOCK_RECORD_SALE, mqData.toJSONString(), new CorrelationData(UUID.randomUUID().toString())); + return null; + } } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/shop/TbShopTableService.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/shop/TbShopTableService.java index 25d2179b..00e4c62c 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/shop/TbShopTableService.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/shop/TbShopTableService.java @@ -111,4 +111,12 @@ public interface TbShopTableService { Object createOrder(CreateOrderDTO createOrderDTO); Object getMasterId(Integer shopId, Long tableId, Integer vipUserId); + + Object pending(PendingDTO pendingDTO); + + Object getCar(Integer shopId); + + Object getPayType(Integer shopId); + + Object pay(PayDTO payDTO); } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/utils/SnowFlakeUtil.java b/eladmin-system/src/main/java/cn/ysk/cashier/utils/SnowFlakeUtil.java new file mode 100644 index 00000000..402e31e6 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/utils/SnowFlakeUtil.java @@ -0,0 +1,48 @@ +package cn.ysk.cashier.utils; + +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.util.IdUtil; +import lombok.extern.slf4j.Slf4j; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Random; + +/** + * @author Exrickx + */ +@Slf4j +public class SnowFlakeUtil { + + /** + * 派号器workid:0~31 + * 机房datacenterid:0~31 + */ + private static Snowflake snowflake = IdUtil.createSnowflake(1, 1); + + public static Long nextId() { + return snowflake.nextId(); + } + + + + + + public static String generateOrderNo(){ + String dateFormat="yyyyMMddHHmmssSSS"; + SimpleDateFormat sm=new SimpleDateFormat(dateFormat); + + String currentDate=sm.format(new Date()); + + Random rm=new Random(); + int suffix=rm.nextInt(9999999); + + return currentDate.concat(String.format("%07d",suffix)); + } + + public static void main(String[] args){ + for(int i=0;i<10;i++){ + System.out.println(SnowFlakeUtil.generateOrderNo()); + } + } +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/vo/CarVO.java b/eladmin-system/src/main/java/cn/ysk/cashier/vo/CarVO.java new file mode 100644 index 00000000..58b29e9f --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/vo/CarVO.java @@ -0,0 +1,17 @@ +package cn.ysk.cashier.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class CarVO { + private String masterId; + private String productName; + private String uuid; + private Integer shopId; + private String tableId; + private Integer userId; + private Long pendingAt; + private BigDecimal totalAmount; +} From b8a60a15490d379cdb99d42e00c494ad1c0995c7 Mon Sep 17 00:00:00 2001 From: SongZhang <2064194730@qq.com> Date: Fri, 16 Aug 2024 13:38:52 +0800 Subject: [PATCH 2/4] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E8=AE=B0=E5=BD=95mq=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/ysk/cashier/config/RabbitConfig.java | 2 + .../cashier/dto/rabbit/StockRecordMsg.java | 12 +++ .../cn/ysk/cashier/rabbit/StockListener.java | 26 ++++- .../service/TbProductStockOperateService.java | 5 +- .../TbProductStockDetailServiceImpl.java | 2 + .../TbProductStockOperateServiceImpl.java | 95 +++++++++++++++++++ .../product/TbProductStockDetailService.java | 2 + 7 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 eladmin-system/src/main/java/cn/ysk/cashier/dto/rabbit/StockRecordMsg.java diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/config/RabbitConfig.java b/eladmin-system/src/main/java/cn/ysk/cashier/config/RabbitConfig.java index 1bfae312..8771c6b5 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/config/RabbitConfig.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/config/RabbitConfig.java @@ -13,6 +13,8 @@ public class RabbitConfig { public static final String EXCHANGE_STOCK_RECORD = "exchange.stock.record"; public static final String ROUTING_STOCK_RECORD_SALE = "routing.stock.record.sale"; + public static final String QUEUE_STOCK_RECORD = "queue.stock.record"; + @Bean Queue stockRecordSaleQueue() { return new Queue(QUEUE_STOCK_RECORD_SALE); diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/dto/rabbit/StockRecordMsg.java b/eladmin-system/src/main/java/cn/ysk/cashier/dto/rabbit/StockRecordMsg.java new file mode 100644 index 00000000..b9eba98c --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/dto/rabbit/StockRecordMsg.java @@ -0,0 +1,12 @@ +package cn.ysk.cashier.dto.rabbit; + +import lombok.Data; + +@Data +public class StockRecordMsg { + private Integer shopId; + private Integer skuId; + private Integer productId; + private String type; + private Integer currentNumber; +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/rabbit/StockListener.java b/eladmin-system/src/main/java/cn/ysk/cashier/rabbit/StockListener.java index 9fc4ada5..1a6949dc 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/rabbit/StockListener.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/rabbit/StockListener.java @@ -1,7 +1,10 @@ package cn.ysk.cashier.rabbit; +import cn.hutool.core.util.StrUtil; import cn.ysk.cashier.config.RabbitConfig; +import cn.ysk.cashier.dto.rabbit.StockRecordMsg; import cn.ysk.cashier.pojo.product.TbProductStockDetail; +import cn.ysk.cashier.service.TbProductStockOperateService; import cn.ysk.cashier.service.product.TbProductStockDetailService; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; @@ -15,8 +18,11 @@ public class StockListener { private final TbProductStockDetailService productStockDetailService; - public StockListener(TbProductStockDetailService productStockDetailService) { + private final TbProductStockOperateService productStockOperateService; + + public StockListener(TbProductStockDetailService productStockDetailService, TbProductStockOperateService productStockOperateService) { this.productStockDetailService = productStockDetailService; + this.productStockOperateService = productStockOperateService; } @RabbitListener(queues = RabbitConfig.QUEUE_STOCK_RECORD_SALE) @@ -33,4 +39,22 @@ public class StockListener { log.error("执行保存库存mq失败", e); } } + +// @RabbitListener(queues = RabbitConfig.QUEUE_STOCK_RECORD_SALE) + public void recordStockHandler(String message) { + log.info("接收到下单保存库存信息mq消息,消息内容: {}", message); + + if (StrUtil.isBlank(message)) { + log.warn("错误消息体"); + return; + } + + StockRecordMsg stockRecordMsg = JSONObject.parseObject(message, StockRecordMsg.class); + + try { + productStockOperateService.addStockRecord(stockRecordMsg); + }catch (Exception e) { + log.error("执行保存库存mq失败", e); + } + } } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/TbProductStockOperateService.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/TbProductStockOperateService.java index 27db0611..d8ab34f0 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/TbProductStockOperateService.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/TbProductStockOperateService.java @@ -1,5 +1,6 @@ package cn.ysk.cashier.service; +import cn.ysk.cashier.dto.rabbit.StockRecordMsg; import cn.ysk.cashier.pojo.product.TbProductStockOperate; import cn.ysk.cashier.vo.ProductStockOperateVO; import cn.ysk.cashier.dto.product.OutAndOnDto; @@ -74,4 +75,6 @@ public interface TbProductStockOperateService { * @throws IOException / */ void download(List all, HttpServletResponse response) throws IOException; -} \ No newline at end of file + + void addStockRecord(StockRecordMsg stockRecordMsg); +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockDetailServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockDetailServiceImpl.java index 9bd4e11d..3c7ac737 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockDetailServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockDetailServiceImpl.java @@ -17,6 +17,7 @@ package cn.ysk.cashier.service.impl.productimpl; import cn.hutool.core.util.StrUtil; import cn.ysk.cashier.dto.product.StockCountDTO; +import cn.ysk.cashier.dto.rabbit.StockRecordMsg; import cn.ysk.cashier.pojo.order.TbOrderInfo; import cn.ysk.cashier.pojo.product.TbProductStockDetail; import cn.ysk.cashier.repository.order.StockCountRepository; @@ -205,4 +206,5 @@ public class TbProductStockDetailServiceImpl implements TbProductStockDetailServ }); } + } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockOperateServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockOperateServiceImpl.java index 096ffb01..14dd5af2 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockOperateServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockOperateServiceImpl.java @@ -1,9 +1,15 @@ package cn.ysk.cashier.service.impl.productimpl; +import cn.ysk.cashier.dto.rabbit.StockRecordMsg; +import cn.ysk.cashier.mybatis.mapper.TbProducSkutMapper; +import cn.ysk.cashier.mybatis.mapper.TbProductMapper; import cn.ysk.cashier.pojo.product.TbProduct; import cn.ysk.cashier.pojo.shop.TbShopPurveyor; +import cn.ysk.cashier.pojo.shop.TbShopUnit; import cn.ysk.cashier.repository.product.TbProductRepository; +import cn.ysk.cashier.repository.product.TbProductStockDetailRepository; import cn.ysk.cashier.repository.shop.TbShopPurveyorRepository; +import cn.ysk.cashier.repository.shop.TbShopUnitRepository; import cn.ysk.cashier.utils.*; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; @@ -23,12 +29,14 @@ import cn.ysk.cashier.repository.shop.TbShopInfoRepository; import cn.ysk.cashier.pojo.shop.TbShopPurveyorTransact; import cn.ysk.cashier.repository.shop.TbShopPurveyorTransactRepository; import com.alipay.api.domain.Product; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import lombok.RequiredArgsConstructor; import cn.ysk.cashier.repository.product.TbProductStockOperateRepository; import cn.ysk.cashier.service.TbProductStockOperateService; import cn.ysk.cashier.dto.product.TbProductStockOperateDto; import cn.ysk.cashier.dto.product.TbProductStockOperateQueryCriteria; import cn.ysk.cashier.mapper.product.TbProductStockOperateMapper; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; @@ -53,6 +61,7 @@ import javax.servlet.http.HttpServletResponse; **/ @Service @RequiredArgsConstructor +@Slf4j public class TbProductStockOperateServiceImpl implements TbProductStockOperateService { private final TbProductStockOperateRepository tbProductStockOperateRepository; @@ -429,4 +438,90 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe } FileUtil.downloadExcel(list, response); } + + + private final TbProductMapper productMapper; + private final TbProducSkutMapper producSkutMapper; + private final TbShopUnitRepository shopUnitRepository; + private final TbProductStockOperateRepository productStockOperateRepository; + private final TbProductStockDetailRepository productStockDetailRepository; + @Override + public void addStockRecord(StockRecordMsg stockRecordMsg) { + TbShopInfo byId = shopInfoRepository.findById(stockRecordMsg.getShopId()).orElseGet(TbShopInfo::new); + if (byId.getId() == null) { + throw new BadRequestException("商户号有误"); + } + + TbProduct product = productMapper.selectOne(new LambdaUpdateWrapper() + .eq(TbProduct::getShopId, stockRecordMsg.getShopId()) + .eq(TbProduct::getId, stockRecordMsg.getProductId()) + .eq(TbProduct::getIsDel, 0)); + + TbProductSku productSku = producSkutMapper.selectOne(new LambdaUpdateWrapper() + .eq(TbProductSku::getShopId, stockRecordMsg.getShopId()) + .eq(TbProductSku::getId, stockRecordMsg.getSkuId()) + .eq(TbProductSku::getIsDel, 0)); + if (product == null || productSku == null) { + log.info("商品或sku不存在"); + throw new BadRequestException("商品或sku不存在"); + } + + double difference = product.getIsDistribute().equals(1) ? stockRecordMsg.getCurrentNumber() - product.getStockNumber() + : stockRecordMsg.getCurrentNumber() - productSku.getStockNumber(); + + TbShopUnit tbShopUnit = shopUnitRepository.findById(product.getUnitId()).orElse(null); + + //增加操作日志 + long times = Instant.now().toEpochMilli(); + HashMap snapItem = new HashMap<>(); + snapItem.put("stockNumber", product.getIsDistribute().equals(1) ? product.getStockNumber() : productSku.getStockNumber()); + snapItem.put("number", product.getIsDistribute().equals(1) ? stockRecordMsg.getCurrentNumber() - product.getStockNumber() + : stockRecordMsg.getCurrentNumber() - productSku.getStockNumber()); + snapItem.put("coverImg", product.getCoverImg()); + snapItem.put("productId", product.getId()); + snapItem.put("name", product.getName()); + snapItem.put("unitName", tbShopUnit == null ? "" : tbShopUnit.getName()); + + ArrayList> stockSnap = new ArrayList<>(); + stockSnap.add(snapItem); + + TbProductStockOperate stockOperate = new TbProductStockOperate(); + stockOperate.setShopId(String.valueOf(stockRecordMsg.getShopId())); + stockOperate.setStockSnap(JSONObject.toJSONString(stockSnap)); + stockOperate.setType(stockRecordMsg.getType()); + + Map operatorSnapMap = new HashMap<>(); + operatorSnapMap.put("name", byId.getShopName()); + operatorSnapMap.put("account", byId.getAccount()); + + stockOperate.setOperatorSnap(JSON.toJSONString(operatorSnapMap)); + stockOperate.setStockTime(times); + stockOperate.setCreatedAt(times); + stockOperate.setUpdatedAt(times); + stockOperate.setStatus("normal"); + productStockOperateRepository.save(stockOperate); + + + TbProductStockDetail productStockDetail = new TbProductStockDetail(); + productStockDetail.setCreatedAt(times); + productStockDetail.setUpdatedAt(times); + productStockDetail.setIsStock(1); + productStockDetail.setProductId(String.valueOf(product.getId())); + productStockDetail.setProductName(product.getName()); + productStockDetail.setUnitName(tbShopUnit == null ? null : tbShopUnit.getName()); + productStockDetail.setShopId(String.valueOf(stockRecordMsg.getShopId())); + productStockDetail.setSkuId(String.valueOf(stockRecordMsg.getSkuId())); + productStockDetail.setSubType(product.getIsDistribute().equals(1) ? stockRecordMsg.getCurrentNumber() - product.getStockNumber() > 0 ? 1 : -1 + : stockRecordMsg.getCurrentNumber() - productSku.getStockNumber() > 0 ? 1 : -1); + productStockDetail.setType(stockRecordMsg.getType()); + productStockDetail.setSpecSnap(productSku.getSpecSnap()); + productStockDetail.setStockNumber(difference); + productStockDetail.setCostAmount(productSku.getSalePrice().multiply(BigDecimal.valueOf(Math.abs(difference)))); + productStockDetail.setLeftNumber(product.getIsDistribute().equals(1) ? product.getStockNumber() : productSku.getStockNumber().intValue()); + productStockDetail.setRecordId(stockOperate.getId().toString()); + productStockDetail.setStockSnap(JSONObject.toJSONString(snapItem)); + productStockDetail.setSourcePath("NORMAL"); + productStockDetailRepository.save(productStockDetail); + + } } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/product/TbProductStockDetailService.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/product/TbProductStockDetailService.java index 5764d35e..7df93d24 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/product/TbProductStockDetailService.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/product/TbProductStockDetailService.java @@ -15,6 +15,7 @@ */ package cn.ysk.cashier.service.product; +import cn.ysk.cashier.dto.rabbit.StockRecordMsg; import cn.ysk.cashier.pojo.product.TbProductStockDetail; import cn.ysk.cashier.dto.product.TbProductStockDetailDto; import cn.ysk.cashier.dto.product.TbProductStockDetailQueryCriteria; @@ -88,4 +89,5 @@ public interface TbProductStockDetailService { void download(List all, HttpServletResponse response) throws IOException; void addSaleRecord(Integer orderId); + } From 7c122565fc1569edd0294a83ab075bcef736d0d2 Mon Sep 17 00:00:00 2001 From: SongZhang <2064194730@qq.com> Date: Thu, 1 Aug 2024 14:22:33 +0800 Subject: [PATCH 3/4] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E8=AE=B0=E5=BD=95mq=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/ysk/cashier/config/RabbitConfig.java | 12 ++++++++++++ .../cashier/dto/rabbit/StockRecordMsg.java | 3 ++- .../cn/ysk/cashier/rabbit/StockListener.java | 5 +---- .../TbProductStockOperateServiceImpl.java | 19 ++++++++----------- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/config/RabbitConfig.java b/eladmin-system/src/main/java/cn/ysk/cashier/config/RabbitConfig.java index 8771c6b5..fc2a7807 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/config/RabbitConfig.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/config/RabbitConfig.java @@ -14,6 +14,8 @@ public class RabbitConfig { public static final String ROUTING_STOCK_RECORD_SALE = "routing.stock.record.sale"; public static final String QUEUE_STOCK_RECORD = "queue.stock.record"; + public static final String ROUTING_STOCK_RECORD= "routing.stock.record"; + @Bean Queue stockRecordSaleQueue() { @@ -29,4 +31,14 @@ public class RabbitConfig { Binding binding(Queue stockRecordSaleQueue, DirectExchange stockRecordExchange) { return BindingBuilder.bind(stockRecordSaleQueue).to(stockRecordExchange).with(ROUTING_STOCK_RECORD_SALE); } + + @Bean + Queue stockRecordSaleQueue2() { + return new Queue(QUEUE_STOCK_RECORD); + } + + @Bean + Binding binding2(Queue stockRecordSaleQueue2, DirectExchange stockRecordExchange) { + return BindingBuilder.bind(stockRecordSaleQueue2).to(stockRecordExchange).with(ROUTING_STOCK_RECORD); + } } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/dto/rabbit/StockRecordMsg.java b/eladmin-system/src/main/java/cn/ysk/cashier/dto/rabbit/StockRecordMsg.java index b9eba98c..9b9ebd27 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/dto/rabbit/StockRecordMsg.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/dto/rabbit/StockRecordMsg.java @@ -8,5 +8,6 @@ public class StockRecordMsg { private Integer skuId; private Integer productId; private String type; - private Integer currentNumber; + private Integer subType; + private Integer number; } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/rabbit/StockListener.java b/eladmin-system/src/main/java/cn/ysk/cashier/rabbit/StockListener.java index 1a6949dc..3c65230c 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/rabbit/StockListener.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/rabbit/StockListener.java @@ -40,17 +40,14 @@ public class StockListener { } } -// @RabbitListener(queues = RabbitConfig.QUEUE_STOCK_RECORD_SALE) + @RabbitListener(queues = RabbitConfig.QUEUE_STOCK_RECORD) public void recordStockHandler(String message) { log.info("接收到下单保存库存信息mq消息,消息内容: {}", message); - if (StrUtil.isBlank(message)) { log.warn("错误消息体"); return; } - StockRecordMsg stockRecordMsg = JSONObject.parseObject(message, StockRecordMsg.class); - try { productStockOperateService.addStockRecord(stockRecordMsg); }catch (Exception e) { diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockOperateServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockOperateServiceImpl.java index 14dd5af2..e6226420 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockOperateServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/TbProductStockOperateServiceImpl.java @@ -466,17 +466,14 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe throw new BadRequestException("商品或sku不存在"); } - double difference = product.getIsDistribute().equals(1) ? stockRecordMsg.getCurrentNumber() - product.getStockNumber() - : stockRecordMsg.getCurrentNumber() - productSku.getStockNumber(); - TbShopUnit tbShopUnit = shopUnitRepository.findById(product.getUnitId()).orElse(null); //增加操作日志 long times = Instant.now().toEpochMilli(); HashMap snapItem = new HashMap<>(); - snapItem.put("stockNumber", product.getIsDistribute().equals(1) ? product.getStockNumber() : productSku.getStockNumber()); - snapItem.put("number", product.getIsDistribute().equals(1) ? stockRecordMsg.getCurrentNumber() - product.getStockNumber() - : stockRecordMsg.getCurrentNumber() - productSku.getStockNumber()); + snapItem.put("stockNumber", product.getIsDistribute().equals(1) ? product.getStockNumber() - stockRecordMsg.getNumber() : + productSku.getStockNumber() - stockRecordMsg.getNumber()); + snapItem.put("number", stockRecordMsg.getSubType() == -1 ? -stockRecordMsg.getNumber() : stockRecordMsg.getNumber()); snapItem.put("coverImg", product.getCoverImg()); snapItem.put("productId", product.getId()); snapItem.put("name", product.getName()); @@ -511,13 +508,13 @@ public class TbProductStockOperateServiceImpl implements TbProductStockOperateSe productStockDetail.setUnitName(tbShopUnit == null ? null : tbShopUnit.getName()); productStockDetail.setShopId(String.valueOf(stockRecordMsg.getShopId())); productStockDetail.setSkuId(String.valueOf(stockRecordMsg.getSkuId())); - productStockDetail.setSubType(product.getIsDistribute().equals(1) ? stockRecordMsg.getCurrentNumber() - product.getStockNumber() > 0 ? 1 : -1 - : stockRecordMsg.getCurrentNumber() - productSku.getStockNumber() > 0 ? 1 : -1); + productStockDetail.setSubType(stockRecordMsg.getSubType()); productStockDetail.setType(stockRecordMsg.getType()); productStockDetail.setSpecSnap(productSku.getSpecSnap()); - productStockDetail.setStockNumber(difference); - productStockDetail.setCostAmount(productSku.getSalePrice().multiply(BigDecimal.valueOf(Math.abs(difference)))); - productStockDetail.setLeftNumber(product.getIsDistribute().equals(1) ? product.getStockNumber() : productSku.getStockNumber().intValue()); + productStockDetail.setStockNumber(Double.valueOf(stockRecordMsg.getNumber())); + productStockDetail.setCostAmount(productSku.getSalePrice().multiply(BigDecimal.valueOf(Math.abs(stockRecordMsg.getNumber())))); + productStockDetail.setLeftNumber(product.getIsDistribute().equals(1) ? product.getStockNumber() - stockRecordMsg.getNumber() + : productSku.getStockNumber().intValue() - stockRecordMsg.getNumber()); productStockDetail.setRecordId(stockOperate.getId().toString()); productStockDetail.setStockSnap(JSONObject.toJSONString(snapItem)); productStockDetail.setSourcePath("NORMAL"); From adee84544dc99c86f7614712485d2e17db9ca65c Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Fri, 16 Aug 2024 14:52:49 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=8A=A5=E8=A1=A8-?= =?UTF-8?q?=E9=94=80=E9=87=8F-=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/shop/SummaryByDayController.java | 6 ++---- .../cn/ysk/cashier/mybatis/entity/Activate.java | 2 ++ .../cn/ysk/cashier/service/SummaryService.java | 2 +- .../cashier/service/impl/SummaryServiceImpl.java | 15 ++++++++------- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/SummaryByDayController.java b/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/SummaryByDayController.java index 7f0812c3..f00b3ea6 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/SummaryByDayController.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/SummaryByDayController.java @@ -42,10 +42,8 @@ public class SummaryByDayController { } @GetMapping(value = "count") - public List summaryCount(ShopSummaryDto summaryDto, - @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime, - @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime) { - return summaryService.summaryCount(summaryDto, startTime, endTime); + public List summaryCount(ShopSummaryDto summaryDto) { + return summaryService.summaryCount(summaryDto); } } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/entity/Activate.java b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/entity/Activate.java index f6714217..47efc722 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/entity/Activate.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/entity/Activate.java @@ -23,4 +23,6 @@ public class Activate extends Model { private String handselType; private String isDel; private String isUser; + + } diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/SummaryService.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/SummaryService.java index f1e751a3..9c0cd5f1 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/SummaryService.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/SummaryService.java @@ -37,7 +37,7 @@ public interface SummaryService { */ void download(ShopSummaryDto summaryDto, HttpServletResponse response) throws IOException; - List summaryCount(ShopSummaryDto summaryDto, Date startTime, Date endTime); + List summaryCount(ShopSummaryDto summaryDto); List selectSummaryTable(Integer shopId, Date startTime, Date endTime); diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/SummaryServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/SummaryServiceImpl.java index 3540f315..7e0dbaf7 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/SummaryServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/SummaryServiceImpl.java @@ -15,6 +15,7 @@ import cn.ysk.cashier.service.SummaryService; import cn.ysk.cashier.utils.DateUtil; import cn.ysk.cashier.utils.FileUtil; import cn.ysk.cashier.vo.*; +import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -450,16 +451,16 @@ public class SummaryServiceImpl implements SummaryService { } @Override - public List summaryCount(ShopSummaryDto summaryDto, Date startTime, Date endTime) { + public List summaryCount(ShopSummaryDto summaryDto) { List list = new ArrayList<>(); Long start = 1704038400000L; Long end = Instant.now().toEpochMilli(); - if (startTime != null || endTime != null) { - start = startTime.getTime(); - end = endTime.getTime(); + if (summaryDto.getStartTime() != null || summaryDto.getEndTime() != null) { + start = summaryDto.getStartTime().getTime(); + end = summaryDto.getEndTime().getTime(); } else { - startTime = DateUtil.toDate(DateUtil.fromTimeStamp(1704038400L)); - endTime = new Date(); + summaryDto.setStartTime(DateUtil.toDate(DateUtil.fromTimeStamp(1704038400L))); + summaryDto.setEndTime(new Date()); } if (summaryDto.getType() != null && summaryDto.getType() == 1) { TbOrderPayCountVo payCount = tbOrderInfoRepository.queryOrderPayCount(summaryDto.getShopId(), start, end); @@ -474,7 +475,7 @@ public class SummaryServiceImpl implements SummaryService { refCount.setIcon("el-icon-money"); list.add(refCount); - TbOrderSalesCountByDayVo numCount = detailRepository.queryTbOrderSalesCount(Integer.valueOf(summaryDto.getShopId()), startTime, endTime); + TbOrderSalesCountByDayVo numCount = detailRepository.queryTbOrderSalesCount(Integer.valueOf(summaryDto.getShopId()), summaryDto.getStartTime(), summaryDto.getEndTime()); TbOrderPayCountVo salesNum =new TbOrderPayCountVo("el-icon-goods","销售量","0",numCount.getSalesNum()-numCount.getRefNum()); TbOrderPayCountVo refNum =new TbOrderPayCountVo("el-icon-goods","退单量","0",numCount.getRefNum()); list.add(salesNum);