Merge remote-tracking branch 'origin/test' into test

This commit is contained in:
Tankaikai 2024-12-11 09:48:33 +08:00
commit c9ee3cd3e5
10 changed files with 269 additions and 11 deletions

View File

@ -239,6 +239,11 @@ public class TbPlaceController {
return ResponseEntity.ok(tbShopTableService.choseCount(choseCountDTO));
}
@PutMapping("/switch")
public ResponseEntity<?> switchTable(@Validated @RequestBody SwitchTableDTO switchTableDTO) {
return ResponseEntity.ok(tbShopTableService.switchTable(switchTableDTO));
}
@PutMapping("/updateVip")
@ApiOperation("代客下单 查询购物车 /shop/table")
public ResponseEntity<Object> updateVip(@Validated @RequestBody UpdateVipDTO updateVipDTO) {

View File

@ -0,0 +1,25 @@
package cn.ysk.cashier.dto.shoptable;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
public class SwitchTableDTO {
@NotNull
private Integer shopId;
@NotEmpty(message = "取餐码不为空")
private String masterId;
@NotBlank
private String useType;
private Integer orderId;
private List<Integer> cartIds;
private boolean isFull;
@NotEmpty(message = "当前台桌id不为空")
private String currentTableId;
@NotEmpty(message = "目标台桌id不为空")
private String targetTableId;
}

View File

@ -69,7 +69,16 @@ public interface MpCashierCartService extends IService<TbCashierCart> {
List<TbCashierCart> selectByShopEatType(ShopEatTypeInfoDTO shopEatTypeInfoDTO, String masterId, TableConstant.OrderInfo.Status... statuses);
List<TbCashierCart> selectByShopEatTypeAndOrderId(ShopEatTypeInfoDTO shopEatTypeInfoDTO, String masterId, Integer orderId, TableConstant.OrderInfo.Status... statuses);
/**
* 根据就餐模式查询购物车信息
* @param shopEatTypeInfoDTO 就餐模式
* @param masterId 取餐码
* @param orderId 订单id
* @param onlySearchPc 只查询pc
* @param statuses 状态
*/
List<TbCashierCart> selectByShopEatTypeAndOrderId(ShopEatTypeInfoDTO shopEatTypeInfoDTO, String masterId, Integer orderId, boolean onlySearchPc, TableConstant.OrderInfo.Status... statuses);
Long countByShopEatType(ShopEatTypeInfoDTO shopEatTypeInfoDTO, String masterId, Integer orderId, boolean onlySearchPc, TableConstant.OrderInfo.Status... statuses);
/**
* 根据订单id和状态获取购物车数据

View File

@ -82,5 +82,17 @@ public interface MpOrderDetailService extends IService<TbOrderDetail> {
boolean updateMemberByOrderId(Integer orderId, boolean isMember);
boolean updateFieldByCartId(SFunction<TbOrderDetail, ?> field, Object val, List<Integer> cartIds);
/**
* 根据购物车更改订单台桌信息
* @param shopId 店铺id
* @param targetTableId 新的台桌id
* @param masterId 取餐码
* @param cartIds 购物车id
* @return
*/
boolean updateTableInfoByCartIds(Integer shopId, String targetTableId, String masterId, List<Integer> cartIds);
boolean removeByCartIds(ArrayList<Integer> cartIds);
}

View File

@ -23,8 +23,10 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
* (TbShopPermission)表服务实现类
@ -120,7 +122,9 @@ public class MpCashierCartServiceImpl extends ServiceImpl<TbCashierCartMapper, T
if (statuses.length == 0) {
queryWrapper.in(TbCashierCart::getStatus, "create", "return");
} else {
queryWrapper.in(TbCashierCart::getStatus, CollUtil.newArrayList(statuses));
queryWrapper.in(TbCashierCart::getStatus, Arrays.stream(statuses)
.map(TableConstant.OrderInfo.Status::getValue)
.collect(Collectors.toList()));
}
// 非堂食校验台桌状态
@ -139,7 +143,8 @@ public class MpCashierCartServiceImpl extends ServiceImpl<TbCashierCartMapper, T
}
@Override
public List<TbCashierCart> selectByShopEatTypeAndOrderId(ShopEatTypeInfoDTO shopEatTypeInfoDTO, String masterId, Integer orderId, TableConstant.OrderInfo.Status... statuses) {
public List<TbCashierCart> selectByShopEatTypeAndOrderId(ShopEatTypeInfoDTO shopEatTypeInfoDTO, String masterId,
Integer orderId, boolean onlySearchPc, TableConstant.OrderInfo.Status... statuses) {
LambdaQueryWrapper<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
.eq(TbCashierCart::getShopId, shopEatTypeInfoDTO.getShopId())
.eq(TbCashierCart::getUseType, shopEatTypeInfoDTO.getUseType())
@ -149,7 +154,9 @@ public class MpCashierCartServiceImpl extends ServiceImpl<TbCashierCartMapper, T
if (statuses.length == 0) {
queryWrapper.in(TbCashierCart::getStatus, "create", "return");
} else {
queryWrapper.in(TbCashierCart::getStatus, CollUtil.newArrayList(statuses));
queryWrapper.in(TbCashierCart::getStatus, Arrays.stream(statuses)
.map(TableConstant.OrderInfo.Status::getValue)
.collect(Collectors.toList()));
}
if (orderId != null) {
@ -157,6 +164,10 @@ public class MpCashierCartServiceImpl extends ServiceImpl<TbCashierCartMapper, T
.or().isNull(TbCashierCart::getOrderId));
}
if (onlySearchPc) {
queryWrapper.ne(TbCashierCart::getPlatformType, "mimiapp");
}
// 非堂食校验台桌状态
if (shopEatTypeInfoDTO.isTakeout()) {
queryWrapper.and(q -> q.isNull(TbCashierCart::getTableId).or().eq(TbCashierCart::getTableId, ""))
@ -172,6 +183,47 @@ public class MpCashierCartServiceImpl extends ServiceImpl<TbCashierCartMapper, T
return list(queryWrapper);
}
@Override
public Long countByShopEatType(ShopEatTypeInfoDTO shopEatTypeInfoDTO, String masterId,
Integer orderId, boolean onlySearchPc, TableConstant.OrderInfo.Status... statuses) {
LambdaQueryWrapper<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
.eq(TbCashierCart::getShopId, shopEatTypeInfoDTO.getShopId())
.eq(TbCashierCart::getUseType, shopEatTypeInfoDTO.getUseType())
.gt(TbCashierCart::getCreatedAt, DateUtil.offsetDay(DateUtil.date(), -1).getTime())
.and(q -> q.eq(TbCashierCart::getMasterId, masterId).or().isNull(TbCashierCart::getMasterId));
if (statuses.length == 0) {
queryWrapper.in(TbCashierCart::getStatus, "create", "return");
} else {
queryWrapper.in(TbCashierCart::getStatus, Arrays.stream(statuses)
.map(TableConstant.OrderInfo.Status::getValue)
.collect(Collectors.toList()));
}
if (orderId != null) {
queryWrapper.and(q -> q.eq(TbCashierCart::getOrderId, orderId)
.or().isNull(TbCashierCart::getOrderId));
}
if (onlySearchPc) {
queryWrapper.ne(TbCashierCart::getPlatformType, "mimiapp");
}
// 非堂食校验台桌状态
if (shopEatTypeInfoDTO.isTakeout()) {
queryWrapper.and(q -> q.isNull(TbCashierCart::getTableId).or().eq(TbCashierCart::getTableId, ""))
.in(TbCashierCart::getPlatformType, OrderPlatformTypeEnum.PC.getValue(), OrderPlatformTypeEnum.CASH.getValue());
} else {
if (StrUtil.isNotBlank(shopEatTypeInfoDTO.getTableId())) {
queryWrapper.eq(TbCashierCart::getTableId, shopEatTypeInfoDTO.getTableId());
} else {
queryWrapper.and(q -> q.isNull(TbCashierCart::getTableId).or().eq(TbCashierCart::getTableId, ""));
}
}
return count(queryWrapper);
}
@Override
public List<TbCashierCart> selectByOrderIdAndState(Integer orderId, TableConstant.OrderInfo.Status... status) {
LambdaQueryChainWrapper<TbCashierCart> queryChainWrapper = lambdaQuery().eq(TbCashierCart::getOrderId, orderId);
@ -215,7 +267,9 @@ public class MpCashierCartServiceImpl extends ServiceImpl<TbCashierCartMapper, T
.eq(TbCashierCart::getShopId, shopId)
.eq(TbCashierCart::getId, cartId);
if (statuses.length != 0) {
queryWrapper.in(TbCashierCart::getStatus, CollUtil.newArrayList(statuses));
queryWrapper.in(TbCashierCart::getStatus, Arrays.stream(statuses)
.map(TableConstant.OrderInfo.Status::getValue)
.collect(Collectors.toList()));
}
return getOne(queryWrapper);
}
@ -224,10 +278,15 @@ public class MpCashierCartServiceImpl extends ServiceImpl<TbCashierCartMapper, T
public List<TbCashierCart> selectByIds(Integer shopId, Integer orderId, List<Integer> ids, TableConstant.OrderInfo.Status... statuses) {
LambdaQueryWrapper<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
.eq(TbCashierCart::getShopId, shopId)
.eq(TbCashierCart::getOrderId, orderId)
.in(TbCashierCart::getId, ids);
if (orderId != null) {
queryWrapper.eq(TbCashierCart::getOrderId, orderId);
}
if (statuses.length != 0) {
queryWrapper.in(TbCashierCart::getStatus, CollUtil.newArrayList(statuses));
queryWrapper.in(TbCashierCart::getStatus, Arrays.stream(statuses)
.map(TableConstant.OrderInfo.Status::getValue)
.collect(Collectors.toList()));
}
return list(queryWrapper);
}

View File

@ -97,5 +97,16 @@ public class MpOrderDetailServiceImpl extends ServiceImpl<TbOrderDetailMapper, T
}
return update(query);
}
@Override
public boolean updateTableInfoByCartIds(Integer shopId, String targetTableId, String masterId, List<Integer> cartIds) {
return false;
}
@Override
public boolean removeByCartIds(ArrayList<Integer> cartIds) {
return remove(new LambdaQueryWrapper<TbOrderDetail>()
.in(TbOrderDetail::getCartId, cartIds));
}
}

