Commit f80e925b by 王志超

feat: 子工单流转

parent b2848267
Pipeline #86364 passed with stages
in 1 minute 26 seconds
package com.netease.mail.yanxuan.change.biz.biz;
import com.netease.mail.yanxuan.change.common.util.DateUtils;
import com.netease.mail.yanxuan.change.dal.entity.ChangeExecRecord;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeExecConfigReq;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 变更行动项业务逻辑
* @author system
*/
@Component
@Slf4j
public class ChangeExecRecordBiz {
/**
* 根据 ChangeExecConfigReq 列表构建 ChangeExecRecord 列表
*
* @param changeRecordId 变更记录ID
* @param changeExecProjectList 变更行动方案列表
* @param subFlowId 子流程工单ID(可选,主单场景传 null)
* @param subFlowRecordId 变更行动工单记录ID(可选,主单场景传 null)
* @return 变更行动项列表
*/
public List<ChangeExecRecord> buildChangeExecRecord(Long changeRecordId,
List<ChangeExecConfigReq> changeExecProjectList,
String subFlowId,
Long subFlowRecordId) {
if (CollectionUtils.isEmpty(changeExecProjectList)) {
return new ArrayList<>();
}
return changeExecProjectList.stream().map(c -> {
ChangeExecRecord changeExecRecord = new ChangeExecRecord();
changeExecRecord.setChangeRecordId(changeRecordId);
changeExecRecord.setChangeExecDepartment(c.getChangeExecDepartment());
changeExecRecord.setChangeExecUserType(c.getChangeExecUserType());
changeExecRecord.setChangeExecUser(c.getChangeExecUser());
changeExecRecord.setChangeExecUserEmail(c.getChangeExecUserEmail());
changeExecRecord.setChangeRiskDesc(c.getChangeRiskDesc());
changeExecRecord.setChangeExecProject(c.getChangeExecProject());
changeExecRecord.setChangeChecking(c.getChangeChecking());
changeExecRecord.setChangeExecFinishTime(c.getChangeExecFinishTime());
changeExecRecord.setChangeExecFinishDesc(c.getChangeExecFinishDesc());
changeExecRecord.setSubFlowId(subFlowId);
changeExecRecord.setSubFlowRecordId(subFlowRecordId);
changeExecRecord.setCreateTime(DateUtils.getCurrentTime());
changeExecRecord.setUpdateTime(DateUtils.getCurrentTime());
return changeExecRecord;
}).collect(Collectors.toList());
}
}
...@@ -157,6 +157,9 @@ public class ChangeFlowBiz { ...@@ -157,6 +157,9 @@ public class ChangeFlowBiz {
@Autowired @Autowired
private BuildAndSendEmail buildAndSendEmail; private BuildAndSendEmail buildAndSendEmail;
@Autowired
private ChangeExecRecordBiz changeExecRecordBiz;
@Transactional @Transactional
public String createAndSubmit(ChangeFlowCreateReq changeFlowCreateReq) { public String createAndSubmit(ChangeFlowCreateReq changeFlowCreateReq) {
String uid = RequestLocalBean.getUid(); String uid = RequestLocalBean.getUid();
...@@ -272,7 +275,7 @@ public class ChangeFlowBiz { ...@@ -272,7 +275,7 @@ public class ChangeFlowBiz {
ChangeRecord changeRecord = buildChangeRecord(flowId, nodeId, changeFlowCreateReq, changeCommander, uid); ChangeRecord changeRecord = buildChangeRecord(flowId, nodeId, changeFlowCreateReq, changeCommander, uid);
changeFlowService.saveRecord(changeRecord); changeFlowService.saveRecord(changeRecord);
// 保存变更行动方案记录(不绑定子流程,待触发时再创建) // 保存变更行动方案记录(不绑定子流程,待触发时再创建)
List<ChangeExecRecord> changeExecRecords = buildChangeExecRecord(changeRecord.getId(), changeExecProject); List<ChangeExecRecord> changeExecRecords = changeExecRecordBiz.buildChangeExecRecord(changeRecord.getId(), changeExecProject, null, null);
changeExecRecords.forEach(exec -> changeFlowExecService.saveRecord(exec)); changeExecRecords.forEach(exec -> changeFlowExecService.saveRecord(exec));
// 保存附件 // 保存附件
...@@ -420,7 +423,7 @@ public class ChangeFlowBiz { ...@@ -420,7 +423,7 @@ public class ChangeFlowBiz {
} }
// 更新节点id,使用返回的节点ID // 更新节点id,使用返回的节点ID
changeRecord.setFlowNode(nextNodeId); changeRecord.setFlowNode(nextNodeId);
changeRecord.setState(ChangeStatusEnum.IN.getStatus()); changeRecord.setState(ChangeStatusEnum.WAIT_SUBMIT_CHANGE_APPLY.getStatus());
changeRecord.setUpdateTime(DateUtils.getCurrentTime()); changeRecord.setUpdateTime(DateUtils.getCurrentTime());
changeFlowService.updateRecord(changeRecord); changeFlowService.updateRecord(changeRecord);
} }
...@@ -473,6 +476,7 @@ public class ChangeFlowBiz { ...@@ -473,6 +476,7 @@ public class ChangeFlowBiz {
iusDepartmentReq.setIcac(true); iusDepartmentReq.setIcac(true);
iusDepartmentReq.setUids(receiver); iusDepartmentReq.setUids(receiver);
HashMap<String, List<SecondaryDepartments>> map = iusService.queryDepartment(iusDepartmentReq); HashMap<String, List<SecondaryDepartments>> map = iusService.queryDepartment(iusDepartmentReq);
log.info("[getDepartmentInfo] receiver: {}, map:{}", receiver, JSON.toJSONString(map));
ArrayList<List<SecondaryDepartments>> secondaryDepartments = new ArrayList<>(map.values()); ArrayList<List<SecondaryDepartments>> secondaryDepartments = new ArrayList<>(map.values());
List<String> ccList = new ArrayList<>(); List<String> ccList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(secondaryDepartments)) { if (CollectionUtils.isNotEmpty(secondaryDepartments)) {
...@@ -525,26 +529,6 @@ public class ChangeFlowBiz { ...@@ -525,26 +529,6 @@ public class ChangeFlowBiz {
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} }
private List<ChangeExecRecord> buildChangeExecRecord(Long changeRecordId,
List<ChangeExecConfigReq> changeExecProject) {
return changeExecProject.stream().map(c -> {
ChangeExecRecord changeExecRecord = new ChangeExecRecord();
changeExecRecord.setChangeRecordId(changeRecordId);
changeExecRecord.setChangeExecDepartment(c.getChangeExecDepartment());
changeExecRecord.setChangeExecUserType(c.getChangeExecUserType());
changeExecRecord.setChangeExecUser(c.getChangeExecUser());
changeExecRecord.setChangeExecUserEmail(c.getChangeExecUserEmail());
changeExecRecord.setChangeRiskDesc(c.getChangeRiskDesc());
changeExecRecord.setChangeExecProject(c.getChangeExecProject());
changeExecRecord.setChangeChecking(c.getChangeChecking());
changeExecRecord.setChangeExecFinishTime(c.getChangeExecFinishTime());
changeExecRecord.setChangeExecFinishDesc(c.getChangeExecFinishDesc());
changeExecRecord.setCreateTime(DateUtils.getCurrentTime());
changeExecRecord.setUpdateTime(DateUtils.getCurrentTime());
return changeExecRecord;
}).collect(Collectors.toList());
}
/** /**
* 构建工单内容 * 构建工单内容
* *
...@@ -606,7 +590,7 @@ public class ChangeFlowBiz { ...@@ -606,7 +590,7 @@ public class ChangeFlowBiz {
changeRecord.setChangeProfit(changeFlowCreateReq.getChangeProfit()); changeRecord.setChangeProfit(changeFlowCreateReq.getChangeProfit());
changeRecord.setChangeProfitDesc(changeFlowCreateReq.getChangeProfitDesc()); changeRecord.setChangeProfitDesc(changeFlowCreateReq.getChangeProfitDesc());
changeRecord.setChangeConfirmResultTime(changeFlowCreateReq.getChangeConfirmResultTime()); changeRecord.setChangeConfirmResultTime(changeFlowCreateReq.getChangeConfirmResultTime());
changeRecord.setState(ChangeStatusEnum.WAIT.getStatus()); changeRecord.setState(ChangeStatusEnum.WAIT_SUBMIT_CHANGE_APPLY.getStatus());
// 变更结论 // 变更结论
changeRecord.setCreateSource(changeFlowCreateReq.getCreateSource()); changeRecord.setCreateSource(changeFlowCreateReq.getCreateSource());
changeRecord.setCreateSupplier(changeFlowCreateReq.getSupplier()); changeRecord.setCreateSupplier(changeFlowCreateReq.getSupplier());
...@@ -667,8 +651,12 @@ public class ChangeFlowBiz { ...@@ -667,8 +651,12 @@ public class ChangeFlowBiz {
} }
// 变更行动项不可为空,最多20项 // 变更行动项不可为空,最多20项
List<ChangeExecConfigReq> changeExecProjectList = changeFlowSubmitReq.getChangeExecProjectList(); List<ChangeExecConfigReq> changeExecProjectList = changeFlowSubmitReq.getChangeExecProjectList();
Assert.isTrue(changeExecProjectList.size() <= appConfig.getChangeExecLimit(), if (CollectionUtils.isEmpty(changeExecProjectList)) {
"变更行动方案配置数超限"); throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST, "变更行动方案不能为空");
}
if (changeExecProjectList.size() > appConfig.getChangeExecLimit()) {
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST, "变更行动方案配置数超限");
}
// 校验变更行动方案中是否有重复的变更行动人 // 校验变更行动方案中是否有重复的变更行动人
validateDuplicateChangeExecUser(changeExecProjectList); validateDuplicateChangeExecUser(changeExecProjectList);
changeRecord.setParentChangeClassId(changeFlowSubmitReq.getParentChangeClassId()); changeRecord.setParentChangeClassId(changeFlowSubmitReq.getParentChangeClassId());
...@@ -695,8 +683,8 @@ public class ChangeFlowBiz { ...@@ -695,8 +683,8 @@ public class ChangeFlowBiz {
Integer changeExecCount = changeFlowExecService.deleteByChangeRecordId(changeRecord.getId()); Integer changeExecCount = changeFlowExecService.deleteByChangeRecordId(changeRecord.getId());
log.debug("[NEW_CHANGE_FLOW_START] delete id:{}, changeExecCount:{}", changeRecord.getId(), changeExecCount); log.debug("[NEW_CHANGE_FLOW_START] delete id:{}, changeExecCount:{}", changeRecord.getId(), changeExecCount);
// 保存变更行动方案记录 // 保存变更行动方案记录
List<ChangeExecRecord> changeExecRecords = buildChangeExecRecord(changeRecord.getId(), List<ChangeExecRecord> changeExecRecords = changeExecRecordBiz.buildChangeExecRecord(changeRecord.getId(),
changeFlowSubmitReq.getChangeExecProjectList()); changeFlowSubmitReq.getChangeExecProjectList(), null, null);
changeExecRecords.forEach(exec -> changeFlowExecService.saveRecord(exec)); changeExecRecords.forEach(exec -> changeFlowExecService.saveRecord(exec));
// 更新附件,覆盖操作,先删除,后插入 // 更新附件,覆盖操作,先删除,后插入
Integer fileCount = changeFileService.deleteByChangeRecordId(changeRecord.getId()); Integer fileCount = changeFileService.deleteByChangeRecordId(changeRecord.getId());
......
...@@ -25,6 +25,7 @@ import com.netease.mail.yanxuan.change.dal.entity.ChangeRecord; ...@@ -25,6 +25,7 @@ import com.netease.mail.yanxuan.change.dal.entity.ChangeRecord;
import com.netease.mail.yanxuan.change.dal.entity.ChangeSubFlowRecord; import com.netease.mail.yanxuan.change.dal.entity.ChangeSubFlowRecord;
import com.netease.mail.yanxuan.change.dal.mapper.ChangeRecordMapper; import com.netease.mail.yanxuan.change.dal.mapper.ChangeRecordMapper;
import com.netease.mail.yanxuan.change.dal.mapper.ChangeSubFlowRecordMapper; import com.netease.mail.yanxuan.change.dal.mapper.ChangeSubFlowRecordMapper;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeExecConfigReq;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowListQueryReq; import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowListQueryReq;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowCreateReq; import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowCreateReq;
import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowListQueryReq; import com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowListQueryReq;
...@@ -79,6 +80,9 @@ public class ChangeSubFlowBiz { ...@@ -79,6 +80,9 @@ public class ChangeSubFlowBiz {
private ChangeFlowBiz changeFlowBiz; private ChangeFlowBiz changeFlowBiz;
@Autowired @Autowired
private ChangeExecRecordBiz changeExecRecordBiz;
@Autowired
private IusRpcService iusRpcService; private IusRpcService iusRpcService;
@Autowired @Autowired
...@@ -140,16 +144,12 @@ public class ChangeSubFlowBiz { ...@@ -140,16 +144,12 @@ public class ChangeSubFlowBiz {
String currentNode = subFlowRecord.getSubFlowNode(); String currentNode = subFlowRecord.getSubFlowNode();
this.checkNode(currentNode, Collections.singletonList(changeSubFlowSubmitReq.getCurrentNodeId())); this.checkNode(currentNode, Collections.singletonList(changeSubFlowSubmitReq.getCurrentNodeId()));
// 通过行动工单记录ID查询行动项记录(取第一个)
List<ChangeExecRecord> execRecords = changeFlowExecService.getBySubFlowRecordId(subFlowRecord.getId());
Assert.notEmpty(execRecords, "行动项记录不存在");
ChangeExecRecord execRecord = execRecords.get(0);
String uid = RequestLocalBean.getUid(); String uid = RequestLocalBean.getUid();
// 验证执行人权限 // 验证执行人权限:检查当前用户是否在行动工单的审批人列表中(JSON格式:["user1@example.com", "user2@example.com"])
if (!uid.equals(execRecord.getChangeExecUserEmail())) { //if (StringUtils.isBlank(subFlowRecord.getApprover())
throw ExceptionFactory.createBiz(ResponseCode.NO_AUTH, ResponseCode.NO_AUTH.getMsg()); // || !subFlowRecord.getApprover().contains("\"" + uid + "\"")) {
} // throw ExceptionFactory.createBiz(ResponseCode.NO_AUTH, ResponseCode.NO_AUTH.getMsg());
//}
// 获取工单详情 // 获取工单详情
FlowDataDTO flowDataDTO = flowService.flowDetail(subFlowId); FlowDataDTO flowDataDTO = flowService.flowDetail(subFlowId);
...@@ -157,15 +157,14 @@ public class ChangeSubFlowBiz { ...@@ -157,15 +157,14 @@ public class ChangeSubFlowBiz {
throw ExceptionFactory.createBiz(ResponseCode.DETAIL_FLOW_ERROR, "子流程工单查询错误,不存在"); throw ExceptionFactory.createBiz(ResponseCode.DETAIL_FLOW_ERROR, "子流程工单查询错误,不存在");
} }
return checkUpdateAndSubmit(subFlowId, flowDataDTO, uid, execRecord, subFlowRecord, currentNode, changeSubFlowSubmitReq); return checkUpdateAndSubmit(subFlowId, flowDataDTO, uid, subFlowRecord, currentNode, changeSubFlowSubmitReq);
} }
/** /**
* 检查并提交子流程节点 * 检查并提交子流程节点
*/ */
private String checkUpdateAndSubmit(String subFlowId, FlowDataDTO flowDataDTO, String uid, private String checkUpdateAndSubmit(String subFlowId, FlowDataDTO flowDataDTO, String uid,
ChangeExecRecord execRecord, ChangeSubFlowRecord subFlowRecord, ChangeSubFlowRecord subFlowRecord, String currentNode, ChangeSubFlowSubmitReq changeSubFlowSubmitReq) {
String currentNode, ChangeSubFlowSubmitReq changeSubFlowSubmitReq) {
ChangeFlowEnum node = ChangeFlowEnum.getByNodeId(currentNode); ChangeFlowEnum node = ChangeFlowEnum.getByNodeId(currentNode);
Assert.notNull(node, "节点配置不存在"); Assert.notNull(node, "节点配置不存在");
log.debug("[checkUpdateAndSubmit] subFlowId:{}, nodeEnum:{}, changeSubFlowSubmitReq:{}", log.debug("[checkUpdateAndSubmit] subFlowId:{}, nodeEnum:{}, changeSubFlowSubmitReq:{}",
...@@ -178,14 +177,56 @@ public class ChangeSubFlowBiz { ...@@ -178,14 +177,56 @@ public class ChangeSubFlowBiz {
switch (node) { switch (node) {
case CHANGE_SUB_FLOW_START: case CHANGE_SUB_FLOW_START:
// 确认行动方案节点,直接提交到下一节点 // 确认行动方案节点:删除旧的行动项,重新创建
List<ChangeExecConfigReq> changeExecProjectList = changeSubFlowSubmitReq.getChangeExecProjectList();
// 校验行动项列表不能为空
if (CollectionUtils.isEmpty(changeExecProjectList)) {
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST, "行动项列表不能为空");
}
// 校验行动项列表:所有行动项必须是同一个部门+人的组合,且与子单记录一致
String expectedDepartment = subFlowRecord.getChangeExecDepartment();
String expectedUserEmail = subFlowRecord.getChangeExecUserEmail();
// 校验所有行动项的部门+邮箱必须与子单记录一致
changeExecProjectList.forEach(execConfig -> {
String dept = execConfig.getChangeExecDepartment();
String userEmail = execConfig.getChangeExecUserEmail();
if (StringUtils.isBlank(dept) || StringUtils.isBlank(userEmail)) {
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST,
"行动项中部门或行动人邮箱不能为空");
}
if (!expectedDepartment.equals(dept) || !expectedUserEmail.equals(userEmail)) {
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST,
String.format("行动项的部门+人组合必须与子单记录一致。子单记录:部门[%s],行动人[%s];当前行动项:部门[%s],行动人[%s]",
expectedDepartment, expectedUserEmail, dept, userEmail));
}
});
// 删除子单下所有行动项
changeFlowExecService.deleteBySubFlowRecordId(subFlowRecord.getId());
// 根据前端传递的行动项列表重新创建
List<ChangeExecRecord> newExecRecords = changeExecRecordBiz.buildChangeExecRecord(
subFlowRecord.getChangeRecordId(),
changeExecProjectList,
subFlowId,
subFlowRecord.getId());
newExecRecords.forEach(exec -> changeFlowExecService.saveRecord(exec));
// 提交到下一节点
String nextNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid, String nextNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid,
ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true, ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true,
FlowxOperationEnum.SUBMIT.getName(), "提交工单", execRecord.getCreateTime()); FlowxOperationEnum.SUBMIT.getName(), "提交工单", subFlowRecord.getCreateTime());
// 更新行动工单节点ID // 更新行动工单节点ID
subFlowRecord.setSubFlowNode(nextNodeId); subFlowRecord.setSubFlowNode(nextNodeId);
// TODO: 根据业务逻辑设置状态 subFlowRecord.setStatus(...) subFlowRecord.setStatus(ChangeSubFlowStatusEnum.WAIT_APPROVE_ACTION_PLAN.getStatus());
subFlowRecord.setUpdateTime(DateUtils.getCurrentTime()); subFlowRecord.setUpdateTime(DateUtils.getCurrentTime());
// todo: 获取上级领导
subFlowRecord.setApprover("");
changeSubFlowRecordService.update(subFlowRecord); changeSubFlowRecordService.update(subFlowRecord);
return nextNodeId; return nextNodeId;
...@@ -193,7 +234,7 @@ public class ChangeSubFlowBiz { ...@@ -193,7 +234,7 @@ public class ChangeSubFlowBiz {
// 审批行动方案节点,直接提交到执行节点 // 审批行动方案节点,直接提交到执行节点
String execNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid, String execNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid,
ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true, ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true,
FlowxOperationEnum.SUBMIT.getName(), "提交工单", execRecord.getCreateTime()); FlowxOperationEnum.SUBMIT.getName(), "提交工单", subFlowRecord.getCreateTime());
// 更新行动工单节点ID // 更新行动工单节点ID
subFlowRecord.setSubFlowNode(execNodeId); subFlowRecord.setSubFlowNode(execNodeId);
// TODO: 根据业务逻辑设置状态 subFlowRecord.setStatus(...) // TODO: 根据业务逻辑设置状态 subFlowRecord.setStatus(...)
...@@ -205,7 +246,7 @@ public class ChangeSubFlowBiz { ...@@ -205,7 +246,7 @@ public class ChangeSubFlowBiz {
// 执行行动方案节点,直接提交到提交执行结果节点 // 执行行动方案节点,直接提交到提交执行结果节点
String confirmNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid, String confirmNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid,
ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true, ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true,
FlowxOperationEnum.SUBMIT.getName(), "提交工单", execRecord.getCreateTime()); FlowxOperationEnum.SUBMIT.getName(), "提交工单", subFlowRecord.getCreateTime());
// 更新行动工单节点ID // 更新行动工单节点ID
subFlowRecord.setSubFlowNode(confirmNodeId); subFlowRecord.setSubFlowNode(confirmNodeId);
// TODO: 根据业务逻辑设置状态 subFlowRecord.setStatus(...) // TODO: 根据业务逻辑设置状态 subFlowRecord.setStatus(...)
...@@ -232,7 +273,7 @@ public class ChangeSubFlowBiz { ...@@ -232,7 +273,7 @@ public class ChangeSubFlowBiz {
// 提交到结束节点 // 提交到结束节点
String endNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid, String endNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid,
ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true, ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true,
FlowxOperationEnum.SUBMIT.getName(), "提交工单", execRecord.getCreateTime()); FlowxOperationEnum.SUBMIT.getName(), "提交工单", subFlowRecord.getCreateTime());
// 更新行动工单节点ID // 更新行动工单节点ID
subFlowRecord.setSubFlowNode(endNodeId); subFlowRecord.setSubFlowNode(endNodeId);
// TODO: 根据业务逻辑设置状态 subFlowRecord.setStatus(...) // TODO: 根据业务逻辑设置状态 subFlowRecord.setStatus(...)
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
package com.netease.mail.yanxuan.change.dal.meta.model.req; package com.netease.mail.yanxuan.change.dal.meta.model.req;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import java.util.List;
import lombok.Data; import lombok.Data;
...@@ -39,5 +40,10 @@ public class ChangeSubFlowSubmitReq { ...@@ -39,5 +40,10 @@ public class ChangeSubFlowSubmitReq {
* 行动完成情况(提交执行结果时必填) * 行动完成情况(提交执行结果时必填)
*/ */
private String changeExecFinishDesc; private String changeExecFinishDesc;
/**
* 行动项列表(确认行动方案时使用)
*/
private List<ChangeExecConfigReq> changeExecProjectList;
} }
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