diff --git a/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskTransferApi.java b/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskTransferApi.java index 181c5db680088ffe05da1ef91cdb18cb43b9ef30..43ca36aa5c6ae7c19975d84e1016b3b03be4c354 100644 --- a/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskTransferApi.java +++ b/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskTransferApi.java @@ -3,31 +3,18 @@ package neatlogic.module.process.api.processtask; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import neatlogic.framework.asynchronization.threadlocal.UserContext; import neatlogic.framework.auth.core.AuthAction; import neatlogic.framework.common.constvalue.ApiParamType; -import neatlogic.framework.common.constvalue.GroupSearch; import neatlogic.framework.process.auth.PROCESS_BASE; -import neatlogic.framework.process.constvalue.ProcessTaskStepDataType; -import neatlogic.framework.process.constvalue.ProcessUserType; -import neatlogic.framework.process.dto.ProcessTaskStepDataVo; -import neatlogic.framework.process.dto.ProcessTaskStepVo; -import neatlogic.framework.process.dto.ProcessTaskStepWorkerVo; -import neatlogic.framework.process.dto.ProcessTaskVo; -import neatlogic.framework.process.exception.process.ProcessStepHandlerNotFoundException; -import neatlogic.framework.process.stephandler.core.IProcessStepHandler; -import neatlogic.framework.process.stephandler.core.ProcessStepHandlerFactory; import neatlogic.framework.restful.annotation.*; import neatlogic.framework.restful.constvalue.OperationTypeEnum; import neatlogic.framework.restful.core.privateapi.PrivateApiComponentBase; -import neatlogic.module.process.dao.mapper.processtask.ProcessTaskStepDataMapper; import neatlogic.module.process.service.ProcessTaskService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; -import java.util.Objects; @Service @OperationType(type = OperationTypeEnum.UPDATE) @@ -36,9 +23,6 @@ public class ProcessTaskTransferApi extends PrivateApiComponentBase { @Autowired private ProcessTaskService processTaskService; - - @Autowired - private ProcessTaskStepDataMapper processTaskStepDataMapper; @Override public String getToken() { @@ -67,43 +51,20 @@ public class ProcessTaskTransferApi extends PrivateApiComponentBase { @Output({}) @Description(desc = "nmpap.processtasktransferapi.getname") public Object myDoService(JSONObject jsonObj) throws Exception { - Long processTaskId = jsonObj.getLong("processTaskId"); - Long processTaskStepId = jsonObj.getLong("processTaskStepId"); - ProcessTaskVo processTaskVo = processTaskService.checkProcessTaskParamsIsLegal(processTaskId, processTaskStepId); - ProcessTaskStepVo processTaskStepVo = processTaskVo.getCurrentProcessTaskStep(); - IProcessStepHandler handler = ProcessStepHandlerFactory.getHandler(processTaskStepVo.getHandler()); - if(handler == null) { - throw new ProcessStepHandlerNotFoundException(processTaskStepVo.getHandler()); - } - List processTaskStepWorkerList = new ArrayList(); - List workerList = new ArrayList<>(); - Object workerListObj = jsonObj.get("workerList"); - if(workerListObj instanceof JSONArray) { - workerList = JSON.parseArray(JSON.toJSONString(workerListObj), String.class); - }else if(workerListObj instanceof String) { - workerList.add((String)workerListObj); - } - for(String worker : workerList) { - String[] split = worker.split("#"); - if(GroupSearch.getValue(split[0]) != null) { - processTaskStepWorkerList.add(new ProcessTaskStepWorkerVo(processTaskId, processTaskStepId, split[0], split[1], ProcessUserType.MAJOR.getValue())); - } - } - Integer isSaveData = jsonObj.getInteger("isSaveData"); - if (Objects.equals(isSaveData, 1)) { - JSONObject data = processTaskService.getProcessTaskStepStagingData(processTaskId, processTaskStepId); - processTaskStepVo.getParamObj().putAll(data); - } - processTaskStepVo.getParamObj().putAll(jsonObj); - handler.transfer(processTaskStepVo,processTaskStepWorkerList); - if (Objects.equals(isSaveData, 1)) { - ProcessTaskStepDataVo processTaskStepDataVo = new ProcessTaskStepDataVo(); - processTaskStepDataVo.setProcessTaskId(processTaskId); - processTaskStepDataVo.setProcessTaskStepId(processTaskStepId); - processTaskStepDataVo.setFcu(UserContext.get().getUserUuid(true)); - processTaskStepDataVo.setType(ProcessTaskStepDataType.STEPDRAFTSAVE.getValue()); - processTaskStepDataMapper.deleteProcessTaskStepData(processTaskStepDataVo); + Long processTaskId = jsonObj.getLong("processTaskId"); + Long processTaskStepId = jsonObj.getLong("processTaskStepId"); + + List workerList = new ArrayList<>(); + Object workerListObj = jsonObj.get("workerList"); + if(workerListObj instanceof JSONArray) { + workerList = JSON.parseArray(JSON.toJSONString(workerListObj), String.class); + }else if(workerListObj instanceof String) { + workerList.add((String)workerListObj); } + Integer isSaveData = jsonObj.getInteger("isSaveData"); + String source = jsonObj.getString("source"); + String content = jsonObj.getString("content"); + processTaskService.transferProcessTaskStep(processTaskId, processTaskStepId, workerList, isSaveData, content, source); return null; } diff --git a/src/main/java/neatlogic/module/process/api/processtask/task/ProcessTaskStepTaskSaveApi.java b/src/main/java/neatlogic/module/process/api/processtask/task/ProcessTaskStepTaskSaveApi.java index 824568dcb520d6adda317bb4a929fdb4ce78dc54..cacd1eeb43c023b703e535aa236a72d42b0f0809 100644 --- a/src/main/java/neatlogic/module/process/api/processtask/task/ProcessTaskStepTaskSaveApi.java +++ b/src/main/java/neatlogic/module/process/api/processtask/task/ProcessTaskStepTaskSaveApi.java @@ -15,43 +15,22 @@ along with this program. If not, see .*/ package neatlogic.module.process.api.processtask.task; -import neatlogic.framework.asynchronization.threadlocal.UserContext; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import neatlogic.framework.auth.core.AuthAction; import neatlogic.framework.common.constvalue.ApiParamType; -import neatlogic.framework.common.constvalue.GroupSearch; -import neatlogic.framework.dao.mapper.UserMapper; -import neatlogic.framework.dto.UserVo; import neatlogic.framework.exception.type.ParamIrregularException; import neatlogic.framework.process.auth.PROCESS_BASE; -import neatlogic.framework.process.constvalue.*; -import neatlogic.module.process.dao.mapper.processtask.ProcessTaskMapper; -import neatlogic.module.process.dao.mapper.processtask.ProcessTaskStepTaskMapper; -import neatlogic.module.process.dao.mapper.task.TaskMapper; -import neatlogic.framework.process.dto.*; -import neatlogic.framework.process.exception.process.ProcessStepUtilHandlerNotFoundException; -import neatlogic.framework.process.exception.processtask.ProcessTaskStepNotFoundException; -import neatlogic.framework.process.exception.processtask.task.*; -import neatlogic.framework.process.notify.constvalue.ProcessTaskStepTaskNotifyTriggerType; -import neatlogic.framework.process.operationauth.core.ProcessAuthManager; -import neatlogic.module.process.service.IProcessStepHandlerUtil; -import neatlogic.framework.process.stephandler.core.IProcessStepInternalHandler; -import neatlogic.framework.process.stephandler.core.ProcessStepInternalHandlerFactory; +import neatlogic.framework.process.dto.ProcessTaskStepTaskVo; import neatlogic.framework.restful.annotation.*; import neatlogic.framework.restful.constvalue.OperationTypeEnum; import neatlogic.framework.restful.core.privateapi.PrivateApiComponentBase; -import neatlogic.framework.service.UserService; import neatlogic.module.process.service.ProcessTaskStepTaskService; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.MapUtils; -import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.*; -import java.util.stream.Collectors; /** * @author lvzk @@ -62,20 +41,9 @@ import java.util.stream.Collectors; @OperationType(type = OperationTypeEnum.CREATE) @AuthAction(action = PROCESS_BASE.class) public class ProcessTaskStepTaskSaveApi extends PrivateApiComponentBase { - @Resource - ProcessTaskMapper processTaskMapper; - @Resource - ProcessTaskStepTaskMapper processTaskStepTaskMapper; + @Resource ProcessTaskStepTaskService processTaskStepTaskService; - @Resource - TaskMapper taskMapper; - @Resource - UserService userService; - @Resource - UserMapper userMapper; - @Resource - IProcessStepHandlerUtil processStepHandlerUtil; @Override public String getToken() { @@ -106,212 +74,13 @@ public class ProcessTaskStepTaskSaveApi extends PrivateApiComponentBase { @Description(desc = "保存任务接口") @Override public Object myDoService(JSONObject jsonObj) throws Exception { - ProcessTaskStepTaskVo processTaskStepTaskVo = jsonObj.toJavaObject(ProcessTaskStepTaskVo.class); - // 第一步 判断入参是否合法 - Long processTaskStepId = processTaskStepTaskVo.getProcessTaskStepId(); - ProcessTaskStepVo processTaskStepVo = processTaskMapper.getProcessTaskStepBaseInfoById(processTaskStepId); - if (processTaskStepVo == null) { - throw new ProcessTaskStepNotFoundException(processTaskStepId.toString()); - } - - //获取流程步骤配置中的 任务策略和人员范围 - JSONObject taskConfig = processTaskStepTaskService.getTaskConfig(processTaskStepVo.getConfigHash()); - if (MapUtils.isEmpty(taskConfig)) { - throw new TaskConfigException(processTaskStepVo.getName()); - } - - Long taskConfigId = processTaskStepTaskVo.getTaskConfigId(); - JSONArray taskConfigIdArray = taskConfig.getJSONArray("idList"); - if (CollectionUtils.isEmpty(taskConfigIdArray)) { - throw new ProcessTaskStepTaskConfigIllegalException(taskConfigId.toString()); - } - List taskConfigIdList = taskConfigIdArray.toJavaList(Long.class); - if (!taskConfigIdList.contains(taskConfigId)) { - throw new ProcessTaskStepTaskConfigIllegalException(taskConfigId.toString()); - } - TaskConfigVo taskConfigVo = taskMapper.getTaskConfigById(taskConfigId); - if (taskConfigVo == null) { - throw new ProcessTaskStepTaskConfigIllegalException(taskConfigId.toString()); - } - + Long id = jsonObj.getLong("id"); + String source = jsonObj.getString("source"); JSONArray stepTaskUserVoList = jsonObj.getJSONArray("stepTaskUserVoList"); if (CollectionUtils.isEmpty(stepTaskUserVoList)) { throw new ParamIrregularException("stepTaskUserVoList"); } - int num = taskConfigVo.getNum(); - if (num != -1 && num != stepTaskUserVoList.size()) { - throw new ProcessTaskStepTaskUserCountIllegalException(taskConfigVo.getName(), taskConfigVo.getNum()); - } - List allUserUuidList = new ArrayList<>(); - Set newUserUuidSet = new HashSet<>(); - Map stepTaskUserMap = new HashMap<>(); - for (int i = 0; i < stepTaskUserVoList.size(); i++) { - JSONObject stepTaskUserObj = stepTaskUserVoList.getJSONObject(i); - String userUuid = stepTaskUserObj.getString("userUuid"); - if (StringUtils.isBlank(userUuid)) { - throw new ParamIrregularException("stepTaskUserVoList[" + i + "].userUuid"); - } - allUserUuidList.add(userUuid); - Long stepTaskUserId = stepTaskUserObj.getLong("id"); - if (stepTaskUserId == null) { - newUserUuidSet.add(userUuid); - continue; - } - stepTaskUserMap.put(stepTaskUserId, userUuid); - } - - JSONArray rangeList = taskConfig.getJSONArray("rangeList"); - if (CollectionUtils.isNotEmpty(rangeList)) { - //校验用户是否在配置范围内 - checkUserIsLegal(allUserUuidList.stream().map(Object::toString).collect(Collectors.toList()), rangeList.stream().map(Object::toString).collect(Collectors.toList())); - } - - //第二步 校验执行权限 - new ProcessAuthManager.StepOperationChecker(processTaskStepId, ProcessTaskStepOperationType.TASK_CREATE) - .build() - .checkAndNoPermissionThrowException(); - - //第三步 保存数据 - // 锁定当前流程 - Long processTaskId = processTaskStepVo.getProcessTaskId(); - processTaskMapper.getProcessTaskLockById(processTaskId); - boolean isChange = false; - ProcessTaskAuditType auditType = ProcessTaskAuditType.CREATETASK; - ProcessTaskStepTaskNotifyTriggerType triggerType = ProcessTaskStepTaskNotifyTriggerType.CREATETASK; - Long id = jsonObj.getLong("id"); - if (id != null) { - //更新 - auditType = ProcessTaskAuditType.EDITTASK; - triggerType = ProcessTaskStepTaskNotifyTriggerType.EDITTASK; - ProcessTaskStepTaskVo stepTaskVo = processTaskStepTaskMapper.getStepTaskById(id); - if (stepTaskVo == null) { - throw new ProcessTaskStepTaskNotFoundException(id.toString()); - } - boolean isChangeContent = false; - ProcessTaskContentVo processTaskContentVo = new ProcessTaskContentVo(processTaskStepTaskVo.getContent()); - processTaskStepTaskVo.setContentHash(processTaskContentVo.getHash()); - if (!Objects.equals(processTaskContentVo.getHash(), stepTaskVo.getContentHash())) { - processTaskMapper.insertIgnoreProcessTaskContent(processTaskContentVo); - isChangeContent = true; - } - boolean isChangeOwner = false; - if (!Objects.equals(UserContext.get().getUserUuid(true), stepTaskVo.getOwner())) { - processTaskStepTaskVo.setOwner(UserContext.get().getUserUuid(true)); - isChangeOwner = true; - } - if (isChangeContent || isChangeOwner) { - processTaskStepTaskMapper.updateTask(processTaskStepTaskVo); - isChange = true; - } - //找出需要删除的stepUserId - List needDeleteStepTaskUserIdList = new ArrayList<>(); - List processTaskStepTaskUserList = processTaskStepTaskMapper.getStepTaskUserListByStepTaskId(id); - for (ProcessTaskStepTaskUserVo processTaskStepTaskUserVo : processTaskStepTaskUserList) { - if (Objects.equals(processTaskStepTaskUserVo.getIsDelete(), 1)) { - continue; - } - String userUuid = stepTaskUserMap.get(processTaskStepTaskUserVo.getId()); - if (StringUtils.isNotBlank(userUuid)) { - if (!Objects.equals(userUuid, processTaskStepTaskUserVo.getUserUuid())) { - //删除 - needDeleteStepTaskUserIdList.add(processTaskStepTaskUserVo.getId()); - newUserUuidSet.add(userUuid); - } - } else { - //删除 - needDeleteStepTaskUserIdList.add(processTaskStepTaskUserVo.getId()); - } - } - if (CollectionUtils.isNotEmpty(needDeleteStepTaskUserIdList)) { - processTaskStepTaskMapper.updateTaskUserIsDeleteByIdList(needDeleteStepTaskUserIdList, 1); -// processTaskStepTaskMapper.deleteProcessTaskStepTaskUserAgentByStepTaskUserIdList(needDeleteStepTaskUserIdList); - isChange = true; - } - //找出需要恢复的stepUserId - List needRecoverUserUuidList = new ArrayList<>(); - List needRecoverStepTaskUserIdList = new ArrayList<>(); - for (ProcessTaskStepTaskUserVo processTaskStepTaskUserVo : processTaskStepTaskUserList) { - if (Objects.equals(processTaskStepTaskUserVo.getIsDelete(), 0)) { - continue; - } - if (newUserUuidSet.contains(processTaskStepTaskUserVo.getUserUuid())) { - needRecoverStepTaskUserIdList.add(processTaskStepTaskUserVo.getId()); - needRecoverUserUuidList.add(processTaskStepTaskUserVo.getUserUuid()); - } - } - if (CollectionUtils.isNotEmpty(needRecoverStepTaskUserIdList)) { - newUserUuidSet.removeAll(needRecoverUserUuidList); - processTaskStepTaskMapper.updateTaskUserIsDeleteByIdList(needRecoverStepTaskUserIdList, 0); - isChange = true; - } - } else { - //新增 - ProcessTaskContentVo processTaskContentVo = new ProcessTaskContentVo(processTaskStepTaskVo.getContent()); - processTaskMapper.insertIgnoreProcessTaskContent(processTaskContentVo); - processTaskStepTaskVo.setContentHash(processTaskContentVo.getHash()); - processTaskStepTaskVo.setProcessTaskId(processTaskId); - processTaskStepTaskVo.setOwner(UserContext.get().getUserUuid(true)); - processTaskStepTaskMapper.insertTask(processTaskStepTaskVo); - } - //插上新taskUser - if (CollectionUtils.isNotEmpty(newUserUuidSet)) { - ProcessTaskStepTaskUserVo processTaskStepTaskUserVo = new ProcessTaskStepTaskUserVo(); - processTaskStepTaskUserVo.setProcessTaskStepTaskId(processTaskStepTaskVo.getId()); - processTaskStepTaskUserVo.setStatus(ProcessTaskStepTaskUserStatus.PENDING.getValue()); - for (String userUuid : newUserUuidSet) { - processTaskStepTaskUserVo.setId(null); - processTaskStepTaskUserVo.setUserUuid(userUuid); - processTaskStepTaskMapper.insertTaskUser(processTaskStepTaskUserVo); - } - isChange = true; - } - //第四步 更新`processtask_step_worker`表和`processtask_step_user`表、记录活动、触发通知、动作 - if (isChange) { - IProcessStepInternalHandler handler = ProcessStepInternalHandlerFactory.getHandler(processTaskStepVo.getHandler()); - if (handler == null) { - throw new ProcessStepUtilHandlerNotFoundException(processTaskStepVo.getHandler()); - } - handler.updateProcessTaskStepUserAndWorker(processTaskStepVo.getProcessTaskId(), processTaskStepVo.getId()); - - //活动参数 - List workerList = new ArrayList<>(); - List processTaskStepTaskUserList = processTaskStepTaskVo.getStepTaskUserVoList(); - for (ProcessTaskStepTaskUserVo processTaskStepTaskUserVo : processTaskStepTaskUserList) { - workerList.add(GroupSearch.USER.getValuePlugin() + processTaskStepTaskUserVo.getUserUuid()); - } - JSONObject paramObj = new JSONObject(); - paramObj.put("replaceable_task", taskConfigVo.getName()); - paramObj.put(ProcessTaskAuditDetailType.CONTENT.getParamName(), processTaskStepTaskVo.getContent()); - paramObj.put(ProcessTaskAuditDetailType.WORKERLIST.getParamName(), JSONObject.toJSONString(workerList)); - paramObj.put("source", jsonObj.getString("source")); - processTaskStepVo.getParamObj().putAll(paramObj); - processStepHandlerUtil.audit(processTaskStepVo, auditType); - processTaskStepTaskVo.setTaskConfigName(taskConfigVo.getName()); - processTaskStepVo.setProcessTaskStepTaskVo(processTaskStepTaskVo); - processStepHandlerUtil.notify(processTaskStepVo, triggerType); - processStepHandlerUtil.action(processTaskStepVo, triggerType); - } - return processTaskStepTaskVo.getId(); - } - - /** - * 检查用户是否合法 - * - * @param userUuidList 用户uuidList - * @param rangeList 用户范围 - */ - private void checkUserIsLegal(List userUuidList, List rangeList) { - UserVo userVo = new UserVo(); - userVo.setCurrentPage(1); - userVo.setIsDelete(0); - userVo.setIsActive(1); - userService.getUserByRangeList(userVo, rangeList); - List legalUserUuidList = userMapper.checkUserInRangeList(userUuidList, userVo); - if (legalUserUuidList.size() != userUuidList.size()) { - userUuidList.removeAll(legalUserUuidList); - if (CollectionUtils.isNotEmpty(userUuidList)) { - throw new TaskUserIllegalException(String.join(",", userUuidList)); - } - } + ProcessTaskStepTaskVo processTaskStepTaskVo = jsonObj.toJavaObject(ProcessTaskStepTaskVo.class); + return processTaskStepTaskService.saveTask(id, processTaskStepTaskVo, stepTaskUserVoList, source); } } diff --git a/src/main/java/neatlogic/module/process/service/ProcessTaskService.java b/src/main/java/neatlogic/module/process/service/ProcessTaskService.java index 18da008de8d3af1930c568607ba9aef45793759d..951f3474488209ed7b4512c9730ab8f9fd9ee47e 100644 --- a/src/main/java/neatlogic/module/process/service/ProcessTaskService.java +++ b/src/main/java/neatlogic/module/process/service/ProcessTaskService.java @@ -380,6 +380,18 @@ public interface ProcessTaskService { */ void startProcessTaskStep(JSONObject paramObj) throws Exception; + /** + * 转交步骤 + * @param processTaskId + * @param processTaskStepId + * @param workerList + * @param isSaveData + * @param content + * @param source + * @throws Exception + */ + void transferProcessTaskStep(Long processTaskId, Long processTaskStepId, List workerList, Integer isSaveData, String content, String source) throws Exception; + /** * 某个用户的待办的工单中当前处理节点是打了某个标签的节点的工单列表 * diff --git a/src/main/java/neatlogic/module/process/service/ProcessTaskServiceImpl.java b/src/main/java/neatlogic/module/process/service/ProcessTaskServiceImpl.java index c7041a762445a29a7cbe29d10da22432a2b1dd38..68b5122b7da2540291bacf64477350f5ede8a84e 100644 --- a/src/main/java/neatlogic/module/process/service/ProcessTaskServiceImpl.java +++ b/src/main/java/neatlogic/module/process/service/ProcessTaskServiceImpl.java @@ -2869,6 +2869,40 @@ public class ProcessTaskServiceImpl implements ProcessTaskService, IProcessTaskC handler.start(processTaskStepVo); } + @Override + public void transferProcessTaskStep(Long processTaskId, Long processTaskStepId, List workerList, Integer isSaveData, String content, String source) throws Exception { + ProcessTaskVo processTaskVo = checkProcessTaskParamsIsLegal(processTaskId, processTaskStepId); + ProcessTaskStepVo processTaskStepVo = processTaskVo.getCurrentProcessTaskStep(); + IProcessStepHandler handler = ProcessStepHandlerFactory.getHandler(processTaskStepVo.getHandler()); + if(handler == null) { + throw new ProcessStepHandlerNotFoundException(processTaskStepVo.getHandler()); + } + List processTaskStepWorkerList = new ArrayList<>(); + for(String worker : workerList) { + String[] split = worker.split("#"); + if(GroupSearch.getValue(split[0]) != null) { + processTaskStepWorkerList.add(new ProcessTaskStepWorkerVo(processTaskId, processTaskStepId, split[0], split[1], ProcessUserType.MAJOR.getValue())); + } + } + if (Objects.equals(isSaveData, 1)) { + JSONObject data = getProcessTaskStepStagingData(processTaskId, processTaskStepId); + processTaskStepVo.getParamObj().putAll(data); + } + JSONArray workerArray = new JSONArray(); + workerArray.addAll(workerList); + processTaskStepVo.getParamObj().put(ProcessTaskAuditDetailType.WORKERLIST.getParamName(), workerArray); + processTaskStepVo.getParamObj().put(ProcessTaskAuditDetailType.CONTENT.getParamName(), content); + handler.transfer(processTaskStepVo, processTaskStepWorkerList); + if (Objects.equals(isSaveData, 1)) { + ProcessTaskStepDataVo processTaskStepDataVo = new ProcessTaskStepDataVo(); + processTaskStepDataVo.setProcessTaskId(processTaskId); + processTaskStepDataVo.setProcessTaskStepId(processTaskStepId); + processTaskStepDataVo.setFcu(UserContext.get().getUserUuid(true)); + processTaskStepDataVo.setType(ProcessTaskStepDataType.STEPDRAFTSAVE.getValue()); + processTaskStepDataMapper.deleteProcessTaskStepData(processTaskStepDataVo); + } + } + @Override public List> getProcessTaskListWhichIsProcessingByUserAndTag(JSONObject jsonObj) { String userId = jsonObj.getString("userId"); diff --git a/src/main/java/neatlogic/module/process/service/ProcessTaskStepTaskService.java b/src/main/java/neatlogic/module/process/service/ProcessTaskStepTaskService.java index b40f0149132b068186904a021fb42e5d5c0929a3..db18db7aa63ec76d3719cbb3db35f1cafdae7f67 100644 --- a/src/main/java/neatlogic/module/process/service/ProcessTaskStepTaskService.java +++ b/src/main/java/neatlogic/module/process/service/ProcessTaskStepTaskService.java @@ -15,6 +15,7 @@ along with this program. If not, see .*/ package neatlogic.module.process.service; +import com.alibaba.fastjson.JSONArray; import neatlogic.framework.process.dto.*; import neatlogic.framework.process.exception.operationauth.ProcessTaskPermissionDeniedException; import com.alibaba.fastjson.JSONObject; @@ -26,6 +27,15 @@ import java.util.List; * @since 2021/8/31 11:38 **/ public interface ProcessTaskStepTaskService { + /** + * 创建任务 + * + * @param id + * @param processTaskStepTaskVo + * @param stepTaskUserVoList + * @param source + */ + Long saveTask(Long id, ProcessTaskStepTaskVo processTaskStepTaskVo, JSONArray stepTaskUserVoList, String source); /** * 创建任务 * diff --git a/src/main/java/neatlogic/module/process/service/ProcessTaskStepTaskServiceImpl.java b/src/main/java/neatlogic/module/process/service/ProcessTaskStepTaskServiceImpl.java index 5547c8fce581f6521bc8641d88bca0a387b7c9b6..3eba377e9957c3685b366e644bf0d355d86e8518 100644 --- a/src/main/java/neatlogic/module/process/service/ProcessTaskStepTaskServiceImpl.java +++ b/src/main/java/neatlogic/module/process/service/ProcessTaskStepTaskServiceImpl.java @@ -19,9 +19,11 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import neatlogic.framework.asynchronization.threadlocal.UserContext; +import neatlogic.framework.common.constvalue.GroupSearch; import neatlogic.framework.common.constvalue.systemuser.SystemUser; import neatlogic.framework.dao.mapper.UserMapper; import neatlogic.framework.dto.UserVo; +import neatlogic.framework.exception.type.ParamIrregularException; import neatlogic.framework.file.dao.mapper.FileMapper; import neatlogic.framework.file.dto.FileVo; import neatlogic.framework.process.constvalue.*; @@ -32,9 +34,11 @@ import neatlogic.framework.process.exception.operationauth.ProcessTaskPermission import neatlogic.framework.process.exception.operationauth.ProcessTaskStepNotActiveException; import neatlogic.framework.process.exception.operationauth.ProcessTaskStepNotMinorUserException; import neatlogic.framework.process.exception.process.ProcessStepUtilHandlerNotFoundException; +import neatlogic.framework.process.exception.processtask.ProcessTaskStepNotFoundException; import neatlogic.framework.process.exception.processtask.task.*; import neatlogic.framework.process.notify.constvalue.ProcessTaskStepTaskNotifyTriggerType; import neatlogic.framework.process.operationauth.core.IOperationType; +import neatlogic.framework.process.operationauth.core.ProcessAuthManager; import neatlogic.framework.process.stephandler.core.IProcessStepInternalHandler; import neatlogic.framework.process.stephandler.core.ProcessStepInternalHandlerFactory; import neatlogic.framework.process.task.TaskConfigManager; @@ -82,6 +86,190 @@ public class ProcessTaskStepTaskServiceImpl implements ProcessTaskStepTaskServic @Resource private FileMapper fileMapper; + @Override + public Long saveTask(Long id, ProcessTaskStepTaskVo processTaskStepTaskVo, JSONArray stepTaskUserVoList, String source) { + // 第一步 判断入参是否合法 + Long processTaskStepId = processTaskStepTaskVo.getProcessTaskStepId(); + ProcessTaskStepVo processTaskStepVo = processTaskMapper.getProcessTaskStepBaseInfoById(processTaskStepId); + if (processTaskStepVo == null) { + throw new ProcessTaskStepNotFoundException(processTaskStepId.toString()); + } + + //获取流程步骤配置中的 任务策略和人员范围 + JSONObject taskConfig = getTaskConfig(processTaskStepVo.getConfigHash()); + if (MapUtils.isEmpty(taskConfig)) { + throw new TaskConfigException(processTaskStepVo.getName()); + } + + Long taskConfigId = processTaskStepTaskVo.getTaskConfigId(); + JSONArray taskConfigIdArray = taskConfig.getJSONArray("idList"); + if (CollectionUtils.isEmpty(taskConfigIdArray)) { + throw new ProcessTaskStepTaskConfigIllegalException(taskConfigId.toString()); + } + List taskConfigIdList = taskConfigIdArray.toJavaList(Long.class); + if (!taskConfigIdList.contains(taskConfigId)) { + throw new ProcessTaskStepTaskConfigIllegalException(taskConfigId.toString()); + } + TaskConfigVo taskConfigVo = taskMapper.getTaskConfigById(taskConfigId); + if (taskConfigVo == null) { + throw new ProcessTaskStepTaskConfigIllegalException(taskConfigId.toString()); + } + + int num = taskConfigVo.getNum(); + if (num != -1 && num != stepTaskUserVoList.size()) { + throw new ProcessTaskStepTaskUserCountIllegalException(taskConfigVo.getName(), taskConfigVo.getNum()); + } + List allUserUuidList = new ArrayList<>(); + Set newUserUuidSet = new HashSet<>(); + Map stepTaskUserMap = new HashMap<>(); + for (int i = 0; i < stepTaskUserVoList.size(); i++) { + JSONObject stepTaskUserObj = stepTaskUserVoList.getJSONObject(i); + String userUuid = stepTaskUserObj.getString("userUuid"); + if (StringUtils.isBlank(userUuid)) { + throw new ParamIrregularException("stepTaskUserVoList[" + i + "].userUuid"); + } + allUserUuidList.add(userUuid); + Long stepTaskUserId = stepTaskUserObj.getLong("id"); + if (stepTaskUserId == null) { + newUserUuidSet.add(userUuid); + continue; + } + stepTaskUserMap.put(stepTaskUserId, userUuid); + } + + JSONArray rangeList = taskConfig.getJSONArray("rangeList"); + if (CollectionUtils.isNotEmpty(rangeList)) { + //校验用户是否在配置范围内 + checkUserIsLegal(allUserUuidList.stream().map(Object::toString).collect(Collectors.toList()), rangeList.stream().map(Object::toString).collect(Collectors.toList())); + } + + //第二步 校验执行权限 + new ProcessAuthManager.StepOperationChecker(processTaskStepId, ProcessTaskStepOperationType.TASK_CREATE) + .build() + .checkAndNoPermissionThrowException(); + + //第三步 保存数据 + // 锁定当前流程 + Long processTaskId = processTaskStepVo.getProcessTaskId(); + processTaskMapper.getProcessTaskLockById(processTaskId); + boolean isChange = false; + ProcessTaskAuditType auditType = ProcessTaskAuditType.CREATETASK; + ProcessTaskStepTaskNotifyTriggerType triggerType = ProcessTaskStepTaskNotifyTriggerType.CREATETASK; + if (id != null) { + //更新 + auditType = ProcessTaskAuditType.EDITTASK; + triggerType = ProcessTaskStepTaskNotifyTriggerType.EDITTASK; + ProcessTaskStepTaskVo stepTaskVo = processTaskStepTaskMapper.getStepTaskById(id); + if (stepTaskVo == null) { + throw new ProcessTaskStepTaskNotFoundException(id.toString()); + } + boolean isChangeContent = false; + ProcessTaskContentVo processTaskContentVo = new ProcessTaskContentVo(processTaskStepTaskVo.getContent()); + processTaskStepTaskVo.setContentHash(processTaskContentVo.getHash()); + if (!Objects.equals(processTaskContentVo.getHash(), stepTaskVo.getContentHash())) { + processTaskMapper.insertIgnoreProcessTaskContent(processTaskContentVo); + isChangeContent = true; + } + boolean isChangeOwner = false; + if (!Objects.equals(UserContext.get().getUserUuid(true), stepTaskVo.getOwner())) { + processTaskStepTaskVo.setOwner(UserContext.get().getUserUuid(true)); + isChangeOwner = true; + } + if (isChangeContent || isChangeOwner) { + processTaskStepTaskMapper.updateTask(processTaskStepTaskVo); + isChange = true; + } + //找出需要删除的stepUserId + List needDeleteStepTaskUserIdList = new ArrayList<>(); + List processTaskStepTaskUserList = processTaskStepTaskMapper.getStepTaskUserListByStepTaskId(id); + for (ProcessTaskStepTaskUserVo processTaskStepTaskUserVo : processTaskStepTaskUserList) { + if (Objects.equals(processTaskStepTaskUserVo.getIsDelete(), 1)) { + continue; + } + String userUuid = stepTaskUserMap.get(processTaskStepTaskUserVo.getId()); + if (StringUtils.isNotBlank(userUuid)) { + if (!Objects.equals(userUuid, processTaskStepTaskUserVo.getUserUuid())) { + //删除 + needDeleteStepTaskUserIdList.add(processTaskStepTaskUserVo.getId()); + newUserUuidSet.add(userUuid); + } + } else { + //删除 + needDeleteStepTaskUserIdList.add(processTaskStepTaskUserVo.getId()); + } + } + if (CollectionUtils.isNotEmpty(needDeleteStepTaskUserIdList)) { + processTaskStepTaskMapper.updateTaskUserIsDeleteByIdList(needDeleteStepTaskUserIdList, 1); +// processTaskStepTaskMapper.deleteProcessTaskStepTaskUserAgentByStepTaskUserIdList(needDeleteStepTaskUserIdList); + isChange = true; + } + //找出需要恢复的stepUserId + List needRecoverUserUuidList = new ArrayList<>(); + List needRecoverStepTaskUserIdList = new ArrayList<>(); + for (ProcessTaskStepTaskUserVo processTaskStepTaskUserVo : processTaskStepTaskUserList) { + if (Objects.equals(processTaskStepTaskUserVo.getIsDelete(), 0)) { + continue; + } + if (newUserUuidSet.contains(processTaskStepTaskUserVo.getUserUuid())) { + needRecoverStepTaskUserIdList.add(processTaskStepTaskUserVo.getId()); + needRecoverUserUuidList.add(processTaskStepTaskUserVo.getUserUuid()); + } + } + if (CollectionUtils.isNotEmpty(needRecoverStepTaskUserIdList)) { + newUserUuidSet.removeAll(needRecoverUserUuidList); + processTaskStepTaskMapper.updateTaskUserIsDeleteByIdList(needRecoverStepTaskUserIdList, 0); + isChange = true; + } + } else { + //新增 + ProcessTaskContentVo processTaskContentVo = new ProcessTaskContentVo(processTaskStepTaskVo.getContent()); + processTaskMapper.insertIgnoreProcessTaskContent(processTaskContentVo); + processTaskStepTaskVo.setContentHash(processTaskContentVo.getHash()); + processTaskStepTaskVo.setProcessTaskId(processTaskId); + processTaskStepTaskVo.setOwner(UserContext.get().getUserUuid(true)); + processTaskStepTaskMapper.insertTask(processTaskStepTaskVo); + } + //插上新taskUser + if (CollectionUtils.isNotEmpty(newUserUuidSet)) { + ProcessTaskStepTaskUserVo processTaskStepTaskUserVo = new ProcessTaskStepTaskUserVo(); + processTaskStepTaskUserVo.setProcessTaskStepTaskId(processTaskStepTaskVo.getId()); + processTaskStepTaskUserVo.setStatus(ProcessTaskStepTaskUserStatus.PENDING.getValue()); + for (String userUuid : newUserUuidSet) { + processTaskStepTaskUserVo.setId(null); + processTaskStepTaskUserVo.setUserUuid(userUuid); + processTaskStepTaskMapper.insertTaskUser(processTaskStepTaskUserVo); + } + isChange = true; + } + //第四步 更新`processtask_step_worker`表和`processtask_step_user`表、记录活动、触发通知、动作 + if (isChange) { + IProcessStepInternalHandler handler = ProcessStepInternalHandlerFactory.getHandler(processTaskStepVo.getHandler()); + if (handler == null) { + throw new ProcessStepUtilHandlerNotFoundException(processTaskStepVo.getHandler()); + } + handler.updateProcessTaskStepUserAndWorker(processTaskStepVo.getProcessTaskId(), processTaskStepVo.getId()); + + //活动参数 + List workerList = new ArrayList<>(); + List processTaskStepTaskUserList = processTaskStepTaskVo.getStepTaskUserVoList(); + for (ProcessTaskStepTaskUserVo processTaskStepTaskUserVo : processTaskStepTaskUserList) { + workerList.add(GroupSearch.USER.getValuePlugin() + processTaskStepTaskUserVo.getUserUuid()); + } + JSONObject paramObj = new JSONObject(); + paramObj.put("replaceable_task", taskConfigVo.getName()); + paramObj.put(ProcessTaskAuditDetailType.CONTENT.getParamName(), processTaskStepTaskVo.getContent()); + paramObj.put(ProcessTaskAuditDetailType.WORKERLIST.getParamName(), JSONObject.toJSONString(workerList)); + paramObj.put("source", source); + processTaskStepVo.getParamObj().putAll(paramObj); + processStepHandlerUtil.audit(processTaskStepVo, auditType); + processTaskStepTaskVo.setTaskConfigName(taskConfigVo.getName()); + processTaskStepVo.setProcessTaskStepTaskVo(processTaskStepTaskVo); + processStepHandlerUtil.notify(processTaskStepVo, triggerType); + processStepHandlerUtil.action(processTaskStepVo, triggerType); + } + return processTaskStepTaskVo.getId(); + } + /** * 创建任务 * @@ -462,7 +650,9 @@ public class ProcessTaskStepTaskServiceImpl implements ProcessTaskStepTaskServic List legalUserUuidList = userMapper.checkUserInRangeList(userUuidList, userVo); if (legalUserUuidList.size() != userUuidList.size()) { userUuidList.removeAll(legalUserUuidList); - throw new TaskUserIllegalException(String.join(",", userUuidList)); + if (CollectionUtils.isNotEmpty(userUuidList)) { + throw new TaskUserIllegalException(String.join(",", userUuidList)); + } } }