package jnpf.flowable.util; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.google.common.collect.ImmutableList; import jnpf.base.ActionResult; import jnpf.base.UserInfo; import jnpf.base.model.systemconfig.SysConfigModel; import jnpf.constant.JnpfConst; import jnpf.constant.MsgCode; import jnpf.constant.PermissionConst; import jnpf.emnus.TemplateEnum; import jnpf.exception.WorkFlowException; import jnpf.flowable.entity.*; import jnpf.flowable.enums.*; import jnpf.flowable.mapper.*; import jnpf.flowable.model.flowable.FlowAbleUrl; import jnpf.flowable.model.flowable.FlowableNodeModel; import jnpf.flowable.model.flowable.NextOrPrevFo; import jnpf.flowable.model.flowable.OutgoingFlowsFo; import jnpf.flowable.model.message.DelegateModel; import jnpf.flowable.model.message.FlowEventModel; import jnpf.flowable.model.message.FlowMsgModel; import jnpf.flowable.model.operator.OperatorVo; import jnpf.flowable.model.task.*; import jnpf.flowable.model.templatejson.FlowFormModel; import jnpf.flowable.model.templatejson.TemplateJsonInfoVO; import jnpf.flowable.model.templatenode.FlowErrorModel; import jnpf.flowable.model.templatenode.TemplateNodeUpFrom; import jnpf.flowable.model.templatenode.nodejson.*; import jnpf.flowable.model.util.FlowConstant; import jnpf.flowable.model.util.FlowContextHolder; import jnpf.flowable.model.util.FlowNature; import jnpf.permission.entity.*; import jnpf.util.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @Component public class FlowUtil { @Autowired private ConditionUtil conditionUtil; @Autowired private FlowAbleUrl flowAbleUrl; @Autowired private ServiceUtil serviceUtil; @Autowired private CandidatesMapper candidatesMapper; @Autowired private OperatorMapper operatorMapper; @Autowired private LaunchUserMapper launchUserMapper; @Autowired private TemplateMapper templateMapper; @Autowired private RecordMapper recordMapper; @Autowired private DelegateMapper delegateMapper; @Autowired private DelegateInfoMapper delegateInfoMapper; @Autowired private CommentMapper commentMapper; @Autowired private TaskMapper taskMapper; @Autowired private CirculateMapper circulateMapper; @Autowired private TemplateJsonMapper templateJsonMapper; @Autowired private TemplateNodeMapper templateNodeMapper; //-------------------------------taskUtil------------------------------------------------------------ // true为选择分支 public boolean checkBranch(TemplateNodeEntity nodeEntity) { NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class); return this.checkBranch(nodeModel); } public boolean checkBranch(NodeModel nodeModel) { String divideRule = nodeModel.getDivideRule(); return ObjectUtil.equals(DivideRuleEnum.CHOOSE.getType(), divideRule); } /** * 获取下一级审批节点 */ public List getNextApprover(FlowMethod flowMethod) throws WorkFlowException { String deploymentId = flowMethod.getDeploymentId(); String nodeCode = flowMethod.getNodeCode(); Map nodes = flowMethod.getNodes(); List nextNode = flowMethod.getNextNode(); // 获取下一级节点 NextOrPrevFo fo = new NextOrPrevFo(); fo.setDeploymentId(deploymentId); fo.setTaskKey(nodeCode); List nextList = flowAbleUrl.getNext(fo); if (CollectionUtil.isNotEmpty(nextList)) { OutgoingFlowsFo flowsFo = new OutgoingFlowsFo(); flowsFo.setDeploymentId(deploymentId); flowsFo.setTaskKey(nodeCode); List outgoingFlows = flowAbleUrl.getOutgoingFlows(flowsFo); Map res = new HashMap<>(); flowMethod.setOutgoingFlows(outgoingFlows); flowMethod.setResMap(res); conditionUtil.getConditionResult(flowMethod); conditionUtil.checkCondition(res, nodes); for (FlowableNodeModel next : nextList) { // 判断条件,子流程的出线 条件都为false 则跳过 Map resMap = new HashMap<>(); flowMethod.setOutgoingFlows(next.getIncomingList()); flowMethod.setResMap(resMap); flowMethod.setNodeCode(next.getId()); conditionUtil.getConditionResult(flowMethod); try { conditionUtil.checkCondition(resMap, nodes); } catch (WorkFlowException e) { continue; } NodeModel nodeModel = nodes.get(next.getId()); if (null != nodeModel) { // 子流程、外部节点往下递归 List typeList = ImmutableList.of(NodeEnum.subFlow.getType(), NodeEnum.outside.getType()); if (typeList.contains(nodeModel.getType())) { if (flowMethod.getNextSubFlow()) { nextNode.add(nodeModel); } getNextApprover(flowMethod); } else { nextNode.add(nodeModel); } } } } return nextNode; } public Object getOneData(Map map, String key) { Object obj = null; if (null != map) { obj = map.get(key + FlowNature.FORM_FIELD_SUFFIX); if (null == obj) { obj = map.get(key); } } return obj; } //字段的值获取用户 public List getUserId(Object data) { List userIdList = new ArrayList<>(); if (ObjectUtil.isNotEmpty(data)) { List list = new ArrayList<>(); try { list.addAll(JsonUtil.getJsonToList(String.valueOf(data), String.class)); } catch (Exception e) { } if (data instanceof List) { list.addAll((List) data); } else { list.addAll(Arrays.asList(String.valueOf(data).split(","))); } List id = new ArrayList<>(); for (String s : list) { id.add(s.split("--")[0]); } List userRelationList = serviceUtil.getListByObjectIdAll(id); List roleRelationList = serviceUtil.getListByRoleId(id); List userList = serviceUtil.getUserListAll(list); List userRelation = userRelationList.stream().map(UserRelationEntity::getUserId).collect(Collectors.toList()); List roleRelation = roleRelationList.stream().map(RoleRelationEntity::getObjectId).collect(Collectors.toList()); Set handleIdAll = new HashSet<>(); handleIdAll.addAll(userRelation); handleIdAll.addAll(roleRelation); handleIdAll.addAll(id); handleIdAll.addAll(userList); userIdList.addAll(handleIdAll); } return userIdList; } // false为候选人 public boolean checkNextCandidates(List nodeList) { if (CollectionUtil.isNotEmpty(nodeList)) { for (NodeModel node : nodeList) { if (node.getIsCandidates()) { return false; } } } return true; } public int checkNextError(FlowModel flowModel, List nextApprover, boolean nodeFlag, boolean notSubmitFlag) throws WorkFlowException { return this.checkNextError(flowModel, nextApprover, nodeFlag, notSubmitFlag, false); } // 判断异常处理是否是 上一节点审批人指定处理人、无法提交 public int checkNextError(FlowModel flowModel, List nextApprover, boolean nodeFlag, boolean notSubmitFlag, boolean errorFlag) throws WorkFlowException { List nodeEntityList = flowModel.getNodeEntityList(); TaskEntity taskEntity = flowModel.getTaskEntity(); List errorList = new ArrayList<>(); for (NodeModel nodeModel : nextApprover) { // 候选人节点跳过 if (nodeModel.getIsCandidates()) { continue; } TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> e.getNodeCode().equals(nodeModel.getNodeId())).findFirst().orElse(null); // 获取审批人 FlowMethod flowMethod = new FlowMethod(); flowMethod.setFlowModel(flowModel); flowMethod.setTaskEntity(taskEntity); flowMethod.setNodeEntity(nodeEntity); flowMethod.setNodeEntityList(nodeEntityList); flowMethod.setErrorRule(true); flowMethod.setExtraRule(true); List userIds = this.userListAll(flowMethod); Integer node = flowMethod.getNode(); Integer notSubmit = flowMethod.getNotSubmit(); if (node > 0) { if (nodeFlag) { handleErrorRule(nodeModel, errorList); } else { return 1; } } if (notSubmit > 0) { if (notSubmitFlag) { throw new WorkFlowException(MsgCode.WF061.get()); } return 2; } } if (errorFlag && CollectionUtil.isNotEmpty(errorList)) { flowModel.setErrorList(errorList); return 3; } if (!errorList.isEmpty()) { AuditModel model = new AuditModel(); model.setErrorCodeList(new HashSet<>(errorList)); throw new WorkFlowException(200, JsonUtil.getObjectToString(model)); } return 0; } /** * 获取审批人 * * @param flowMethod * @return */ public List userListAll(FlowMethod flowMethod) throws WorkFlowException { List nodeEntityList = flowMethod.getNodeEntityList(); TemplateNodeEntity nodeEntity = flowMethod.getNodeEntity(); NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class); TemplateNodeEntity globalEntity = nodeEntityList.stream().filter(t -> NodeEnum.global.getType().equals(t.getNodeType())).findFirst().get(); NodeModel global = JsonUtil.getJsonToBean(globalEntity.getNodeJson(), NodeModel.class); Integer errRule = global.getErrorRule(); List errRuleUser = global.getErrorRuleUser(); // 子流程去获取指定成员、异常处理 if (StringUtil.equals(nodeModel.getType(), NodeEnum.subFlow.getType())) { errRule = nodeModel.getErrorRule(); errRuleUser = nodeModel.getErrorRuleUser(); } Boolean errorRule = flowMethod.getErrorRule(); int pass = 0; int notSubmit = 0; int node = 0; Boolean extraRule = flowMethod.getExtraRule(); TaskEntity taskEntity = flowMethod.getTaskEntity(); List userIdAll = user(flowMethod, nodeModel.getAssigneeType()); // String admin = serviceUtil.getAdmin(); // userIdAll = userIdAll.stream().filter(e -> !ObjectUtil.equals(e, admin)).distinct().collect(Collectors.toList()); //附加规则 if (extraRule && !nodeModel.getIsCandidates()) { rule(userIdAll, taskEntity.getId(), nodeModel.getExtraRule()); } //获取最新用户 List userList = serviceUtil.getUserName(userIdAll, true); // 子流程权限 if (StringUtil.equals(nodeModel.getType(), NodeEnum.subFlow.getType())) { String flowId = nodeModel.getFlowId(); TemplateEntity template = templateMapper.selectById(flowId); if (template != null && template.getVisibleType().equals(FlowNature.Authority) && ObjectUtil.equals(template.getStatus(), TemplateStatueEnum.up.getCode())) { List list = new ArrayList<>(userList); if (nodeModel.getHasPermission()) { for (UserEntity user : list) { if (serviceUtil.isCommonUser(user.getId())) { List flowIds = serviceUtil.getPermission(user.getId()); // 权限中不存在 该流程版本 if (!flowIds.contains(flowId)) { UserEntity userEntity = list.stream().filter(e -> e.getId().equals(user.getId())).findFirst().orElse(null); if (null != userEntity) { userList.remove(user); } } } } } } } userIdAll = userList.stream().map(UserEntity::getId).collect(Collectors.toList()); //异常规则 if (errorRule && userList.isEmpty()) { //异常处理规则 switch (ErrorRuleEnum.getByCode(errRule)) { case administrator: userIdAll.add(serviceUtil.getAdmin()); break; case initiator: List errorRuleUser = serviceUtil.getUserName(errRuleUser, true); if (!errorRuleUser.isEmpty()) { userIdAll.addAll(errorRuleUser.stream().map(UserEntity::getId).collect(Collectors.toList())); } else { userIdAll.add(serviceUtil.getAdmin()); } break; case node: String nodeId = nodeEntity.getNodeCode(); List userId = new ArrayList<>(); List list = candidatesMapper.getList(taskEntity.getId(), nodeId); for (CandidatesEntity t : list) { List candidates = StringUtil.isNotEmpty(t.getCandidates()) ? Arrays.stream(t.getCandidates().split(",")).collect(Collectors.toList()) : new ArrayList<>(); userId.addAll(candidates); } if (!list.isEmpty()) { List errorRuleUserList = serviceUtil.getUserName(userId, true); if (!errorRuleUserList.isEmpty()) { userIdAll.addAll(errorRuleUserList.stream().map(UserEntity::getId).collect(Collectors.toList())); } else { userIdAll.add(serviceUtil.getAdmin()); } } node++; break; case pass: pass++; break; case notSubmit: notSubmit++; break; case creatorUserId: userIdAll.add(taskEntity.getCreatorUserId()); break; default: break; } } flowMethod.setPass(pass); flowMethod.setNotSubmit(notSubmit); flowMethod.setNode(node); return userIdAll; } /** * 附加条件 */ public void rule(List userIdAll, String taskId, int rule) { LaunchUserEntity flowUser = launchUserMapper.getInfoByTask(taskId); if (flowUser != null) { rule(userIdAll, flowUser, rule); } } // 附加条件过滤 public void rule(List userIdAll, LaunchUserEntity flowUser, int rule) { List ruleList = ImmutableList.of(ExtraRuleEnum.organize.getCode(), ExtraRuleEnum.position.getCode(), ExtraRuleEnum.manager.getCode(), ExtraRuleEnum.subordinate.getCode(), ExtraRuleEnum.department.getCode()); if (ruleList.contains(rule)) { if (flowUser != null) { List organizeList = flowUser.getOrganizeId() != null ? Arrays.asList(flowUser.getOrganizeId().split(",")) : new ArrayList<>(); List positionList = flowUser.getPositionId() != null ? Arrays.asList(flowUser.getPositionId().split(",")) : new ArrayList<>(); List managerList = flowUser.getManagerId() != null ? Arrays.asList(flowUser.getManagerId().split(",")) : new ArrayList<>(); List subordinateList = flowUser.getSubordinate() != null ? Arrays.asList(flowUser.getSubordinate().split(",")) : new ArrayList<>(); List userList = serviceUtil.getUserName(userIdAll, true); List userListAll = userList.stream().map(UserEntity::getId).collect(Collectors.toList()); //同一部门、公司的用户 Map> userMap = new HashMap<>(); Map> relationUserList = serviceUtil.getListByUserIdAll(userListAll).stream().filter(t -> StringUtil.isNotEmpty(t.getObjectId())).collect(Collectors.groupingBy(UserRelationEntity::getObjectId)); //附加条件 switch (ExtraRuleEnum.getByCode(rule)) { case organize: for (String organizeId : organizeList) { OrganizeEntity organizeInfo = serviceUtil.getOrganizeInfo(organizeId); if (null != organizeInfo && Objects.equals(organizeInfo.getCategory(), PermissionConst.DEPARTMENT)) { List userId = userMap.get(organizeId) != null ? userMap.get(organizeId) : new ArrayList<>(); if (relationUserList.get(organizeId) != null) { userId.addAll(relationUserList.get(organizeId).stream().map(UserRelationEntity::getUserId).collect(Collectors.toList())); } userMap.put(organizeId, userId); } } List userIdList = new ArrayList<>(); for (String key : userMap.keySet()) { List id = userMap.get(key); if (ObjectUtil.isEmpty(id)) { continue; } userIdList.addAll(id); } userIdAll.retainAll(userIdList); break; case position: List position = new ArrayList<>(); for (String positionId : positionList) { if (relationUserList.get(positionId) != null) { position.addAll(relationUserList.get(positionId).stream().map(UserRelationEntity::getUserId).collect(Collectors.toList())); } } userIdAll.retainAll(position); break; case manager: List manager = new ArrayList<>(); manager.addAll(managerList); userIdAll.retainAll(manager); break; case subordinate: List subordinate = new ArrayList<>(); for (String subordinateId : subordinateList) { if (StringUtil.isNotEmpty(subordinateId)) { subordinate.addAll(new ArrayList<>(Arrays.asList(subordinateId.split(",")))); } } userIdAll.retainAll(subordinate); break; case department: List categoryList = ImmutableList.of("agency", "office"); for (String organizeId : organizeList) { OrganizeEntity organizeInfo = serviceUtil.getOrganizeInfo(organizeId); if (organizeInfo == null || categoryList.contains(organizeInfo.getCategory())) { continue; } List orgList = serviceUtil.getDepartmentAll(organizeId).stream().map(OrganizeEntity::getId).collect(Collectors.toList()); List departmentAll = serviceUtil.getListByOrgIds(orgList).stream().map(PositionEntity::getId).collect(Collectors.toList()); for (String id : departmentAll) { List userId = userMap.get(id) != null ? userMap.get(id) : new ArrayList<>(); if (relationUserList.get(id) != null) { userId.addAll(relationUserList.get(id).stream().map(UserRelationEntity::getUserId).collect(Collectors.toList())); } userMap.put(id, userId); } } if (!userMap.isEmpty()) { List userId = new ArrayList<>(); for (String key : userMap.keySet()) { List id = userMap.get(key); if (ObjectUtil.isEmpty(id)) { continue; } userId.addAll(id); } userIdAll.retainAll(userId); } break; default: break; } } } } /** * 获取上级节点,不过滤子流程节点 * * @param deploymentId 部署id * @param nodeCode 节点编码 * @param nodeEntityList 节点集合 * @param nodeCodeList 上一级节点编码集合 */ public void prevNode(String deploymentId, String nodeCode, List nodeEntityList, List nodeCodeList) throws WorkFlowException { NextOrPrevFo fo = new NextOrPrevFo(); fo.setDeploymentId(deploymentId); fo.setTaskKey(nodeCode); List prevList = flowAbleUrl.getPrev(fo); if (CollectionUtil.isNotEmpty(prevList)) { for (String prev : prevList) { TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> e.getNodeCode().equals(prev)).findFirst().orElse(null); if (nodeEntity != null) { nodeCodeList.add(nodeEntity.getNodeCode()); } } } } // 根据经办获取上一审批节点的审批人 public List getHandleIds(String taskId, OperatorEntity operator, boolean autoAudit) { List handleIds = new ArrayList<>(); List operatorList = operatorMapper.getList(taskId); if (CollectionUtil.isNotEmpty(operatorList)) { List list = operatorList.stream() .filter(e -> e.getHandleTime() != null && ObjectUtil.equals(e.getNodeId(), operator.getNodeId())).sorted(Comparator.comparing(OperatorEntity::getHandleTime).reversed()).collect(Collectors.toList()); handleIds = list.stream().map(OperatorEntity::getHandleId).collect(Collectors.toList()); } if (CollectionUtil.isEmpty(handleIds) && autoAudit) { handleIds.add(operator.getHandleId()); } return handleIds; } public void createLaunchUser(String taskId, String userId) { LaunchUserEntity launchUserEntity = launchUserMapper.getInfoByTask(taskId); if (null != launchUserEntity) { return; } UserEntity user = serviceUtil.getUserInfo(userId); if (null != user) { LaunchUserEntity entity = new LaunchUserEntity(); entity.setId(RandomUtil.uuId()); entity.setTaskId(taskId); entity.setType(FlowNature.TaskInitiation); launchUser(entity, user); // Department用到时,再递归获取 serviceUtil.getDepartmentAll launchUserMapper.insert(entity); } } /** * 用户的信息 */ public void launchUser(LaunchUserEntity flowUser, UserEntity userEntity) { if (userEntity != null) { //全部岗位 List userPositionList = serviceUtil.getListByUserIdAll(ImmutableList.of(userEntity.getId())).stream() .filter(t -> PermissionConst.POSITION.equals(t.getObjectType())).collect(Collectors.toList()); List pos = new ArrayList<>(); List org = new ArrayList<>(); List managerId = new ArrayList<>(); List subordinateList = new ArrayList<>(); for (UserRelationEntity relation : userPositionList) { PositionEntity positionInfo = serviceUtil.getPositionInfo(relation.getObjectId()); if (positionInfo != null) { userEntity.setPositionId(positionInfo.getId()); pos.add(positionInfo.getId()); OrganizeEntity organizeInfo = serviceUtil.getOrganizeInfo(positionInfo.getOrganizeId()); if (organizeInfo != null) { org.add(organizeInfo.getId()); } String managerByLevel = getManagerByLevel(userEntity, 1); if (StringUtil.isNotEmpty(managerByLevel)) { managerId.add(managerByLevel); } List childPosition = serviceUtil.getChildPosition(userEntity.getPositionId()); List positionList = childPosition.stream().map(PositionEntity::getId).collect(Collectors.toList()); positionList.remove(userEntity.getPositionId()); List userRelationList = serviceUtil.getListByObjectIdAll(positionList); subordinateList.addAll(userRelationList.stream().map(UserRelationEntity::getUserId).collect(Collectors.toList())); } } flowUser.setPositionId(String.join(",", pos)); flowUser.setOrganizeId(String.join(",", org)); flowUser.setManagerId(String.join(",", managerId)); String subordinate = serviceUtil.getUserName(subordinateList, true).stream().map(UserEntity::getId).collect(Collectors.joining(",")); flowUser.setSubordinate(subordinate); } } /** * 递归主管 */ public String getManagerByLevel(UserEntity userEntity, int level) { return getManagerByLevel(userEntity, level, false); } public String getManagerByLevel(UserEntity userEntity, int level, boolean isOrganize) { String managerUser = ""; if (userEntity == null) { return managerUser; } String positionId = ""; if (isOrganize) { PositionEntity positionEntity = serviceUtil.getPositionInfo(userEntity.getPositionId()); if (positionEntity != null) { OrganizeEntity organizeInfo = serviceUtil.getOrganizeInfo(positionEntity.getOrganizeId()); positionId = getManageOrg(organizeInfo, level); } } else { PositionEntity positionEntity = serviceUtil.getPositionInfo(userEntity.getPositionId()); positionId = getManagerPos(positionEntity, level); } PositionEntity position = serviceUtil.getPositionInfo(positionId); return position != null && StringUtil.isNotEmpty(position.getDutyUser()) ? position.getDutyUser() : ""; } /** * 查询岗位 */ public String getManagerPos(PositionEntity position, int level) { String positionId = ""; if (position != null) { String[] tree = position.getPositionIdTree().split(","); positionId = position.getId(); for (int i = tree.length - 1; i >= 0; i--) { String id = tree[i]; if (Objects.equals(id, position.getId())) { continue; } --level; positionId = id; if (level == 0) { break; } } if (level > 0) { PositionEntity positionInfo = serviceUtil.getPositionInfo(positionId); if (positionInfo != null) { OrganizeEntity organizeInfo = serviceUtil.getOrganizeInfo(positionInfo.getOrganizeId()); return getManageOrg(organizeInfo, level); } } } return positionId; } /** * 查询组织 */ private String getManageOrg(OrganizeEntity organize, long level) { List organizeList = new ArrayList<>(); organizeList.add(organize.getId()); String[] tree = organize.getOrganizeIdTree().split(","); for (int i = tree.length - 1; i >= 0; i--) { String id = tree[i]; if (Objects.equals(id, organize.getId())) { continue; } --level; organizeList.add(id); if (level == 0) { break; } } OrganizeEntity entity = serviceUtil.getOrganizeInfo(organizeList.get(organizeList.size() - 1)); return level == 0 && entity != null ? entity.getDutyPosition() : ""; } /** * 查询表单值 * * @return */ public Map infoData(String formId, String taskId) throws WorkFlowException { Map> allData = FlowContextHolder.getAllData(); return infoData(formId,taskId,allData); } /** * 查询表单值 * * @return */ public Map infoData(String formId, String taskId, Map> allData) throws WorkFlowException { Map dataAll = allData.get(taskId + JnpfConst.SIDE_MARK + formId) != null ? allData.get(taskId + JnpfConst.SIDE_MARK + formId) : serviceUtil.infoData(formId, taskId); return dataAll; } /** * 保存、更新数据,仅处理数据 */ public Map createOrUpdate(FlowMethod flowMethod) throws WorkFlowException { TaskEntity taskEntity = flowMethod.getTaskEntity(); TemplateNodeEntity nodeEntity = flowMethod.getNodeEntity(); NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class); FlowModel flowModel = flowMethod.getFlowModel(); Map formData = flowModel.getFormData(); Map data = new HashMap<>(); //保存数据的表单 String formId = nodeEntity.getFormId(); // 子流程选择的流程版本id String taskId = taskEntity.getId(); String resultNodeCode = resultNodeCode(flowMethod); flowMethod.setResultNodeCode(resultNodeCode); List assignList = nodeModel.getAssignList().stream().filter(e -> e.getNodeId().equals(resultNodeCode)).collect(Collectors.toList()); //获取当前表单 Map thisNodeData = infoData(formId, taskId); data.putAll(thisNodeData); data.putAll(formData(formData, assignList, taskEntity, flowMethod)); data.put(TableFeildsEnum.VERSION.getField(), thisNodeData.get(TableFeildsEnum.VERSION.getField())); return data; } /** * 获取节点的最后一个审批节点 */ public String resultNodeCode(FlowMethod flowMethod) throws WorkFlowException { TaskEntity taskEntity = flowMethod.getTaskEntity(); TemplateNodeEntity nodeEntity = flowMethod.getNodeEntity(); List nodeEntityList = flowMethod.getNodeEntityList(); FlowModel flowModel = flowMethod.getFlowModel(); Map formData = flowModel.getFormData(); // 子流程选择的流程版本id String taskId = taskEntity.getId(); List handleStatus = ImmutableList.of(RecordEnum.audit.getCode(), RecordEnum.submit.getCode()); //递归 List nodeIdList = new ArrayList<>(); prevNodeList(flowModel.getDeploymentId(), nodeEntity.getNodeCode(), nodeEntityList, nodeIdList); List list = recordMapper.getRecordList(taskId, handleStatus).stream().filter(t -> nodeIdList.contains(t.getNodeCode())).sorted(Comparator.comparing(RecordEntity::getHandleTime).reversed()).collect(Collectors.toList()); List recordNodeIdList = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { if (i == 0) { recordNodeIdList.add(list.get(i).getNodeCode()); } } List taskNodeEntity = nodeEntityList.stream().filter(t -> nodeIdList.contains(t.getNodeCode())).collect(Collectors.toList()); if (taskNodeEntity.isEmpty()) { taskNodeEntity.addAll(nodeEntityList.stream().filter(t -> recordNodeIdList.contains(t.getNodeCode())).collect(Collectors.toList())); } String nodeCode = ""; if (CollectionUtil.isNotEmpty(list)) { nodeCode = list.get(0).getNodeCode(); } else { if (!taskNodeEntity.isEmpty()) { nodeCode = taskNodeEntity.get(0).getNodeCode(); } } if (!taskNodeEntity.isEmpty()) { formData.put(FlowConstant.PREV_NODE_FORM_ID, taskNodeEntity.get(0).getFormId()); } return nodeCode; } /** * 获取上级节点 * * @param deploymentId 部署id * @param nodeCode 节点编码 * @param nodeEntityList 节点集合 * @param nodeCodeList 上一级节点编码集合 */ public void prevNodeList(String deploymentId, String nodeCode, List nodeEntityList, List nodeCodeList) throws WorkFlowException { NextOrPrevFo fo = new NextOrPrevFo(); fo.setDeploymentId(deploymentId); fo.setTaskKey(nodeCode); List prevList = flowAbleUrl.getPrev(fo); if (CollectionUtil.isNotEmpty(prevList)) { for (String prev : prevList) { TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> e.getNodeCode().equals(prev)).findFirst().orElse(null); if (nodeEntity != null) { // 获取 不是子流程类型的节点 if (nodeEntity.getNodeType().equals(NodeEnum.subFlow.getType())) { prevNodeList(deploymentId, nodeEntity.getNodeCode(), nodeEntityList, nodeCodeList); } else { nodeCodeList.add(nodeEntity.getNodeCode()); } } } } } // 表单赋值 public Map formData(Map formData, List assignListAll, TaskEntity taskEntity, FlowMethod flowMethod) throws WorkFlowException { String taskId = taskEntity.getId(); List nodeEntityList = flowMethod.getNodeEntityList(); TemplateNodeEntity startNode = nodeEntityList.stream().filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.start.getType())).findFirst().orElse(null); if (startNode != null) { formData.put(FlowConstant.StartNodeFormId, startNode.getFormId()); } Map result = new HashMap<>(formData); Map oldData = new HashMap<>(formData); Map> map = new HashMap<>(); // 全局参数 String globalParameter = taskEntity.getGlobalParameter(); Map taskMap = globalParameter != null ? JsonUtil.stringToMap(globalParameter) : new HashMap<>(); for (Assign assignModel : assignListAll) { List ruleList = this.handleAssignRule(assignModel.getRuleList()); for (AssignRule assignMode : ruleList) { String parentField = assignMode.getParentField(); String[] parentFieldList = parentField.split("-"); String childField = assignMode.getChildField(); String[] childFieldList = childField.split("-"); if (childFieldList.length > 1 && parentFieldList.length > 1) { int end = 0; if (oldData.get(parentFieldList[0]) instanceof List) { List> parentList = (List>) oldData.get(parentFieldList[0]); end = parentList.size(); } if (result.get(childFieldList[0]) instanceof List) { List> childList = (List>) result.get(childFieldList[0]); for (int i = 0; i < childList.size() - end; i++) { childList.add(new HashMap<>()); } } else { List> childList = new ArrayList<>(); for (int i = 0; i < end; i++) { childList.add(new HashMap<>()); } result.put(childFieldList[0], childList); result.put(childFieldList[0] + FlowNature.FORM_FIELD_SUFFIX, childList); } } } } for (Assign assignModel : assignListAll) { List ruleList = this.handleAssignRule(assignModel.getRuleList()); for (AssignRule assignMode : ruleList) { String formId = assignMode.getFormId(); if (StringUtil.equals(formId, FlowNature.GLOBAL_PARAMETER)) { oldData.putAll(taskMap); } else { if (StringUtil.isNotEmpty(formId)) { Map mapData = map.get(formId); if (CollectionUtil.isEmpty(mapData)) { Map data = serviceUtil.infoData(formId, taskId); map.put(formId, data); oldData.putAll(data); } } else { oldData.putAll(formData); } } //子表处理规则 String parentField = assignMode.getParentField(); String[] parentFieldList = parentField.split("-"); String childField = assignMode.getChildField(); String[] childFieldList = childField.split("-"); Object childData = formData.get(parentField); if (childFieldList.length > 1) { List> childMapAll = new ArrayList<>(); if (result.get(childFieldList[0]) instanceof List) { List> childList = (List>) result.get(childFieldList[0]); for (Map objectMap : childList) { Map childMap = new HashMap<>(objectMap); childMapAll.add(childMap); } } if (parentFieldList.length > 1) { if (oldData.get(parentFieldList[0]) instanceof List) { List> parentList = (List>) oldData.get(parentFieldList[0]); int num = parentList.size() - childMapAll.size(); for (int i = 0; i < num; i++) { childMapAll.add(new HashMap<>()); } for (int i = 0; i < parentList.size(); i++) { Map parentMap = parentList.get(i); Map childMap = childMapAll.get(i); childMap.put(childFieldList[1], parentMap.get(parentFieldList[1])); } } } else { // 主传子 if (1 > childMapAll.size()) { childMapAll.add(new HashMap<>()); } for (Map childMap : childMapAll) { childMap.put(childFieldList[1], childData); } } result.put(childFieldList[0], childMapAll); result.put(childFieldList[0] + FlowNature.FORM_FIELD_SUFFIX, childMapAll); } else { if (parentFieldList.length > 1) { if (oldData.get(parentFieldList[0]) instanceof List) { List> parentList = (List>) oldData.get(parentFieldList[0]); for (int i = 0; i < parentList.size(); i++) { Map parentMap = parentList.get(i); if (i == 0) { childData = parentMap.get(parentFieldList[1]); } } } } result.put(childField, childData); result.put(childField + FlowNature.FORM_FIELD_SUFFIX, childData); } } } return result; } // 截取数据传递字段,获取表单id public List handleAssignRule(List ruleList) { List list = new ArrayList<>(); if (CollectionUtil.isNotEmpty(ruleList)) { for (AssignRule assignRule : ruleList) { AssignRule rule = JsonUtil.getJsonToBean(assignRule, AssignRule.class); String parentField = assignRule.getParentField(); int index = parentField.lastIndexOf("|"); if (index != -1) { String field = parentField.substring(0, index); rule.setParentField(field); String substring = parentField.substring(index + 1); rule.setFormId(substring); } list.add(rule); } } return list; } /** * 组装接口数据 * * @return */ public Map parameterMap(FlowModel flowModel, List templateJsonModelList) { TaskEntity task = flowModel.getTaskEntity(); List creator = ImmutableList.of( FlowConstant.LAUNCH_USER_NAME, FlowConstant.CREATORUSERNAME, FlowConstant.MANDATOR ); List mandatary = ImmutableList.of(FlowConstant.MANDATARY); List templateList = templateJsonModelList.stream().filter(e -> Objects.equals(e.getSourceType(), TemplateEnum.System.getCode())).collect(Collectors.toList()); boolean isCreator = templateList.stream().anyMatch(e -> creator.contains(e.getRelationField())); UserEntity createUser = null; if (isCreator) { createUser = serviceUtil.getUserInfo(task.getCreatorUserId()); } boolean isMandatary = templateList.stream().anyMatch(e -> mandatary.contains(e.getRelationField())); UserEntity delegate = null; if (isMandatary) { delegate = StringUtil.isNotEmpty(task.getDelegateUserId()) ? serviceUtil.getUserInfo(task.getDelegateUserId()) : null; } return parameterMap(flowModel, templateJsonModelList, createUser, delegate); } /** * 组装接口数据 * * @return */ public Map parameterMap(FlowModel flowModel, List templateJsonModelList, UserEntity createUser, UserEntity delegate) { Map data = flowModel.getFormData(); TaskEntity task = flowModel.getTaskEntity(); RecordEntity record = flowModel.getRecordEntity(); Map parameterMap = new HashMap<>(); for (TemplateJsonModel templateJsonModel : templateJsonModelList) { String fieldId = templateJsonModel.getField(); String msgTemplateId = templateJsonModel.getMsgTemplateId(); String relationField = templateJsonModel.getRelationField(); Integer sourceType = templateJsonModel.getSourceType(); Map parameterData = task.getGlobalParameter() != null ? JsonUtil.stringToMap(task.getGlobalParameter()) : new HashMap<>(); String parameterValue = parameterData.get(relationField) != null ? String.valueOf(parameterData.get(relationField)) : null; boolean isList = data.get(relationField) instanceof List; String dataValue = data.get(relationField) != null ? isList ? JsonUtil.getObjectToString(data.get(relationField)) : String.valueOf(data.get(relationField)) : null; String dataJson = Objects.equals(FieldEnum.Field.getCode(), sourceType) ? dataValue : Objects.equals(FieldEnum.Global.getCode(), sourceType) ? parameterValue : relationField; FlowEventModel eventModel = FlowEventModel.builder().data(data).dataJson(dataJson).record(record).templateJson(templateJsonModel).taskEntity(task).createUser(createUser).delegate(delegate).build(); dataJson = data(eventModel); parameterMap.put((StringUtil.isNotEmpty(msgTemplateId) ? msgTemplateId : "") + fieldId, dataJson); } return parameterMap; } /** * @return */ public String data(FlowEventModel eventModel) { RecordEntity record = eventModel.getRecord(); TemplateJsonModel templateJson = eventModel.getTemplateJson(); String relationField = StringUtil.isNotEmpty(templateJson.getRelationField()) ? templateJson.getRelationField() : ""; List typeList = ImmutableList.of(FieldEnum.Field.getCode(), FieldEnum.System.getCode()); boolean isType = typeList.contains(templateJson.getSourceType()); String dataJson = eventModel.getDataJson(); Map data = eventModel.getData(); UserInfo userInfo = UserProvider.getUser(); String userId = userInfo.getUserId(); String userName = userInfo.getUserName() != null ? userInfo.getUserName() : ""; String value = dataJson; TaskEntity taskEntity = eventModel.getTaskEntity(); if (isType) { switch (relationField) { case FlowConstant.FLOW_ID: value = taskEntity.getFlowId(); break; case FlowConstant.TASK_ID: value = taskEntity.getId(); break; case FlowConstant.EVENT_ID: //外部节点才有 value = record.getNodeId(); break; case FlowConstant.TASK_NODE_ID: value = record.getNodeCode(); break; case FlowConstant.FLOW_FULL_NAME: value = taskEntity.getFlowName(); break; case FlowConstant.TASK_FULL_NAME: value = taskEntity.getFullName(); break; case FlowConstant.FORMDATA: value = JsonUtil.getObjectToString(data); break; case FlowConstant.LAUNCH_USER_ID: value = taskEntity.getCreatorUserId(); break; case FlowConstant.LAUNCH_USER_NAME: case FlowConstant.CREATORUSERNAME: case FlowConstant.MANDATOR: // UserEntity createUser = StringUtil.isNotBlank(taskEntity.getCreatorUserId()) ? serviceUtil.getUserInfo(taskEntity.getCreatorUserId()) : null; UserEntity createUser = eventModel.getCreateUser(); value = createUser != null ? createUser.getRealName() : ""; break; case FlowConstant.FLOW_OPERATOR_USER_ID: value = userId; break; case FlowConstant.FLOW_OPERATOR_USER_NAME: value = userName; break; case FlowConstant.SENDTIME: value = DateUtil.getNow(); break; case FlowConstant.MANDATARY: // UserEntity delegate = StringUtil.isNotBlank(taskEntity.getDelegateUserId()) ? serviceUtil.getUserInfo(taskEntity.getDelegateUserId()) : null; UserEntity delegate = eventModel.getDelegate(); value = delegate != null ? delegate.getRealName() : ""; break; default: String[] model = StringUtil.isNotEmpty(relationField) ? relationField.split("-") : new String[]{}; if (model.length > 1) { Object dataList = data.get(model[0]); if (dataList instanceof List) { List> listAll = (List>) dataList; List list = new ArrayList<>(); for (Map objectMap : listAll) { list.add(objectMap.get(model[1])); } value = String.valueOf(list); } } break; } } return value; } public List getToUser(String userId, String flowId) { Date thisTime = DateUtil.getNowDate(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(DelegateEntity::getType, 1); queryWrapper.lambda().le(DelegateEntity::getStartTime, thisTime).ge(DelegateEntity::getEndTime, thisTime); if (StringUtil.isNotEmpty(userId)) { queryWrapper.lambda().eq(DelegateEntity::getUserId, userId); } List list = delegateMapper.selectList(queryWrapper); List listRes = new ArrayList<>(); if (StringUtil.isNotEmpty(flowId)) { for (DelegateEntity item : list) { if (StringUtil.isNotEmpty(item.getFlowId())) { String[] split = item.getFlowId().split(","); if (Arrays.asList(split).contains(flowId)) { listRes.add(item); } } else {//为空是全部流程 listRes.add(item); } } } else { listRes = list; } List toUser = new ArrayList<>(); if (CollectionUtil.isNotEmpty(listRes)) { List ids = listRes.stream().map(DelegateEntity::getId).distinct().collect(Collectors.toList()); List infoList = delegateInfoMapper.getList(ids); toUser = infoList.stream().filter(e -> ObjectUtil.equals(e.getStatus(), 1)) .map(DelegateInfoEntity::getToUserId).collect(Collectors.toList()); } return toUser; } // 事件 public void event(FlowModel flowModel, Integer status) throws WorkFlowException { event(flowModel, status, FlowContextHolder.getAllData()); } // 事件 public void event(FlowModel flowModel, Integer status, Map> allData) throws WorkFlowException { FlowModel model = JsonUtil.getJsonToBean(flowModel, FlowModel.class); TemplateNodeEntity nodeEntity = model.getNodeEntity(); NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class); RecordEntity record = new RecordEntity(); record.setNodeCode(nodeModel.getNodeId()); // 结束事件 if (ObjectUtil.equals(status, EventEnum.End.getStatus())) { List nodeEntityList = model.getNodeEntityList(); TemplateNodeEntity start = nodeEntityList.stream() .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.start.getType())).findFirst().orElse(null); if (null != start) { nodeModel = JsonUtil.getJsonToBean(start.getNodeJson(), NodeModel.class); } } TaskEntity taskEntity = model.getTaskEntity(); String formId = nodeEntity.getFormId(); String taskId = taskEntity.getId(); Map map = allData.get(taskId + JnpfConst.SIDE_MARK + formId) != null ? allData.get(taskId + JnpfConst.SIDE_MARK + formId) : serviceUtil.infoData(formId, taskId); model.setFormData(map); event(status, nodeModel, record, model); } /** * 流程事件 * * @param status 事件状态 1.发起 2.结束 3.发起撤回 4同意 5拒绝 6节点撤回 7 超时 8提醒 9退回 * @param nodeModel 节点数据 * @param record 审批数据 */ public void event(Integer status, NodeModel nodeModel, RecordEntity record, FlowModel flowModel) { if (nodeModel != null) { FuncConfig config = new FuncConfig(); EventEnum eventStatus = EventEnum.getEventStatus(status); switch (eventStatus) { case Init: config = nodeModel.getInitFuncConfig(); break; case End: config = nodeModel.getEndFuncConfig(); break; case FlowRecall: config = nodeModel.getFlowRecallFuncConfig(); break; case Approve: config = nodeModel.getApproveFuncConfig(); break; case Reject: config = nodeModel.getRejectFuncConfig(); break; case Recall: config = nodeModel.getRecallFuncConfig(); break; case Overtime: config = nodeModel.getOvertimeFuncConfig(); break; case Notice: config = nodeModel.getNoticeFuncConfig(); break; case Back: config = nodeModel.getBackFuncConfig(); break; } boolean on = config.getOn(); String interId = config.getInterfaceId(); List templateJsonModelList = config.getTemplateJson(); if (on && StringUtil.isNotEmpty(interId)) { Map data = flowModel.getFormData(); TaskEntity taskEntity = flowModel.getTaskEntity(); FlowModel parameterModel = new FlowModel(); parameterModel.setFormData(data); parameterModel.setRecordEntity(record); parameterModel.setTaskEntity(taskEntity); Map parameterMap = parameterMap(parameterModel, templateJsonModelList); ActionResult result = serviceUtil.infoToId(interId, parameterMap); if (null == result || Objects.equals(400, result.getCode())) { System.out.println("接口调用失败: "+ result); } } } } public void create(FlowModel fo, String taskId, List nodeEntityList, OperatorEntity operator) { UserInfo userInfo = UserProvider.getUser(); // 候选人 Map> candidateList = fo.getCandidateList(); for (String key : candidateList.keySet()) { TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> e.getNodeCode().equals(key)).findFirst().orElse(null); if (null == nodeEntity) { continue; } List list = candidateList.get(key); this.create(taskId, nodeEntity, operator, userInfo, list, FlowNature.Candidates); } // 异常人 Map> errorRuleUserList = fo.getErrorRuleUserList(); for (String key : errorRuleUserList.keySet()) { TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> e.getNodeCode().equals(key)).findFirst().orElse(null); if (null == nodeEntity) { continue; } List list = errorRuleUserList.get(key); this.create(taskId, nodeEntity, operator, userInfo, list, FlowNature.CandidatesError); } } public void create(String taskId, TemplateNodeEntity nodeEntity, OperatorEntity operator, UserInfo userInfo, List list, Integer type) { CandidatesEntity entity = new CandidatesEntity(); entity.setId(RandomUtil.uuId()); entity.setTaskId(taskId); entity.setNodeCode(nodeEntity.getNodeCode()); String nodeId = ""; if (operator != null) { entity.setOperatorId(operator.getId()); nodeId = operator.getNodeId(); } else { entity.setOperatorId(FlowNature.ParentId); } List entityList = candidatesMapper.getListByCode(taskId, nodeEntity.getNodeCode()); if (CollectionUtil.isNotEmpty(entityList)) { QueryWrapper operatorWrapper = new QueryWrapper<>(); operatorWrapper.lambda().eq(OperatorEntity::getTaskId, taskId).eq(OperatorEntity::getNodeId, nodeId); List opList = operatorMapper.selectList(operatorWrapper); if (CollectionUtil.isNotEmpty(opList)) { List opIds = opList.stream().map(OperatorEntity::getId).collect(Collectors.toList()); List deleteList = entityList.stream() .filter(e -> !opIds.contains(e.getOperatorId())).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(deleteList)) { candidatesMapper.deleteByIds(deleteList); } } } entity.setAccount(userInfo.getUserAccount()); entity.setHandleId(userInfo.getUserId()); entity.setType(type); entity.setCandidates(String.join(",", list)); candidatesMapper.insert(entity); } public FlowMsgModel sendMsg(CommentEntity entity) throws WorkFlowException { FlowMsgModel flowMsgModel = new FlowMsgModel(); flowMsgModel.setWait(false); FlowModel flowModel = new FlowModel(); setFlowModel(entity.getTaskId(), flowModel); TaskEntity taskEntity = flowModel.getTaskEntity(); List nodeEntityList = flowModel.getNodeEntityList(); TemplateNodeEntity start = nodeEntityList.stream() .filter(e -> e.getNodeType().equals(NodeEnum.start.getType())).findFirst().orElse(null); if (null == start) { return flowMsgModel; } // 开始节点的评论配置 NodeModel startNode = JsonUtil.getJsonToBean(start.getNodeJson(), NodeModel.class); MsgConfig commentMsgConfig = startNode.getCommentMsgConfig(); if (commentMsgConfig.getOn() != 1 && commentMsgConfig.getOn() != 3) { return flowMsgModel; } String text = entity.getText(); // 不包含@{ 且 回复ID为空(不发消息) if (StringUtil.isBlank(text) || !text.contains("@{") && StringUtil.isBlank(entity.getReplyId())) { return flowMsgModel; } List userIds = new ArrayList<>(); // 回复的人 if (StringUtil.isNotEmpty(entity.getReplyId())) { CommentEntity reply = commentMapper.getInfo(entity.getReplyId()); if (reply != null) { userIds.add(reply.getCreatorUserId()); } } String regex = "@\\{([^}]*)\\}"; Pattern pattern = Pattern.compile(regex); List userNameList = new ArrayList<>(); Matcher matcher = pattern.matcher(text); while (matcher.find()) { String group = matcher.group(); userNameList.add(group.substring(2, group.length() - 1)); } // 获取@的人的account List accountList = new ArrayList<>(); if (CollectionUtil.isNotEmpty(userNameList)) { for (String userName : userNameList) { String[] split = userName.split("/"); if (split.length >= 2) { String account = split[split.length - 1]; accountList.add(account); } } } List userList = serviceUtil.getUserByAccount(accountList.stream().distinct().collect(Collectors.toList())); List ids = userList.stream().map(UserEntity::getId).collect(Collectors.toList()); userIds.addAll(ids); // 过滤自己 String userId = UserProvider.getLoginUserId(); userIds = userIds.stream().filter(e -> !e.equals(userId)).distinct().collect(Collectors.toList()); if (userIds.isEmpty()) { return flowMsgModel; } List operatorList = new ArrayList<>(); List circulateList = new ArrayList<>(); List userIdList = new ArrayList<>(userIds); TaskUserListModel model = getTaskUserList(taskEntity.getId()); // 经办 for (OperatorEntity operator : model.getOperatorList()) { String handleId = operator.getHandleId(); if (userIdList.contains(handleId)) { operatorList.add(operator); userIdList.remove(handleId); } } // 抄送 if (!userIdList.isEmpty()) { for (CirculateEntity circulate : model.getCirculateList()) { String circulateUserId = circulate.getUserId(); if (userIdList.contains(circulateUserId)) { circulateList.add(circulate); userIdList.remove(circulateUserId); } } } // 发起人 boolean startHandleId = false; if (!userIdList.isEmpty()) { if (userIdList.contains(taskEntity.getCreatorUserId())) { startHandleId = true; } } // 消息 flowMsgModel.setNodeList(flowModel.getNodeEntityList()); flowMsgModel.setCirculateList(circulateList); flowMsgModel.setFlowModel(flowModel); flowMsgModel.setTaskEntity(taskEntity); flowMsgModel.setOperatorList(operatorList); flowMsgModel.setStartHandId(startHandleId); flowMsgModel.setComment(true); return flowMsgModel; } public List getListByFlowIds(List flowIds) { List list = new ArrayList<>(); List jsonEntityList = templateJsonMapper.selectByIds(flowIds); if (CollectionUtil.isNotEmpty(jsonEntityList)) { List templateIds = jsonEntityList.stream().map(TemplateJsonEntity::getTemplateId).distinct().collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(templateIds)) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().in(TemplateEntity::getId, templateIds).eq(TemplateEntity::getStatus, TemplateStatueEnum.up.getCode()); list = templateMapper.selectList(wrapper); } } return list; } public TaskUserListModel getTaskUserList(String taskId) { Set userIdSet = new HashSet<>(); // 发起人 TaskEntity taskEntity = taskMapper.selectById(taskId); if (null != taskEntity) { userIdSet.add(taskEntity.getCreatorUserId()); } // 审批人 List operatorList = operatorMapper.getList(taskId); if (CollectionUtil.isNotEmpty(operatorList)) { userIdSet.addAll(operatorList.stream().map(OperatorEntity::getHandleId).collect(Collectors.toList())); } // 抄送 List circulateList = circulateMapper.getList(taskId); if (CollectionUtil.isNotEmpty(circulateList)) { userIdSet.addAll(circulateList.stream().map(CirculateEntity::getUserId).collect(Collectors.toList())); } List recordList = recordMapper.getList(taskId); if (CollectionUtil.isNotEmpty(recordList)) { userIdSet.addAll(recordList.stream().map(RecordEntity::getHandleId).collect(Collectors.toList())); } TaskUserListModel model = new TaskUserListModel(); model.setAllUserIdList(new ArrayList<>(userIdSet)); model.setFlowTask(taskEntity); model.setOperatorList(operatorList); model.setCirculateList(circulateList); model.setOperatorRecordList(recordList); return model; } public DelegateModel create(List toUserIdList, DelegateEntity delegateEntity) { DelegateModel model = new DelegateModel(); if (CollectionUtil.isNotEmpty(toUserIdList)) { Integer type = delegateEntity.getType(); // 获取全局配置,是否确认 SysConfigModel sysConfig = serviceUtil.getSysConfig(); Integer ack = ObjectUtil.equals(type, 0) ? sysConfig.getDelegateAck() : sysConfig.getProxyAck(); List userList = serviceUtil.getUserName(toUserIdList); List list = new ArrayList<>(); for (String toUserId : toUserIdList) { DelegateInfoEntity entity = new DelegateInfoEntity(); entity.setId(RandomUtil.uuId()); entity.setStatus(0); if (ObjectUtil.equals(ack, 0)) { entity.setStatus(1); } entity.setDelegateId(delegateEntity.getId()); entity.setToUserId(toUserId); UserEntity user = userList.stream().filter(e -> ObjectUtil.equals(e.getId(), toUserId)).findFirst().orElse(null); if (null != user) { entity.setToUserName(user.getRealName() + "/" + user.getAccount()); } list.add(entity); } delegateInfoMapper.insert(list); // 委托消息 UserInfo userInfo = UserProvider.getUser(); model.setToUserIds(toUserIdList); model.setType(type); model.setUserInfo(userInfo); model.setDelegate(ObjectUtil.equals(type, 0)); } return model; } public List update(List toUserIdList, DelegateEntity delegateEntity) { List createList = new ArrayList<>(); String delegateId = delegateEntity.getId(); if (CollectionUtil.isNotEmpty(toUserIdList)) { List deleteList = new ArrayList<>(); List list = delegateInfoMapper.getList(delegateId); for (String userId : toUserIdList) { DelegateInfoEntity infoEntity = list.stream() .filter(e -> ObjectUtil.equals(e.getToUserId(), userId)).findFirst().orElse(null); if (null == infoEntity) { createList.add(userId); } } for (DelegateInfoEntity entity : list) { String userId = toUserIdList.stream() .filter(e -> ObjectUtil.equals(entity.getToUserId(), e)).findFirst().orElse(null); if (StringUtil.isEmpty(userId)) { deleteList.add(entity.getToUserId()); } } if (CollectionUtil.isNotEmpty(deleteList)) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(DelegateInfoEntity::getDelegateId, delegateId) .in(DelegateInfoEntity::getToUserId, deleteList); delegateInfoMapper.delete(wrapper); } } return createList; } public List getByToUserId(String toUserId) { return this.getByToUserId(toUserId, 1); } public List getByToUserId(String toUserId, Integer type) { List infoList = delegateInfoMapper.getByToUserId(toUserId); List ids = infoList.stream().filter(e -> ObjectUtil.equals(e.getStatus(), 1)) .map(DelegateInfoEntity::getDelegateId).distinct().collect(Collectors.toList()); List list = new ArrayList<>(); if (CollectionUtil.isNotEmpty(ids)) { Date thisTime = DateUtil.getNowDate(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().in(DelegateEntity::getId, ids).eq(DelegateEntity::getType, type) .le(DelegateEntity::getStartTime, thisTime).ge(DelegateEntity::getEndTime, thisTime); list = delegateMapper.selectList(queryWrapper); } return list; } public String getEnCode(TemplateEntity entity) { String code = serviceUtil.getCode(); boolean existByEnCode = templateMapper.isExistByEnCode(code, entity.getId(), null); if (existByEnCode) { return getEnCode(entity); } return code; } public void create(TemplateNodeUpFrom from) { Map> flowNodes = from.getFlowNodes(); String flowXml = from.getFlowXml(); String templateJsonId = from.getFlowId(); String id = from.getId(); List jsonList = templateJsonMapper.getList(id); int version = jsonList.stream().map(TemplateJsonEntity::getVersion).mapToInt(Integer::parseInt).max().orElse(0) + 1; TemplateJsonEntity entity = new TemplateJsonEntity(); entity.setId(StringUtil.isNotEmpty(templateJsonId) ? templateJsonId : RandomUtil.uuId()); entity.setTemplateId(id); entity.setFlowXml(flowXml); NodeModel startNode = JsonUtil.getJsonToList(new ArrayList<>(flowNodes.values()), NodeModel.class).stream().filter(t -> NodeEnum.start.getType().equals(t.getType())).findFirst().orElse(null); entity.setVersion(String.valueOf(version)); entity.setState(0); entity.setSortCode(0L); String formId = null != startNode ? startNode.getFormId() : null; for (String key : flowNodes.keySet()) { NodeModel nodeModel = JsonUtil.getJsonToBean(flowNodes.get(key), NodeModel.class); TemplateNodeEntity nodeEntity = new TemplateNodeEntity(); nodeEntity.setId(StringUtil.isNotEmpty(nodeEntity.getId()) ? nodeEntity.getId() : RandomUtil.uuId()); nodeEntity.setFlowId(entity.getId()); nodeEntity.setNodeCode(key); nodeEntity.setNodeJson(JsonUtil.getObjectToString(flowNodes.get(key))); nodeEntity.setNodeType(nodeModel.getType()); nodeEntity.setFormId(StringUtil.isBlank(nodeModel.getFormId()) ? formId : nodeModel.getFormId()); templateNodeMapper.setIgnoreLogicDelete().deleteById(nodeEntity.getId()); templateNodeMapper.setIgnoreLogicDelete().insertOrUpdate(nodeEntity); templateNodeMapper.clearIgnoreLogicDelete(); } templateJsonMapper.setIgnoreLogicDelete().deleteById(entity.getId()); templateJsonMapper.setIgnoreLogicDelete().insertOrUpdate(entity); templateJsonMapper.clearIgnoreLogicDelete(); } public void delete(List idList) { templateJsonMapper.delete(idList); templateNodeMapper.delete(idList); } public TemplateJsonInfoVO getInfoVo(String id) throws WorkFlowException { TemplateJsonEntity jsonEntity = templateJsonMapper.getInfo(id); TemplateEntity entity = templateMapper.getInfo(jsonEntity.getTemplateId()); TemplateJsonInfoVO vo = JsonUtil.getJsonToBean(entity, TemplateJsonInfoVO.class); vo.setFlowXml(jsonEntity.getFlowXml()); List templateNodeList = templateNodeMapper.getList(jsonEntity.getId()); Map> flowNodes = new HashMap<>(); for (TemplateNodeEntity nodeEntity : templateNodeList) { flowNodes.put(nodeEntity.getNodeCode(), JsonUtil.stringToMap(nodeEntity.getNodeJson())); } vo.setFlowableId(jsonEntity.getFlowableId()); vo.setFlowNodes(flowNodes); vo.setFlowId(jsonEntity.getId()); return vo; } public List getOperatorList(TaskPagination pagination) { String loginUserId = StringUtil.isNotEmpty(pagination.getUserId()) ? pagination.getUserId() : UserProvider.getLoginUserId(); // 是否委托 Boolean delegateType = pagination.getDelegateType(); List delegateList = delegateType ? getByToUserId(loginUserId) : new ArrayList<>(); return operatorMapper.getList(pagination, delegateList); } public List getRecordList(TaskPagination pagination) { String loginUserId = StringUtil.isNotEmpty(pagination.getUserId()) ? pagination.getUserId() : UserProvider.getLoginUserId(); List delegateList = getByToUserId(loginUserId); List recordList = recordMapper.getList(pagination, delegateList); if (recordList.isEmpty()) { return new ArrayList<>(); } List list = taskMapper.getList(pagination, recordList); return list; } /** * 设置参数 */ public void setFlowModel(String taskId, FlowModel flowModel) throws WorkFlowException { if (flowModel.getUserInfo() == null) { flowModel.setUserInfo(UserProvider.getUser()); } TaskEntity taskEntity = taskMapper.getInfo(taskId); if (null == taskEntity) { throw new WorkFlowException(MsgCode.FA001.get()); } TemplateJsonEntity jsonEntity = templateJsonMapper.getInfo(taskEntity.getFlowId()); flowModel.setJsonEntity(jsonEntity); flowModel.setDeploymentId(jsonEntity.getFlowableId()); flowModel.setTaskEntity(taskEntity); List nodeEntityList = templateNodeMapper.getList(taskEntity.getFlowId()); flowModel.setNodeEntityList(nodeEntityList); Map nodes = new HashMap<>(); for (TemplateNodeEntity nodeEntity : nodeEntityList) { nodes.put(nodeEntity.getNodeCode(), JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class)); } flowModel.setNodes(nodes); } public FlowFormModel getFormIdAndFlowId(List userIdAll, String templateId) throws WorkFlowException { List userList = new ArrayList<>(); TemplateEntity template = templateMapper.getInfo(templateId); List nodeEntityList = templateNodeMapper.getList(template.getFlowId()); // 判断权限 for (String userId : userIdAll) { userList.add(userId); if (ObjectUtil.equals(template.getVisibleType(), FlowNature.Authority)) { boolean commonUser = serviceUtil.isCommonUser(userId); if (commonUser) { List flowIds = serviceUtil.getPermission(userId); if (!flowIds.contains(template.getId())) { userList.remove(userId); } } } } TemplateNodeEntity nodeEntity = nodeEntityList.stream() .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.start.getType())).findFirst().orElse(null); if (null == nodeEntity) { throw new WorkFlowException(MsgCode.FA001.get()); } FlowFormModel model = new FlowFormModel(); model.setFormId(nodeEntity.getFormId()); model.setFlowId(template.getFlowId()); model.setUserId(userList); model.setUserIdAll(userIdAll); return model; } public TaskEntity createEntity(FlowModel fo, TemplateEntity templateEntity, Map nodes) throws WorkFlowException { UserInfo user = UserProvider.getUser(); String userName = user.getUserName(); String userId = user.getUserId(); UserInfo userInfo = fo.getUserInfo(); if (null != userInfo) { if (StringUtil.isBlank(fo.getUserId())) { fo.setUserId(userInfo.getUserId()); } userName = userInfo.getUserName(); userId = userInfo.getUserId(); } Map data = fo.getFormData() == null ? new HashMap<>() : fo.getFormData(); data.put(FlowConstant.FLOW_FULL_NAME, templateEntity.getFullName()); data.put(FlowConstant.FLOW_FULL_CODE, templateEntity.getEnCode()); data.put(FlowConstant.LAUNCH_USER_NAME, userName); data.put(FlowConstant.LAUNCH_TIME, DateUtil.daFormat(new Date())); data.put(FlowConstant.USER_NAME, userName); NodeModel global = nodes.get(NodeEnum.global.getType()); String titleContent = !FlowNature.TitleType.equals(global.getTitleType()) ? global.getTitleContent() : global.getDefaultContent(); if (StringUtil.isNotEmpty(fo.getId())) { TaskEntity taskEntity = taskMapper.selectById(fo.getId()); if (null != taskEntity) { data.put(FlowConstant.FLOW_NAME, taskEntity.getFullName()); if (StringUtil.isNotBlank(fo.getDelegateUser())) { taskEntity.setDelegateUserId(fo.getDelegateUser()); } taskEntity.setCreatorUserId(StringUtil.isNotBlank(fo.getUserId()) ? fo.getUserId() : userId); // 流程名称 if (ObjectUtil.equals(TaskStatusEnum.RUNNING.getCode(), fo.getStatus()) && ObjectUtil.equals(taskEntity.getStatus(), TaskStatusEnum.TO_BE_SUBMIT.getCode())) { String fullName = FlowJsonUtil.field(titleContent, data, "1"); taskEntity.setFullName(fullName); } taskEntity.setUrgent(fo.getFlowUrgent()); return taskEntity; } } TaskEntity entity = new TaskEntity(); entity.setType(fo.getIsFlow()); if (StringUtil.isNotEmpty(fo.getId())) { entity.setId(fo.getId()); } else { entity.setId(RandomUtil.uuId()); } entity.setUrgent(fo.getFlowUrgent()); entity.setSortCode(0L); if (StringUtil.isNotBlank(fo.getDelegateUser())) { entity.setDelegateUserId(fo.getDelegateUser()); } // 发起人就是创建人 entity.setCreatorUserId(StringUtil.isNotBlank(fo.getUserId()) ? fo.getUserId() : userId); entity.setCreatorTime(new Date()); FileConfig fileConfig = global.getFileConfig(); entity.setIsFile(fileConfig.getOn() ? 0 : null); // 流程名称 String fullName = templateEntity.getFullName(); if (!ObjectUtil.equals(fo.getStatus(), TaskStatusEnum.TO_BE_SUBMIT.getCode())) { data.put(FlowConstant.FLOW_NAME, fullName); fullName = FlowJsonUtil.field(titleContent, data, "1"); } entity.setParentId(fo.getParentId()); if (!StringUtil.equals(FlowNature.ParentId, fo.getParentId())) { fullName += "(子流程)"; entity.setSubCode(fo.getSubCode()); entity.setSubParameter(JsonUtil.getObjectToString(fo.getSubParameter())); entity.setIsAsync(fo.getIsAsync()); } entity.setFullName(fullName); entity.setDelegateUserId(fo.getDelegateUser()); entity.setFlowCode(templateEntity.getEnCode()); entity.setFlowName(templateEntity.getFullName()); entity.setFlowCategory(templateEntity.getCategory()); TemplateJsonEntity jsonEntity = fo.getJsonEntity(); if (null != jsonEntity && StringUtil.isNotBlank(jsonEntity.getVersion())) { entity.setFlowVersion(jsonEntity.getVersion()); } else { entity.setFlowVersion(templateEntity.getVersion()); } entity.setTemplateId(templateEntity.getId()); entity.setFlowId(templateEntity.getFlowId()); // entity.setIsBatch(1);// 0:否,1:是 if (templateEntity.getType() != null) { entity.setFlowType(templateEntity.getType()); } return entity; } //-------------------------------operatorUtil------------------------------------------------------------ // 设置异常处理 public void handleErrorRule(NodeModel nodeModel, List errorList) { if (null == nodeModel) { return; } FlowErrorModel errorModel = new FlowErrorModel(); errorModel.setNodeCode(nodeModel.getNodeId()); errorModel.setNodeName(nodeModel.getNodeName()); errorList.add(errorModel); } /** * 封装查询审批人 */ private List user(FlowMethod flowMethod, int type) throws WorkFlowException { List userIdAll = new ArrayList<>(); Boolean isCandidates = flowMethod.getIsCandidates(); TemplateNodeEntity nodeEntity = flowMethod.getNodeEntity(); NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class); TaskEntity taskEntity = flowMethod.getTaskEntity(); String createUserId = taskEntity.getCreatorUserId(); FlowModel flowModel = flowMethod.getFlowModel(); OperatorEntity operator = flowModel.getOperatorEntity(); String deploymentId = flowModel.getDeploymentId(); Boolean autoAudit = flowModel.getAutoAudit(); List nodeEntityList = flowMethod.getNodeEntityList(); List prevList = new ArrayList<>(); TemplateNodeEntity startNode = nodeEntityList.stream().filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.start.getType())).findFirst().orElse(null); boolean prevIsStart = false; if (nodeModel.getIsCandidates() && isCandidates) { String nodeCode = nodeEntity.getNodeCode(); List candidatesList = candidatesMapper.getList(taskEntity.getId(), nodeCode); if (CollectionUtil.isNotEmpty(candidatesList)) { List opIds = candidatesList.stream().map(CandidatesEntity::getOperatorId).collect(Collectors.toList()); List operators = operatorMapper.selectByIds(opIds); for (CandidatesEntity t : candidatesList) { OperatorEntity op = operators.stream().filter(e -> ObjectUtil.equals(e.getId(), t.getOperatorId())).findFirst().orElse(null); if (null != op && null == op.getHandleStatus() && null != op.getHandleParameter()) { continue; } List candidates = StringUtil.isNotEmpty(t.getCandidates()) ? Arrays.stream(t.getCandidates().split(",")).collect(Collectors.toList()) : new ArrayList<>(); userIdAll.addAll(candidates); } } return userIdAll; } //发起者【发起者主管】 if (OperatorEnum.LaunchCharge.getCode().equals(type)) { this.prevNode(deploymentId, nodeEntity.getNodeCode(), nodeEntityList, prevList); if (null != startNode) { prevIsStart = prevList.contains(startNode.getNodeCode()); } List userId = new ArrayList<>(); // 判断 发起人、上一节点 Integer approverType = nodeModel.getApproverType(); if (ObjectUtil.equals(approverType, FlowNature.Previously) && !prevIsStart) { List handleIds = new ArrayList<>(); if (!isCandidates) { if (prevList.contains(operator.getNodeCode())) { handleIds.add(operator.getHandleId()); } } else { handleIds.addAll(this.getHandleIds(taskEntity.getId(), operator, autoAudit)); } List userList = serviceUtil.getUserName(handleIds); userId.addAll(userList.stream().map(UserEntity::getId).collect(Collectors.toList())); } else { userId.add(createUserId); } for (String id : userId) { if (StringUtil.isEmpty(id)){ continue; } List userPositionList = serviceUtil.getListByUserIdAll(ImmutableList.of(id)).stream() .filter(t -> PermissionConst.POSITION.equals(t.getObjectType())).collect(Collectors.toList()); for (UserRelationEntity relation : userPositionList) { UserEntity user = new UserEntity(); user.setPositionId(relation.getObjectId()); String managerByLevel = getManagerByLevel(user, nodeModel.getManagerLevel()); if (StringUtil.isNotEmpty(managerByLevel)) { userIdAll.add(managerByLevel); } } } } //【发起本人】 if (OperatorEnum.InitiatorMe.getCode().equals(type)) { userIdAll.add(createUserId); } //【变量】 if (OperatorEnum.Variate.getCode().equals(type)) { flowMethod.setIsAssign(false); Map dataAll = flowMethod.getSubFormData(); if (CollectionUtil.isEmpty(dataAll)) { dataAll = !isCandidates ? flowModel.getFormData() : createOrUpdate(flowMethod); } Object data = getOneData(dataAll, nodeModel.getFormField()); List handleIdAll = this.getUserId(data); userIdAll.addAll(handleIdAll); } //【环节】 if (OperatorEnum.Link.getCode().equals(type)) { List list = recordMapper.getList(taskEntity.getId()); list = list.stream().filter(e -> ObjectUtil.equals(e.getNodeCode(), nodeModel.getApproverNodeId()) && (FlowNature.AuditCompletion.equals(e.getHandleType()) || FlowNature.RejectCompletion.equals(e.getHandleType())) && !FlowNature.Invalid.equals(e.getStatus()) && !e.getHandleId().equals(FlowNature.SYSTEM_CODE) && !e.getHandleId().equals(FlowNature.ParentId)) .collect(Collectors.toList()); List handleId = list.stream().map(RecordEntity::getHandleId).collect(Collectors.toList()); if (CollectionUtil.isEmpty(handleId) && autoAudit) { handleId.add(operator.getHandleId()); } userIdAll.addAll(handleId); } //【服务】 if (OperatorEnum.Serve.getCode().equals(type)) { flowMethod.setIsAssign(false); Map dataAll = !isCandidates ? flowModel.getFormData() : createOrUpdate(flowMethod); InterfaceConfig interfaceConfig = nodeModel.getInterfaceConfig(); String interfaceId = interfaceConfig.getInterfaceId(); if (StringUtil.isNotEmpty(interfaceId)) { UserInfo userInfo = UserProvider.getUser(); List templateJsonModelList = interfaceConfig.getTemplateJson(); RecordEntity record = new RecordEntity(); record.setTaskId(taskEntity.getId()); record.setNodeCode(nodeEntity.getNodeCode()); record.setHandleId(userInfo.getUserId()); FlowModel parameterModel = new FlowModel(); parameterModel.setFormData(dataAll); parameterModel.setRecordEntity(record); parameterModel.setTaskEntity(taskEntity); Map parameterMap = parameterMap(parameterModel, templateJsonModelList); ActionResult result = serviceUtil.infoToId(interfaceId, parameterMap); if (Objects.equals(200, result.getCode())) { Object data = result.getData(); if (data instanceof Map) { JSONObject map = new JSONObject((Map) data); List handleId = StringUtil.isNotEmpty(map.getString("handleId")) ? Arrays.asList(map.getString("handleId").split(",")) : new ArrayList<>(); userIdAll.addAll(handleId); } } } } //【指定人】 if (OperatorEnum.Nominator.getCode().equals(type)) { List handleIdAll = serviceUtil.getUserListAll(nodeModel.getApprovers()); userIdAll.addAll(handleIdAll); } //【逐级】 if (OperatorEnum.Step.getCode().equals(type)) { LaunchUserEntity launchUser = new LaunchUserEntity(); launchUser.setId(RandomUtil.uuId()); launchUser.setNodeCode(nodeModel.getNodeId()); launchUser.setTaskId(taskEntity.getId()); launchUser.setType(FlowNature.StepInitiation); launchUser.setCreatorTime(new Date()); this.prevNode(deploymentId, nodeEntity.getNodeCode(), nodeEntityList, prevList); if (null != startNode) { prevIsStart = prevList.contains(startNode.getNodeCode()); } // 判断 发起人、上一节点 String userId = createUserId; ApproversConfig approversConfig = nodeModel.getApproversConfig(); Integer start = approversConfig.getStart(); if (ObjectUtil.equals(start, FlowNature.Previously) && !prevIsStart) { List handleIds = this.getHandleIds(taskEntity.getId(), operator, autoAudit); userId = !handleIds.isEmpty() ? handleIds.get(0) : ""; } UserEntity info = serviceUtil.getUserInfo(userId); String managerByLevel = getManagerByLevel(info, 1); //直属主管 UserEntity managerInfo = serviceUtil.getUserInfo(managerByLevel); if (managerInfo != null) { userIdAll.add(managerInfo.getId()); //保存逐级对象 PositionEntity positionInfo = serviceUtil.getPositionInfo(info.getPositionId()); if (positionInfo != null) { launchUser.setPositionId(positionInfo.getPositionIdTree()); launchUser.setOrganizeId(positionInfo.getOrganizeId()); OrganizeEntity organizeInfo = serviceUtil.getOrganizeInfo(positionInfo.getOrganizeId()); if (organizeInfo != null) { launchUser.setOrganizeId(organizeInfo.getOrganizeIdTree()); } launchUser.setCreatorUserId(userId); flowMethod.setLaunchUser(launchUser); } } } return userIdAll; } }