Commit 2ee5b1c1 by 王志超

feat: 提交自定义方案时增加变更行动人重复校验

parent 7c922cf0
Pipeline #86008 passed with stages
in 1 minute 20 seconds
......@@ -47,6 +47,7 @@ import com.netease.mail.yanxuan.change.common.bean.CommonConstants;
import com.netease.mail.yanxuan.change.common.bean.RequestLocalBean;
import com.netease.mail.yanxuan.change.common.bean.ResponseCode;
import com.netease.mail.yanxuan.change.common.enums.ChangeFlowEnum;
import com.netease.mail.yanxuan.change.common.enums.ChangeCommanderEnum;
import com.netease.mail.yanxuan.change.common.enums.ChangeResultEnum;
import com.netease.mail.yanxuan.change.common.enums.ChangeStatusEnum;
import com.netease.mail.yanxuan.change.common.enums.ChangeSubjectEnum;
......@@ -248,6 +249,8 @@ public class ChangeFlowBiz {
List<ChangeExecConfigReq> changeExecProject = changeFlowCreateReq.getChangeExecProject();
Assert.isTrue(changeExecProject.size() <= appConfig.getChangeExecLimit(),
"变更行动方案配置数超限");
// 校验变更行动方案中是否有重复的变更行动人
validateDuplicateChangeExecUser(changeExecProject);
// 结束时间不可晚于第二天定时任务执行时间
Long tomorrowSpecificTime = DateUtils.getTomorrowSpecificTime("00:00:00");
if (changeFlowCreateReq.getCreateSource() != 2) {
......@@ -633,6 +636,8 @@ public class ChangeFlowBiz {
List<ChangeExecConfigReq> changeExecProjectList = changeFlowSubmitReq.getChangeExecProjectList();
Assert.isTrue(changeExecProjectList.size() <= appConfig.getChangeExecLimit(),
"变更行动方案配置数超限");
// 校验变更行动方案中是否有重复的变更行动人
validateDuplicateChangeExecUser(changeExecProjectList);
changeRecord.setParentChangeClassId(changeFlowSubmitReq.getParentChangeClassId());
changeRecord.setSonChangeClassId(changeFlowSubmitReq.getSonChangeClassId());
List<String> execDepartmentList = changeExecProjectList.stream().map(ChangeExecConfigReq::getChangeExecDepartment)
......@@ -1572,4 +1577,73 @@ public class ChangeFlowBiz {
public FlowDataDTO getFlowNodeInfo(Long flowId) {
return flowService.flowDetail(flowId.toString());
}
/**
* 校验变更行动方案中是否有重复的变更行动人
*
* 规则:
* 1. 供应商关联角色/商品关联角色:如果 changeExecUserType 和 changeExecUser 都相同,则重复
* 2. 固定人:如果 changeExecUserType 相同且 changeExecUser(邮箱)相同,则重复
* 3. 发起人:如果 changeExecUserType 相同,则重复
*
* @param changeExecProjectList 变更行动方案列表
*/
private void validateDuplicateChangeExecUser(List<ChangeExecConfigReq> changeExecProjectList) {
if (CollectionUtils.isEmpty(changeExecProjectList)) {
return;
}
// 用于记录已选择的变更行动人
Set<String> usedExecUserKeys = new HashSet<>();
for (ChangeExecConfigReq execConfig : changeExecProjectList) {
if (execConfig.getChangeExecUserType() == null || StringUtils.isBlank(execConfig.getChangeExecUser())) {
continue;
}
Integer changeExecUserType = execConfig.getChangeExecUserType();
String changeExecUser = execConfig.getChangeExecUser();
// 构建唯一标识key
String key;
ChangeCommanderEnum commanderEnum = ChangeCommanderEnum.getChangeCommanderEnum(changeExecUserType);
if (commanderEnum == null) {
log.warn("[validateDuplicateChangeExecUser] 未知的变更行动人类型: {}", changeExecUserType);
continue;
}
switch (commanderEnum) {
case COMMANDER_ORIGINATOR:
// 发起人:只判断类型
key = changeExecUserType.toString();
break;
case FIXED_PERSON:
// 固定人:类型 + 邮箱(changeExecUser存储的是邮箱)
key = changeExecUserType + "_" + changeExecUser;
break;
case GOODS_ASSOCIATED:
case SUPPLIERS_ASSOCIATED:
// 商品关联角色/供应商关联角色:类型 + 角色名称(如"采购"、"计划"、"SQE"、"合规")
key = changeExecUserType + "_" + changeExecUser;
break;
default:
log.warn("[validateDuplicateChangeExecUser] 未处理的变更行动人类型: {}", commanderEnum);
continue;
}
// 检查是否重复
if (usedExecUserKeys.contains(key)) {
String errorMsg = String.format("变更行动方案中不能重复选择相同的变更行动人:%s-%s",
commanderEnum.getName(), changeExecUser);
log.warn("[validateDuplicateChangeExecUser] 检测到重复的变更行动人: type={}, user={}, key={}",
changeExecUserType, changeExecUser, key);
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST, errorMsg);
}
usedExecUserKeys.add(key);
log.debug("[validateDuplicateChangeExecUser] 添加变更行动人: type={}, user={}, key={}",
changeExecUserType, changeExecUser, key);
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment