|
@@ -292,6 +292,9 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|
|
orderDetailMapper.insert(detail);
|
|
orderDetailMapper.insert(detail);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // 记录订单变更日志
|
|
|
|
|
+ recordOrderChangeLog(finalOrder.getId(), finalOrderNo, cart.getItems(), isUpdate ? 3 : 1, now, userId, userPhone);
|
|
|
|
|
+
|
|
|
// 更新桌号的当前订单ID(如果是新订单才需要更新,更新订单时已经绑定了)
|
|
// 更新桌号的当前订单ID(如果是新订单才需要更新,更新订单时已经绑定了)
|
|
|
if (!isUpdate) {
|
|
if (!isUpdate) {
|
|
|
table.setCurrentOrderId(finalOrder.getId());
|
|
table.setCurrentOrderId(finalOrder.getId());
|
|
@@ -469,7 +472,11 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|
|
StoreOrderDetail existingDetail = orderDetailMapper.selectOne(detailWrapper);
|
|
StoreOrderDetail existingDetail = orderDetailMapper.selectOne(detailWrapper);
|
|
|
|
|
|
|
|
Date now = new Date();
|
|
Date now = new Date();
|
|
|
|
|
+ Integer quantityBefore = 0; // 加餐前的数量(用于记录变更日志)
|
|
|
|
|
+
|
|
|
if (existingDetail != null) {
|
|
if (existingDetail != null) {
|
|
|
|
|
+ // 记录加餐前的数量
|
|
|
|
|
+ quantityBefore = existingDetail.getQuantity();
|
|
|
// 更新数量
|
|
// 更新数量
|
|
|
existingDetail.setQuantity(existingDetail.getQuantity() + quantity);
|
|
existingDetail.setQuantity(existingDetail.getQuantity() + quantity);
|
|
|
existingDetail.setSubtotalAmount(existingDetail.getUnitPrice()
|
|
existingDetail.setSubtotalAmount(existingDetail.getUnitPrice()
|
|
@@ -487,6 +494,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|
|
orderDetailMapper.updateById(existingDetail);
|
|
orderDetailMapper.updateById(existingDetail);
|
|
|
} else {
|
|
} else {
|
|
|
// 添加新菜品(加餐)
|
|
// 添加新菜品(加餐)
|
|
|
|
|
+ quantityBefore = 0; // 新菜品,加餐前数量为0
|
|
|
StoreOrderDetail detail = new StoreOrderDetail();
|
|
StoreOrderDetail detail = new StoreOrderDetail();
|
|
|
detail.setOrderId(orderId);
|
|
detail.setOrderId(orderId);
|
|
|
detail.setOrderNo(order.getOrderNo());
|
|
detail.setOrderNo(order.getOrderNo());
|
|
@@ -525,6 +533,24 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|
|
order.setUpdatedUserId(userId);
|
|
order.setUpdatedUserId(userId);
|
|
|
this.updateById(order);
|
|
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);
|
|
|
|
|
+
|
|
|
log.info("加餐成功, orderId={}", orderId);
|
|
log.info("加餐成功, orderId={}", orderId);
|
|
|
return order;
|
|
return order;
|
|
|
}
|
|
}
|
|
@@ -951,6 +977,113 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderMapper, StoreOr
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
|
|
+ * 记录订单变更日志
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param orderId 订单ID
|
|
|
|
|
+ * @param orderNo 订单号
|
|
|
|
|
+ * @param items 商品列表
|
|
|
|
|
+ * @param operationType 操作类型(1:首次下单, 2:加餐, 3:更新订单)
|
|
|
|
|
+ * @param operationTime 操作时间
|
|
|
|
|
+ * @param userId 操作人ID
|
|
|
|
|
+ * @param userPhone 操作人手机号
|
|
|
|
|
+ */
|
|
|
|
|
+ private void recordOrderChangeLog(Integer orderId, String orderNo, List<shop.alien.entity.store.dto.CartItemDTO> items,
|
|
|
|
|
+ Integer operationType, Date operationTime, Integer userId, String userPhone) {
|
|
|
|
|
+ if (items == null || items.isEmpty()) {
|
|
|
|
|
+ log.warn("商品列表为空,不记录变更日志, orderId={}", orderId);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 生成批次号:ORDER{orderId}_{yyyyMMddHHmmss}
|
|
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
|
|
|
|
|
+ String timestamp = sdf.format(operationTime);
|
|
|
|
|
+ String batchNo = "ORDER" + orderId + "_" + timestamp;
|
|
|
|
|
+
|
|
|
|
|
+ List<StoreOrderChangeLog> changeLogs = new ArrayList<>();
|
|
|
|
|
+
|
|
|
|
|
+ for (shop.alien.entity.store.dto.CartItemDTO item : items) {
|
|
|
|
|
+ Integer lockedQuantity = item.getLockedQuantity(); // 已下单数量
|
|
|
|
|
+ Integer currentQuantity = item.getQuantity(); // 当前数量
|
|
|
|
|
+ Integer quantityChange = 0; // 数量变化
|
|
|
|
|
+ Integer quantityBefore = 0; // 变化前数量
|
|
|
|
|
+ Integer quantityAfter = 0; // 变化后数量
|
|
|
|
|
+
|
|
|
|
|
+ if (operationType == 1) {
|
|
|
|
|
+ // 首次下单:记录所有商品
|
|
|
|
|
+ quantityBefore = 0;
|
|
|
|
|
+ quantityAfter = currentQuantity != null ? currentQuantity : 0;
|
|
|
|
|
+ quantityChange = quantityAfter;
|
|
|
|
|
+ } else if (operationType == 2) {
|
|
|
|
|
+ // 加餐:记录加餐的商品
|
|
|
|
|
+ quantityBefore = lockedQuantity != null ? lockedQuantity : 0;
|
|
|
|
|
+ quantityAfter = currentQuantity != null ? currentQuantity : 0;
|
|
|
|
|
+ quantityChange = quantityAfter - quantityBefore;
|
|
|
|
|
+ } else if (operationType == 3) {
|
|
|
|
|
+ // 更新订单:只记录新增的商品或数量增加的商品
|
|
|
|
|
+ if (lockedQuantity == null || lockedQuantity == 0) {
|
|
|
|
|
+ // 新增商品
|
|
|
|
|
+ quantityBefore = 0;
|
|
|
|
|
+ quantityAfter = currentQuantity != null ? currentQuantity : 0;
|
|
|
|
|
+ quantityChange = quantityAfter;
|
|
|
|
|
+ } else if (currentQuantity != null && currentQuantity > lockedQuantity) {
|
|
|
|
|
+ // 数量增加
|
|
|
|
|
+ quantityBefore = lockedQuantity;
|
|
|
|
|
+ quantityAfter = currentQuantity;
|
|
|
|
|
+ quantityChange = quantityAfter - quantityBefore;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 没有变化,跳过
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 只记录有数量变化的商品
|
|
|
|
|
+ if (quantityChange == null || quantityChange == 0) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 计算金额变化
|
|
|
|
|
+ BigDecimal amountChange = item.getUnitPrice() != null
|
|
|
|
|
+ ? item.getUnitPrice().multiply(BigDecimal.valueOf(quantityChange))
|
|
|
|
|
+ : BigDecimal.ZERO;
|
|
|
|
|
+
|
|
|
|
|
+ StoreOrderChangeLog changeLog = new StoreOrderChangeLog();
|
|
|
|
|
+ changeLog.setOrderId(orderId);
|
|
|
|
|
+ changeLog.setOrderNo(orderNo);
|
|
|
|
|
+ changeLog.setBatchNo(batchNo);
|
|
|
|
|
+ changeLog.setOperationType(operationType);
|
|
|
|
|
+ changeLog.setCuisineId(item.getCuisineId());
|
|
|
|
|
+ changeLog.setCuisineName(item.getCuisineName());
|
|
|
|
|
+ changeLog.setCuisineType(item.getCuisineType());
|
|
|
|
|
+ changeLog.setCuisineImage(item.getCuisineImage());
|
|
|
|
|
+ changeLog.setUnitPrice(item.getUnitPrice());
|
|
|
|
|
+ changeLog.setQuantityChange(quantityChange);
|
|
|
|
|
+ changeLog.setQuantityBefore(quantityBefore);
|
|
|
|
|
+ changeLog.setQuantityAfter(quantityAfter);
|
|
|
|
|
+ changeLog.setAmountChange(amountChange);
|
|
|
|
|
+ changeLog.setOperationTime(operationTime);
|
|
|
|
|
+ changeLog.setOperatorUserId(userId);
|
|
|
|
|
+ changeLog.setOperatorUserPhone(userPhone);
|
|
|
|
|
+ changeLog.setRemark(item.getRemark());
|
|
|
|
|
+ changeLog.setCreatedUserId(userId);
|
|
|
|
|
+ changeLog.setCreatedTime(operationTime);
|
|
|
|
|
+ changeLog.setUpdatedTime(operationTime);
|
|
|
|
|
+
|
|
|
|
|
+ changeLogs.add(changeLog);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 批量插入变更记录
|
|
|
|
|
+ if (!changeLogs.isEmpty()) {
|
|
|
|
|
+ for (StoreOrderChangeLog log : changeLogs) {
|
|
|
|
|
+ orderChangeLogMapper.insert(log);
|
|
|
|
|
+ }
|
|
|
|
|
+ log.info("记录订单变更日志完成, orderId={}, batchNo={}, operationType={}, itemCount={}",
|
|
|
|
|
+ orderId, batchNo, operationType, changeLogs.size());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ log.warn("没有需要记录的变更, orderId={}, operationType={}", orderId, operationType);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
* 生成订单号
|
|
* 生成订单号
|
|
|
*/
|
|
*/
|
|
|
private String generateOrderNo() {
|
|
private String generateOrderNo() {
|