|
|
@@ -112,7 +112,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 如果没有新增商品且没有商品数量增加,不允许创建订单
|
|
|
+ // 如果没有新增商品且没有商品数量增加,不允许创建/更新订单(下单后只能增不能减,不支持减量同步)
|
|
|
if (!hasNewItems && !hasQuantityIncrease) {
|
|
|
throw new RuntimeException("购物车中没有新增商品或商品数量未增加,无法创建订单");
|
|
|
}
|
|
|
@@ -577,8 +577,24 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|
|
return this.getById(orderId);
|
|
|
}
|
|
|
|
|
|
+ /** 前端只传 0=进行中、3=已完成。进行中对应库表 0待支付+1已支付,已完成对应 3。 */
|
|
|
+ private List<Integer> resolveOrderStatusFilter(Integer orderStatus) {
|
|
|
+ if (orderStatus == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ if (orderStatus == 0) {
|
|
|
+ return Arrays.asList(0, 1); // 进行中 = 待支付 + 已支付
|
|
|
+ }
|
|
|
+ if (orderStatus == 3) {
|
|
|
+ return Collections.singletonList(3); // 已完成
|
|
|
+ }
|
|
|
+ return null; // 其他值不参与筛选
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public IPage<StoreOrder> getOrderPage(Page<StoreOrder> page, Integer storeId, Integer tableId, Integer orderStatus, String keyword) {
|
|
|
+ // 前端只传 0=进行中、3=已完成。进行中=待支付(0)+已支付(1),已完成=3
|
|
|
+ List<Integer> orderStatusList = resolveOrderStatusFilter(orderStatus);
|
|
|
LambdaQueryWrapper<StoreOrder> wrapper = new LambdaQueryWrapper<>();
|
|
|
wrapper.eq(StoreOrder::getDeleteFlag, 0);
|
|
|
if (storeId != null) {
|
|
|
@@ -587,8 +603,8 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|
|
if (tableId != null) {
|
|
|
wrapper.eq(StoreOrder::getTableId, tableId);
|
|
|
}
|
|
|
- if (orderStatus != null) {
|
|
|
- wrapper.eq(StoreOrder::getOrderStatus, orderStatus);
|
|
|
+ if (orderStatusList != null && !orderStatusList.isEmpty()) {
|
|
|
+ wrapper.in(StoreOrder::getOrderStatus, orderStatusList);
|
|
|
}
|
|
|
|
|
|
// 搜索功能:按订单编号模糊搜索
|
|
|
@@ -604,7 +620,9 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|
|
|
|
|
@Override
|
|
|
public IPage<StoreOrderPageVO> getOrderPageWithCuisines(Page<StoreOrder> page, Integer storeId, Integer tableId, Integer orderStatus, String keyword) {
|
|
|
- log.info("分页查询订单列表(包含菜品信息), storeId={}, tableId={}, orderStatus={}, keyword={}", storeId, tableId, orderStatus, keyword);
|
|
|
+ // 前端只传 0=进行中、3=已完成。进行中=待支付(0)+已支付(1),已完成=3
|
|
|
+ List<Integer> orderStatusList = resolveOrderStatusFilter(orderStatus);
|
|
|
+ log.info("分页查询订单列表(包含菜品信息), storeId={}, tableId={}, orderStatus={}, keyword={}", storeId, tableId, orderStatusList, keyword);
|
|
|
|
|
|
// 限制搜索关键词长度(15字)
|
|
|
String searchKeyword = null;
|
|
|
@@ -627,8 +645,8 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|
|
if (tableId != null) {
|
|
|
orderNoWrapper.eq(StoreOrder::getTableId, tableId);
|
|
|
}
|
|
|
- if (orderStatus != null) {
|
|
|
- orderNoWrapper.eq(StoreOrder::getOrderStatus, orderStatus);
|
|
|
+ if (orderStatusList != null && !orderStatusList.isEmpty()) {
|
|
|
+ orderNoWrapper.in(StoreOrder::getOrderStatus, orderStatusList);
|
|
|
}
|
|
|
List<StoreOrder> orderNoMatches = this.list(orderNoWrapper);
|
|
|
orderNoMatches.forEach(order -> orderIdsSet.add(order.getId()));
|
|
|
@@ -640,7 +658,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|
|
.eq(StoreOrderDetail::getDeleteFlag, 0);
|
|
|
|
|
|
// 如果有限制条件,需要先查询符合条件的订单ID
|
|
|
- if (storeId != null || tableId != null || orderStatus != null) {
|
|
|
+ if (storeId != null || tableId != null || (orderStatusList != null && !orderStatusList.isEmpty())) {
|
|
|
LambdaQueryWrapper<StoreOrder> filterWrapper = new LambdaQueryWrapper<>();
|
|
|
filterWrapper.eq(StoreOrder::getDeleteFlag, 0)
|
|
|
.select(StoreOrder::getId);
|
|
|
@@ -650,8 +668,8 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|
|
if (tableId != null) {
|
|
|
filterWrapper.eq(StoreOrder::getTableId, tableId);
|
|
|
}
|
|
|
- if (orderStatus != null) {
|
|
|
- filterWrapper.eq(StoreOrder::getOrderStatus, orderStatus);
|
|
|
+ if (orderStatusList != null && !orderStatusList.isEmpty()) {
|
|
|
+ filterWrapper.in(StoreOrder::getOrderStatus, orderStatusList);
|
|
|
}
|
|
|
List<StoreOrder> filteredOrders = this.list(filterWrapper);
|
|
|
Set<Integer> filteredOrderIds = filteredOrders.stream()
|
|
|
@@ -693,8 +711,8 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|
|
if (tableId != null) {
|
|
|
wrapper.eq(StoreOrder::getTableId, tableId);
|
|
|
}
|
|
|
- if (orderStatus != null) {
|
|
|
- wrapper.eq(StoreOrder::getOrderStatus, orderStatus);
|
|
|
+ if (orderStatusList != null && !orderStatusList.isEmpty()) {
|
|
|
+ wrapper.in(StoreOrder::getOrderStatus, orderStatusList);
|
|
|
}
|
|
|
// 如果有关键词搜索,只查询匹配的订单ID
|
|
|
if (matchingOrderIds != null && !matchingOrderIds.isEmpty()) {
|
|
|
@@ -730,10 +748,23 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|
|
Map<Integer, List<StoreOrderDetail>> detailsMap = allDetails.stream()
|
|
|
.collect(Collectors.groupingBy(StoreOrderDetail::getOrderId));
|
|
|
|
|
|
- // 5. 构建返回结果
|
|
|
+ // 5. 批量查询门店名称
|
|
|
+ Set<Integer> storeIds = orders.stream().map(StoreOrder::getStoreId).filter(Objects::nonNull).collect(Collectors.toSet());
|
|
|
+ Map<Integer, String> storeNameMap = new HashMap<>();
|
|
|
+ if (!storeIds.isEmpty()) {
|
|
|
+ List<StoreInfo> storeList = storeInfoMapper.selectBatchIds(storeIds);
|
|
|
+ if (storeList != null) {
|
|
|
+ for (StoreInfo s : storeList) {
|
|
|
+ storeNameMap.put(s.getId(), s.getStoreName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 6. 构建返回结果
|
|
|
List<StoreOrderPageVO> voList = orders.stream().map(order -> {
|
|
|
StoreOrderPageVO vo = new StoreOrderPageVO();
|
|
|
vo.setOrder(order);
|
|
|
+ vo.setStoreName(storeNameMap.getOrDefault(order.getStoreId(), ""));
|
|
|
|
|
|
// 获取该订单的菜品列表
|
|
|
List<StoreOrderDetail> orderDetails = detailsMap.getOrDefault(order.getId(), new ArrayList<>());
|
|
|
@@ -753,7 +784,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|
|
return vo;
|
|
|
}).collect(Collectors.toList());
|
|
|
|
|
|
- // 6. 构建分页结果
|
|
|
+ // 7. 构建分页结果
|
|
|
Page<StoreOrderPageVO> resultPage = new Page<>(page.getCurrent(), page.getSize());
|
|
|
resultPage.setRecords(voList);
|
|
|
resultPage.setTotal(orderPage.getTotal());
|
|
|
@@ -763,148 +794,6 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public StoreOrder addDishToOrder(Integer orderId, Integer cuisineId, Integer quantity, String remark) {
|
|
|
- log.info("加餐, orderId={}, cuisineId={}, quantity={}", orderId, cuisineId, quantity);
|
|
|
-
|
|
|
- // 验证订单状态
|
|
|
- StoreOrder order = validateOrderForOperation(orderId, 0, "加餐");
|
|
|
-
|
|
|
- // 验证菜品
|
|
|
- StoreCuisine cuisine = storeCuisineMapper.selectById(cuisineId);
|
|
|
- if (cuisine == null) {
|
|
|
- throw new RuntimeException("菜品不存在");
|
|
|
- }
|
|
|
- if (cuisine.getShelfStatus() != 1) {
|
|
|
- throw new RuntimeException("菜品已下架");
|
|
|
- }
|
|
|
-
|
|
|
- // 获取当前用户信息
|
|
|
- Object[] userInfo = getCurrentUserInfo();
|
|
|
- Integer userId = (Integer) userInfo[0];
|
|
|
- String userPhone = (String) userInfo[1];
|
|
|
-
|
|
|
- // 在加餐之前,检查订单明细中是否已经有 is_add_dish=1 的记录
|
|
|
- // 如果没有,说明这是首次加餐(首次订单发生变化)
|
|
|
- LambdaQueryWrapper<StoreOrderDetail> checkBeforeAddDishWrapper = new LambdaQueryWrapper<>();
|
|
|
- checkBeforeAddDishWrapper.eq(StoreOrderDetail::getOrderId, orderId)
|
|
|
- .eq(StoreOrderDetail::getDeleteFlag, 0)
|
|
|
- .eq(StoreOrderDetail::getIsAddDish, 1);
|
|
|
- Integer addDishCountBefore = orderDetailMapper.selectCount(checkBeforeAddDishWrapper);
|
|
|
- boolean isFirstAddDish = (addDishCountBefore == null || addDishCountBefore == 0);
|
|
|
-
|
|
|
- // 查询是否已有该菜品
|
|
|
- LambdaQueryWrapper<StoreOrderDetail> detailWrapper = new LambdaQueryWrapper<>();
|
|
|
- detailWrapper.eq(StoreOrderDetail::getOrderId, orderId);
|
|
|
- detailWrapper.eq(StoreOrderDetail::getCuisineId, cuisineId);
|
|
|
- detailWrapper.eq(StoreOrderDetail::getDeleteFlag, 0);
|
|
|
- StoreOrderDetail existingDetail = orderDetailMapper.selectOne(detailWrapper);
|
|
|
-
|
|
|
- Date now = new Date();
|
|
|
- Integer quantityBefore = 0; // 加餐前的数量(用于记录变更日志)
|
|
|
- BigDecimal addAmount; // 新增的金额
|
|
|
-
|
|
|
- if (existingDetail != null) {
|
|
|
- // 记录加餐前的数量
|
|
|
- quantityBefore = existingDetail.getQuantity();
|
|
|
- // 计算新增金额(单价 * 新增数量)
|
|
|
- addAmount = existingDetail.getUnitPrice().multiply(BigDecimal.valueOf(quantity));
|
|
|
- // 更新数量
|
|
|
- existingDetail.setQuantity(existingDetail.getQuantity() + quantity);
|
|
|
- existingDetail.setSubtotalAmount(existingDetail.getUnitPrice()
|
|
|
- .multiply(BigDecimal.valueOf(existingDetail.getQuantity())));
|
|
|
- if (StringUtils.hasText(remark)) {
|
|
|
- existingDetail.setRemark(remark);
|
|
|
- }
|
|
|
- // 如果之前不是加餐,现在标记为加餐
|
|
|
- if (existingDetail.getIsAddDish() == null || existingDetail.getIsAddDish() == 0) {
|
|
|
- existingDetail.setIsAddDish(1); // 标记为加餐
|
|
|
- existingDetail.setAddDishTime(now);
|
|
|
- }
|
|
|
- existingDetail.setUpdatedTime(now);
|
|
|
- existingDetail.setUpdatedUserId(userId);
|
|
|
- orderDetailMapper.updateById(existingDetail);
|
|
|
- } else {
|
|
|
- // 添加新菜品(加餐)
|
|
|
- quantityBefore = 0; // 新菜品,加餐前数量为0
|
|
|
- // 计算新增金额(单价 * 数量)
|
|
|
- addAmount = cuisine.getTotalPrice().multiply(BigDecimal.valueOf(quantity));
|
|
|
- StoreOrderDetail detail = new StoreOrderDetail();
|
|
|
- detail.setOrderId(orderId);
|
|
|
- detail.setOrderNo(order.getOrderNo());
|
|
|
- detail.setCuisineId(cuisine.getId());
|
|
|
- detail.setCuisineName(cuisine.getName());
|
|
|
-
|
|
|
- // 设置菜品类型:如果为null,默认为1(单品)
|
|
|
- Integer cuisineType = cuisine.getCuisineType();
|
|
|
- if (cuisineType == null) {
|
|
|
- cuisineType = 1; // 默认为单品
|
|
|
- log.warn("菜品类型为null,使用默认值1, cuisineId={}", cuisine.getId());
|
|
|
- }
|
|
|
- detail.setCuisineType(cuisineType);
|
|
|
-
|
|
|
- detail.setCuisineImage(cuisine.getImages());
|
|
|
- detail.setUnitPrice(cuisine.getTotalPrice());
|
|
|
- detail.setQuantity(quantity);
|
|
|
- detail.setSubtotalAmount(addAmount);
|
|
|
- detail.setAddUserId(userId);
|
|
|
- detail.setAddUserPhone(userPhone);
|
|
|
- detail.setIsAddDish(1); // 标记为加餐
|
|
|
- detail.setAddDishTime(now);
|
|
|
- detail.setRemark(remark);
|
|
|
- detail.setCreatedUserId(userId);
|
|
|
- detail.setCreatedTime(now);
|
|
|
- detail.setUpdatedTime(now);
|
|
|
- orderDetailMapper.insert(detail);
|
|
|
- }
|
|
|
-
|
|
|
- // 增量计算订单总金额(避免重新查询所有订单明细)
|
|
|
- BigDecimal newTotalAmount = order.getTotalAmount().add(addAmount);
|
|
|
-
|
|
|
- // 加餐时只更新订单总金额,不计算优惠金额和实付金额(因为可能还会继续加菜,支付时再统一计算)
|
|
|
- // 如果订单使用了优惠券,不验证最低消费(因为可能还会继续加菜,支付时再验证)
|
|
|
- order.setTotalAmount(newTotalAmount);
|
|
|
- // order.setDiscountAmount 和 order.setPayAmount 保持不变,支付时再计算
|
|
|
- order.setUpdatedTime(new Date());
|
|
|
- order.setUpdatedUserId(userId);
|
|
|
- this.updateById(order);
|
|
|
-
|
|
|
- // 记录加餐变更日志
|
|
|
- List<shop.alien.entity.store.dto.CartItemDTO> addDishItems = new ArrayList<>();
|
|
|
- shop.alien.entity.store.dto.CartItemDTO addDishItem = new shop.alien.entity.store.dto.CartItemDTO();
|
|
|
- addDishItem.setCuisineId(cuisine.getId());
|
|
|
- addDishItem.setCuisineName(cuisine.getName());
|
|
|
- addDishItem.setCuisineType(cuisine.getCuisineType());
|
|
|
- addDishItem.setCuisineImage(cuisine.getImages());
|
|
|
- addDishItem.setUnitPrice(cuisine.getTotalPrice());
|
|
|
- // 设置当前数量(加餐后的总数量)
|
|
|
- addDishItem.setQuantity(quantityBefore + quantity);
|
|
|
- // 设置已下单数量(加餐前的数量,用于计算变化)
|
|
|
- addDishItem.setLockedQuantity(quantityBefore);
|
|
|
- addDishItem.setSubtotalAmount(cuisine.getTotalPrice().multiply(BigDecimal.valueOf(quantity)));
|
|
|
- addDishItem.setRemark(remark);
|
|
|
- addDishItems.add(addDishItem);
|
|
|
-
|
|
|
- recordOrderChangeLog(orderId, order.getOrderNo(), addDishItems, 2, now, userId, userPhone);
|
|
|
-
|
|
|
- // 如果是首次加餐(首次订单发生变化),更新餐桌状态为加餐状态(3)
|
|
|
- if (isFirstAddDish) {
|
|
|
- StoreTable table = storeTableMapper.selectById(order.getTableId());
|
|
|
- if (table != null) {
|
|
|
- table.setStatus(3); // 加餐状态
|
|
|
- table.setUpdatedTime(new Date());
|
|
|
- if (userId != null) {
|
|
|
- table.setUpdatedUserId(userId);
|
|
|
- }
|
|
|
- storeTableMapper.updateById(table);
|
|
|
- log.info("首次加餐,更新餐桌状态为加餐状态, tableId={}, orderId={}", table.getId(), orderId);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- log.info("加餐成功, orderId={}", orderId);
|
|
|
- return order;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
public boolean completeOrder(Integer orderId) {
|
|
|
log.info("完成订单, orderId={}", orderId);
|
|
|
|
|
|
@@ -1575,6 +1464,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|
|
batchVO.setOperationTime(firstLog.getOperationTime());
|
|
|
batchVO.setOperatorUserId(firstLog.getOperatorUserId());
|
|
|
batchVO.setOperatorUserPhone(firstLog.getOperatorUserPhone());
|
|
|
+ batchVO.setRemark(firstLog.getRemark());
|
|
|
|
|
|
// 计算批次统计信息
|
|
|
Integer totalQuantityChange = batchLogs.stream()
|