fix: prevent duplicated clerk get's the same order
This commit is contained in:
@@ -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;
|
||||
@@ -851,51 +852,94 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl<PlayOrderInfoMapper, P
|
||||
* @param operatorBy 操作人ID
|
||||
* @param acceptBy 接单人ID
|
||||
* @param orderId 订单Id
|
||||
**/
|
||||
**/
|
||||
@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 (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())
|
||||
&& this.baseMapper.selectOne(lambdaQueryWrapper) != null) {
|
||||
// throw new CustomException("只有未接单的店员才可接单");
|
||||
}
|
||||
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(LocalDateTime.now());
|
||||
ClerkEstimatedRevenueVo estimatedRevenueVo = this.getClerkEstimatedRevenue(acceptBy, orderInfo.getCouponIds(),
|
||||
orderInfo.getPlaceType(), orderInfo.getFirstOrder(), orderInfo.getFinalAmount());
|
||||
entity.setEstimatedRevenue(estimatedRevenueVo.getRevenueAmount());
|
||||
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());
|
||||
this.baseMapper.updateById(entity);
|
||||
|
||||
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())
|
||||
&& this.baseMapper.selectOne(lambdaQueryWrapper) != null) {
|
||||
// throw new CustomException("只有未接单的店员才可接单");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取通用的订单查询对象 订单作为主表 连接顾客用户表、店员用户表、商品表
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user