1.代客下单 退单接口 选择台桌 选择人数

This commit is contained in:
SongZhang 2024-09-11 11:17:39 +08:00
parent 6096f91b6c
commit 10290bd37b
14 changed files with 397 additions and 151 deletions

View File

@ -19,4 +19,9 @@ public interface RabbitConstants {
// 售出记录
String EXCHANGE_STOCK_RECORD = "exchange.stock.record";
String ROUTING_STOCK_RECORD_SALE = "routing.stock.record.sale";
// 菜品打印
String EXCHANGE_PRINT = "exchange.print";
String ROUTING_KEY_PRINT_DISHES = "routing.dishes.print";
}

View File

@ -86,6 +86,15 @@ public class TbPlaceController {
tbShopTableService.removeCart(removeCartDTO);
return new ResponseEntity<>(HttpStatus.OK);
}
@AnonymousAccess
@PutMapping("/returnOrder")
@Log("代客下单 退单")
@ApiOperation("代客下单 清空购物车 /shop/table")
public ResponseEntity<Object> returnOrder(@Validated @RequestBody RemoveCartDTO removeCartDTO) {
tbShopTableService.returnCart(removeCartDTO);
return new ResponseEntity<>(HttpStatus.OK);
}
@AnonymousAccess
@DeleteMapping("/clearCart")
@ -192,6 +201,31 @@ public class TbPlaceController {
return ResponseEntity.ok(tbShopTableService.pay(payDTO));
}
@AnonymousAccess
@PutMapping("/choseTable")
@Log("代客下单 选择台桌")
@ApiOperation("代客下单 选择台桌 /shop/table")
public ResponseEntity<Object> choseTable(
@Validated @RequestBody ChoseTableDTO choseTableDTO
) {
return ResponseEntity.ok(tbShopTableService.choseTable(choseTableDTO));
}
@AnonymousAccess
@PutMapping("/choseCount")
@Log("代客下单 选择用餐人数")
@ApiOperation("代客下单 选择台桌 /shop/table")
public ResponseEntity<Object> choseCount(
@Validated @RequestBody ChoseCountDTO choseCountDTO
) {
return ResponseEntity.ok(tbShopTableService.choseCount(choseCountDTO));
}
@AnonymousAccess
@PutMapping("/updateVip")
@Log("代客下单 查询购物车")

View File

@ -20,9 +20,10 @@ public class AddCartDTO {
@NotEmpty
private String tableId;
@NotNull
@Min(0)
@Min(1)
private Integer num;
private boolean isPack;
private boolean isGift;
private Integer cartId;
}

View File

@ -0,0 +1,20 @@
package cn.ysk.cashier.dto.shoptable;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Data
public class ChoseCountDTO {
@NotEmpty
private String masterId;
@NotNull
private Integer shopId;
@NotEmpty
private String tableId;
@NotNull
@Min(1)
private Integer num;
}

View File

@ -0,0 +1,19 @@
package cn.ysk.cashier.dto.shoptable;
import lombok.Data;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Data
public class ChoseTableDTO {
@NotNull
private Integer shopId;
private Integer orderId;
@NotNull
private String newTableId;
@NotEmpty
private String oldTableId;
}

View File

@ -0,0 +1,15 @@
package cn.ysk.cashier.dto.shoptable;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
public class ReturnOrderDTO {
@NotNull
private Integer cartId;
@NotNull
private Integer shopId;
@NotNull
private Long tableId;
}

View File

@ -155,6 +155,8 @@ public class TbCashierCart implements Serializable {
private String uuid;
@Column(name = "`sku_name`")
private String skuName;
@Column(name = "`place_num`")
private Integer placeNum;
public void copy(TbCashierCart source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));

View File