View File

@ -316,6 +316,9 @@ public class TbOrderInfoServiceImpl implements TbOrderInfoService {
case "deposit":
dto.setPayType("储值卡支付");
break;
case "creditBuyer":
dto.setPayType("挂账支付");
break;
default:
dto.setPayType(tbOrderInfo.getSendType());
break;

View File

@ -464,8 +464,12 @@ public class TbShopTableServiceImpl implements TbShopTableService {
tbCashierCart.setSalePrice(tbCashierCart.getSalePrice());
tbCashierCart.setTotalAmount(updateCartDTO.getNum().multiply(tbCashierCart.getSalePrice()));
tbCashierCart.setNote(updateCartDTO.getNote());
tbCashierCart.setIsPrint(updateCartDTO.getIsPrint());
tbCashierCart.setIsWaitCall(updateCartDTO.getIsWaitCall());
if (updateCartDTO.getIsPrint() != null) {
tbCashierCart.setIsPrint(updateCartDTO.getIsPrint());
}
if (updateCartDTO.getIsWaitCall() != null) {
tbCashierCart.setIsWaitCall(updateCartDTO.getIsWaitCall());
}
if (updateCartDTO.getIsPack() != null) {
if (!updateCartDTO.getIsPack()) {
@ -656,6 +660,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
tbCashierCart.setIsMember(shopEatTypeInfoDTO.isMemberPrice() && addCartDTO.getVipUserId() != null ? 1 : 0);
tbCashierCart.setIsMember(!shopEatTypeInfoDTO.isMemberPrice() ? 0 : addCartDTO.getVipUserId() == null ? 0 : 1);
tbCashierCart.setMemberPrice(productSku.getMemberPrice());
tbCashierCart.setIsPrint(true);
mpCashierCartService.save(tbCashierCart);
} else {
@ -686,6 +691,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
tbCashierCart.setPackFee(product.getPackFee() != null ?
product.getPackFee().multiply(addCartDTO.getNum()) : BigDecimal.ZERO);
}
tbCashierCart.setIsPrint(true);
cashierCartMapper.updateById(tbCashierCart);
}
@ -2691,6 +2697,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
tbCashierCart.setNumber(BigDecimal.valueOf(choseCountDTO.getNum()));
tbCashierCart.setTotalNumber(BigDecimal.valueOf(choseCountDTO.getNum()));
tbCashierCart.setUseType(choseCountDTO.getUseType());
tbCashierCart.setPlatformType("pc");
tbCashierCartMapper.insert(tbCashierCart);
} else {
tbCashierCart.setMemberPrice(shopInfo.getTableFee());
@ -3319,7 +3326,8 @@ public class TbShopTableServiceImpl implements TbShopTableService {
public Object waitCall(WaitCallDTO waitCallDTO) {
ShopEatTypeInfoDTO shopEatTypeInfoDTO = checkEatModel(waitCallDTO.getShopId(), waitCallDTO.getTableId(), waitCallDTO.getUseType());
List<TbCashierCart> cashierCarts = mpCashierCartService.selectByShopEatTypeAndOrderId(shopEatTypeInfoDTO,
waitCallDTO.getMasterId(), waitCallDTO.getOrderId(), TableConstant.OrderInfo.Status.CREATE, TableConstant.OrderInfo.Status.RETURN, TableConstant.OrderInfo.Status.CLOSED);
waitCallDTO.getMasterId(), waitCallDTO.getOrderId(), false, TableConstant.OrderInfo.Status.CREATE,
TableConstant.OrderInfo.Status.RETURN, TableConstant.OrderInfo.Status.CLOSED);
if (cashierCarts.isEmpty()) {
throw new BadRequestException("购物车为空");
}
@ -3337,4 +3345,122 @@ public class TbShopTableServiceImpl implements TbShopTableService {
mpCashierCartService.updateFieldValByIds(waitCallDTO.getShopId(), cartIds, TbCashierCart::getIsWaitCall, waitCallDTO.getIsWaitCall());
return mpOrderDetailService.updateFieldByCartId(TbOrderDetail::getIsWaitCall, waitCallDTO.getIsWaitCall(), cartIds);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Object switchTable(SwitchTableDTO switchTableDTO) {
// 查询当前台桌信息
ShopEatTypeInfoDTO shopEatTypeInfoDTO = checkEatModel(switchTableDTO.getShopId(), switchTableDTO.getCurrentTableId(), switchTableDTO.getUseType());
ShopEatTypeInfoDTO targetShopEatTypeInfoDTO = checkEatModel(switchTableDTO.getShopId(), switchTableDTO.getTargetTableId(), switchTableDTO.getUseType());
if (!shopEatTypeInfoDTO.isDineInAfter()) {
throw new BadRequestException("仅后付费模式支持转台");
}
TbShopTable shopTable = mpShopTableService.selectByTableId(switchTableDTO.getTargetTableId(), switchTableDTO.getShopId());
if (shopTable == null) {
throw new BadRequestException("目标台桌信息不存在");
}
if (TableConstant.ShopTable.State.CLEANING.getValue().equals(shopTable.getStatus())) {
throw new BadRequestException("当前台桌清理中,不能转台");
}
List<TbCashierCart> cashierCarts;
long totalSize = 99999;
if (switchTableDTO.isFull()) {
cashierCarts = mpCashierCartService.selectByShopEatTypeAndOrderId(shopEatTypeInfoDTO, switchTableDTO.getMasterId(), switchTableDTO.getOrderId(),
true, TableConstant.OrderInfo.Status.CREATE, TableConstant.OrderInfo.Status.RETURN);
}else {
if (switchTableDTO.getCartIds().isEmpty()) {
throw new BadRequestException("请选择转单商品");
}
totalSize = mpCashierCartService.countByShopEatType(shopEatTypeInfoDTO, switchTableDTO.getMasterId(), switchTableDTO.getOrderId(),
true, TableConstant.OrderInfo.Status.CREATE, TableConstant.OrderInfo.Status.RETURN);
cashierCarts = mpCashierCartService.selectByIds(switchTableDTO.getShopId(), null, switchTableDTO.getCartIds(),
TableConstant.OrderInfo.Status.CREATE, TableConstant.OrderInfo.Status.RETURN);
}
if (cashierCarts.isEmpty()) {
throw new BadRequestException("当前台桌购物车为空");
}
String masterId = getMasterId(switchTableDTO.getShopId(), switchTableDTO.getTargetTableId(), null, null).getString("masterId");
// 查询目标购物车
List<TbCashierCart> targetCarts = mpCashierCartService.selectByShopEatTypeAndOrderId(targetShopEatTypeInfoDTO, masterId, null, false);
TbCashierCart targetSeatFee = null;
Integer targetOrderId = null;
for (TbCashierCart targetCart : targetCarts) {
if (TableConstant.CART_SEAT_ID.equals(targetCart.getProductId())) {
targetSeatFee = targetCart;
}
if (targetCart.getOrderId() != null) {
targetOrderId = targetCart.getOrderId();
}
}
// 修改原有购物车数据
ArrayList<Integer> cartIds = new ArrayList<>();
Integer orderId = switchTableDTO.getOrderId();
TbCashierCart currentSeatFee = null;
ArrayList<TbCashierCart> updateCartInfos = new ArrayList<>();
for (TbCashierCart item : cashierCarts) {
if (targetSeatFee == null || !TableConstant.CART_SEAT_ID.equals(item.getProductId())) {
item.setTableId(switchTableDTO.getTargetTableId());
item.setMasterId(masterId);
updateCartInfos.add(item);
}
cartIds.add(item.getId());
if (item.getOrderId() != null) {
orderId = item.getOrderId();
}
if (TableConstant.CART_SEAT_ID.equals(item.getProductId())) {
currentSeatFee = item;
}
}
if (currentSeatFee != null && targetSeatFee != null) {
targetSeatFee.setNumber(currentSeatFee.getNumber().add(targetSeatFee.getNumber()));
targetSeatFee.setTotalNumber(currentSeatFee.getTotalNumber().add(targetSeatFee.getTotalNumber()));
targetSeatFee.setTotalAmount(targetSeatFee.getSalePrice().multiply(targetSeatFee.getTotalNumber()));
mpCashierCartService.updateById(targetSeatFee);
mpCashierCartService.removeById(currentSeatFee.getId());
}
mpCashierCartService.updateBatchById(updateCartInfos);
mpCashierCartService.update(new LambdaUpdateWrapper<TbCashierCart>()
.in(TbCashierCart::getId, cartIds)
.set(TbCashierCart::getOrderId, null)
.set(TbCashierCart::getPlaceNum, null));
mpOrderDetailService.removeByCartIds(cartIds);
// 删除原有台桌detail和order信息
if (orderId != null && (switchTableDTO.isFull() || switchTableDTO.getCartIds().size() == totalSize)) {
mpOrderInfoService.removeById(orderId);
}
if (!switchTableDTO.isFull() && switchTableDTO.getCartIds().size() != totalSize){
// 重新创建订单数据
CreateOrderDTO createOrderDTO = new CreateOrderDTO();
createOrderDTO.setMasterId(switchTableDTO.getMasterId());
createOrderDTO.setShopId(switchTableDTO.getShopId());
createOrderDTO.setTableId(switchTableDTO.getCurrentTableId());
createOrderDTO.setUseType(shopEatTypeInfoDTO.getUseType());
createOrder(createOrderDTO, false);
}
if (targetOrderId != null) {
// 重新创建订单数据
CreateOrderDTO createOrderDTO = new CreateOrderDTO();
createOrderDTO.setMasterId(masterId);
createOrderDTO.setShopId(switchTableDTO.getShopId());
createOrderDTO.setTableId(switchTableDTO.getTargetTableId());
createOrderDTO.setUseType(targetShopEatTypeInfoDTO.getUseType());
createOrder(createOrderDTO, false);
}
return true;
}
}

View File

@ -169,4 +169,10 @@ public interface TbShopTableService {
Object checkCoupon(ThirdCouponCheckDTO checkDTO);
Object waitCall(WaitCallDTO waitCallDTO);
/**
* 台桌转台
* @param switchTableDTO 转台参数
*/
Object switchTable(SwitchTableDTO switchTableDTO);
}

View File

@ -1,10 +1,12 @@
#PRE_DATABASE: fycashier_pre
#REDIS_HOST: 121.40.109.122
#配置数据源
spring:
datasource:
druid:
db-type: com.alibaba.druid.pool.DruidDataSource
# driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
url: jdbc:p6spy:mysql://rm-bp1kn7h89nz62cno1ro.mysql.rds.aliyuncs.com:3306/fycashier_test?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useJDBCCompliantTimezoneShift=true&serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true
url: jdbc:p6spy:mysql://rm-bp1kn7h89nz62cno1ro.mysql.rds.aliyuncs.com:3306/${PRE_DATABASE:fycashier_test}?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useJDBCCompliantTimezoneShift=true&serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true
# url: jdbc:mysql://127.0.0.1:3306/fycashier?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useJDBCCompliantTimezoneShift=true&serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true
# url: jdbc:p6spy:mysql://rm-bp1kn7h89nz62cno1ro.mysql.rds.aliyuncs.com:3306/fycashier_pre?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useJDBCCompliantTimezoneShift=true&serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true
username: cashier