fix: prevent duplicated clerk get's the same order

This commit is contained in:
irving
2025-10-27 21:50:13 -04:00
parent 8691a56f8a
commit e677ca3d33

View File

@@ -2,6 +2,7 @@ package com.starry.admin.modules.order.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -854,27 +855,83 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl<PlayOrderInfoMapper, P
**/
@Override
public void updateStateTo1(String operatorByType, String operatorBy, String acceptBy, String orderId) {
if (!OrderConstant.OperatorType.CLERK.getCode().equals(operatorByType)
&& !OrderConstant.OperatorType.ADMIN.getCode().equals(operatorByType)) {
boolean isClerkOperator = OrderConstant.OperatorType.CLERK.getCode().equals(operatorByType);
boolean isAdminOperator = OrderConstant.OperatorType.ADMIN.getCode().equals(operatorByType);
if (!isClerkOperator && !isAdminOperator) {
throw new CustomException("禁止操作");
}
PlayOrderInfoEntity orderInfo = this.selectOrderInfoById(orderId);
String previousStatus = orderInfo.getOrderStatus();
if (OrderStatus.COMPLETED.getCode().equals(previousStatus)
|| OrderStatus.CANCELLED.getCode().equals(previousStatus)) {
throw new CustomException("订单已结束,无法接单");
}
PlayClerkUserInfoEntity clerkUserInfoEntity = playClerkUserInfoService.selectById(acceptBy);
if (isClerkOperator && StringUtils.isNotBlank(orderInfo.getAcceptBy())
&& !orderInfo.getAcceptBy().equals(acceptBy)) {
throw new CustomException("订单已被接单");
}
if (isClerkOperator && !OrderStatus.PENDING.getCode().equals(previousStatus)) {
throw new CustomException("订单已被接单");
}
// 店员接单时,判断店员是否符合资格
if (OrderConstant.OperatorType.CLERK.getCode().equals(operatorByType)
&& OrderConstant.PlaceType.RANDOM.getCode().equals(orderInfo.getPlaceType())) {
// 判断店员等级是否符合规则
if (isClerkOperator && OrderConstant.PlaceType.RANDOM.getCode().equals(orderInfo.getPlaceType())) {
validateClerkQualificationForRandomOrder(orderInfo, clerkUserInfoEntity, acceptBy);
}
PlayOrderInfoEntity entity = new PlayOrderInfoEntity(orderId, OrderStatus.ACCEPTED.getCode());
LocalDateTime acceptTime = LocalDateTime.now();
entity.setAcceptBy(acceptBy);
entity.setAcceptTime(acceptTime);
ClerkEstimatedRevenueVo estimatedRevenueVo = this.getClerkEstimatedRevenue(
acceptBy,
orderInfo.getCouponIds(),
orderInfo.getPlaceType(),
orderInfo.getFirstOrder(),
orderInfo.getFinalAmount());
BigDecimal revenueAmount = estimatedRevenueVo.getRevenueAmount();
entity.setEstimatedRevenue(revenueAmount);
entity.setEstimatedRevenueRatio(estimatedRevenueVo.getRevenueRatio());
LambdaUpdateWrapper<PlayOrderInfoEntity> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(PlayOrderInfoEntity::getId, orderId);
if (isClerkOperator) {
updateWrapper.eq(PlayOrderInfoEntity::getOrderStatus, OrderStatus.PENDING.getCode());
if (StringUtils.isNotBlank(orderInfo.getAcceptBy())) {
updateWrapper.eq(PlayOrderInfoEntity::getAcceptBy, orderInfo.getAcceptBy());
} else {
updateWrapper.isNull(PlayOrderInfoEntity::getAcceptBy);
}
}
int updated = this.baseMapper.update(entity, updateWrapper);
if (updated == 0) {
if (isClerkOperator) {
throw new CustomException("订单已被接单");
}
log.warn("Failed to update order status to accepted for admin reassignment, orderId={}", orderId);
return;
}
// Set acceptBy on orderInfo for notification
orderInfo.setAcceptBy(acceptBy);
orderInfo.setAcceptTime(acceptTime);
orderInfo.setOrderStatus(OrderStatus.ACCEPTED.getCode());
orderInfo.setEstimatedRevenue(revenueAmount);
orderInfo.setEstimatedRevenueRatio(estimatedRevenueVo.getRevenueRatio());
wxCustomMpService.sendOrderMessageAsync(orderInfo);
}
private void validateClerkQualificationForRandomOrder(PlayOrderInfoEntity orderInfo,
PlayClerkUserInfoEntity clerkUserInfoEntity,
String acceptBy) {
if (orderInfo.getLevelId().equals(clerkUserInfoEntity.getLevelId())) {
PlayClerkLevelInfoEntity levelInfo = playClerkLevelInfoService
.selectPlayClerkLevelInfoById(orderInfo.getLevelId());
// throw new CustomException("等级为" + levelInfo.getName() + "的店员才可接单");
}
// 判断店员性别是否符合规则
if (!orderInfo.getSex().equals(clerkUserInfoEntity.getSex())) {
OrderConstant.Gender requiredGender = OrderConstant.Gender.fromCode(orderInfo.getSex());
throw new CustomException("性别为" + requiredGender.getDescription() + "的店员才可接单");
}
// 如果排除已下单的店员
LambdaQueryWrapper<PlayOrderInfoEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(PlayOrderInfoEntity::getAcceptBy, acceptBy);
if (OrderConstant.EXCLUDE_HISTORY_YES.equals(orderInfo.getExcludeHistory())
@@ -882,19 +939,6 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl<PlayOrderInfoMapper, P
// throw new CustomException("只有未接单的店员才可接单");
}
}
PlayOrderInfoEntity entity = new PlayOrderInfoEntity(orderId, OrderStatus.ACCEPTED.getCode());
entity.setAcceptBy(acceptBy);
entity.setAcceptTime(LocalDateTime.now());
ClerkEstimatedRevenueVo estimatedRevenueVo = this.getClerkEstimatedRevenue(acceptBy, orderInfo.getCouponIds(),
orderInfo.getPlaceType(), orderInfo.getFirstOrder(), orderInfo.getFinalAmount());
entity.setEstimatedRevenue(estimatedRevenueVo.getRevenueAmount());
entity.setEstimatedRevenueRatio(estimatedRevenueVo.getRevenueRatio());
this.baseMapper.updateById(entity);
// Set acceptBy on orderInfo for notification
orderInfo.setAcceptBy(acceptBy);
wxCustomMpService.sendOrderMessageAsync(orderInfo);
}
/**
* 获取通用的订单查询对象 订单作为主表 连接顾客用户表、店员用户表、商品表