business/src/main/java/com/ycl/controller/ProjectInfoController.java
@@ -114,7 +114,10 @@ return Result.ok().data(ProjectCodeGenerator.generateProjectCode()); } ; @GetMapping("/searchByKey") public Result searchByKey(@RequestParam(required = false) String wordKey) { return projectInfoService.searchByKey(wordKey); } @GetMapping("/getManagerFlag/{recordId}") public Result getManagerFlag(@PathVariable("recordId") Integer recordId) { @@ -169,4 +172,7 @@ public Result editProject(@RequestBody ProjectForm form) { return projectInfoService.editProject(form); } } business/src/main/java/com/ycl/domain/json/DelegateData.java
File was renamed from business/src/main/java/com/ycl/domain/json/TaskDelegateData.java @@ -12,7 +12,7 @@ * @date:2025/1/2 14:39 */ @Data public class TaskDelegateData { public class DelegateData { /** * 转办前的处理人id business/src/main/java/com/ycl/domain/vo/CustomerTaskVO.java
@@ -97,6 +97,16 @@ private List<String> handlerUnitName; /** * 实际处理人id */ private String actualHandlerUserId; /** * 实际处理人姓名 */ private String actualHandlerUserName; /** * 办理期限 */ private String timeLimit; business/src/main/java/com/ycl/domain/vo/ProjectProcessVO.java
@@ -25,6 +25,9 @@ @ApiModelProperty("流程定义id") private String processDefId; @ApiModelProperty("发布id") private String deployId; @ApiModelProperty("流程名称") private String flowableProcessName; business/src/main/java/com/ycl/event/event/TaskLogEvent.java
New file @@ -0,0 +1,62 @@ package com.ycl.event.event; import com.ycl.common.enums.business.ProcessLogEventTypeEnum; import lombok.Getter; import lombok.Setter; import org.springframework.context.ApplicationEvent; /** * 转办事件定义 * * @author:xp * @date:2025/1/16 15:04 */ @Getter @Setter public class TaskLogEvent extends ApplicationEvent { /** * 项目id */ private Long projectId; /** * 流程实例id */ private String processInsId; /** * 任务id */ private String taskId; /** * 事件类型 */ private ProcessLogEventTypeEnum eventType; /** * 其它数据 * @see com.ycl.domain.json */ private Object otherData; /** * 构造 * * @param source 传this即可 * @param projectId 项目id * @param processInsId 流程实例id * @param taskId 任务id * @param otherData 其它数据 */ public TaskLogEvent(Object source, Long projectId, String processInsId, String taskId, ProcessLogEventTypeEnum eventType, Object otherData) { super(source); this.projectId = projectId; this.processInsId = processInsId; this.eventType = eventType; this.taskId = taskId; this.otherData = otherData; } } business/src/main/java/com/ycl/event/listener/ProcessLogEventListener.java
New file @@ -0,0 +1,41 @@ package com.ycl.event.listener; import com.alibaba.fastjson2.JSON; import com.ycl.common.enums.business.ProcessLogEventTypeEnum; import com.ycl.common.utils.SecurityUtils; import com.ycl.domain.entity.ProcessLog; import com.ycl.event.event.TaskLogEvent; import com.ycl.service.ProcessLogService; import lombok.RequiredArgsConstructor; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; /** * @author:xp * @date:2025/1/16 15:14 */ @Component @RequiredArgsConstructor public class ProcessLogEventListener { private final ProcessLogService processLogService; /** * 监听流程日志事件 * * @param event 转办的事件内容 */ @EventListener(classes = {TaskLogEvent.class}) public void delegate(TaskLogEvent event) { ProcessLog log = new ProcessLog(); log.setEventType(event.getEventType()); log.setProcessInsId(event.getProcessInsId()); log.setProjectId(event.getProjectId()); log.setTaskId(event.getTaskId()); log.setUserId(SecurityUtils.getUserId()); log.setEventDataJson(JSON.toJSONString(event.getOtherData())); processLogService.save(log); } } business/src/main/java/com/ycl/mapper/PlanMapper.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.ycl.common.annotation.DataScope; import com.ycl.domain.entity.Plan; import com.ycl.domain.query.PlanQuery; import com.ycl.domain.vo.PlanVO; @@ -27,6 +28,7 @@ /** * 分页 */ IPage getPage(IPage page, @Param("query") PlanQuery query); @DataScope(deptAlias = "d") IPage getPage(@Param("query") PlanQuery query, IPage page); } business/src/main/java/com/ycl/mapper/ProjectInfoMapper.java
@@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.ycl.common.annotation.DataScope; import com.ycl.common.core.domain.BaseEntity; import com.ycl.domain.entity.ProjectInfo; import com.ycl.domain.excel.ProjectExcelTemplate; import com.ycl.domain.query.ProjectInfoQuery; @@ -31,9 +33,11 @@ /** * 分页 */ IPage getPage(IPage page, @Param("query") ProjectInfoQuery query); @DataScope(deptAlias = "d") IPage getPage(@Param("query") ProjectInfoQuery query, IPage page); List<ProjectVO> homeCount(); @DataScope(deptAlias = "d") List<ProjectVO> homeCount(BaseEntity params); List<ProjectVO> selectProjectDetailByIds(@Param("dataIdList") List<Long> dataIdList); business/src/main/java/com/ycl/mapper/ProjectProcessMapper.java
@@ -1,5 +1,6 @@ package com.ycl.mapper; import com.ycl.common.annotation.DataScope; import com.ycl.domain.entity.ProjectInfo; import com.ycl.domain.entity.ProjectProcess; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -30,7 +31,8 @@ /** * 分页 */ IPage getPage(IPage page, @Param("query") ProjectProcessQuery query); @DataScope(deptAlias = "d") IPage getPage(@Param("query") ProjectProcessQuery query, IPage page); /** * 通过流程实例id获取项目id、名称 business/src/main/java/com/ycl/service/ProjectInfoService.java
@@ -90,4 +90,6 @@ void importProject(MultipartFile file); Result editProject(ProjectForm form); Result searchByKey(String wordKey); } business/src/main/java/com/ycl/service/impl/PlanServiceImpl.java
@@ -105,7 +105,7 @@ @Override public Result page(PlanQuery query) { IPage<ProjectPlanResponseVO> page = PageUtil.getPage(query, ProjectPlanResponseVO.class); baseMapper.getPage(page, query); baseMapper.getPage(query, page); // 对分页后的属性进行处理 List<ProjectPlanResponseVO> records = page.getRecords(); for (ProjectPlanResponseVO record : records) { business/src/main/java/com/ycl/service/impl/ProjectInfoServiceImpl.java
@@ -7,14 +7,17 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ZipUtil; import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.common.annotation.DataScope; import com.ycl.common.base.Result; import com.ycl.common.config.SysConfig; import com.ycl.common.constant.Constants; import com.ycl.common.core.domain.BaseEntity; import com.ycl.common.enums.business.FileTypeEnum; import com.ycl.common.enums.business.ImportanceTypeEnum; import com.ycl.common.enums.business.ProjectCategoryEnum; @@ -234,18 +237,18 @@ Long userId = SecurityUtils.getUserId(); String ancestors = sysDeptMapper.selectAncestors(userId); String[] ancestorArr = ancestors.split(","); for (String ancestor : ancestorArr) { if ("101".equals(ancestor)) { // 业主 query.setCreateBy(userId); query.setRole(0); }else if ("102".equals(ancestor)){ // 审批 query.setUsedStatus(1); query.setRole(1); } } // for (String ancestor : ancestorArr) { // if ("101".equals(ancestor)) { // 业主 // query.setCreateBy(userId); // query.setRole(0); // } else if ("102".equals(ancestor)) { // 审批 // query.setUsedStatus(1); // query.setRole(1); // } // } IPage<ProjectInfoVO> page = PageUtil.getPage(query, ProjectInfoVO.class); baseMapper.getPage(page, query); baseMapper.getPage(query, page); List<ProjectInfoVO> records = page.getRecords(); List<ProjectVO> list = new ArrayList<>(); records.forEach(vo -> { @@ -316,7 +319,7 @@ // {"type":"省重点项目","count":0,"amount":"0.00","text":"省"}]}} IndexCountVO indexCountVO = new IndexCountVO(); List<IndexProPhaseCountVO> proPhaseCountVO = new ArrayList<>(); List<ProjectVO> projectVOS = baseMapper.homeCount(); List<ProjectVO> projectVOS = baseMapper.homeCount(new BaseEntity()); List<ProjectVO> reserve = new ArrayList<>(); List<ProjectVO> previous = new ArrayList<>(); List<ProjectVO> implement = new ArrayList<>(); @@ -436,7 +439,7 @@ ProjectInfo projectInfo = baseMapper.selectById(recordId); // 判断当前用户id是否在主管列表中 String competentDepartment = projectInfo.getCompetentDepartment(); if (StringUtils.isEmpty(competentDepartment)){ if (StringUtils.isEmpty(competentDepartment)) { return Result.ok().data(false); } List<String> list = Arrays.asList(competentDepartment.split(",")); @@ -586,7 +589,7 @@ java.io.File tempDir = null; try { tempZip = java.io.File.createTempFile("temp", ".zip"); try(InputStream inputStream = file.getInputStream()) { try (InputStream inputStream = file.getInputStream()) { Files.copy(inputStream, tempZip.toPath(), StandardCopyOption.REPLACE_EXISTING); } @@ -594,9 +597,9 @@ try { ZipUtil.unzip(tempZip, tempDir, CharsetUtil.CHARSET_UTF_8); }catch (IORuntimeException e){ log.error("解压失败,尝试使用GBK编码解压..."); ZipUtil.unzip(tempZip, tempDir, CharsetUtil.CHARSET_GBK); } catch (IORuntimeException e) { log.error("解压失败,尝试使用GBK编码解压..."); ZipUtil.unzip(tempZip, tempDir, CharsetUtil.CHARSET_GBK); } Path path = tempDir.toPath(); @@ -679,11 +682,11 @@ @Override public Result editProject(ProjectForm form) { if (ObjectUtil.isNotNull(form.getProjectInfoForm())){ if (ObjectUtil.isNotNull(form.getProjectInfoForm())) { if (ObjectUtil.isNull(form.getProjectInfoForm().getId())) { //新增 add(form.getProjectInfoForm()); }else { } else { //更新 update(form.getProjectInfoForm()); } @@ -691,40 +694,50 @@ if (ObjectUtil.isNotNull(form.getProjectInvestmentInfoForm())) { if (ObjectUtil.isNull(form.getProjectInvestmentInfoForm().getId())) { projectInvestmentInfoServiceImpl.add(form.getProjectInvestmentInfoForm()); }else { } else { projectInvestmentInfoServiceImpl.update(form.getProjectInvestmentInfoForm()); } } if (ObjectUtil.isNotNull(form.getProjectInvestmentFundingForm())) { if (ObjectUtil.isNull(form.getProjectInvestmentFundingForm().getId())) { projectInvestmentFundingServiceImpl.add(form.getProjectInvestmentFundingForm()); }else { } else { projectInvestmentFundingServiceImpl.update(form.getProjectInvestmentFundingForm()); } } if (ObjectUtil.isNotNull(form.getProjectInvestmentPolicyComplianceForm())) { if (ObjectUtil.isNull(form.getProjectInvestmentPolicyComplianceForm().getId())) { projectInvestmentPolicyComplianceServiceImpl.add(form.getProjectInvestmentPolicyComplianceForm()); }else { } else { projectInvestmentPolicyComplianceServiceImpl.update(form.getProjectInvestmentPolicyComplianceForm()); } } if (ObjectUtil.isNotNull(form.getProjectUnitRegistrationInfoForm())) { if (ObjectUtil.isNull(form.getProjectUnitRegistrationInfoForm().getId())) { projectUnitRegistrationInfoServiceImpl.add(form.getProjectUnitRegistrationInfoForm()); }else { } else { projectUnitRegistrationInfoServiceImpl.update(form.getProjectUnitRegistrationInfoForm()); } } if (ObjectUtil.isNotNull(form.getDocumentInfoForm())) { if (ObjectUtil.isNull(form.getDocumentInfoForm().getProjectId())){ if (ObjectUtil.isNull(form.getDocumentInfoForm().getProjectId())) { return Result.error("请先保存投资管理基本信息"); }else { } else { addDoc(form.getDocumentInfoForm()); } } return Result.ok("提交成功"); } @Override public Result searchByKey(String wordKey) { Wrapper wrapper = null; if (!StringUtils.isEmpty(wordKey)) { wrapper = Wrappers.<ProjectInfo>lambdaQuery().like(ProjectInfo::getProjectName, wordKey).or().like(ProjectInfo::getProjectCode, wordKey); } List<ProjectInfo> list = baseMapper.selectList(wrapper); return Result.ok().data(list); } private static void deleteDirectoryOrFile(java.io.File file) { @@ -742,8 +755,10 @@ } file.delete(); } /** * 项目名称校验重复 * * @return */ public void checkProjectNameUnique(ProjectInfo projectInfo) { business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -1,35 +1,28 @@ package com.ycl.service.impl; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.ycl.common.constant.ProcessConstants; import com.ycl.common.core.domain.AjaxResult; import com.ycl.common.core.domain.entity.SysDept; import com.ycl.common.core.domain.entity.SysRole; import com.ycl.common.core.domain.entity.SysUser; import com.ycl.common.enums.FlowComment; import com.ycl.common.enums.business.FlowLogEventTypeEnum; import com.ycl.common.enums.business.HandlerTypeEnum; import com.ycl.common.enums.business.ProcessLogEventTypeEnum; import com.ycl.common.enums.business.TaskStatusEnum; import com.ycl.common.utils.SecurityUtils; import com.ycl.constant.TaskTypeConstant; import com.ycl.domain.dto.FlowTaskDto; import com.ycl.domain.entity.FlowLog; import com.ycl.domain.entity.ProjectInfo; import com.ycl.domain.entity.ProjectProcess; import com.ycl.domain.form.RejectTaskForm; import com.ycl.domain.form.TaskDelegationForm; import com.ycl.domain.json.TaskDelegateData; import com.ycl.domain.json.DelegateData; import com.ycl.domain.vo.CustomerTaskVO; import com.ycl.domain.vo.IndexCustomerTaskVO; import com.ycl.domain.vo.ProjectProcessDetailVO; import com.ycl.event.event.TaskLogEvent; import com.ycl.mapper.ProjectInfoMapper; import com.ycl.mapper.ProjectProcessMapper; import com.ycl.service.FlowLogService; import com.ycl.service.ProjectProcessService; import com.ycl.common.base.Result; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -51,17 +44,15 @@ import org.flowable.identitylink.api.IdentityLink; import org.flowable.identitylink.api.IdentityLinkInfo; import org.flowable.identitylink.api.IdentityLinkType; import org.flowable.identitylink.api.history.HistoricIdentityLink; import org.flowable.identitylink.service.impl.persistence.entity.IdentityLinkEntityImpl; import org.flowable.task.api.Task; import org.flowable.task.api.TaskQuery; import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.api.history.HistoricTaskInstanceQuery; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import com.ycl.framework.utils.PageUtil; import org.springframework.beans.BeanUtils; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import java.util.*; @@ -88,7 +79,7 @@ private final ISysRoleService sysRoleService; private final ISysDeptService sysDeptService; private final TaskCommonService taskCommonService; private final FlowLogService flowLogService; private final ApplicationEventPublisher publisher; /** * 分页查询 @@ -99,13 +90,14 @@ @Override public Result page(ProjectProcessQuery query) { IPage<ProjectProcessVO> page = PageUtil.getPage(query, ProjectProcessVO.class); baseMapper.getPage(page, query); baseMapper.getPage(query, page); for (ProjectProcessVO vo : page.getRecords()) { if (Objects.nonNull(vo.getProcessDefId())) { ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(vo.getProcessDefId()).singleResult(); if (Objects.nonNull(processDefinition)) { vo.setSuspended(processDefinition.isSuspended()); vo.setFlowableProcessName(processDefinition.getName() + "(v" + processDefinition.getVersion() + ")"); vo.setDeployId(processDefinition.getDeploymentId()); } } } @@ -155,6 +147,7 @@ entity.setProcessDefId(processDefId); entity.setProcessInsId(processInsId); baseMapper.insert(entity); return Result.ok("流程启动成功"); } @@ -166,6 +159,14 @@ * @return */ private String startPro(Long projectId, String processDefId) { ProjectInfo project = new LambdaQueryChainWrapper<>(projectInfoMapper) .select(ProjectInfo::getCreateBy) .eq(ProjectInfo::getId, projectId) .one(); if (Objects.isNull(project)) { throw new RuntimeException("项目不存在"); } ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefId) .latestVersion().singleResult(); if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) { @@ -176,6 +177,9 @@ SysUser sysUser = SecurityUtils.getLoginUser().getUser(); identityService.setAuthenticatedUserId(sysUser.getUserId().toString()); variables.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId()); // 将该项目的申请人(业主方)作为流程中某些环节的处理人 variables.put(ProcessConstants.DATA_LAUNCH, project.getCreateBy()); ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, projectId + "", variables); return processInstance.getId(); } @@ -262,11 +266,18 @@ TaskQuery taskQuery = taskService.createTaskQuery() .active() .includeProcessVariables() .includeIdentityLinks() .orderByTaskCreateTime().desc(); if (StringUtils.isNotBlank(taskName)) { taskQuery.processDefinitionNameLike(taskName); } if (! SecurityUtils.getLoginUser().getUser().isAdmin()) { taskQuery .or() .taskCandidateGroupIn(taskCommonService.getCurrentUserGroups()) .taskCandidateUser(SecurityUtils.getUserId() + "") .taskAssignee(SecurityUtils.getUserId() + "") .endOr(); } result.total(taskQuery.count()); List<Task> taskList = taskQuery.listPage(pageSize * (pageNum - 1), pageSize); @@ -306,7 +317,11 @@ List<String> handlerUnitNames = new ArrayList<>(2); // 流程处理人信息 List<? extends IdentityLinkInfo> identityLinks = task.getIdentityLinks(); List<IdentityLink> identityLinks = taskService.getIdentityLinksForTask(task.getId()); // Boolean aboutMe = taskCommonService.taskAboutMe(identityLinks); // if (! aboutMe) { // continue; // } for (IdentityLinkInfo identityLink : identityLinks) { // 绑定的是用户,查出用户姓名、部门 if (StringUtils.isNotBlank(identityLink.getUserId())) { @@ -467,20 +482,25 @@ @Override public Result taskDelegation(TaskDelegationForm form) { Task task = taskService.createTaskQuery().taskId(form.getTaskId()).includeIdentityLinks().singleResult(); Task task = taskService.createTaskQuery().taskId(form.getTaskId()).singleResult(); if (Objects.isNull(task)) { throw new RuntimeException("未在运行任务中找到该任务,无法执行转办操作"); } List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId()); // 转办之前的处理人 List<String> beforeHandlerIds = new ArrayList<>(2); // 转办之前的处理人类型 HandlerTypeEnum beforeHandlerType = null; // 需要先移除之前的处理人 for (IdentityLinkInfo identityLink : task.getIdentityLinks()) { for (IdentityLinkInfo identityLink : identityLinksForTask) { if (StringUtils.isNotBlank(identityLink.getUserId())) { beforeHandlerIds.add(identityLink.getUserId()); beforeHandlerType = HandlerTypeEnum.USER; taskService.deleteCandidateUser(task.getId(), identityLink.getUserId()); if (IdentityLinkType.ASSIGNEE.equals(identityLink.getType())) { taskService.deleteUserIdentityLink(task.getId(), identityLink.getUserId(), IdentityLinkType.ASSIGNEE); } else { taskService.deleteCandidateUser(task.getId(), identityLink.getUserId()); } } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { beforeHandlerIds.add(identityLink.getGroupId()); if (identityLink.getGroupId().contains("dept")) { @@ -492,7 +512,7 @@ taskService.deleteCandidateGroup(task.getId(), identityLink.getGroupId()); } } TaskDelegateData jsonData = new TaskDelegateData(); DelegateData jsonData = new DelegateData(); jsonData.setBeforeHandlerIds(beforeHandlerIds); jsonData.setBeforeHandlerType(beforeHandlerType); @@ -537,8 +557,8 @@ } jsonData.setAfterHandlerIds(afterHandlerIds); jsonData.setAfterHandlerType(form.getPeopleType()); // 添加日志 flowLogService.add(task.getId(), task.getProcessInstanceId(), FlowLogEventTypeEnum.DELEGATE, form.getProjectId(), JSON.toJSONString(jsonData)); // 发布转办事件 publisher.publishEvent(new TaskLogEvent(this, form.getProjectId(), form.getProcessInsId(), task.getId(), ProcessLogEventTypeEnum.DELEGATE, jsonData)); return Result.ok("转办成功"); } @@ -567,73 +587,7 @@ List<CustomerTaskVO> vos = new ArrayList<>(); for (Task task : taskList) { CustomerTaskVO taskVO = new CustomerTaskVO(); // 当前流程信息 taskVO.setTaskId(task.getId()); taskVO.setCreateTime(task.getCreateTime()); taskVO.setProcessDefId(task.getProcessDefinitionId()); taskVO.setExecutionId(task.getExecutionId()); taskVO.setTaskName(task.getName()); taskVO.setTaskStatus(TaskStatusEnum.TODO); // 流程定义信息 ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() .processDefinitionId(task.getProcessDefinitionId()) .singleResult(); taskVO.setDeployId(pd.getDeploymentId()); taskVO.setProcessName(pd.getName()); taskVO.setProcessInsId(task.getProcessInstanceId()); taskVO.setTaskDefinitionKey(task.getTaskDefinitionKey()); // 流程发起人信息 this.setPromoterInfo(taskVO); // 一个任务可能有多个候选人/组,所以需要使用list List<Long> handlerIds = new ArrayList<>(2); List<String> handlerNames = new ArrayList<>(2); List<Long> handlerUnitIds = new ArrayList<>(2); List<String> handlerUnitNames = new ArrayList<>(2); // 流程处理人信息 List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId()); for (IdentityLink identityLink : identityLinksForTask) { // 绑定的是用户,查出用户姓名、部门 if (StringUtils.isNotBlank(identityLink.getUserId())) { taskVO.setHandlerType(HandlerTypeEnum.USER); SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); if (Objects.nonNull(sysUser)) { handlerIds.add(sysUser.getUserId()); handlerNames.add(sysUser.getNickName()); if (Objects.nonNull(sysUser.getDept())) { handlerUnitIds.add(sysUser.getDept().getDeptId()); handlerUnitNames.add(sysUser.getDept().getDeptName()); } } // 绑定的是角色或者部门 } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { if (identityLink.getGroupId().startsWith("dept")) { // 部门的id是加了前缀的如:dept:1 taskVO.setHandlerType(HandlerTypeEnum.DEPT); String[] split = identityLink.getGroupId().split(":"); if (split.length > 1) { // 部门 SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); if (Objects.nonNull(dept)) { handlerUnitIds.add(dept.getDeptId()); handlerUnitNames.add(dept.getDeptName()); } } } else { taskVO.setHandlerType(HandlerTypeEnum.ROLE); SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); if (Objects.nonNull(role)) { handlerUnitIds.add(Long.parseLong(identityLink.getGroupId())); handlerUnitNames.add(role.getRoleName()); } } } taskVO.setHandlerId(handlerIds); taskVO.setHandlerName(handlerNames); taskVO.setHandlerUnitId(handlerUnitIds); taskVO.setHandlerUnitName(handlerUnitNames); } this.setRuntimeTaskInfo(task, taskVO); vos.add(taskVO); } result.put("taskList", vos); @@ -680,7 +634,10 @@ vo.setDeployId(process.getDeploymentId()); vo.setTaskName(userTask.getName()); vo.setProcessName(process.getProcessDefinitionName()); Task task = taskService.createTaskQuery().processInstanceId(process.getId()).taskDefinitionKey(userTask.getId()).singleResult(); Task task = taskService.createTaskQuery() .processInstanceId(process.getId()) .taskDefinitionKey(userTask.getId()) .singleResult(); // 一个任务可能有多个候选人/组,所以需要使用list List<Long> handlerIds = new ArrayList<>(2); @@ -744,16 +701,23 @@ vo.setTaskId(historicTasks.get(0).getId()); vo.setExecutionId(historicTasks.get(0).getExecutionId()); vo.setCreateTime(historicTasks.get(0).getStartTime()); // 查询实际处理人 long handlerUserId = Long.parseLong(historicTasks.get(0).getAssignee()); SysUser handlerUser = sysUserService.selectUserById(handlerUserId); if (Objects.nonNull(handlerUser)) { handlerIds.add(handlerUserId); handlerNames.add(handlerUser.getNickName()); vo.setActualHandlerUserId(historicTasks.get(0).getAssignee()); vo.setActualHandlerUserName(handlerUser.getNickName()); } vo.setTaskDefinitionKey(historicTasks.get(0).getTaskDefinitionKey()); this.setPromoterAndHandler(vo, historicTasks.get(0).getIdentityLinks()); } vo.setHandlerId(handlerIds); vo.setHandlerName(handlerNames); vo.setHandlerUnitId(handlerUnitIds); vo.setHandlerUnitName(handlerUnitNames); } else { vo.setTaskStatus(TaskStatusEnum.TODO); vo.setTaskId(task.getId()); @@ -762,11 +726,9 @@ vo.setTaskDefinitionKey(task.getTaskDefinitionKey()); this.setPromoterAndHandler(vo, null); this.setRuntimeTaskInfo(task, vo); } vo.setHandlerId(handlerIds); vo.setHandlerName(handlerNames); vo.setHandlerUnitId(handlerUnitIds); vo.setHandlerUnitName(handlerUnitNames); return vo; }).collect(Collectors.toList()); result.data(vos); @@ -809,8 +771,8 @@ SysUser handlerUser = sysUserService.selectUserById(handlerUserId); if (Objects.nonNull(handlerUser)) { vo.setHandlerId(Arrays.asList(handlerUserId)); vo.setHandlerName(Arrays.asList(handlerUser.getNickName())); vo.setActualHandlerUserId(hisTaskList.get(0).getAssignee()); vo.setActualHandlerUserName(handlerUser.getNickName()); } vo.setTaskDefinitionKey(hisTaskList.get(0).getTaskDefinitionKey()); this.setPromoterAndHandler(vo, hisTaskList.get(0).getIdentityLinks()); @@ -818,6 +780,85 @@ return vo; }).collect(Collectors.toList()); return vos; } /** * 设置运行时任务的信息 * * @param task 任务 * @param taskVO 任务vo */ private void setRuntimeTaskInfo(Task task, CustomerTaskVO taskVO) { // 当前流程信息 taskVO.setTaskId(task.getId()); taskVO.setCreateTime(task.getCreateTime()); taskVO.setProcessDefId(task.getProcessDefinitionId()); taskVO.setExecutionId(task.getExecutionId()); taskVO.setTaskName(task.getName()); taskVO.setTaskStatus(TaskStatusEnum.TODO); // 流程定义信息 ProcessDefinition pd = repositoryService.createProcessDefinitionQuery() .processDefinitionId(task.getProcessDefinitionId()) .singleResult(); taskVO.setDeployId(pd.getDeploymentId()); taskVO.setProcessName(pd.getName()); taskVO.setProcessInsId(task.getProcessInstanceId()); taskVO.setTaskDefinitionKey(task.getTaskDefinitionKey()); // 流程发起人信息 this.setPromoterInfo(taskVO); // 一个任务可能有多个候选人/组,所以需要使用list List<Long> handlerIds = new ArrayList<>(2); List<String> handlerNames = new ArrayList<>(2); List<Long> handlerUnitIds = new ArrayList<>(2); List<String> handlerUnitNames = new ArrayList<>(2); // 流程处理人信息 List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId()); for (IdentityLinkInfo identityLink : identityLinksForTask) { // if (StringUtils.isBlank(((IdentityLinkEntityImpl)identityLink).getId())) { // continue; // } // 绑定的是用户,查出用户姓名、部门 if (StringUtils.isNotBlank(identityLink.getUserId())) { taskVO.setHandlerType(HandlerTypeEnum.USER); SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); if (Objects.nonNull(sysUser)) { handlerIds.add(sysUser.getUserId()); handlerNames.add(sysUser.getNickName()); if (Objects.nonNull(sysUser.getDept())) { handlerUnitIds.add(sysUser.getDept().getDeptId()); handlerUnitNames.add(sysUser.getDept().getDeptName()); } } // 绑定的是角色或者部门 } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { if (identityLink.getGroupId().startsWith("dept")) { // 部门的id是加了前缀的如:dept:1 taskVO.setHandlerType(HandlerTypeEnum.DEPT); String[] split = identityLink.getGroupId().split(":"); if (split.length > 1) { // 部门 SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); if (Objects.nonNull(dept)) { handlerUnitIds.add(dept.getDeptId()); handlerUnitNames.add(dept.getDeptName()); } } } else { taskVO.setHandlerType(HandlerTypeEnum.ROLE); SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); if (Objects.nonNull(role)) { handlerUnitIds.add(Long.parseLong(identityLink.getGroupId())); handlerUnitNames.add(role.getRoleName()); } } } taskVO.setHandlerId(handlerIds); taskVO.setHandlerName(handlerNames); taskVO.setHandlerUnitId(handlerUnitIds); taskVO.setHandlerUnitName(handlerUnitNames); } } /** @@ -871,7 +912,10 @@ vo.setDeployId(process.getDeploymentId()); vo.setTaskName(userTask.getName()); vo.setProcessName(process.getProcessDefinitionName()); Task task = taskService.createTaskQuery().processInstanceId(process.getId()).taskDefinitionKey(userTask.getId()).singleResult(); Task task = taskService.createTaskQuery() .processInstanceId(process.getId()) .taskDefinitionKey(userTask.getId()) .singleResult(); if (Objects.isNull(task)) { // 如果任务在运行时没找到,那么可能为未开始或者已完成,只查询未开始的 List<HistoricTaskInstance> historicTasks = historyService.createHistoricTaskInstanceQuery() @@ -927,6 +971,8 @@ } else { continue; } } else { this.setRuntimeTaskInfo(task, vo); } vos.add(vo); } @@ -979,6 +1025,9 @@ if (TaskStatusEnum.TODO.equals(taskVO.getTaskStatus())) { List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(taskVO.getTaskId()); for (IdentityLink identityLink : identityLinksForTask) { if (StringUtils.isBlank(((IdentityLinkEntityImpl)identityLink).getId())) { continue; } // 绑定的是用户,查出用户姓名、部门 if (StringUtils.isNotBlank(identityLink.getUserId())) { SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); @@ -1021,12 +1070,12 @@ taskVO.setHandlerType(HandlerTypeEnum.USER); SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); if (Objects.nonNull(sysUser)) { // taskVO.setHandlerId(sysUser.getUserId()); handlerIds.add(sysUser.getUserId()); handlerNames.add(sysUser.getNickName()); if (Objects.nonNull(sysUser.getDept())) { handlerUnitIds.add(sysUser.getDept().getDeptId()); handlerUnitNames.add(sysUser.getDept().getDeptName()); } // taskVO.setHandlerName(sysUser.getNickName()); } // 绑定的是角色,查出角色名称 } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { business/src/main/resources/mapper/PlanMapper.xml
@@ -63,6 +63,7 @@ pi.invest_type FROM t_project_info AS pi LEFT JOIN t_plan AS p ON p.project_info_id = pi.id LEFT JOIN sys_dept d ON d.dept_id = PI.project_owner_unit <where> pi.deleted = 0 <if test="query.projectName!= null and query.projectName!= ''"> @@ -83,6 +84,7 @@ <if test="query.yearStatus!= null"> AND p.year_status = #{query.yearStatus} </if> ${query.params.dataScope} </where> </select> business/src/main/resources/mapper/ProjectInfoMapper.xml
@@ -103,6 +103,7 @@ LEFT JOIN t_project_investment_policy_compliance TPIPC ON TPI.id = TPIPC.project_id and TPIPC.deleted = 0 LEFT JOIN t_project_unit_registration_info TPURI ON TPI.id = TPURI.project_id and TPURI.deleted = 0 LEFT JOIN t_project_process TPP ON TPI.id = TPP.project_id and TPP.deleted = 0 LEFT JOIN sys_dept d ON d.dept_id = TPI.project_owner_unit <where> TPI.deleted = 0 <if test="query.projectName !=null and query.projectName!=''"> @@ -164,16 +165,22 @@ and TPI.used_status = #{query.usedStatus} </if> </if> ${query.params.dataScope} </where> order by TPI.gmt_create </select> <select id="homeCount" resultType="com.ycl.domain.vo.ProjectVO"> <select id="homeCount" parameterType="com.ycl.common.core.domain.BaseEntity" resultType="com.ycl.domain.vo.ProjectVO"> SELECT TPI.*,TPIF.total_investment,TPP.process_ins_id as processId FROM t_project_info TPI LEFT JOIN t_project_investment_funding TPIF ON TPI.id = TPIF.project_id and TPIF.deleted = 0 LEFT JOIN t_project_process TPP ON TPI.id = TPP.project_id and TPP.deleted = 0 WHERE TPI.deleted = 0 LEFT JOIN sys_dept d ON TPI.project_owner_unit = d.dept_id <where> TPI.deleted = 0 ${params.dataScope} </where> </select> <select id="selectProjectDetailByIds" resultType="com.ycl.domain.vo.ProjectVO"> business/src/main/resources/mapper/ProjectProcessMapper.xml
@@ -65,6 +65,7 @@ FROM t_project_info PI LEFT JOIN t_project_process TPP ON TPP.project_id = PI.id AND TPP.deleted = 0 AND PI.deleted = 0 LEFT JOIN sys_dept d ON d.dept_id = PI.project_owner_unit <where> <if test="query.projectName != null and query.projectName != ''"> AND PI.project_name like concat('%', #{query.projectName}, '%') @@ -72,6 +73,7 @@ <if test="query.projectCode != null and query.projectCode != ''"> AND PI.project_code like concat('%', #{query.projectCode}, '%') </if> ${query.params.dataScope} </where> </select> common/src/main/java/com/ycl/common/enums/business/ProcessLogEventTypeEnum.java
File was renamed from common/src/main/java/com/ycl/common/enums/business/FlowLogEventTypeEnum.java @@ -11,7 +11,7 @@ * @date:2024/11/29 11:13 */ @Getter public enum FlowLogEventTypeEnum { public enum ProcessLogEventTypeEnum { DELEGATE("DELEGATE", "转办"), FINISHED("FINISHED", "完成"), @@ -26,7 +26,7 @@ private final String desc; FlowLogEventTypeEnum(String value, String desc) { ProcessLogEventTypeEnum(String value, String desc) { this.value = value; this.desc = desc; } flowable/src/main/java/com/ycl/common/constant/ProcessConstants.java
@@ -70,6 +70,10 @@ */ public static final String PROCESS_INITIATOR = "INITIATOR"; /** * 提交数据方 */ public static final String DATA_LAUNCH = "data_launch"; /** * 流程跳过 flowable/src/main/java/com/ycl/controller/FlowLogController.java
@@ -1,8 +1,8 @@ package com.ycl.controller; import com.ycl.common.base.Result; import com.ycl.domain.query.FlowLogQuery; import com.ycl.service.FlowLogService; import com.ycl.domain.query.ProcessLogQuery; import com.ycl.service.ProcessLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -25,14 +25,14 @@ @RequestMapping("/flow-log") public class FlowLogController { private final FlowLogService flowLogService; private final ProcessLogService processLogService; @GetMapping("/page") @ApiOperation(value = "分页", notes = "分页") @PreAuthorize("@ss.hasPermi('flowLog:page')") public Result page(FlowLogQuery query) { return flowLogService.page(query); public Result page(ProcessLogQuery query) { return processLogService.page(query); } } flowable/src/main/java/com/ycl/controller/FlowTaskController.java
@@ -75,8 +75,8 @@ @ApiOperation(value = "流程历史流转记录", response = FlowTaskDto.class) @GetMapping(value = "/flowRecord") public AjaxResult flowRecord(String procInsId, String deployId) { return flowTaskService.flowRecord(procInsId, deployId); public AjaxResult flowRecord(String procInsId) { return flowTaskService.flowRecord(procInsId); } @ApiOperation(value = "根据任务ID查询挂载的表单信息") @@ -258,13 +258,13 @@ /** * 流程节点信息 * * @param procInsId 流程实例id * @param processInsId 流程实例id * @return */ @GetMapping("/flowXmlAndNode") public AjaxResult flowXmlAndNode(@RequestParam(value = "procInsId", required = false) String procInsId, public AjaxResult flowXmlAndNode(@RequestParam(value = "processInsId", required = false) String processInsId, @RequestParam(value = "deployId", required = false) String deployId) { return flowTaskService.flowXmlAndNode(procInsId, deployId); return flowTaskService.flowXmlAndNode(processInsId, deployId); } /** flowable/src/main/java/com/ycl/domain/entity/ProcessLog.java
File was renamed from flowable/src/main/java/com/ycl/domain/entity/FlowLog.java @@ -2,7 +2,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.ycl.common.enums.business.FlowLogEventTypeEnum; import com.ycl.common.enums.business.ProcessLogEventTypeEnum; import com.ycl.system.domain.base.AbsEntity; import lombok.Data; @@ -13,8 +13,8 @@ * @since 2025-01-02 */ @Data @TableName("t_flow_log") public class FlowLog extends AbsEntity { @TableName("t_process_log") public class ProcessLog extends AbsEntity { private static final long serialVersionUID = 1L; @@ -24,15 +24,15 @@ @TableField("event_type") /** 事件日志类型 */ private FlowLogEventTypeEnum eventType; private ProcessLogEventTypeEnum eventType; @TableField("project_id") /** 项目id */ private Long projectId; @TableField("flow_ins_id") @TableField("process_ins_id") /** 流程实例id */ private String flowInsId; private String processInsId; @TableField("user_id") /** 产生日志的人/或其它 */ flowable/src/main/java/com/ycl/domain/query/ProcessLogQuery.java
File was renamed from flowable/src/main/java/com/ycl/domain/query/FlowLogQuery.java @@ -17,6 +17,6 @@ */ @Data @ApiModel(value = "FlowLog查询参数", description = "流程日志查询参数") public class FlowLogQuery extends AbsQuery { public class ProcessLogQuery extends AbsQuery { } flowable/src/main/java/com/ycl/domain/vo/ProcessLogVO.java
File was renamed from flowable/src/main/java/com/ycl/domain/vo/FlowLogVO.java @@ -1,14 +1,12 @@ package com.ycl.domain.vo; import com.ycl.system.domain.base.AbsVo; import com.ycl.domain.entity.FlowLog; import java.util.List; import com.ycl.domain.entity.ProcessLog; import org.springframework.lang.NonNull; import org.springframework.beans.BeanUtils; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; /** * 流程日志展示 @@ -18,7 +16,7 @@ */ @Data @ApiModel(value = "流程日志响应数据", description = "流程日志响应数据") public class FlowLogVO extends AbsVo { public class ProcessLogVO extends AbsVo { /** 任务id */ @ApiModelProperty("任务id") @@ -44,9 +42,9 @@ @ApiModelProperty("事件数据,根据不同的事件可存储对应的扩展数据。如转办事件可存储转办前后的处理人信息") private String eventDataJson; public static FlowLogVO getVoByEntity(@NonNull FlowLog entity, FlowLogVO vo) { public static ProcessLogVO getVoByEntity(@NonNull ProcessLog entity, ProcessLogVO vo) { if(vo == null) { vo = new FlowLogVO(); vo = new ProcessLogVO(); } BeanUtils.copyProperties(entity, vo); return vo; flowable/src/main/java/com/ycl/mapper/FlowLogMapper.java
File was deleted flowable/src/main/java/com/ycl/mapper/ProcessLogMapper.java
New file @@ -0,0 +1,32 @@ package com.ycl.mapper; import com.ycl.domain.entity.ProcessLog; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ycl.domain.vo.ProcessLogVO; import com.ycl.domain.query.ProcessLogQuery; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; /** * 流程日志 Mapper 接口 * * @author xp * @since 2025-01-02 */ @Mapper public interface ProcessLogMapper extends BaseMapper<ProcessLog> { /** * id查找流程日志 * @param id * @return */ ProcessLogVO getById(Long id); /** * 分页 */ IPage getPage(IPage page, @Param("query") ProcessLogQuery query); } flowable/src/main/java/com/ycl/service/IFlowTaskService.java
@@ -145,7 +145,7 @@ * @param procInsId 流程实例Id * @return */ AjaxResult flowRecord(String procInsId,String deployId); AjaxResult flowRecord(String procInsId); /** * 根据任务ID查询挂载的表单信息 flowable/src/main/java/com/ycl/service/ProcessLogService.java
File was renamed from flowable/src/main/java/com/ycl/service/FlowLogService.java @@ -1,10 +1,10 @@ package com.ycl.service; import com.ycl.common.enums.business.FlowLogEventTypeEnum; import com.ycl.domain.entity.FlowLog; import com.ycl.common.enums.business.ProcessLogEventTypeEnum; import com.ycl.domain.entity.ProcessLog; import com.baomidou.mybatisplus.extension.service.IService; import com.ycl.common.base.Result; import com.ycl.domain.query.FlowLogQuery; import com.ycl.domain.query.ProcessLogQuery; import java.util.List; /** @@ -13,7 +13,7 @@ * @author xp * @since 2025-01-02 */ public interface FlowLogService extends IService<FlowLog> { public interface ProcessLogService extends IService<ProcessLog> { /** * 添加 @@ -23,7 +23,7 @@ * @param projectId 项目id * @param eventDataJson json扩展内容 */ void add(String taskId, String flowInsId, FlowLogEventTypeEnum eventType, Long projectId, String eventDataJson); void add(String taskId, String flowInsId, ProcessLogEventTypeEnum eventType, Long projectId, String eventDataJson); /** * 批量删除 @@ -44,7 +44,7 @@ * @param query * @return */ Result page(FlowLogQuery query); Result page(ProcessLogQuery query); /** * 根据id查找 flowable/src/main/java/com/ycl/service/common/TaskCommonService.java
@@ -5,10 +5,12 @@ import com.ycl.common.core.domain.entity.SysUser; import com.ycl.common.enums.FlowComment; import com.ycl.common.enums.business.TaskStatusEnum; import com.ycl.common.utils.SecurityUtils; import com.ycl.domain.entity.SysForm; import com.ycl.domain.vo.FormDetailVO; import com.ycl.flow.FindNextNodeUtil; import com.ycl.service.ISysFormService; import com.ycl.system.service.ISysUserService; import lombok.RequiredArgsConstructor; import org.flowable.bpmn.model.*; import org.flowable.bpmn.model.Process; @@ -18,6 +20,8 @@ import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.identitylink.api.IdentityLink; import org.flowable.identitylink.api.IdentityLinkType; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; import org.springframework.stereotype.Service; @@ -39,6 +43,7 @@ private final RepositoryService repositoryService; private final TaskService taskService; private final HistoryService historyService; private final ISysUserService sysUserService; /** * 通过当前节点定义key,获取其上一个节点的信息,如果前面是并行的会返回多个(包含当前节点) @@ -272,6 +277,7 @@ * @param taskId 当前任务id * @param msg 审核意见 */ @Deprecated public void reject(String rejectedTaskDefKey, String rejectTaskDefKey, String processInsId, String taskId, String msg) { // 驳回的核心api:runtimeService.createChangeActivityStateBuilder().moveXXX 的api,可以设置从当前节点移动到目标节点 // 驳回的核心:需要找到当前节点、以及要流转到的目标节点。其中比较麻烦的是处理并行等比较复杂的情况 @@ -294,4 +300,21 @@ } /** * 获取当前用户的组 * * @return */ public List<String> getCurrentUserGroups() { String deptId = "dept:" + SecurityUtils.getLoginUser().getDeptId(); List<String> roleIds; if (CollectionUtils.isEmpty(SecurityUtils.getLoginUser().getUser().getRoles())) { roleIds = new ArrayList<>(1); } else { roleIds = SecurityUtils.getLoginUser().getUser().getRoles().stream().map(role -> role.getRoleId() + "").collect(Collectors.toList()); } roleIds.add(deptId); return roleIds; } } flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
@@ -29,7 +29,7 @@ import com.ycl.flow.FindNextNodeUtil; import com.ycl.flow.FlowableUtils; import com.ycl.mapper.ProcessCodingMapper; import com.ycl.service.FlowLogService; import com.ycl.service.ProcessLogService; import com.ycl.service.IFlowTaskService; import com.ycl.service.ISysDeployFormService; import com.ycl.service.ISysFormService; @@ -64,7 +64,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.io.InputStream; import java.lang.reflect.Field; import java.nio.charset.StandardCharsets; @@ -94,7 +93,7 @@ private final ISysFormService sysFormService; private final TaskCommonService taskCommonService; private final ProcessCodingMapper processCodingMapper; private final FlowLogService flowLogService; private final ProcessLogService processLogService; /** * 完成审核任务 @@ -144,22 +143,20 @@ newV.put(task.getTaskDefinitionKey() + "&" + key, variables.get(key)); //字典里有就放入流程变量中 if (!CollectionUtils.isEmpty(dictList) && dictList.contains(key)) { processVariables.put(key, variables.get(key)); processVariables.put(key,variables.get(key)); } } } //添加流程变量 if (!processVariables.isEmpty()) taskService.setVariables(taskId, processVariables); if(!processVariables.isEmpty()) taskService.setVariables(taskId,processVariables); taskService.addComment(taskId, task.getProcessInstanceId(), FlowComment.SUBMIT.getType(), "完成提交"); // 判断当前任务是不是转办过的 Boolean delegation = flowLogService.taskDelegation(task.getProcessInstanceId(), task.getId()); if (delegation) { if (DelegationState.PENDING.equals(task.getDelegationState())) { taskService.resolveTask(taskId, newV); } else { // 先让当前用户认领这个任务 taskService.claim(taskId, SecurityUtils.getUserId() + ""); taskService.complete(taskId, newV); } // 先让当前用户认领这个任务 taskService.claim(taskId, SecurityUtils.getUserId() + ""); taskService.complete(taskId, newV); return AjaxResult.success("提交成功"); } @@ -803,7 +800,7 @@ * @return */ @Override public AjaxResult flowRecord(String procInsId, String deployId) { public AjaxResult flowRecord(String procInsId) { Map<String, Object> map = new HashMap<String, Object>(); if (StringUtils.isNotBlank(procInsId)) { List<HistoricActivityInstance> list = historyService @@ -1301,12 +1298,16 @@ List<JSONObject> oldFields = JSON.parseObject(JSON.toJSONString(formJson.get(ProcessConstants.WIDGET_LIST)), new TypeReference<List<JSONObject>>() { }); // 设置已填写的表单为禁用状态 if (!CollectionUtils.isEmpty(oldFields)) { if(CollectionUtils.isNotEmpty(oldFields)) { // 设置已填写的表单为禁用状态 for (JSONObject oldField : oldFields) { JSONObject options = oldField.getJSONObject("options"); options.put("disabled", true); } formJson.put(ProcessConstants.WIDGET_LIST, oldFields); newP.put(ProcessConstants.TASK_FORM_KEY, formJson); newP.remove(formDetailVO.getBeforeNodeDefId() + "&" + ProcessConstants.TASK_FORM_KEY); formDetailVO.setFormJsonObj(newP); } // TODO 暂时只处理用户任务上的表单 // if (StringUtils.isNotBlank(task.getFormKey())) { @@ -1326,10 +1327,7 @@ // } // oldFields.addAll(newFields); // } formJson.put(ProcessConstants.WIDGET_LIST, oldFields); newP.put(ProcessConstants.TASK_FORM_KEY, formJson); newP.remove(formDetailVO.getBeforeNodeDefId() + "&" + ProcessConstants.TASK_FORM_KEY); formDetailVO.setFormJsonObj(newP); } } return beforeNodes; flowable/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java
File was renamed from flowable/src/main/java/com/ycl/service/impl/FlowLogServiceImpl.java @@ -2,14 +2,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.ycl.common.enums.business.FlowLogEventTypeEnum; import com.ycl.domain.entity.FlowLog; import com.ycl.mapper.FlowLogMapper; import com.ycl.service.FlowLogService; import com.ycl.common.enums.business.ProcessLogEventTypeEnum; import com.ycl.domain.entity.ProcessLog; import com.ycl.mapper.ProcessLogMapper; import com.ycl.service.ProcessLogService; import com.ycl.common.base.Result; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.domain.vo.FlowLogVO; import com.ycl.domain.query.FlowLogQuery; import com.ycl.domain.vo.ProcessLogVO; import com.ycl.domain.query.ProcessLogQuery; import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; @@ -27,9 +27,9 @@ */ @Service @RequiredArgsConstructor public class FlowLogServiceImpl extends ServiceImpl<FlowLogMapper, FlowLog> implements FlowLogService { public class ProcessLogServiceImpl extends ServiceImpl<ProcessLogMapper, ProcessLog> implements ProcessLogService { private final FlowLogMapper flowLogMapper; private final ProcessLogMapper processLogMapper; /** * 添加日志 @@ -40,10 +40,10 @@ * @param eventDataJson json扩展内容 */ @Override public void add(String taskId, String flowInsId, FlowLogEventTypeEnum eventType, Long projectId, String eventDataJson) { FlowLog log = new FlowLog(); public void add(String taskId, String flowInsId, ProcessLogEventTypeEnum eventType, Long projectId, String eventDataJson) { ProcessLog log = new ProcessLog(); log.setTaskId(taskId); log.setFlowInsId(flowInsId); log.setProcessInsId(flowInsId); log.setProjectId(projectId); log.setEventType(eventType); log.setEventDataJson(eventDataJson); @@ -78,8 +78,8 @@ * @return */ @Override public Result page(FlowLogQuery query) { IPage<FlowLogVO> page = PageUtil.getPage(query, FlowLogVO.class); public Result page(ProcessLogQuery query) { IPage<ProcessLogVO> page = PageUtil.getPage(query, ProcessLogVO.class); baseMapper.getPage(page, query); return Result.ok().data(page.getRecords()).total(page.getTotal()); } @@ -91,7 +91,7 @@ */ @Override public Result detail(Long id) { FlowLogVO vo = baseMapper.getById(id); ProcessLogVO vo = baseMapper.getById(id); Assert.notNull(vo, "记录不存在"); return Result.ok().data(vo); } @@ -102,19 +102,19 @@ */ @Override public Result all() { List<FlowLog> entities = baseMapper.selectList(null); List<FlowLogVO> vos = entities.stream() .map(entity -> FlowLogVO.getVoByEntity(entity, null)) List<ProcessLog> entities = baseMapper.selectList(null); List<ProcessLogVO> vos = entities.stream() .map(entity -> ProcessLogVO.getVoByEntity(entity, null)) .collect(Collectors.toList()); return Result.ok().data(vos); } @Override public Boolean taskDelegation(String processInstanceId, String taskId) { List<FlowLog> list = new LambdaQueryChainWrapper<>(baseMapper) .eq(FlowLog::getFlowInsId, processInstanceId) .eq(FlowLog::getTaskId, taskId) .eq(FlowLog::getEventType, FlowLogEventTypeEnum.DELEGATE) List<ProcessLog> list = new LambdaQueryChainWrapper<>(baseMapper) .eq(ProcessLog::getProcessInsId, processInstanceId) .eq(ProcessLog::getTaskId, taskId) .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.DELEGATE) .list(); return CollectionUtils.isNotEmpty(list); } flowable/src/main/resources/mapper/ProcessLogMapper.xml
File was renamed from flowable/src/main/resources/mapper/FlowLogMapper.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ycl.mapper.FlowLogMapper"> <mapper namespace="com.ycl.mapper.ProcessLogMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.ycl.domain.vo.FlowLogVO"> <resultMap id="BaseResultMap" type="com.ycl.domain.vo.ProcessLogVO"> <result column="task_id" property="taskId" /> <result column="event_type" property="eventType" /> <result column="project_id" property="projectId" /> @@ -28,7 +28,7 @@ TFL.event_data_json, TFL.id FROM t_flow_log TFL t_process_log TFL WHERE TFL.id = #{id} AND TFL.deleted = 0 </select> @@ -44,7 +44,7 @@ TFL.event_data_json, TFL.id FROM t_flow_log TFL t_process_log TFL WHERE TFL.deleted = 0 </select> start/src/main/resources/application-dev.yml
@@ -7,7 +7,7 @@ # 版权年份 copyrightYear: 2024 # 文件路径 示例( Windows配置D:/projectManagement/uploadPath,Linux配置 /home/projectManagement/uploadPath) profile: D:/projectManagement/uploadPath profile: E:/ycl/file # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数字计算 char 字符验证 system/src/main/java/com/ycl/framework/aspectj/DataScopeAspect.java
@@ -2,6 +2,8 @@ import java.util.ArrayList; import java.util.List; import com.ycl.system.domain.base.AbsQuery; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @@ -151,10 +153,12 @@ if (StringUtils.isNotBlank(sqlString.toString())) { Object params = joinPoint.getArgs()[0]; if (StringUtils.isNotNull(params) && params instanceof BaseEntity) { if (StringUtils.isNotNull(params) && params instanceof BaseEntity) { BaseEntity baseEntity = (BaseEntity) params; baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")"); } else if (StringUtils.isNotNull(params) && params instanceof AbsQuery) { AbsQuery query = (AbsQuery) params; query.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")"); } } } system/src/main/java/com/ycl/framework/config/SecurityConfig.java
@@ -115,6 +115,7 @@ // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/flowable-ui", "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() .antMatchers("/common/upload").permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() .and() system/src/main/java/com/ycl/system/domain/base/AbsQuery.java
@@ -3,6 +3,9 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.HashMap; import java.util.Map; /** * 基础分页查询,默认第一页,每页10条 * @@ -18,4 +21,6 @@ @ApiModelProperty(value = "每页条数", required = true) private long pageSize = 10L; public Map<String, Object> params = new HashMap<>(2); } system/src/main/java/com/ycl/system/service/impl/SysDeptServiceImpl.java
@@ -65,7 +65,7 @@ @Override public List<StringTreeSelect> flowDeptTree(SysDept dept) { List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptList(dept); List<SysDept> depts = deptMapper.selectDeptList(dept); List<StringTreeSelect> list = depts.stream().map(item -> { StringTreeSelect d = new StringTreeSelect(); d.setId("dept:" + item.getDeptId());