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] =?UTF-8?q?1.=E4=BB=A3=E5=AE=A2=E4=B8=8B=E5=8D=95=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E4=BB=98=EF=BC=8C=E6=8C=82=E8=B5=B7=EF=BC=8C=E4=B8=8B?= =?UTF-8?q?=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; +}