1.代客下单,支付,挂起,下单接口开发

This commit is contained in:
2024-08-16 11:12:25 +08:00
parent 62ca02cdc4
commit d32f9705a0
12 changed files with 462 additions and 138 deletions

View File

@@ -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<TbCashierCart> query = new LambdaQueryWrapper<TbCashierCart>().eq(TbCashierCart::getShopId, addCartDTO.getShopId())
LambdaQueryWrapper<TbCashierCart> query = new LambdaQueryWrapper<TbCashierCart>()
.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<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
.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<TbCashierCart> 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<TbOrderDetail> 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<TbOrderDetail>().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<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
.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<TbCashierCart> 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<TbOrderDetail> 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<TbOrderDetail>().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<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
.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<TbCashierCart> 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<TbOrderDetail>()
.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<TbCashierCart>()
.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<TbOrderInfo>()
.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<TbCashierCart>()
.eq(TbCashierCart::getOrderId, payDTO.getOrderId()));
TbOrderDetail orderDetail = new TbOrderDetail();
orderDetail.setStatus("closed");
orderDetailMapper.update(orderDetail, new LambdaUpdateWrapper<TbOrderDetail>()
.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;
}
}

View File

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