From 29294ac9ad6d9eedff7113e57744b61b980e5944 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期五, 29 十一月 2024 10:27:02 +0800
Subject: [PATCH] 首页统计接口+跳转
---
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java | 324 +++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 262 insertions(+), 62 deletions(-)
diff --git a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
index e109539..4856ea1 100644
--- a/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
+++ b/business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -1,7 +1,21 @@
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.SysRole;
+import com.ycl.common.core.domain.entity.SysUser;
+import com.ycl.common.enums.FlowComment;
+import com.ycl.common.utils.SecurityUtils;
+import com.ycl.domain.dto.FlowTaskDto;
+import com.ycl.domain.entity.ProjectInfo;
import com.ycl.domain.entity.ProjectProcess;
+import com.ycl.domain.vo.ProjectProcessDetailVO;
+import com.ycl.mapper.ProjectInfoMapper;
import com.ycl.mapper.ProjectProcessMapper;
import com.ycl.service.ProjectProcessService;
import com.ycl.common.base.Result;
@@ -9,13 +23,30 @@
import com.ycl.domain.form.ProjectProcessForm;
import com.ycl.domain.vo.ProjectProcessVO;
import com.ycl.domain.query.ProjectProcessQuery;
+import com.ycl.system.service.ISysRoleService;
+import com.ycl.system.service.ISysUserService;
+import org.apache.commons.lang3.StringUtils;
+import org.flowable.bpmn.model.BpmnModel;
+import org.flowable.bpmn.model.FlowElement;
+import org.flowable.bpmn.model.Process;
+import org.flowable.bpmn.model.StartEvent;
+import org.flowable.engine.*;
+import org.flowable.engine.history.HistoricProcessInstance;
+import org.flowable.engine.repository.ProcessDefinition;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.identitylink.api.IdentityLink;
+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.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 java.util.List;
+import java.util.*;
import java.util.stream.Collectors;
/**
@@ -29,56 +60,14 @@
public class ProjectProcessServiceImpl extends ServiceImpl<ProjectProcessMapper, ProjectProcess> implements ProjectProcessService {
private final ProjectProcessMapper projectProcessMapper;
-
- /**
- * 娣诲姞
- * @param form
- * @return
- */
- @Override
- public Result add(ProjectProcessForm form) {
- ProjectProcess entity = ProjectProcessForm.getEntityByForm(form, null);
- baseMapper.insert(entity);
- return Result.ok("娣诲姞鎴愬姛");
- }
-
- /**
- * 淇敼
- * @param form
- * @return
- */
- @Override
- public Result update(ProjectProcessForm form) {
- ProjectProcess entity = baseMapper.selectById(form.getId());
-
- // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊
- Assert.notNull(entity, "璁板綍涓嶅瓨鍦�");
- BeanUtils.copyProperties(form, entity);
- baseMapper.updateById(entity);
- return Result.ok("淇敼鎴愬姛");
- }
-
- /**
- * 鎵归噺鍒犻櫎
- * @param ids
- * @return
- */
- @Override
- public Result remove(List<String> ids) {
- baseMapper.deleteBatchIds(ids);
- return Result.ok("鍒犻櫎鎴愬姛");
- }
-
- /**
- * id鍒犻櫎
- * @param id
- * @return
- */
- @Override
- public Result removeById(String id) {
- baseMapper.deleteById(id);
- return Result.ok("鍒犻櫎鎴愬姛");
- }
+ private final RuntimeService runtimeService;
+ private final TaskService taskService;
+ private final IdentityService identityService;
+ private final RepositoryService repositoryService;
+ private final ProjectInfoMapper projectInfoMapper;
+ private final HistoryService historyService;
+ private final ISysUserService sysUserService;
+ private final ISysRoleService sysRoleService;
/**
* 鍒嗛〉鏌ヨ
@@ -93,24 +82,235 @@
}
/**
- * 鏍规嵁id鏌ユ壘
- * @param id
+ * 鑾峰彇娴佺▼璇︽儏
+ * @param projectId
* @return
*/
@Override
- public Result detail(Integer id) {
- ProjectProcessVO vo = baseMapper.getById(id);
- Assert.notNull(vo, "璁板綍涓嶅瓨鍦�");
- return Result.ok().data(vo);
+ public Result detail(Long projectId, String processId) {
+ // 椤圭洰淇℃伅
+ ProjectInfo projectInfo = new LambdaQueryChainWrapper<>(projectInfoMapper)
+ .select(ProjectInfo::getId, ProjectInfo::getProjectName, ProjectInfo::getProjectCode)
+ .eq(ProjectInfo::getId, projectId)
+ .one();
+
+ if (Objects.isNull(projectInfo)) {
+ return Result.error("璇ラ」鐩笉瀛樺湪");
+ }
+
+ ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(baseMapper)
+ .eq(ProjectProcess::getProjectId, projectId)
+ .eq(ProjectProcess::getFlowableProcessId, processId)
+ .one();
+ if (Objects.isNull(projectProcess)) {
+ return Result.error("璇ラ」鐩湭璁剧疆娴佺▼");
+ }
+
+ ProjectProcessDetailVO detail = new ProjectProcessDetailVO();
+ detail.setProjectId(projectId);
+ detail.setProjectName(projectInfo.getProjectName());
+ detail.setProjectCode(projectInfo.getProjectCode());
+
+ ProjectProcessDetailVO.TaskStatistics taskStatistics = new ProjectProcessDetailVO.TaskStatistics();
+ // 鐘舵�佺粺璁�
+ taskStatistics.setTotalTaskNum(this.getTotalTaskNum(processId));
+ taskStatistics.setTodoTaskNum(this.getTodoTaskNum(projectProcess.getProcessInstanceId()));
+// taskStatistics.setCurrentTask(this.getCurrentNodeTaskList(projectProcess.getProcessInstanceId()));
+ taskStatistics.setRemainingTaskNum(this.getNotFinishedTaskNum(projectProcess.getProcessInstanceId()));
+ detail.setStatistics(taskStatistics);
+
+ Result result = Result.ok();
+
+ // 浠e姙浠诲姟
+ this.getTodoTaskList(projectProcess.getProcessInstanceId(),"", 1, 5, result);
+ return result.data(detail);
+ }
+
+
+ @Override
+ public Result projectSetProcess(ProjectProcessForm form) {
+ // 鏌ヨ璇ラ」鐩槸鍚﹀凡缁忕粦瀹氳繃娴佺▼浜嗭紝妫�鏌ョ粦瀹氱殑娴佺▼鏄惁鍦ㄨ繍琛岋紝鍦ㄨ繍琛屽氨鍒犱簡
+ ProjectProcess pp = new LambdaQueryChainWrapper<>(baseMapper)
+ .eq(ProjectProcess::getProjectId, form.getProjectId())
+ .one();
+ if (Objects.nonNull(pp)) {
+ // TODO 澶勭悊涔嬪墠缁戝畾杩囩殑娴佺▼鏁版嵁
+ new LambdaUpdateChainWrapper<>(baseMapper)
+ .eq(ProjectProcess::getProjectId, form.getProjectId())
+ .set(ProjectProcess::getFlowableProcessId, form.getFlowableProcessId())
+ .update();
+ } else {
+ ProjectProcess entity = ProjectProcessForm.getEntityByForm(form, null);
+ baseMapper.insert(entity);
+ }
+ return Result.ok("娴佺▼鍙樻洿鎴愬姛");
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Result startProcess(String projectId, String processId) {
+ ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processId)
+ .latestVersion().singleResult();
+ if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) {
+ return Result.error("璇ユ祦绋嬪凡琚寕璧�,璇峰厛婵�娲绘祦绋�");
+ }
+ Map<String, Object> variables = new HashMap<>(2);
+ // 璁剧疆娴佺▼鍙戣捣浜篒d鍒版祦绋嬩腑
+ SysUser sysUser = SecurityUtils.getLoginUser().getUser();
+ identityService.setAuthenticatedUserId(sysUser.getUserId().toString());
+ variables.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId());
+ ProcessInstance processInstance = runtimeService.startProcessInstanceById(processId, projectId, variables);
+// // 娴佺▼鍙戣捣鏃� 璺宠繃鍙戣捣浜鸿妭鐐�
+// // 缁欑涓�姝ョ敵璇蜂汉鑺傜偣璁剧疆浠诲姟鎵ц浜哄拰鎰忚
+// Task task = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult();
+// if (Objects.nonNull(task)) {
+// taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.NORMAL.getType(), sysUser.getNickName() + "鍙戣捣娴佺▼鐢宠");
+// taskService.complete(task.getId(), variables);
+// }
+ // 椤圭洰娴佺▼鍏宠仈娴佺▼瀹炰緥id
+ new LambdaUpdateChainWrapper<>(baseMapper)
+ .eq(ProjectProcess::getProjectId, projectId)
+ .eq(ProjectProcess::getFlowableProcessId, processId)
+ .set(ProjectProcess::getProcessInstanceId, processInstance.getProcessInstanceId())
+ .update();
+ return Result.ok("娴佺▼鍚姩鎴愬姛");
+ }
+
+
+ private void getTodoTaskList(String processInstanceId, String name, Integer pageNum, Integer pageSize, Result result) {
+ TaskQuery taskQuery = taskService.createTaskQuery()
+ .active()
+ .processInstanceId(processInstanceId)
+ .includeProcessVariables()
+ .orderByTaskCreateTime().desc();
+
+// TODO 浼犲叆鍚嶇О鏌ヨ涓嶅埌鏁版嵁?
+ if (StringUtils.isNotBlank(name)) {
+ taskQuery.processDefinitionNameLike(name);
+ }
+ result.total(taskQuery.count());
+ List<Task> taskList = taskQuery.listPage(pageSize * (pageNum - 1), pageSize);
+ List<FlowTaskDto> flowList = new ArrayList<>();
+ for (Task task : taskList) {
+ FlowTaskDto flowTask = new FlowTaskDto();
+ // 褰撳墠娴佺▼淇℃伅
+ flowTask.setTaskId(task.getId());
+ flowTask.setTaskDefKey(task.getTaskDefinitionKey());
+ flowTask.setCreateTime(task.getCreateTime());
+ flowTask.setProcDefId(task.getProcessDefinitionId());
+ flowTask.setExecutionId(task.getExecutionId());
+ flowTask.setTaskName(task.getName());
+ // 娴佺▼瀹氫箟淇℃伅
+ ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
+ .processDefinitionId(task.getProcessDefinitionId())
+ .singleResult();
+ flowTask.setDeployId(pd.getDeploymentId());
+ flowTask.setProcDefName(pd.getName());
+ flowTask.setProcDefVersion(pd.getVersion());
+ flowTask.setProcInsId(task.getProcessInstanceId());
+
+ // 娴佺▼鍙戣捣浜轰俊鎭�
+ HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
+ .processInstanceId(task.getProcessInstanceId())
+ .singleResult();
+ SysUser startUser = sysUserService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId()));
+ flowTask.setStartUserId(startUser.getUserId().toString());
+ flowTask.setStartUserName(startUser.getNickName());
+ flowTask.setStartDeptName(Objects.nonNull(startUser.getDept()) ? startUser.getDept().getDeptName() : "");
+ // 娴佺▼澶勭悊浜轰俊鎭�
+ List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId());
+ for (IdentityLink identityLink : identityLinksForTask) {
+ // 缁戝畾鐨勬槸鐢ㄦ埛锛屾煡鍑虹敤鎴峰鍚嶃�侀儴闂�
+ if (StringUtils.isNotBlank(identityLink.getUserId())) {
+ SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
+ if (Objects.nonNull(sysUser)) {
+ flowTask.setAssigneeId(sysUser.getUserId());
+ if (Objects.nonNull(sysUser.getDept())) {
+ flowTask.setAssigneeDeptName(sysUser.getDept().getDeptName());
+ }
+ flowTask.setAssigneeName(sysUser.getNickName());
+ }
+ // 缁戝畾鐨勬槸瑙掕壊锛屾煡鍑鸿鑹插悕绉�
+ } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
+ SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
+ if (Objects.nonNull(role)) {
+ flowTask.setAssigneeId(Long.parseLong(identityLink.getGroupId()));
+ flowTask.setAssigneeDeptName("鐢辨嫢鏈夎鑹诧細銆�" + role.getRoleName() + "銆戠殑浜哄鐞�");
+ flowTask.setAssigneeName("鏆傛湭澶勭悊");
+ }
+ }
+ }
+ flowList.add(flowTask);
+ }
+ result.put("taskList", flowList);
}
/**
- * 鍒楄〃
+ * 鑾峰彇娴佺▼鑺傜偣鏁帮紙鎬讳换鍔℃暟锛屼笉鍖呭惈寮�濮嬨�佺粨鏉熺瓑鐗规畩鐨勶紝鍙粺璁serTask绫诲瀷鐨勶級
+ *
+ * @param processDefinitionId 娴佺▼瀹氫箟id
* @return
*/
- @Override
- public Result all() {
- List<ProjectProcess> entities = baseMapper.selectList(null);
- return Result.ok().data(entities);
+ private Long getTotalTaskNum(String processDefinitionId) {
+ // 鑾峰彇娴佺▼瀹氫箟
+ ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
+ .processDefinitionId(processDefinitionId)
+ .singleResult();
+
+ if (processDefinition == null) {
+ throw new IllegalArgumentException("娴佺▼瀹氫箟ID鏃犳晥: " + processDefinitionId);
+ }
+
+ // 鑾峰彇BPMN妯″瀷
+ BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
+ if (bpmnModel == null) {
+ throw new IllegalStateException("鏃犳硶鑾峰彇BPMN妯″瀷: " + processDefinitionId);
+ }
+
+ // 鑾峰彇娴佺▼瀵硅薄
+ Process process = bpmnModel.getProcessById(processDefinition.getKey());
+ if (process == null) {
+ throw new IllegalStateException("鏃犳硶鑾峰彇娴佺▼瀵硅薄: " + processDefinition.getKey());
+ }
+
+ // 璁$畻浠诲姟鑺傜偣鏁伴噺
+ Long taskNodeCount = 0L;
+ List<FlowElement> flowElements = process.getFlowElements().stream().toList();
+ for (FlowElement flowElement : flowElements) {
+ if (flowElement instanceof org.flowable.bpmn.model.UserTask) {
+ taskNodeCount++;
+ }
+ }
+ return taskNodeCount;
+ }
+
+ /**
+ * 鑾峰彇娴佺▼鍓╀綑鏈畬鎴愮殑浠诲姟鏁�
+ *
+ * @param processInstanceId
+ * @return
+ */
+ private Long getNotFinishedTaskNum(String processInstanceId) {
+ return historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).processUnfinished().count();
+ }
+
+ /**
+ * 鑾峰彇寰呭姙浠诲姟鏁�
+ *
+ * @param processInstanceId
+ * @return
+ */
+ private Long getTodoTaskNum(String processInstanceId) {
+ return taskService.createTaskQuery().active().processInstanceId(processInstanceId).count();
+ }
+
+ /**
+ * 鑾峰彇褰撳墠鐜妭鐨勬墍鏈変换鍔℃暟
+ *
+ * @param processInstanceId
+ * @return
+ */
+ private List<Task> getCurrentNodeTaskList(String processInstanceId) {
+ return taskService.createTaskQuery().processDefinitionId(processInstanceId).list();
}
}
--
Gitblit v1.8.0