@ -15,6 +15,7 @@
*/
package cn.ysk.cashier.pojo.order;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import cn.hutool.core.bean.BeanUtil;
import io.swagger.annotations.ApiModelProperty;
@ -101,12 +102,17 @@ public class TbOrderDetail implements Serializable {
@Transient
@ApiModelProperty(value = "退单数量")
@TableField(exist = false)
private Integer refundNumber;
@Column(name = "`is_vip`")
@ApiModelProperty(value = "isVip")
private Integer isVip;
@Column(name = "`place_num`")
@ApiModelProperty(value = "place_num")
private Integer placeNum;
public void copy(TbOrderDetail source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}

View File

@ -228,6 +228,9 @@ public class TbOrderInfo implements Serializable {
private String isUseCoupon;
@Column(name = "`use_type`")
private String useType;
@Column(name = "`place_num`")
@ApiModelProperty(value = "place_num")
private Integer placeNum;
public void copy(TbOrderInfo source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}

View File

@ -7,14 +7,15 @@ import cn.ysk.cashier.pojo.order.TbOrderInfo;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
public interface TbPayService {
TbOrderInfo scanPay(PayDTO payDTO);
TbOrderInfo scanPay(Integer shopId, String code, Integer merchantId, Integer memberId, BigDecimal payMount, TbOrderInfo orderInfo);
TbOrderInfo vipPay(@NotNull Integer shopId, @NotNull Integer orderId, Double discount, Integer vipUserId);
void vipPay(BigDecimal payMount, Integer vipUserId);
TbOrderInfo cashPay(PayDTO payDTO);
TbOrderInfo memberAccountPay(String memberId, String shopId, String accountCode, Integer orderId, Double discount) throws Exception;
TbOrderInfo memberAccountPay(String memberId, String shopId, String accountCode, TbOrderInfo orderInfo, BigDecimal payMount) throws Exception;
}

View File

@ -106,29 +106,20 @@ public class TbPayServiceImpl implements TbPayService {
}
@Override
public TbOrderInfo scanPay(PayDTO scanPayDTO) {
if (StrUtil.isBlank(scanPayDTO.getCode())) {
public TbOrderInfo scanPay(Integer shopId, String code, Integer merchantId, Integer memberId, BigDecimal payMount, TbOrderInfo orderInfo) {
if (StrUtil.isBlank(code)) {
throw new BadRequestException("无效码");
}
TbOrderInfo orderInfo = orderInfoMapper.selectOne(new LambdaUpdateWrapper<TbOrderInfo>()
.in(TbOrderInfo::getStatus, "unpaid", "paying")
.eq(TbOrderInfo::getId, scanPayDTO.getOrderId())
.eq(TbOrderInfo::getShopId, scanPayDTO.getShopId()));
if (orderInfo == null) {
throw new BadRequestException("订单不存在或已支付");
}
if (ObjectUtil.isNull(orderInfo.getMerchantId()) || ObjectUtil.isEmpty(orderInfo.getMerchantId())) {
if (merchantId == null) {
throw new BadRequestException("订单商户id为空");
}
List<TbCashierCart> cashierCarts = cashierCartMapper.selectList(new LambdaUpdateWrapper<TbCashierCart>()
.eq(TbCashierCart::getShopId, scanPayDTO.getShopId())
.eq(TbCashierCart::getOrderId, scanPayDTO.getOrderId()));
.eq(TbCashierCart::getShopId, shopId)
.eq(TbCashierCart::getOrderId, orderInfo.getId()));
if (cashierCarts.isEmpty()) {
throw new BadRequestException("购物车为空");
}
@ -138,10 +129,8 @@ public class TbPayServiceImpl implements TbPayService {
body.append(cashierCart.getName());
}
BigDecimal payMount = orderInfo.getOrderAmount().multiply(BigDecimal.valueOf(scanPayDTO.getDiscount())).setScale(2, RoundingMode.HALF_UP);
TbMerchantThirdApply thirdApply = merchantThirdApplyRepository.getById(Integer.valueOf(orderInfo.getMerchantId()));
TbMerchantThirdApply thirdApply = merchantThirdApplyRepository.getById(merchantId);
if (ObjectUtil.isEmpty(thirdApply) || ObjectUtil.isNull(thirdApply)) {
throw new BadRequestException("三方支付信息不存在");
}
@ -149,7 +138,7 @@ public class TbPayServiceImpl implements TbPayService {
String payType;
String payName;
String qpay;
String payTypeCode = scanPayDTO.getCode().substring(0, 2);// 判断收款码
String payTypeCode = code.substring(0, 2);// 判断收款码
if(Integer.parseInt(payTypeCode) >=25 && Integer.parseInt(payTypeCode) <= 30){
payType = "aliPay";
@ -168,32 +157,32 @@ public class TbPayServiceImpl implements TbPayService {
}
long count = shopPayTypeMapper.selectCount(new LambdaUpdateWrapper<TbShopPayType>()
.eq(TbShopPayType::getShopId, scanPayDTO.getShopId())
.eq(TbShopPayType::getShopId, shopId)
.eq(TbShopPayType::getIsDisplay, 1)
.eq(TbShopPayType::getPayType, qpay));
if (count < 1) {
throw new BadRequestException("未到找支付方式");
}
TbOrderPayment payment = orderPaymentService.getById(scanPayDTO.getOrderId());
TbOrderPayment payment = orderPaymentService.getById(orderInfo.getId());
if (ObjectUtil.isEmpty(payment) || payment == null) {
payment = new TbOrderPayment();
payment.setPayTypeId("ysk");
payment.setAmount(payMount.doubleValue());
payment.setPaidAmount(orderInfo.getPayAmount().doubleValue());
payment.setPaidAmount(payMount.doubleValue());
payment.setHasRefundAmount((double) 0);
payment.setPayName(payName);
payment.setPayType(payType);
payment.setReceived(payment.getAmount());
payment.setChangeFee((double) 0);
payment.setMemberId(orderInfo.getMemberId());
payment.setShopId(orderInfo.getShopId());
payment.setOrderId(orderInfo.getId().toString());
payment.setMemberId(String.valueOf(memberId));
payment.setShopId(String.valueOf(shopId));
payment.setOrderId(String.valueOf(orderInfo.getId()));
payment.setCreatedAt(System.currentTimeMillis());
payment.setAuthCode(scanPayDTO.getCode());
payment.setAuthCode(code);
orderPaymentService.save(payment);
} else {
payment.setAuthCode(scanPayDTO.getCode());
payment.setAuthCode(code);
payment.setUpdatedAt(System.currentTimeMillis());
orderPaymentService.updateById(payment);
}
@ -202,15 +191,13 @@ public class TbPayServiceImpl implements TbPayService {
orderInfo.setPayAmount(payMount);
orderInfo.setPayType(qpay);
orderInfo.setUpdatedAt(System.currentTimeMillis());
orderInfoMapper.update(orderInfo, new LambdaUpdateWrapper<TbOrderInfo>()
.eq(TbOrderInfo::getId, scanPayDTO.getOrderId()));
if ("ysk".equals(thirdPayType)) {
ScanPayReq scanPayReq = new ScanPayReq();
scanPayReq.setAppId(thirdApply.getAppId());
scanPayReq.setTimestamp(System.currentTimeMillis());
scanPayReq.setAuthCode(scanPayDTO.getCode());
scanPayReq.setAuthCode(code);
scanPayReq.setNotifyUrl(backUrl);
scanPayReq.setConsumeFee(BigDecimal.valueOf(payment.getAmount()).setScale(2, RoundingMode.DOWN).toPlainString());
@ -231,20 +218,20 @@ public class TbPayServiceImpl implements TbPayService {
orderInfo.setStatus("closed");
orderInfo.setPayOrderNo(object.getJSONObject("data").get("orderNumber").toString());
orderInfoMapper.update(orderInfo, new LambdaQueryWrapper<TbOrderInfo>()
.eq(TbOrderInfo::getId, scanPayDTO.getOrderId()));
.eq(TbOrderInfo::getId, orderInfo.getId()));
//更新购物车状态
TbCashierCart cashierCart = new TbCashierCart();
cashierCart.setStatus("final");
int cartCount = cashierCartMapper.update(cashierCart, new LambdaQueryWrapper<TbCashierCart>()
.eq(TbCashierCart::getOrderId, scanPayDTO.getOrderId()));
.eq(TbCashierCart::getOrderId, orderInfo.getId()));
log.info("更新购物车:{}", cartCount);
//更新子单状态
TbOrderDetail orderDetail = new TbOrderDetail();
orderDetail.setStatus("closed");
orderDetailMapper.update(orderDetail, new LambdaQueryWrapper<TbOrderDetail>()
.eq(TbOrderDetail::getOrderId, scanPayDTO.getOrderId()));
.eq(TbOrderDetail::getOrderId, orderInfo.getId()));
return orderInfo;
@ -282,7 +269,7 @@ public class TbPayServiceImpl implements TbPayService {
reqbody, reqbody,
BigDecimal.valueOf(payment.getAmount()).setScale(2, RoundingMode.DOWN).multiply(new BigDecimal(100)).longValue(),
payType.equals("wechatPay") ? thirdApply.getSmallAppid() : null,
scanPayDTO.getCode(), DateUtils.getSsdfTimes(), thirdApply.getStoreId(), callBack, thirdApply.getAppToken());
code, DateUtils.getSsdfTimes(), thirdApply.getStoreId(), callBack, thirdApply.getAppToken());
log.info("响应信息, {}", publicResp);
if (ObjectUtil.isNotNull(publicResp) && ObjectUtil.isNotEmpty(publicResp)) {
if ("000000".equals(publicResp.getCode())) {
@ -331,41 +318,25 @@ public class TbPayServiceImpl implements TbPayService {
}
@Override
public TbOrderInfo vipPay(@NotNull Integer shopId, @NotNull Integer orderId, Double discount, Integer vipUserId) {
TbOrderInfo orderInfo = orderInfoMapper.selectById(orderId);
if (ObjectUtil.isEmpty(orderInfo)) {
throw new BadRequestException("订单不存在");
}
if (!"unpaid".equals(orderInfo.getStatus()) && !"pending".equals(orderInfo.getStatus())) {
throw new BadRequestException("订单非未支付状态");
}
if (vipUserId != null) {
orderInfo.setUserId(String.valueOf(vipUserId));
}
public void vipPay(BigDecimal payMount, Integer vipUserId) {
// 扣减会员余额
TbShopUser shopUser = shopUserMapper.selectOne(new LambdaUpdateWrapper<TbShopUser>()
.eq(TbShopUser::getStatus, 1)
.eq(TbShopUser::getId, orderInfo.getUserId()));
.eq(TbShopUser::getId, vipUserId));
if (shopUser == null) {
throw new BadRequestException("用户不存在或已被禁用");
}
BigDecimal finalAmount = orderInfo.getOrderAmount().multiply(BigDecimal.valueOf(discount)).setScale(2, RoundingMode.HALF_UP);
long flag = shopUserMapper.decrBalance(Integer.valueOf(orderInfo.getUserId()), finalAmount);
long flag = shopUserMapper.decrBalance(vipUserId, payMount);
if (flag < 1) {
throw new BadRequestException("余额不足或扣除余额失败");
}
TbShopUserFlow userFlow = new TbShopUserFlow();
userFlow.setAmount(finalAmount);
userFlow.setBalance(shopUser.getAmount().subtract(finalAmount));
userFlow.setAmount(payMount);
userFlow.setBalance(shopUser.getAmount().subtract(payMount));
userFlow.setShopUserId(shopUser.getId());
userFlow.setBizCode("vipCardCash");
userFlow.setBizName("余额支付");
@ -373,22 +344,6 @@ public class TbPayServiceImpl implements TbPayService {
userFlow.setType("-");
shopUserFlowMapper.insert(userFlow);
orderInfo.setPayAmount(finalAmount);
orderInfo.setPayType("cash");
orderInfo.setStatus("closed");
orderInfo.setPayOrderNo("cash".concat(SnowFlakeUtil.generateOrderNo()));
orderInfo.setDiscountRatio(BigDecimal.valueOf(discount));
orderInfo.setDiscountAmount(orderInfo.getAmount().subtract(finalAmount));
orderInfoMapper.updateById(orderInfo);
//更新购物车状态
int cartCount = cashierCartMapper.update(null, new LambdaUpdateWrapper<TbCashierCart>()
.eq(TbCashierCart::getOrderId, orderId)
.set(TbCashierCart::getStatus, "final"));
orderDetailMapper.update(null, new LambdaUpdateWrapper<TbOrderDetail>()
.eq(TbOrderDetail::getOrderId, orderId)
.set(TbOrderDetail::getStatus, "closed"));
return orderInfo;
}
@ -442,33 +397,11 @@ public class TbPayServiceImpl implements TbPayService {
return orderInfo;
}
public TbOrderInfo memberAccountPay(String memberId, String shopId, String accountCode, Integer orderId, Double discount) {
public TbOrderInfo memberAccountPay(String memberId, String shopId, String accountCode, TbOrderInfo orderInfo, BigDecimal payMount) {
if (StrUtil.isBlank(accountCode)) {
throw new BadRequestException("无效码");
}
TbOrderInfo orderInfo = orderInfoMapper.selectOne(new LambdaUpdateWrapper<TbOrderInfo>()
.eq(TbOrderInfo::getId, orderId)
.eq(TbOrderInfo::getShopId, shopId));
if (orderInfo == null) {
throw new BadRequestException("订单不存在或已支付");
}
if (!"unpaid".equals(orderInfo.getStatus()) && !"pending".equals(orderInfo.getStatus())) {
throw new BadRequestException("此订单不处于未支付状态");
}
BigDecimal payMount = orderInfo.getOrderAmount().multiply(BigDecimal.valueOf(discount)).setScale(2, RoundingMode.HALF_UP);
long count = tbShopPayTypeMapper.selectCount(new LambdaQueryWrapper<TbShopPayType>()
.eq(TbShopPayType::getShopId, shopId)
.eq(TbShopPayType::getIsDisplay, 1)
.eq(TbShopPayType::getPayType, "deposit"));
if (count < 1) {
throw new BadRequestException("未知支付方式");
}
TbShopUser user = null;
@ -520,22 +453,7 @@ public class TbPayServiceImpl implements TbPayService {
orderInfo.setUserId(user.getUserId());
orderInfo.setMemberId(user.getId().toString());
orderInfo.setPayType("deposit");
orderInfo.setStatus("closed");
orderInfo.setPayOrderNo("deposit".concat(SnowFlakeUtil.generateOrderNo()));
orderInfoMapper.updateById(orderInfo);
//更新购物车状态
int cartCount = cashierCartMapper.update(null, new LambdaUpdateWrapper<TbCashierCart>()
.eq(TbCashierCart::getId, orderId)
.set(TbCashierCart::getStatus, "final"));
orderDetailMapper.update(null, new LambdaUpdateWrapper<TbOrderDetail>()
.eq(TbOrderDetail::getOrderId, orderId)
.set(TbOrderDetail::getStatus, "closed"));
log.info("更新购物车:{}", cartCount);
return orderInfo;
}
}

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.hutool.core.util.StrUtil;
import cn.ysk.cashier.config.security.security.TokenProvider;
import cn.ysk.cashier.cons.RedisConstant;
@ -27,7 +28,9 @@ import cn.ysk.cashier.enums.ShopWxMsgTypeEnum;
import cn.ysk.cashier.enums.TableStateEnum;
import cn.ysk.cashier.exception.BadRequestException;
import cn.ysk.cashier.mybatis.entity.TbShopOpenId;
import cn.ysk.cashier.mybatis.entity.TbShopUserFlow;
import cn.ysk.cashier.mybatis.mapper.*;
import cn.ysk.cashier.pojo.TbShopPayType;
import cn.ysk.cashier.pojo.order.TbCashierCart;
import cn.ysk.cashier.pojo.order.TbOrderDetail;
import cn.ysk.cashier.pojo.order.TbOrderInfo;
@ -66,6 +69,8 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Timestamp;
import java.time.Instant;
import java.util.*;
import java.io.IOException;
@ -105,6 +110,8 @@ public class TbShopTableServiceImpl implements TbShopTableService {
private final WxMsgUtils wxMsgUtils;
private final TbShopPayTypeRepository payTypeRepository;
private final MpShopTableMapper mpShopTableMapper;
private final TbShopPayTypeMapper tbShopPayTypeMapper;
/**
* 桌码前缀
@ -322,10 +329,24 @@ public class TbShopTableServiceImpl implements TbShopTableService {
return shopTable;
}
private int getCurrentPlaceNum(String tableId, String shopId) {
String currentOrderKey = RedisConstant.getCurrentOrderKey(tableId,
shopId);
if (StrUtil.isBlank(currentOrderKey)) {
return 1;
}
TbOrderInfo orderInfo = orderInfoMapper.selectOne(new LambdaQueryWrapper<TbOrderInfo>()
.eq(TbOrderInfo::getUseType, "postPay")
.eq(TbOrderInfo::getId, currentOrderKey).select(TbOrderInfo::getPlaceNum));
return orderInfo == null ? 1 : orderInfo.getPlaceNum() + 1;
}
@Override
public TbCashierCart addCartForUser(AddCartDTO addCartDTO) {
checkTableIsOpen(addCartDTO.getTableId());
int currentPlaceNum = getCurrentPlaceNum(addCartDTO.getShopId().toString(), addCartDTO.getTableId());
TbProductSku productSku = productMapper.selectSkuByIdAndShopId(addCartDTO.getShopId(), addCartDTO.getSkuId());
TbProduct product = productMapper.selectByIdAndShopId(addCartDTO.getShopId(), addCartDTO.getProductId());
@ -344,6 +365,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
.eq(TbCashierCart::getSkuId, addCartDTO.getSkuId())
.eq(TbCashierCart::getProductId, addCartDTO.getProductId())
.eq(TbCashierCart::getTableId, addCartDTO.getTableId())
.eq(TbCashierCart::getPlaceNum, currentPlaceNum)
.in(TbCashierCart::getStatus, "create", "refund")
// .and(q -> {
// q.eq(TbCashierCart::getTradeDay, DateUtils.getDay())
@ -391,6 +413,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
tbCashierCart.setSalePrice(productSku.getSalePrice());
tbCashierCart.setTotalAmount(new BigDecimal(addCartDTO.getNum()).multiply(productSku.getSalePrice()));
tbCashierCart.setSkuName(productSku.getSpecSnap());
tbCashierCart.setPlaceNum(currentPlaceNum);
if (!addCartDTO.isPack()) {
tbCashierCart.setPackFee(BigDecimal.ZERO);
} else {
@ -425,11 +448,6 @@ public class TbShopTableServiceImpl implements TbShopTableService {
tbCashierCart.setIsGift(String.valueOf(addCartDTO.isGift()));
tbCashierCart.setTotalNumber(addCartDTO.getNum());
tbCashierCart.setNumber(addCartDTO.getNum());
// 数量0删除
if (tbCashierCart.getNumber() == 0) {
cashierCartRepository.deleteById(tbCashierCart.getId());
return null;
}
tbCashierCart.setUpdatedAt(DateUtil.current());
cashierCartRepository.save(tbCashierCart);
}
@ -466,9 +484,11 @@ public class TbShopTableServiceImpl implements TbShopTableService {
@Override
public void removeCart(RemoveCartDTO removeCartDTO) {
int currentPlaceNum = getCurrentPlaceNum(removeCartDTO.getTableId().toString(), removeCartDTO.getShopId().toString());
// 会员点单
TbCashierCart cashierCart = cashierCartMapper.selectOne(new LambdaQueryWrapper<TbCashierCart>()
.eq(TbCashierCart::getShopId, removeCartDTO.getShopId())
.eq(TbCashierCart::getPlaceNum, currentPlaceNum)
.eq(TbCashierCart::getId, removeCartDTO.getCartId()));
if (cashierCart == null) {
throw new BadRequestException("购物车商品不存在");
@ -479,11 +499,9 @@ public class TbShopTableServiceImpl implements TbShopTableService {
.eq(TbOrderDetail::getShopId, cashierCart.getShopId())
.eq(TbOrderDetail::getProductId, cashierCart.getProductId())
.eq(TbOrderDetail::getProductSkuId, cashierCart.getSkuId())
.eq(TbOrderDetail::getPlaceNum, currentPlaceNum)
.eq(TbOrderDetail::getOrderId, cashierCart.getOrderId()));
}
cashierCartMapper.delete(new LambdaQueryWrapper<TbCashierCart>().eq(TbCashierCart::getShopId, removeCartDTO.getShopId())
.eq(TbCashierCart::getId, removeCartDTO.getCartId()));
// 清空购物车 出票
long carCount = countCar(cashierCart.getTableId(), cashierCart.getShopId(), cashierCart.getMasterId());
@ -497,13 +515,55 @@ public class TbShopTableServiceImpl implements TbShopTableService {
}
@Override
public void returnCart(RemoveCartDTO removeCartDTO) {
rabbitMsgUtils.printDishesReturnTicket(4450, 9313);
int currentPlaceNum = getCurrentPlaceNum(removeCartDTO.getTableId().toString(), removeCartDTO.getShopId().toString());
// 会员点单
TbCashierCart cashierCart = cashierCartMapper.selectOne(new LambdaQueryWrapper<TbCashierCart>()
.eq(TbCashierCart::getShopId, removeCartDTO.getShopId())
.in(TbCashierCart::getStatus, "create")
.eq(TbCashierCart::getId, removeCartDTO.getCartId()));
if (cashierCart == null) {
throw new BadRequestException("购物车商品不存在或已退单");
}
TbOrderDetail tbOrderDetail = orderDetailMapper.selectOne(new LambdaQueryWrapper<TbOrderDetail>()
.eq(TbOrderDetail::getShopId, removeCartDTO.getShopId())
.eq(TbOrderDetail::getPlaceNum, cashierCart.getPlaceNum())
.in(TbOrderDetail::getStatus, "unpaid")
.eq(TbOrderDetail::getOrderId, cashierCart.getOrderId()));
if (tbOrderDetail == null) {
throw new BadRequestException("购物车商品不存在或已退单");
}
if (cashierCart.getOrderId() == null) {
throw new BadRequestException("此商品还未下单,无需退单");
}
cashierCartMapper.update(null, new LambdaUpdateWrapper<TbCashierCart>()
.eq(TbCashierCart::getId, cashierCart.getId())
.set(TbCashierCart::getStatus, "return"));
orderDetailMapper.update(null, new LambdaUpdateWrapper<TbOrderDetail>()
.eq(TbOrderDetail::getId, tbOrderDetail.getId())
.set(TbOrderDetail::getUpdateTime, DateUtil.date())
.set(TbOrderDetail::getStatus, "return"));
rabbitMsgUtils.printDishesReturnTicket(tbOrderDetail.getOrderId(), tbOrderDetail.getOrderId());
}
@Override
public void clearCart(ClearCartDTO clearCartDTO) {
String orderId = redisTemplate.opsForValue().get(RedisConstant.getCurrentOrderKey(clearCartDTO.getTableId().toString(), clearCartDTO.getShopId()));
int currentPlaceNum = getCurrentPlaceNum(clearCartDTO.getTableId().toString(), clearCartDTO.getShopId());
cashierCartMapper.delete(new LambdaQueryWrapper<TbCashierCart>()
.eq(TbCashierCart::getShopId, clearCartDTO.getShopId())
.eq(TbCashierCart::getTableId, clearCartDTO.getTableId())
.eq(TbCashierCart::getPlaceNum, currentPlaceNum)
.and(q -> {
q.eq(TbCashierCart::getMasterId, clearCartDTO.getMasterId())
.or()
@ -518,10 +578,13 @@ public class TbShopTableServiceImpl implements TbShopTableService {
})
);
// tbShopTableRepository.deleteByTableIdAndShopId(clearCartDTO.getTableId(), clearCartDTO.getShopId());
if (StrUtil.isNotBlank(orderId)) {
orderDetailMapper.delete(new LambdaQueryWrapper<TbOrderDetail>().eq(TbOrderDetail::getShopId, clearCartDTO.getShopId())
orderDetailMapper.delete(new LambdaQueryWrapper<TbOrderDetail>()
.eq(TbOrderDetail::getShopId, clearCartDTO.getShopId())
.eq(TbOrderDetail::getPlaceNum, currentPlaceNum)
.eq(TbOrderDetail::getOrderId, orderId));
rabbitMsgUtils.printTicket(orderId);
}
@ -541,7 +604,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
Integer size, Integer shopId, Integer vipUserId, String masterId) {
LambdaQueryWrapper<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
.eq(TbCashierCart::getTableId, tableId)
.in(TbCashierCart::getStatus, "create", "refund")
.in(TbCashierCart::getStatus, "create", "refund", "return")
.eq(TbCashierCart::getShopId, shopId)
.and(query2 -> {
query2.or(query3 -> {
@ -835,7 +898,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
private final StringRedisTemplate redisTemplate;
@Override
public Object getMasterId(Integer shopId, Long tableId, Integer vipUserId) {
public JSONObject getMasterId(Integer shopId, Long tableId, Integer vipUserId) {
String account = tokenProvider.getSubject();
if (account == null) {
throw new BadRequestException("token解析失败");
@ -875,12 +938,32 @@ public class TbShopTableServiceImpl implements TbShopTableService {
@Override
public TbOrderInfo createOrder(CreateOrderDTO createOrderDTO, boolean addMaterId, boolean isPrint) {
return Utils.runFunAndCheckKey(() -> {
TbShopTable tbShopTable = mpShopTableMapper.selectOne(new LambdaQueryWrapper<TbShopTable>()
.eq(TbShopTable::getQrcode, createOrderDTO.getTableId())
.in(TbShopTable::getStatus, "idle", "using"));
if (tbShopTable == null) {
throw new BadRequestException("台桌未开台或不存在");
}
// 传递orderId直接取否则取当前缓存id
String currentOrderKey = RedisConstant.getCurrentOrderKey(createOrderDTO.getTableId(),
createOrderDTO.getShopId().toString());
String orderIdValue = redisTemplate.opsForValue().get(currentOrderKey);
Integer orderId = orderIdValue == null ? null : Integer.parseInt(orderIdValue);
orderId = createOrderDTO.getOrderId() != null ? createOrderDTO.getOrderId() : orderId;
// 查询订单
TbOrderInfo orderInfo = null;
if (orderId != null) {
orderInfo = orderInfoMapper.selectById(orderId);
if (orderInfo == null || !"unpaid".equals(orderInfo.getStatus())) {
redisTemplate.delete(currentOrderKey);
}
}
String day = DateUtils.getDay();
LambdaQueryWrapper<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
.eq(TbCashierCart::getShopId, createOrderDTO.getShopId())
@ -896,33 +979,26 @@ public class TbShopTableServiceImpl implements TbShopTableService {
.isNull(TbCashierCart::getMasterId);
}));
});
// 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("购物车为空,请先添加商品");
}
TbShopTable tbShopTable = mpShopTableMapper.selectOne(new LambdaQueryWrapper<TbShopTable>()
.eq(TbShopTable::getQrcode, createOrderDTO.getTableId())
.in(TbShopTable::getStatus, "idle", "using"));
if (tbShopTable == null) {
throw new BadRequestException("台桌未开台或不存在");
}
BigDecimal totalAmount = BigDecimal.ZERO;
BigDecimal packAMount = BigDecimal.ZERO;
BigDecimal feeAmount = BigDecimal.ZERO;
BigDecimal saleAmount = BigDecimal.ZERO;
// 当前下单次数
int placeNum = orderInfo == null ? 1 : orderInfo.getPlaceNum() + 1;
List<TbOrderDetail> orderDetails = new ArrayList<>();
boolean mealCost = false;
for (TbCashierCart cashierCart : cashierCarts) {
if ("客位费".equals(cashierCart.getName())) {
mealCost = true;
}
totalAmount = totalAmount.add(cashierCart.getTotalAmount());
packAMount = packAMount.add(cashierCart.getPackFee());
feeAmount = cashierCart.getPackFee();
@ -950,15 +1026,11 @@ public class TbShopTableServiceImpl implements TbShopTableService {
orderId = cashierCart.getOrderId();
}
orderDetail.setOrderId(orderId);
orderDetail.setPlaceNum(placeNum);
}
TbOrderInfo orderInfo = null;
if (orderId != null) {
orderInfo = orderInfoMapper.selectById(orderId);
if (orderInfo == null || !"unpaid".equals(orderInfo.getStatus())) {
redisTemplate.delete(currentOrderKey);
}
if (!mealCost) {
throw new BadRequestException("请选择用餐人数");
}
// 修改订单信息
@ -1236,25 +1308,70 @@ public class TbShopTableServiceImpl implements TbShopTableService {
@Override
public Object pay(PayDTO payDTO) {
return Utils.runFunAndCheckKey(() -> {
TbOrderInfo orderInfo = null;
long count = tbShopPayTypeMapper.selectCount(new LambdaQueryWrapper<TbShopPayType>()
.eq(TbShopPayType::getShopId, payDTO.getShopId())
.eq(TbShopPayType::getIsDisplay, 1)
.eq(TbShopPayType::getPayType, "deposit"));
if (count < 1) {
throw new BadRequestException("未知支付方式");
}
TbOrderInfo orderInfo = orderInfoMapper.selectById(payDTO.getOrderId());
if (ObjectUtil.isEmpty(orderInfo)) {
throw new BadRequestException("订单不存在");
}
if (!"unpaid".equals(orderInfo.getStatus()) && !"pending".equals(orderInfo.getStatus())) {
throw new BadRequestException("订单非未支付状态");
}
if (payDTO.getDiscount() == null) {
payDTO.setDiscount((double) 1);
}
BigDecimal finalAmount = orderInfo.getOrderAmount().multiply(BigDecimal.valueOf(payDTO.getDiscount())).setScale(2, RoundingMode.HALF_UP);
switch (payDTO.getPayType()) {
case "vipPay":
orderInfo = tbPayServiceImpl.vipPay(payDTO.getShopId(), payDTO.getOrderId(), payDTO.getDiscount(), payDTO.getVipUserId());
if (payDTO.getVipUserId() != null) {
orderInfo.setUserId(String.valueOf(payDTO.getVipUserId()));
}
tbPayServiceImpl.vipPay(finalAmount, Integer.valueOf(orderInfo.getUserId()));
orderInfo.setPayOrderNo("vipPay".concat(SnowFlakeUtil.generateOrderNo()));
orderInfo.setPayType("deposit");
break;
case "cash":
orderInfo = tbPayServiceImpl.cashPay(payDTO);
orderInfo.setPayType("cash");
orderInfo.setPayOrderNo("cash".concat(SnowFlakeUtil.generateOrderNo()));
// orderInfo = tbPayServiceImpl.cashPay(payDTO);
break;
case "scanCode":
orderInfo = tbPayServiceImpl.scanPay(payDTO);
orderInfo = tbPayServiceImpl.scanPay(payDTO.getShopId(), payDTO.getCode(), Integer.valueOf(orderInfo.getMerchantId()), Integer.valueOf(orderInfo.getMemberId()), finalAmount, orderInfo);
break;
case "deposit":
orderInfo = tbPayServiceImpl.memberAccountPay("", String.valueOf(payDTO.getShopId()), payDTO.getCode(), payDTO.getOrderId(), payDTO.getDiscount());
orderInfo = tbPayServiceImpl.memberAccountPay("", String.valueOf(payDTO.getShopId()), payDTO.getCode(), orderInfo, finalAmount);
break;
default:
throw new BadRequestException("未知支付方式");
}
log.info("更新购物车");
orderInfo.setPayAmount(finalAmount);
orderInfo.setStatus("closed");
orderInfo.setDiscountRatio(BigDecimal.valueOf(payDTO.getDiscount()));
orderInfo.setDiscountAmount(orderInfo.getAmount().subtract(finalAmount));
orderInfoMapper.updateById(orderInfo);
//更新购物车状态
cashierCartMapper.update(null, new LambdaUpdateWrapper<TbCashierCart>()
.eq(TbCashierCart::getOrderId, orderInfo.getId())
.set(TbCashierCart::getStatus, "final"));
orderDetailMapper.update(null, new LambdaUpdateWrapper<TbOrderDetail>()
.eq(TbOrderDetail::getOrderId, orderInfo.getId())
.set(TbOrderDetail::getStatus, "closed"));
JSONObject jsonObject = new JSONObject();
jsonObject.put("token", null);
@ -1327,4 +1444,94 @@ public class TbShopTableServiceImpl implements TbShopTableService {
}
return cashierCartMapper.update(null, queryWrapper);
}
private String getCurrentOrderId(String tableId, String shopId) {
String currentOrderKey = RedisConstant.getCurrentOrderKey(tableId, shopId);
return redisTemplate.opsForValue().get(currentOrderKey);
}
@Override
public Object choseTable(ChoseTableDTO choseTableDTO) {
String masterId = getMasterId(choseTableDTO.getShopId(), Long.valueOf(choseTableDTO.getNewTableId()), null).getString("masterId");
String currentOrderId = choseTableDTO.getOrderId() == null ? getCurrentOrderId(choseTableDTO.getOldTableId(),
choseTableDTO.getShopId().toString()) : choseTableDTO.getOrderId().toString();
TbShopTable shopTable = mpShopTableMapper.selectOne(new LambdaQueryWrapper<TbShopTable>()
.eq(TbShopTable::getQrcode, choseTableDTO.getNewTableId())
.eq(TbShopTable::getStatus, "idle"));
if (shopTable == null) {
throw new BadRequestException("台桌不存在或非空闲状态");
}
cashierCartMapper.update(null, new LambdaUpdateWrapper<TbCashierCart>()
.eq(TbCashierCart::getTableId, choseTableDTO.getOldTableId())
.in(TbCashierCart::getStatus, "create", "return")
.eq(TbCashierCart::getShopId, choseTableDTO.getShopId())
.and(q -> {
q.isNull(TbCashierCart::getOrderId)
.or()
.eq(TbCashierCart::getOrderId, currentOrderId);
})
.and(query2 -> {
query2.or(query3 -> {
query3.eq(TbCashierCart::getTradeDay, DateUtils.getDay())
.isNotNull(TbCashierCart::getMasterId);
})
.or((query4 -> {
query4.isNull(TbCashierCart::getTradeDay)
.isNull(TbCashierCart::getMasterId);
}));
})
.set(TbCashierCart::getMasterId, masterId)
.set(TbCashierCart::getTableId, choseTableDTO.getNewTableId()));
mpShopTableMapper.update(null, new LambdaUpdateWrapper<TbShopTable>()
.eq(TbShopTable::getQrcode, choseTableDTO.getNewTableId())
.set(TbShopTable::getStatus, "using"));
mpShopTableMapper.update(null, new LambdaUpdateWrapper<TbShopTable>()
.eq(TbShopTable::getQrcode, choseTableDTO.getOldTableId())
.set(TbShopTable::getStatus, "idle"));
return orderInfoMapper.update(null, new LambdaUpdateWrapper<TbOrderInfo>()
.eq(TbOrderInfo::getId, currentOrderId)
.set(TbOrderInfo::getMasterId, masterId)
.set(TbOrderInfo::getTableId, choseTableDTO.getNewTableId()));
}
@Override
public Object choseCount(ChoseCountDTO choseCountDTO) {
LambdaQueryWrapper<TbCashierCart> query = new LambdaQueryWrapper<TbCashierCart>()
.eq(TbCashierCart::getShopId, choseCountDTO.getShopId())
.eq(TbCashierCart::getMasterId, choseCountDTO.getMasterId())
.eq(TbCashierCart::getProductId, -999)
.eq(TbCashierCart::getTableId, choseCountDTO.getTableId());
TbCashierCart tbCashierCart = cashierCartMapper.selectOne(query);
if (tbCashierCart == null) {
tbCashierCart = new TbCashierCart();
tbCashierCart.setStatus("create");
tbCashierCart.setCreatedAt(System.currentTimeMillis());
tbCashierCart.setTableId(Long.valueOf(choseCountDTO.getTableId()));
tbCashierCart.setName("客座费");
tbCashierCart.setSalePrice(BigDecimal.ONE);
tbCashierCart.setMasterId(choseCountDTO.getMasterId());
tbCashierCart.setShopId(String.valueOf(choseCountDTO.getShopId()));
tbCashierCart.setTradeDay(DateUtils.getDay());
tbCashierCart.setStatus("create");
tbCashierCart.setTotalAmount(new BigDecimal(choseCountDTO.getNum()).multiply(BigDecimal.ONE));
tbCashierCart.setPlaceNum(1);
tbCashierCart.setProductId("-999");
tbCashierCart.setSkuId("-999");
tbCashierCartMapper.insert(tbCashierCart);
}else {
tbCashierCart.setTotalAmount(new BigDecimal(choseCountDTO.getNum()).multiply(BigDecimal.ONE));
tbCashierCart.setNumber(choseCountDTO.getNum());
tbCashierCart.setTotalNumber(choseCountDTO.getNum());
tbCashierCartMapper.updateById(tbCashierCart);
}
return tbCashierCart;
}
}

View File

@ -20,6 +20,7 @@ import cn.ysk.cashier.pojo.order.TbCashierCart;
import cn.ysk.cashier.pojo.shop.TbShopTable;
import cn.ysk.cashier.dto.shop.TbShopTableDto;
import cn.ysk.cashier.dto.shop.TbShopTableQueryCriteria;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.data.domain.Pageable;
import java.util.Map;
@ -100,6 +101,8 @@ public interface TbShopTableService {
void removeCart(RemoveCartDTO removeCartDTO);
void returnCart(RemoveCartDTO removeCartDTO);
void clearCart(ClearCartDTO clearCartDTO);
Page<TbCashierCart> getCart(Long tableId, Integer page, Integer size, Integer shopId, Integer vipUserId, String masterId);
@ -110,7 +113,7 @@ public interface TbShopTableService {
Object createOrder(CreateOrderDTO createOrderDTO, boolean addMasterId, boolean isPrint);
Object getMasterId(Integer shopId, Long tableId, Integer vipUserId);
JSONObject getMasterId(Integer shopId, Long tableId, Integer vipUserId);
Object pending(PendingDTO pendingDTO);
@ -123,4 +126,8 @@ public interface TbShopTableService {
Object deleteOrder(DeleteOrderDTO deleteOrderDTO);
Object updateVip(UpdateVipDTO updateVipDTO);
Object choseTable(ChoseTableDTO choseTableDTO);
Object choseCount(ChoseCountDTO choseCountDTO);
}

View File

@ -46,4 +46,12 @@ public class RabbitMsgUtils implements RabbitTemplate.ConfirmCallback {
// 发送库存记录mq消息
sendMsg(RabbitConstants.EXCHANGE_STOCK_RECORD, RabbitConstants.ROUTING_STOCK_RECORD_SALE, mqData, "库存记录", true);
}
public void printDishesReturnTicket(Integer orderId, Integer... orderIds) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("orderId", orderId);
jsonObject.put("orderDetailIds", orderIds);
jsonObject.put("isReturn", true);
sendMsg(RabbitConstants.EXCHANGE_PRINT, RabbitConstants.ROUTING_KEY_PRINT_DISHES, jsonObject, "菜品退单", false);
}
}