Browse Source

提交

master
zhouhaibin 7 months ago
parent
commit
cbda7ee776
  1. 4
      db/jeecgboot-mysql-5.7.sql
  2. 16
      huzhou/pom.xml
  3. 28
      huzhou/src/main/java/org/jeecg/modules/huzhou/common/HuzhouCommonUtils.java
  4. 148
      huzhou/src/main/java/org/jeecg/modules/huzhou/controller/HuzhouPlanController.java
  5. 396
      huzhou/src/main/java/org/jeecg/modules/huzhou/controller/HuzhouProjectController.java
  6. 118
      huzhou/src/main/java/org/jeecg/modules/huzhou/controller/HuzhouUserController.java
  7. 367
      huzhou/src/main/java/org/jeecg/modules/huzhou/controller/WorkflowController.java
  8. 31
      huzhou/src/main/java/org/jeecg/modules/huzhou/entity/BaseEntity.java
  9. 57
      huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouPlaninfo.java
  10. 34
      huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouPlanmodule.java
  11. 39
      huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouPlanmoduledetail.java
  12. 34
      huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouProcessinfo.java
  13. 173
      huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouProjectinfo.java
  14. 45
      huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouUploadfileinfo.java
  15. 32
      huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouUserproject.java
  16. 19
      huzhou/src/main/java/org/jeecg/modules/huzhou/entity/WorkFlow.java
  17. 41
      huzhou/src/main/java/org/jeecg/modules/huzhou/handler/MyMetaObjectHandler.java
  18. 9
      huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouPlaninfoMapper.java
  19. 9
      huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouPlanmoduleMapper.java
  20. 9
      huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouPlanmoduledetailMapper.java
  21. 9
      huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouProcessinfoMapper.java
  22. 9
      huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouProjectinfoMapper.java
  23. 9
      huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouUploadfileinfoMapper.java
  24. 9
      huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouUserprojectMapper.java
  25. 13
      huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/WorkflowMapper.java
  26. 14
      huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/xml/WorkflowMapper.xml
  27. 16
      huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouPlaninfoService.java
  28. 16
      huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouPlanmoduleService.java
  29. 18
      huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouPlanmoduledetailService.java
  30. 1
      huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouProcessinfoService.java
  31. 16
      huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouProjectinfoService.java
  32. 17
      huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouUploadfileinfoService.java
  33. 17
      huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouUserprojectService.java
  34. 11
      huzhou/src/main/java/org/jeecg/modules/huzhou/service/IWorkflowService.java
  35. 20
      huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouPlaninfoServiceImpl.java
  36. 19
      huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouPlanmoduleServiceImpl.java
  37. 21
      huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouPlanmoduledetailServiceImpl.java
  38. 165
      huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouProcessinfoServiceImpl.java
  39. 14
      huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouProjectinfoServiceImpl.java
  40. 75
      huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouUploadfileinfoServiceImpl.java
  41. 23
      huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouUserprojectServiceImpl.java
  42. 327
      huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/WorkflowServiceImpl.java
  43. 17
      huzhou/src/main/java/org/jeecg/modules/huzhou/vo/ProjectApproveOV.java
  44. 4
      huzhou/src/main/resources/mapper/HuzhouUserprojectMapper.xml
  45. 14
      jeecg-module-system/jeecg-system-biz/pom.xml
  46. 3
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java
  47. 17
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
  48. 19
      jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml
  49. 166
      jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml
  50. 63
      jeecg-module-system/jeecg-system-start/src/main/resources/process/initiatesProjects.bpmn20.xml
  51. BIN
      jeecg-module-system/jeecg-system-start/src/main/resources/process/initiatesProjects.png
  52. 68
      jeecg-module-system/jeecg-system-start/src/main/resources/process/项目计划审批流程.bpmn20.xml
  53. BIN
      jeecg-module-system/jeecg-system-start/src/main/resources/process/项目计划审批流程.png
  54. 68
      jeecg-module-system/jeecg-system-start/src/main/resources/process/项目资料上传流程.bpmn20.xml
  55. BIN
      jeecg-module-system/jeecg-system-start/src/main/resources/process/项目资料上传流程.png
  56. 251
      jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/message/test/SendMessageTest.java
  57. 6
      pom.xml

4
db/jeecgboot-mysql-5.7.sql

@ -1,5 +1,5 @@
CREATE database if NOT EXISTS `jeecg-boot` default character set utf8mb4 collate utf8mb4_general_ci;
USE `jeecg-boot`;
CREATE database if NOT EXISTS `guoyan_huozhou` default character set utf8mb4 collate utf8mb4_general_ci;
USE `guoyan_huozhou`;
/*
Navicat Premium Data Transfer

16
huzhou/pom.xml

@ -17,6 +17,10 @@
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-boot-base-core</artifactId>
</dependency>
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-system-biz</artifactId>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
@ -29,4 +33,16 @@
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>9</source>
<target>9</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

28
huzhou/src/main/java/org/jeecg/modules/huzhou/common/HuzhouCommonUtils.java

@ -0,0 +1,28 @@
package org.jeecg.modules.huzhou.common;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class HuzhouCommonUtils {
public static List<String> extractObjectAttributes(Object user) {
List<String> attributes = new ArrayList<>();
Class<?> clazz = user.getClass();
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
try {
String name = method.getName();
if (name.startsWith("get")) { // 假设所有的getter方法都不带参数,并且返回一个基本数据类型或其包装类
Object value = method.invoke(user);
if (value != null) { // 过滤掉null值
attributes.add(name.substring(3) + "=" + value); // 去掉"get"并添加等号和值
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return attributes;
}
}

148
huzhou/src/main/java/org/jeecg/modules/huzhou/controller/HuzhouPlanController.java

@ -0,0 +1,148 @@
package org.jeecg.modules.huzhou.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang.StringUtils;
import org.checkerframework.checker.units.qual.A;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.huzhou.entity.*;
import org.jeecg.modules.huzhou.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@RestController
@RequestMapping("/huzhouPlan")
public class HuzhouPlanController {
@Autowired
private IHuzhouPlaninfoService planinfoService;
@Autowired
private IHuzhouPlanmoduleService planmoduleService;
@Autowired
private IHuzhouPlanmoduledetailService planmoduledetailService;
@Autowired
private IWorkflowService workflowService;
@Autowired
private IHuzhouProcessinfoService processinfoService;
@Autowired
private IHuzhouProjectinfoService projectinfoService;
@GetMapping("/queryPlanModulePage")
public Result<Page<HuzhouPlanmodule>> queryPlanModulePage(HuzhouPlanmodule planmodule,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize){
LambdaQueryWrapper<HuzhouPlanmodule> queryWrapper = new LambdaQueryWrapper<>();
String moduleName = planmodule.getModuleName();
String projectType = planmodule.getProjectType();
queryWrapper.eq(StringUtils.isNotBlank(moduleName), HuzhouPlanmodule::getModuleName,moduleName)
.eq(StringUtils.isNotBlank(projectType),HuzhouPlanmodule::getProjectType,projectType);
Page<HuzhouPlanmodule> planmodulePage = new Page<>(pageNo,pageSize);
Page<HuzhouPlanmodule> page = planmoduleService.page(planmodulePage, queryWrapper);
return Result.OK(page);
}
@GetMapping("/queryPlanModuleone")
public Result<HuzhouPlanmodule> queryPlanModuleByid(HuzhouPlanmodule planmodule){
LambdaQueryWrapper<HuzhouPlanmodule> queryWrapper = new LambdaQueryWrapper<>();
int planmoduleId = planmodule.getId();
String projectType = planmodule.getProjectType();
queryWrapper.eq(planmoduleId!=0,HuzhouPlanmodule::getId,planmoduleId)
.eq(StringUtils.isNotBlank(projectType),HuzhouPlanmodule::getProjectType,projectType);
HuzhouPlanmodule one = planmoduleService.getOne(queryWrapper);
return Result.OK(one);
}
@PostMapping("/savePlanModule")
public Result<?> savePlanModule(@RequestBody HuzhouPlanmodule planmodule){
String projectType = planmodule.getProjectType();
LambdaQueryWrapper<HuzhouPlanmodule> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(HuzhouPlanmodule::getProjectType,projectType);
int size = planmoduleService.list(queryWrapper).size();
if(size>0){
return Result.error("此项目类型已存在模板,无法新增");
}
planmoduleService.save(planmodule);
return Result.ok("新增项目模板成功");
}
@PostMapping("/modifyPlanModule")
public Result<?> modifyPlanModule(@RequestBody HuzhouPlanmodule planmodule){
String projectType = planmodule.getProjectType();
int planmoduleId = planmodule.getId();
LambdaQueryWrapper<HuzhouPlanmodule> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(HuzhouPlanmodule::getProjectType,projectType);
queryWrapper.ne(HuzhouPlanmodule::getId,planmoduleId);
int size = planmoduleService.list(queryWrapper).size();
if(size>0){
return Result.error("此项目类型已存在模板");
}
planmoduleService.updateById(planmodule);
return Result.ok("修改项目模板成功");
}
@DeleteMapping("/deletePlanModule")
public Result<?> deletePlanModule(@RequestParam("id") Integer id){
planmoduleService.removeById(id);
return Result.ok("删除项目模板成功");
}
@GetMapping("/queryPlanModuleDetailPage")
public Result<List<HuzhouPlanmoduledetail>> queryPlanModuleDetailPage(HuzhouPlanmoduledetail planmoduledetail){
LambdaQueryWrapper<HuzhouPlanmoduledetail> queryWrapper = new LambdaQueryWrapper<>();
String moduleId = planmoduledetail.getModuleId();
queryWrapper.eq(StringUtils.isNotBlank(moduleId), HuzhouPlanmoduledetail::getModuleId,moduleId);
List<HuzhouPlanmoduledetail> list = planmoduledetailService.list(queryWrapper);
return Result.OK(list);
}
@PostMapping("/savePlanModuleDatail")
public Result<?> savePlanModuleDatail(@RequestBody() List<HuzhouPlanmoduledetail> planmoduledetails){
//先删除后增加
String moduleId = planmoduledetails.get(0).getModuleId();
LambdaQueryWrapper<HuzhouPlanmoduledetail> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(HuzhouPlanmoduledetail::getModuleId,moduleId);
boolean remove = planmoduledetailService.remove(queryWrapper);
for (HuzhouPlanmoduledetail p:planmoduledetails
) {
planmoduledetailService.save(p);
}
return Result.ok("新增项目模板成功");
}
@PostMapping("/saveProjectPlan")
public Result<?> saveProjectPlan(@RequestBody List<HuzhouPlaninfo> planinfos){
if(planinfos.size()==0){
return Result.error("数量为0");
}
ArrayList<String> arrayList = new ArrayList<>();
//设置下一个节点处理人
//使用角色查询
arrayList.add("1752895307869614081");
arrayList.add("1752895591849160705");
WorkFlow workFlow = workflowService.createFlow("项目计划审批流程", arrayList);
String processInstanceId = workFlow.getProcessInstanceId();
String businessKey = workFlow.getBusinessKey();
planinfos.forEach(item->{
planinfoService.save(item);
});
String projectId = planinfos.get(0).getProjectId();
//保存项目信息
LambdaUpdateWrapper<HuzhouProjectinfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(HuzhouProjectinfo::getStatus,"5");//3表示项目资料流程审批阶段
updateWrapper.eq(HuzhouProjectinfo::getId,projectId);
projectinfoService.update(null,updateWrapper);
HuzhouProcessinfo huzhouProcessinfo = new HuzhouProcessinfo();
huzhouProcessinfo.setBusinesskey(businessKey);
huzhouProcessinfo.setStatus("3");//该项目的第一个流程
huzhouProcessinfo.setProcessinstanceid(processInstanceId);
huzhouProcessinfo.setProjectid(projectId);
processinfoService.save(huzhouProcessinfo);
return Result.OK("保存成功");
}
@GetMapping("/queryProjectPlan")
public Result< List<HuzhouPlaninfo>> queryProjectPlan(HuzhouPlaninfo planinfo){
String projectId = planinfo.getProjectId();
LambdaQueryWrapper<HuzhouPlaninfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(StringUtils.isNotBlank(projectId),HuzhouPlaninfo::getProjectId,projectId);
queryWrapper.orderByAsc(HuzhouPlaninfo::getOrderNumber);
List<HuzhouPlaninfo> list = planinfoService.list(queryWrapper);
return Result.OK(list);
}
}

396
huzhou/src/main/java/org/jeecg/modules/huzhou/controller/HuzhouProjectController.java

@ -0,0 +1,396 @@
package org.jeecg.modules.huzhou.controller;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.*;
import org.activiti.engine.impl.identity.Authentication;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.beanutils.BeanMap;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.checkerframework.checker.units.qual.A;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.constant.SymbolConstant;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.CommonUtils;
import org.jeecg.modules.huzhou.common.HuzhouCommonUtils;
import org.jeecg.modules.huzhou.entity.*;
import org.jeecg.modules.huzhou.service.*;
import org.jeecg.modules.huzhou.vo.ProjectApproveOV;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.parameters.P;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.*;
@RestController
@RequestMapping("/huzhouProject")
public class HuzhouProjectController {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private RepositoryService repositoryService;
@Autowired
private HistoryService historyService;
@Autowired
private IWorkflowService workflowService;
@Autowired
private IHuzhouProcessinfoService processinfoService;
@Autowired
private IHuzhouProjectinfoService projectinfoService;
@Autowired
private IHuzhouUserprojectService userprojectService;
@Autowired
private IHuzhouUploadfileinfoService uploadfileinfoService;
@Value(value = "${jeecg.path.upload}")
private String uploadpath;
@Autowired
private ISysUserService userService;
/**
* 本地local miniominio 阿里alioss
*/
@Value(value="${jeecg.uploadType}")
private String uploadType;
@PostMapping("/submitProject")
public Result<String> submitProject(@RequestBody HuzhouProjectinfo info){
ArrayList<String> arrayList = new ArrayList<>();
//设置下一个节点处理人
//使用角色查询
arrayList.add("1752895307869614081");
arrayList.add("1752895591849160705");
WorkFlow workFlow = workflowService.createFlow("initiatesProjects", arrayList);
String processInstanceId = workFlow.getProcessInstanceId();
String businessKey = workFlow.getBusinessKey();
//保存项目信息
info.setStatus("1");//最开始的状态
projectinfoService.save(info);
//保存项目流程相关的信息
//设置businessKey
//设置项目状态
//新增项目人员关系表
List<String> extractObjectAttributes = HuzhouCommonUtils.extractObjectAttributes(info);
for (String s:extractObjectAttributes) {
if(s.contains("Contactor")){
String s1 = s.split("=")[1];
HuzhouUserproject huzhouUserproject = new HuzhouUserproject();
huzhouUserproject.setProjectId(info.getId());
huzhouUserproject.setUserId(s1);
userprojectService.save(huzhouUserproject);
}
}
HuzhouProcessinfo huzhouProcessinfo = new HuzhouProcessinfo();
huzhouProcessinfo.setBusinesskey(businessKey);
huzhouProcessinfo.setStatus("1");//该项目的第一个流程
huzhouProcessinfo.setProcessinstanceid(processInstanceId);
huzhouProcessinfo.setProjectid(info.getId());
processinfoService.save(huzhouProcessinfo);
return Result.ok("项目入库申请已发起成功");
}
@PostMapping("/approveProjectInfo")
public Result<?> approveProjectInfo(@RequestBody HashMap<String,Object> param){
LoginUser currentUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
String userId = currentUser.getId();
String taskId = (String) param.get("taskId");
String flag = (String) param.get("flag");
String comment = (String) param.get("comment");
String projectid = (String) param.get("projectid");
String status = (String) param.get("status");
String isEdit = (String) param.get("isEdit");
Map projectInfoMap = (Map) param.get("projectInfo");
String jsonString = JSON.toJSONString(projectInfoMap);
HuzhouProjectinfo projectinfo = JSON.parseObject(jsonString, HuzhouProjectinfo.class);
if("3".equals(flag)){
LambdaUpdateWrapper<HuzhouProjectinfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(HuzhouProjectinfo::getStatus,"0");//表示作废
updateWrapper.eq(HuzhouProjectinfo::getId,projectid);
projectinfoService.update(updateWrapper);
return Result.OK("流程作废成功");
}
if("1".equals(isEdit)&&"1".equals(flag)&&"1".equals(status)){
if(null!=projectinfo){
projectinfoService.updateById(projectinfo);
//删除此项目原来的人员和项目对应信息
LambdaQueryWrapper<HuzhouUserproject> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(HuzhouUserproject::getProjectId,projectid);
boolean remove = userprojectService.remove(queryWrapper);
//保存新的人员和项目对应信息
List<String> extractObjectAttributes = HuzhouCommonUtils.extractObjectAttributes(projectinfo);
for (String s:extractObjectAttributes) {
if(s.contains("Contactor")){
String s1 = s.split("=")[1];
HuzhouUserproject huzhouUserproject = new HuzhouUserproject();
huzhouUserproject.setProjectId(projectinfo.getId());
huzhouUserproject.setUserId(s1);
userprojectService.save(huzhouUserproject);
}
}
}
}
WorkFlow workFlow = workflowService.approveProjectInfo(taskId, flag, comment, status);
String userTaskName = workFlow.getUserTask();
//管理单位审批通过,最后一个节点流程通过
if("管理单位审批".equals(userTaskName)&&"1".equals(flag)){
LambdaUpdateWrapper<HuzhouProjectinfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(HuzhouProjectinfo::getStatus,"2");
updateWrapper.eq(HuzhouProjectinfo::getId,projectid);
projectinfoService.update(updateWrapper);
}
if("流程审批二".equals(userTaskName)&&"1".equals(flag)){
LambdaUpdateWrapper<HuzhouProjectinfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(HuzhouProjectinfo::getStatus,"4");
updateWrapper.eq(HuzhouProjectinfo::getId,projectid);
projectinfoService.update(updateWrapper);
}
if("计划审批二".equals(userTaskName)&&"1".equals(flag)){
LambdaUpdateWrapper<HuzhouProjectinfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(HuzhouProjectinfo::getStatus,"6");
updateWrapper.eq(HuzhouProjectinfo::getId,projectid);
projectinfoService.update(updateWrapper);
}
return Result.ok("审批成功");
}
@PostMapping("/approveUploadFile")
public Result<?> approveUploadFile(@RequestParam(value = "file",required = false) MultipartFile[] file,
@RequestParam String taskId,
@RequestParam String flag,
@RequestParam String projectid,
@RequestParam String comment,
@RequestParam String status) throws IOException {
LoginUser currentUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
String userId = currentUser.getId();
WorkFlow workFlow = workflowService.approveProjectInfo(taskId, flag, comment, status);
String userTaskName = workFlow.getUserTask();
if("发起人".equals(workFlow.getUserTask())&&null != file){
uploadfileinfoService.modifyUploadFile(file,projectid,status);
}
//管理单位审批通过,最后一个节点流程通过
if("管理单位审批".equals(userTaskName)&&"1".equals(flag)){
LambdaUpdateWrapper<HuzhouProjectinfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(HuzhouProjectinfo::getStatus,"2");
updateWrapper.eq(HuzhouProjectinfo::getId,projectid);
projectinfoService.update(updateWrapper);
}
if("流程审批二".equals(userTaskName)&&"1".equals(flag)){
LambdaUpdateWrapper<HuzhouProjectinfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(HuzhouProjectinfo::getStatus,"4");
updateWrapper.eq(HuzhouProjectinfo::getId,projectid);
projectinfoService.update(updateWrapper);
}
if("计划审批二".equals(userTaskName)&&"1".equals(flag)){
LambdaUpdateWrapper<HuzhouProjectinfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(HuzhouProjectinfo::getStatus,"6");
updateWrapper.eq(HuzhouProjectinfo::getId,projectid);
projectinfoService.update(updateWrapper);
}
return Result.ok("审批成功");
}
@PostMapping("/deleteProcesss")
public Result<?> deleteProcesss(String processInstanceId){
runtimeService.deleteProcessInstance(processInstanceId,"发起人删除");
return Result.OK("流程删除成功");
}
@GetMapping("/projectInfoPageList")
public Result<IPage<HuzhouProjectinfo>> queryPageList(@RequestParam Map<String, Object> params,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize){
IPage page = new Page(pageNo, pageSize);
LambdaQueryWrapper<HuzhouProjectinfo> huzhouProjectinfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
String projectName = (String) params.get("projectName");
String projectId = (String) params.get("projectId");
huzhouProjectinfoLambdaQueryWrapper.like(StringUtils.isNotBlank(projectName),HuzhouProjectinfo::getProjectName,projectName);
huzhouProjectinfoLambdaQueryWrapper.like(StringUtils.isNotBlank(projectId),HuzhouProjectinfo::getId,projectId);
IPage pageList = projectinfoService.page(page, huzhouProjectinfoLambdaQueryWrapper);
return Result.OK(pageList);
}
@GetMapping("/queryProjectInfoById")
public Result<HuzhouProjectinfo> queryProjectInfoById(String projectid){
//获取项目入库数据
HuzhouProjectinfo projectinfo = projectinfoService.getById(projectid);
// List<String> attributes = new ArrayList<>();
//
// List<String> extractObjectAttributes = HuzhouCommonUtils.extractObjectAttributes(projectinfo);
// for (String s:extractObjectAttributes) {
// if(s.contains("Contactor")){
// String s1 = s.split("=")[1];
// SysUser user = userService.getById(s1);
// String realname = user.getRealname();
// Class<?> clazz = projectinfo.getClass();
// Method[] methods = clazz.getDeclaredMethods();
//
// for (Method method : methods) {
// try {
// String name = method.getName();
// if (name.contains(s.split("=")[0])) { // 假设所有的getter方法都不带参数,并且返回一个基本数据类型或其包装类
// method.invoke(projectinfo,realname);
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
// }
// }
// LambdaQueryWrapper<HuzhouProcessinfo> queryWrapper = new LambdaQueryWrapper<>();
// queryWrapper.eq(HuzhouProcessinfo::getProjectid,projectid);
// HuzhouProcessinfo processinfo = processinfoService.getOne(queryWrapper);
//获取项目入库流程数据
return Result.OK(projectinfo);
}
@GetMapping("/queryprocessinfoById")
public Result<HuzhouProcessinfo> queryprocessinfoById(String projectid){
LambdaQueryWrapper<HuzhouProcessinfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(HuzhouProcessinfo::getProjectid,projectid);
queryWrapper.orderByDesc(HuzhouProcessinfo::getStatus);
HuzhouProcessinfo processinfo = processinfoService.list(queryWrapper).get(0);
return Result.OK(processinfo);
}
@PostMapping("/uploadFile")
@Transactional()
public Result<?> uploadFile(@RequestParam(value = "file")
MultipartFile[] files,@RequestParam(value = "projectid") String projectid,
@RequestParam(value = "status") String status) throws IOException {
//获取当前时间
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
String currentDay = dateFormat.format(new Date());
File filePath = new File(uploadpath + File.separator + currentDay + File.separator);
//文件夹不存在则创建
if (!filePath.exists()) {
// 创建文件根目录
filePath.mkdirs();
}else {
// return modifyUploadFile(files,projectid,status);
}
for (MultipartFile item:files) {
String fileName =null;
String originalFilename = item.getOriginalFilename();
originalFilename = CommonUtils.getFileName(originalFilename);
if(originalFilename.indexOf(SymbolConstant.SPOT)!=-1){
fileName = originalFilename.substring(0, originalFilename.lastIndexOf(".")) + "_" + System.currentTimeMillis() + originalFilename.substring(originalFilename.lastIndexOf("."));
}else{
fileName = originalFilename+ "_" + System.currentTimeMillis();
}
String savePath = filePath.getPath() + File.separator + fileName;
File savefile = new File(savePath);
FileCopyUtils.copy(item.getBytes(), savefile);//保存文件
HuzhouUploadfileinfo huzhouUploadfileinfo = new HuzhouUploadfileinfo();
huzhouUploadfileinfo.setDocumentName(originalFilename);//未加工过的文件名称
huzhouUploadfileinfo.setDocumentType(item.getContentType());
huzhouUploadfileinfo.setDocumentPath(savePath);
huzhouUploadfileinfo.setStatus(status);
huzhouUploadfileinfo.setSize(item.getSize());
huzhouUploadfileinfo.setProjectid(projectid);
boolean save = uploadfileinfoService.save(huzhouUploadfileinfo);
}
ArrayList<String> arrayList = new ArrayList<>();
//设置下一个节点处理人
//使用角色查询
arrayList.add("1752895307869614081");
arrayList.add("1752895591849160705");
WorkFlow workFlow = workflowService.createFlow("项目资料上传流程", arrayList);
String businessKey = workFlow.getBusinessKey();
String processInstanceId = workFlow.getProcessInstanceId();
//保存项目信息
LambdaUpdateWrapper<HuzhouProjectinfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(HuzhouProjectinfo::getStatus,"3");//3表示项目资料流程审批阶段
updateWrapper.eq(HuzhouProjectinfo::getId,projectid);
projectinfoService.update(null,updateWrapper);
//保存项目流程相关的信息
//设置businessKey
//设置项目状态
HuzhouProcessinfo huzhouProcessinfo = new HuzhouProcessinfo();
huzhouProcessinfo.setBusinesskey(businessKey);
huzhouProcessinfo.setStatus("2");//该项目的第一个流程
huzhouProcessinfo.setProcessinstanceid(processInstanceId);
huzhouProcessinfo.setProjectid(projectid);
processinfoService.save(huzhouProcessinfo);
return Result.OK("上传成功!!");
}
@GetMapping("/downloadfile")
public void downloadfile(HttpServletResponse response,String path,String fileName) throws IOException {
FileInputStream fileInputStream = new FileInputStream(path);
response.setContentType("application/octet-stream");
// response.setHeader("Content-disposition", "attachment;filename=" + fileName);
BufferedInputStream inputStream =null;
try {
ServletOutputStream outputStream = response.getOutputStream();
inputStream = new BufferedInputStream(fileInputStream);
byte[] bytes = new byte[1024];
int len =inputStream.read(bytes);
while (len!=-1){
outputStream.write(bytes,0,bytes.length);
outputStream.flush();
len=inputStream.read(bytes);
}
}finally {
if(inputStream!=null){
inputStream.close();
}
}
}
@GetMapping("/queryResourceInfo")
public Result<IPage<HuzhouUploadfileinfo>> queryResourceInfo(@RequestParam Map<String, Object> params,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize){
String projectid = (String) params.get("projectid");
String status = (String) params.get("status");
IPage<HuzhouUploadfileinfo> huzhouUploadfileinfoIPage = new Page<>(pageNo,pageSize);
LambdaUpdateWrapper<HuzhouUploadfileinfo> huzhouUploadfileinfoLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
huzhouUploadfileinfoLambdaUpdateWrapper.eq(HuzhouUploadfileinfo::getProjectid,projectid);
huzhouUploadfileinfoLambdaUpdateWrapper.eq(HuzhouUploadfileinfo::getStatus,status);
IPage<HuzhouUploadfileinfo> uploadfileinfoIPage = uploadfileinfoService.page(huzhouUploadfileinfoIPage, huzhouUploadfileinfoLambdaUpdateWrapper);
return Result.OK(uploadfileinfoIPage);
}
@GetMapping("/queryProjectApprovedPage")
public Result<Page<HuzhouProjectinfo>> queryProjectApprovedPage(HuzhouProjectinfo projectinfo,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize){
Page<HuzhouProjectinfo> projectinfoPage = new Page<>(pageNo, pageSize);
LambdaQueryWrapper<HuzhouProjectinfo> queryWrapper = new LambdaQueryWrapper<>();
String projectName = projectinfo.getProjectName();
String projectinfoId = projectinfo.getId();
queryWrapper.like(StringUtils.isNotBlank(projectName),HuzhouProjectinfo::getProjectName,projectName);
queryWrapper.like(StringUtils.isNotBlank(projectinfoId),HuzhouProjectinfo::getId,projectinfoId);
queryWrapper.ge(HuzhouProjectinfo::getStatus,"4");
Page<HuzhouProjectinfo> page = projectinfoService.page(projectinfoPage, queryWrapper);
return Result.OK(page);
}
}

118
huzhou/src/main/java/org/jeecg/modules/huzhou/controller/HuzhouUserController.java

@ -0,0 +1,118 @@
package org.jeecg.modules.huzhou.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.huzhou.entity.BaseEntity;
import org.jeecg.modules.huzhou.entity.HuzhouProjectinfo;
import org.jeecg.modules.huzhou.service.IHuzhouProjectinfoService;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/huzhouUser")
public class HuzhouUserController {
@Autowired
private ISysUserService userService;
@Autowired
private IHuzhouProjectinfoService projectinfoService;
@GetMapping("/getMyAddressBook")
public Result<Page<SysUser>> getMyAddressBook(@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize){
//先查询当前参与的项目
//获取当前登录人
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
String userId = loginUser.getId();
//查询参与的项目
LambdaQueryWrapper<HuzhouProjectinfo> projectinfoQueryWrapper = new LambdaQueryWrapper<>();
projectinfoQueryWrapper.eq(HuzhouProjectinfo::getManageContactor,userId)
.or()
.eq(HuzhouProjectinfo::getControlerContactor,userId)
.or()
.eq(HuzhouProjectinfo::getOwnerContactor,userId)
.or()
.eq(HuzhouProjectinfo::getContructorContactor,userId)
.or()
.eq(HuzhouProjectinfo::getSupervisorContactor,userId)
.or()
.eq(HuzhouProjectinfo::getConsultContactor,userId)
.or()
.eq(BaseEntity::getCreator,userId);
//projectinfoQueryWrapper.eq(BaseEntity::getCreator,userId);
List<HuzhouProjectinfo> projectinfoList = projectinfoService.list(projectinfoQueryWrapper);
List<String> manageContactors = projectinfoList.stream()
.map(HuzhouProjectinfo::getManageContactor)
.collect(Collectors.toList());
List<String> controlerContactors = projectinfoList.stream()
.map(HuzhouProjectinfo::getControlerContactor)
.collect(Collectors.toList());
List<String> ownerContactors = projectinfoList.stream()
.map(HuzhouProjectinfo::getOwnerContactor)
.collect(Collectors.toList());
List<String> contructorContactor = projectinfoList.stream()
.map(HuzhouProjectinfo::getContructorContactor)
.collect(Collectors.toList());
List<String> supervisorContactor = projectinfoList.stream().map(HuzhouProjectinfo::getSupervisorContactor).collect(Collectors.toList());
List<String> consultContactor = projectinfoList.stream().map(HuzhouProjectinfo::getConsultContactor).collect(Collectors.toList());
HashSet<String> hashSet = new HashSet<>();
hashSet.addAll(manageContactors);
hashSet.addAll(controlerContactors);
hashSet.addAll(ownerContactors);
hashSet.addAll(contructorContactor);
hashSet.addAll(supervisorContactor);
hashSet.addAll(consultContactor);
Page<SysUser> sysUserPage = new Page<>(pageNo,pageSize);
LambdaQueryWrapper<SysUser> sysUserQueryWrapper = new LambdaQueryWrapper<>();
sysUserQueryWrapper.in(hashSet.size()>0,SysUser::getId,hashSet)
.or().eq(SysUser::getId,userId);
Page<SysUser> userPage = userService.page(sysUserPage, sysUserQueryWrapper);
return Result.OK(userPage);
}
@GetMapping("/getWorkPlaceTypeDict")
public Result<?> getWorkPlaceDict(String workPlaceType){
LambdaQueryWrapper<SysUser> sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
sysUserLambdaQueryWrapper.eq(SysUser::getWorkplaceType,workPlaceType)
.select(SysUser::getWorkplaceType,SysUser::getWorkplace);
List<Map<String, String>> mapList = userService.list(sysUserLambdaQueryWrapper)
.stream()
.distinct()
.map(sysUser -> Map.of(
"value", sysUser.getWorkplace(),
"label", sysUser.getWorkplace()
)).collect(Collectors.toList());
return Result.OK(mapList);
}
@GetMapping("/getContactorDict")
public Result<?> getContactorDict(String workPlace,String workPlaceType){
LambdaQueryWrapper<SysUser> sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
sysUserLambdaQueryWrapper.eq(StringUtils.isNotBlank(workPlace),SysUser::getWorkplace,workPlace)
.eq(StringUtils.isNotBlank(workPlaceType),SysUser::getWorkplaceType,workPlaceType);
List<Map<String, String>> mapList = userService.list(sysUserLambdaQueryWrapper)
.stream()
.map(sysUser -> Map.of(
"value", sysUser.getId(),
"label", sysUser.getRealname()
)).collect(Collectors.toList());
return Result.OK(mapList);
}
@GetMapping("/getUserInfoByid")
public Result<?> getUserInfoByid(String id){
SysUser byId = userService.getById(id);
return Result.ok(byId);
}
}

367
huzhou/src/main/java/org/jeecg/modules/huzhou/controller/WorkflowController.java

@ -0,0 +1,367 @@
package org.jeecg.modules.huzhou.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.module.kotlin.ReflectionCache;
import org.activiti.bpmn.model.*;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.*;
import org.activiti.engine.impl.identity.Authentication;
import org.activiti.engine.impl.persistence.entity.TaskEntityImpl;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Comment;
import org.activiti.engine.task.Task;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.checkerframework.checker.units.qual.A;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.huzhou.entity.HuzhouProcessinfo;
import org.jeecg.modules.huzhou.entity.HuzhouProjectinfo;
import org.jeecg.modules.huzhou.mapper.WorkflowMapper;
import org.jeecg.modules.huzhou.service.IHuzhouProcessinfoService;
import org.jeecg.modules.huzhou.service.IHuzhouProjectinfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/workflow")
public class WorkflowController {
@Autowired
private TaskService taskService;
@Autowired
private HistoryService historyService;
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private IHuzhouProcessinfoService processinfoService;
@Autowired
private IHuzhouProjectinfoService projectinfoService;
@Autowired
private WorkflowMapper workflowMapper;
@GetMapping("/myTaskList")
public Result<Page<HashMap<String, Object>>> myTaskList(@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize){
LoginUser currentUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
String userId = currentUser.getId();
List<HashMap<String, Object>> taskMapList = new ArrayList<>();
List<Task> taskList = taskService.createTaskQuery()
.orderByTaskCreateTime()
.desc()
.taskCandidateOrAssigned(userId)
.listPage((pageNo-1)*pageSize,pageSize);
if (!CollectionUtils.isEmpty(taskList)) {
for (Task task:taskList) {
HashMap<String, Object> stringObjectHashMap = new HashMap<>();
stringObjectHashMap.put("taskId",task.getId());
stringObjectHashMap.put("taskName",task.getName());
String processInstanceId = task.getProcessInstanceId();
String processDefinitionId = task.getProcessDefinitionId();
//获取当前流程名称
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId).singleResult();
if(processDefinition!=null){
String processName = processDefinition.getName();
stringObjectHashMap.put("processName",processName);
}
//获取项目id
LambdaQueryWrapper<HuzhouProcessinfo> processQueryWrapper = new LambdaQueryWrapper<>();
processQueryWrapper.eq(HuzhouProcessinfo::getProcessinstanceid,processInstanceId);
HuzhouProcessinfo processinfo = processinfoService.getOne(processQueryWrapper);
if(processinfo!=null){
String projectid = processinfo.getProjectid();
stringObjectHashMap.put("projectid",projectid);
//获取项目名称
LambdaQueryWrapper<HuzhouProjectinfo> projetcQueryWrapper = new LambdaQueryWrapper<>();
projetcQueryWrapper.eq(HuzhouProjectinfo::getId,projectid);
HuzhouProjectinfo projectInfo = projectinfoService.getOne(projetcQueryWrapper);
stringObjectHashMap.put("projectName",projectInfo.getProjectName());
stringObjectHashMap.put("createTime",projectInfo.getCreatetime());
stringObjectHashMap.put("status",processinfo.getStatus());
}
stringObjectHashMap.put("processInstanceId",processInstanceId);
stringObjectHashMap.put("processDefinitionId",task.getProcessDefinitionId());
taskMapList.add(stringObjectHashMap);
}
}
// //由于activiti7的懒加载机制,无法将结果直接返回.先强转成Task实现类,在调用其方法
// List<TaskEntityImpl> taskImpls = taskList.stream().map(x -> (TaskEntityImpl) x).collect(Collectors.toList());
// //返回的结果相同
// List<Object> collect = taskImpls.stream().map(TaskEntityImpl::getPersistentState).collect(Collectors.toList());
int taskCount = taskService.createTaskQuery()
.taskCandidateOrAssigned(userId)
.list()
.size();
Page<HashMap<String, Object>> taskPage = new Page<>();
taskPage.setCurrent(pageNo);
taskPage.setSize(pageSize);
taskPage.setTotal(taskCount);
taskPage.setRecords(taskMapList);
return Result.ok(taskPage);
}
@GetMapping("/myCompleteTask")
public Result<Page<HashMap<String, String>>> myCompleteTask(@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize){
//历史任务查询暂定这样(一条流程处理两次会有两条记录),后面通过sql
LoginUser currentUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
String userId = currentUser.getId();
ArrayList<HashMap<String, String>> resList = new ArrayList<>();
// List<HistoricTaskInstance> historicTaskInstances = historyService.createHistoricTaskInstanceQuery()
// .taskAssignee(userId)
// .orderByTaskCreateTime()
// .desc()
// .listPage((pageNo-1)*pageSize, pageSize);
Page<Map<String, String>> mapPage = new Page<>(pageNo,pageSize);
Page<Map<String, String>> completeTaskByAssignee = workflowMapper.getCompleteTaskByAssignee(mapPage, userId);
List<Map<String, String>> records = completeTaskByAssignee.getRecords();
// for (HistoricTaskInstance his: historicTaskInstances) {
for (Map<String, String> his: records) {
HashMap<String, String> reshashMap = new HashMap<>();
String processInstanceId = his.get("processInstanceId");
String processDefinitionId = his.get("processDefinitionId");
reshashMap.put("processInstanceId",processInstanceId);
//获取taskid
List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId)
.orderByTaskCreateTime().desc().list();
reshashMap.put("taskId",list.get(0).getId());
//根据流程实例查询当前流所在位置
Task task = taskService.createTaskQuery()
.processInstanceId(processInstanceId)
.active()
.singleResult();
if(task!=null){
String currentTaskName = task.getName();
reshashMap.put("currentTaskName",currentTaskName);
}
//获取当前流程名称
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId).singleResult();
if(processDefinition!=null){
String processName = processDefinition.getName();
reshashMap.put("processName",processName);
}
//获取项目id
LambdaQueryWrapper<HuzhouProcessinfo> processQueryWrapper = new LambdaQueryWrapper<>();
processQueryWrapper.eq(HuzhouProcessinfo::getProcessinstanceid,processInstanceId);
HuzhouProcessinfo processinfo = processinfoService.getOne(processQueryWrapper);
if(processinfo!=null){
String projectid = processinfo.getProjectid();
reshashMap.put("projectid",projectid);
//获取项目名称
LambdaQueryWrapper<HuzhouProjectinfo> projetcQueryWrapper = new LambdaQueryWrapper<>();
projetcQueryWrapper.eq(HuzhouProjectinfo::getId,projectid);
HuzhouProjectinfo projectInfo = projectinfoService.getOne(projetcQueryWrapper);
reshashMap.put("projectName",projectInfo.getProjectName());
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String createtime = dateFormat.format(projectInfo.getCreatetime());
reshashMap.put("createTime",createtime);
reshashMap.put("status",processinfo.getStatus());
}
resList.add(reshashMap);
HistoricProcessInstance historicProcessInstance =historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult();
if(Objects.isNull(historicProcessInstance))
{
reshashMap.put("processStatus","流程不存在");
}
if(Objects.isNull(historicProcessInstance.getEndTime())){
reshashMap.put("processStatus","审批中");
}
else {
if(StringUtils.isNotBlank(historicProcessInstance.getDeleteReason())){
reshashMap.put("processStatus","已作废");
}else {
reshashMap.put("processStatus","已完成");
}
}
// //获取流程的状态是否完成
// ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
// .processInstanceId(processInstanceId)
// .singleResult();
// if(processinfo==null){
// reshashMap.put("processStatus","已完成");
// }else {
// reshashMap.put("processStatus","审判中");
// }
}
int taskCount = historyService.createHistoricTaskInstanceQuery()
.taskAssignee(userId)
.list()
.size();
Page<HashMap<String, String>> taskPage = new Page<>();
taskPage.setCurrent(pageNo);
taskPage.setSize(pageSize);
taskPage.setTotal(taskCount);
taskPage.setRecords(resList);
return Result.ok(taskPage);
}
@GetMapping("/getprocessInfo")
public Result<IPage<HashMap<String,Object>>> getprocessInfo(String projectid,String status,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize){
//通过项目id查询流程id
HuzhouProjectinfo projectinfo = projectinfoService.getById(projectid);
LambdaQueryWrapper<HuzhouProcessinfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(HuzhouProcessinfo::getProjectid,projectid);
queryWrapper.eq(HuzhouProcessinfo::getStatus,status);//属于第几部流程
HuzhouProcessinfo processinfo = processinfoService.getOne(queryWrapper);
String processinstanceid = processinfo.getProcessinstanceid();
List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processinstanceid)
.orderByTaskCreateTime().asc().listPage((pageNo-1)*pageSize,pageSize);
List<HashMap<String,Object>> approvalEntityList = new ArrayList<>();
String approvalSuggestion = "";
HistoricVariableInstance historicVariableInstance = null;
List<Comment> commentList = null;
for(HistoricTaskInstance item : list) {
HashMap<String, Object> hashMap = new HashMap<>();
commentList = taskService.getTaskComments(item.getId());
if (commentList != null && !commentList.isEmpty()) {
approvalSuggestion = commentList.get(0).getFullMessage();
} else {
approvalSuggestion = "";
}
Map<String, Object> taskLocalVariables = item.getTaskLocalVariables();
//获取当前节点的任务变量
List<HistoricVariableInstance> variablelist = historyService.createHistoricVariableInstanceQuery()
.taskId(item.getId())
.list();
if (variablelist.size()>0) {
for (HistoricVariableInstance hisvar:variablelist) {
hashMap.put(hisvar.getVariableName(),hisvar.getValue());
}
}
hashMap.put("operateDate", item.getEndTime());
hashMap.put("operator", item.getAssignee());
hashMap.put("taskName", item.getName());
hashMap.put("comment", approvalSuggestion);
approvalEntityList.add(hashMap);
}
int countSize = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processinstanceid)
.orderByTaskCreateTime().asc().list().size();
IPage<HashMap<String,Object>> listIPage = new Page<>();
listIPage.setRecords(approvalEntityList);
listIPage.setTotal(countSize);
listIPage.setSize(pageSize);
listIPage.setCurrent(pageNo);
return Result.OK(listIPage);
}
@GetMapping("/getActionParam")
public Result<?> getActionParam(String projectid,String status,String taskId,String procesType){
HashMap<String,Object> outRes = new HashMap<>();
ArrayList<Object> actionButtons = new ArrayList<>();
//如果是已办
if("1".equals(procesType)){
outRes.put("buttons",actionButtons);
outRes.put("showApprovalForm",false);
LoginUser currentUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
String currentLoginuserId = currentUser.getId();
HuzhouProjectinfo projectinfo = projectinfoService.getById(projectid);
LambdaQueryWrapper<HuzhouProcessinfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(HuzhouProcessinfo::getProjectid,projectid);
queryWrapper.eq(HuzhouProcessinfo::getStatus,status);//属于第几部流程
HuzhouProcessinfo processinfo = processinfoService.getOne(queryWrapper);
String processinstanceid = processinfo.getProcessinstanceid();
List<HistoricTaskInstance> list = historyService
.createHistoricTaskInstanceQuery()
.processInstanceId(processinstanceid)
.orderByHistoricTaskInstanceEndTime()
.desc()
.list();
HistoricTaskInstance taskInstance = null;
if (!list.isEmpty()) {
if (list.get(0).getEndTime() != null) {
taskInstance = list.get(0);
String userid = taskInstance.getAssignee();
//上一个节点是你处理的(已办可以撤回)
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
if(task==null){
return Result.OK(outRes);
}
String processInstanceId = task.getProcessInstanceId();
//获取当前模型
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
// 获取当前节点
FlowElement flowElement = bpmnModel.getFlowElement(task.getTaskDefinitionKey());
UserTask userTask = (UserTask) flowElement;
String name = userTask.getName();
if(currentLoginuserId.equals(userid)&&!"发起人".equals(name)){
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("label","撤回");
hashMap.put("value","2");
actionButtons.add(hashMap);
outRes.put("buttons",actionButtons);
outRes.put("showApprovalForm",true);
}
}
}
}else{
//代办 发起人可以作废,还要可以修改,加一个修改表示(前端也行)
outRes.put("showApprovalForm",true);
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
String processInstanceId = task.getProcessInstanceId();
//获取当前模型
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
// 获取当前节点
FlowElement flowElement = bpmnModel.getFlowElement(task.getTaskDefinitionKey());
UserTask userTask = (UserTask) flowElement;
String name = userTask.getName();
if("发起人".equals(name)){
HashMap<String, String> hashMap1 = new HashMap<>();
hashMap1.put("label","同意");
hashMap1.put("value","1");
actionButtons.add(hashMap1);
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("label","作废");
hashMap.put("value","3");
outRes.put("IsEdit",true);
actionButtons.add(hashMap);
}else {
HashMap<String, String> hashMap1 = new HashMap<>();
hashMap1.put("label","同意");
hashMap1.put("value","1");
actionButtons.add(hashMap1);
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("label","拒绝");
hashMap.put("value","0");
actionButtons.add(hashMap);
}
}
//获取上一个处理人
outRes.put("buttons",actionButtons);
return Result.OK(outRes);
}
}

31
huzhou/src/main/java/org/jeecg/modules/huzhou/entity/BaseEntity.java

@ -0,0 +1,31 @@
package org.jeecg.modules.huzhou.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.util.Date;
@Data
public class BaseEntity {
@TableField(fill = FieldFill.INSERT)
private String creator;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createtime;
/**
* 最后更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updatetime;
/**
* 更新者目前使用 SysUser id 编号
*
* 使用 String 类型的原因是未来可能会存在非数值的情况留好拓展性
*/
@TableField(fill = FieldFill.UPDATE)
private String updater;
}

57
huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouPlaninfo.java

@ -0,0 +1,57 @@
package org.jeecg.modules.huzhou.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
import java.io.Serializable;
/**
* (HuzhouPlaninfo)实体类
*
* @author makejava
* @since 2024-01-30 16:01:09
*/
@Data
public class HuzhouPlaninfo extends BaseEntity implements Serializable {
private static final long serialVersionUID = -76445082989108429L;
/**
* 项目计划id
*/
private String id;
/**
* 项目id
*/
private String projectId;
/**
* 任务名称
*/
private String taskName;
/**
* 任务启动顺序序号
*/
private String orderNumber;
/**
* 计划开始时间
*/
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd")
private Date scheduledStartTime;
/**
* 计划结束时间
*/
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd")
private Date scheduledEndTime;
/**
* 实际开始时间
*/
private Date actualStartTime;
/**
* 实际结束时间
*/
private Date actualEndTime;
}

34
huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouPlanmodule.java

@ -0,0 +1,34 @@
package org.jeecg.modules.huzhou.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.util.Date;
import java.io.Serializable;
/**
* (HuzhouPlanmodule)实体类
*
* @author makejava
* @since 2024-01-30 16:02:30
*/
@Data
public class HuzhouPlanmodule extends BaseEntity implements Serializable {
private static final long serialVersionUID = 808500478305209789L;
/**
* 计划模板id
*/
@TableId(type = IdType.AUTO)
private int id;
/**
* 模板名称
*/
private String moduleName;
/**
* 项目类型
*/
private String projectType;
}

39
huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouPlanmoduledetail.java

@ -0,0 +1,39 @@
package org.jeecg.modules.huzhou.entity;
import lombok.Data;
import java.util.Date;
import java.io.Serializable;
/**
* (HuzhouPlanmoduledetail)实体类
*
* @author makejava
* @since 2024-01-30 16:02:46
*/
@Data
public class HuzhouPlanmoduledetail extends BaseEntity implements Serializable {
private static final long serialVersionUID = -22580960950467884L;
/**
* 计划模板详情id
*/
private String id;
/**
* 模板id
*/
private String moduleId;
/**
* 任务名称
*/
private String taskName;
/**
* 任务启动顺序序号
*/
private String orderNumber;
/**
* 阶段最长时间
*/
private String maxDays;
}

34
huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouProcessinfo.java

@ -0,0 +1,34 @@
package org.jeecg.modules.huzhou.entity;
import lombok.Data;
import java.io.Serializable;
/**
* (HuzhoouProcessinfo)实体类
*
* @author makejava
* @since 2024-01-23 19:06:12
*/
@Data
public class HuzhouProcessinfo extends BaseEntity implements Serializable {
private static final long serialVersionUID = 641518690443763605L;
/**
* 流程实例id
*/
private String processinstanceid;
/**
* 业务key
*/
private String businesskey;
/**
* 流程所属项目id
*/
private String projectid;
/**
* 当前流程属于项目的哪个阶段
*/
private String status;
}

173
huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouProjectinfo.java

@ -0,0 +1,173 @@
package org.jeecg.modules.huzhou.entity;
import lombok.Data;
import java.util.Date;
import java.io.Serializable;
/**
* (HuzhouProjectinfo)实体类
*
* @author makejava
* @since 2024-02-05 14:14:53
*/
@Data
public class HuzhouProjectinfo extends BaseEntity implements Serializable{
private static final long serialVersionUID = 952171041224600588L;
/**
* 项目id
*/
private String id;
/**
* 项目名称
*/
private String projectName;
/**
* 行政区划
*/
private String adminDivision;
/**
* 主要任务及标志性成果
*/
private String description;
/**
* 项目类型
*/
private String projectType;
/**
* 责任单位
*/
private String dutyWorkplace;
/**
* 建设年限
*/
private String constructionPeriod;
/**
* 中央资金
*/
private Double centralMoney;
/**
* 省级资金
*/
private Double provincialMoney;
/**
* 市级资金
*/
private Double cityMoney;
/**
* 区县级资金
*/
private Double countyMoney;
/**
* 所属改革任务
*/
private String reformName;
/**
* 上级指导处室
*/
private String superLeader;
/**
* 项目联系人
*/
private String projectContacts;
/**
* 联系电话
*/
private String phone;
/**
* 管理单位
*/
private String manageOrg;
/**
* 管理单位负责人
*/
private String manageContactor;
/**
* 监理单位
*/
private String controler;
/**
* 监理单位负责人
*/
private String controlerContactor;
/**
* 监管单位
*/
private String supervisor;
/**
* 监管单位负责人
*/
private String supervisorContactor;
/**
* 建设单位
*/
private String owner;
/**
* 建设单位负责人
*/
private String ownerContactor;
/**
* 咨询单位
*/
private String consult;
/**
* 咨询单位负责人
*/
private String consultContactor;
/**
* 承建单位
*/
private String contructor;
/**
* 承建单位负责人
*/
private String contructorContactor;
/**
* 项目状态
*/
private String status;
/**
* 创建时间
*/
private Date createtime;
/**
* 创建人
*/
private String creator;
/**
* 修改时间
*/
private Date updatetime;
/**
* 修改人
*/
private String updater;
/**
* 单位属性
*/
private String workplaceProperties;
/**
* 总投资
*/
private String totalInvestment;
/**
* 自筹资金
*/
private String selfFunding;
/**
* 2023年支付
*/
private Double payamount2023;
/**
* 2024年支付
*/
private Double payamount2024;
/**
* 2025年支付
*/
private Double payamount2025;
}

45
huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouUploadfileinfo.java

@ -0,0 +1,45 @@
package org.jeecg.modules.huzhou.entity;
import lombok.Data;
import java.io.Serializable;
/**
* (HuzhouUploadfileinfo)实体类
*
* @author makejava
* @since 2024-01-29 14:21:06
*/
@Data
public class HuzhouUploadfileinfo extends BaseEntity implements Serializable {
private static final long serialVersionUID = -47951391694982856L;
/**
* 文档编号
*/
private Integer id;
/**
* 项目id
*/
private String projectid;
/**
* 文档名称
*/
private String documentName;
/**
* 文档类型
*/
private String documentType;
/**
* 文档位置
*/
private String documentPath;
/**
* 文档属于项目的哪个阶段
*/
private String status;
/**
* 文件大小
*/
private long size;
}

32
huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouUserproject.java

@ -0,0 +1,32 @@
package org.jeecg.modules.huzhou.entity;
import lombok.Data;
import java.io.Serializable;
/**
* (HuzhouUserproject)实体类
*
* @author makejava
* @since 2024-02-01 09:57:56
*/
@Data
public class HuzhouUserproject implements Serializable {
private static final long serialVersionUID = 234624016576325502L;
/**
* 表id
*/
private Integer id;
/**
* 用户id
*/
private String userId;
/**
* 项目id
*/
private String projectId;
}

19
huzhou/src/main/java/org/jeecg/modules/huzhou/entity/WorkFlow.java

@ -0,0 +1,19 @@
package org.jeecg.modules.huzhou.entity;
import lombok.Data;
@Data
public class WorkFlow {
/**
* 流程实例id
*/
private String processInstanceId;
/**
* 业务表流程key值
*/
private String businessKey;
/**
* 当前节点名称
*/
private String userTask;
}

41
huzhou/src/main/java/org/jeecg/modules/huzhou/handler/MyMetaObjectHandler.java

@ -0,0 +1,41 @@
package org.jeecg.modules.huzhou.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.system.vo.LoginUser;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 插入时的填充策略
*
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
LoginUser currentUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
String userId = currentUser.getId();
this.setFieldValByName("createtime", new Date(), metaObject);
this.setFieldValByName("updatetime", new Date(), metaObject);
this.setFieldValByName("creator",userId,metaObject);
}
/**
* 更新时的填充策略
*
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
LoginUser currentUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
String userId = currentUser.getId();
this.setFieldValByName("updatetime", new Date(), metaObject);
this.setFieldValByName("updater",userId,metaObject);
}
}

9
huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouPlaninfoMapper.java

@ -0,0 +1,9 @@
package org.jeecg.modules.huzhou.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.jeecg.modules.huzhou.entity.HuzhouPlaninfo;
@Mapper
public interface HuzhouPlaninfoMapper extends BaseMapper<HuzhouPlaninfo> {
}

9
huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouPlanmoduleMapper.java

@ -0,0 +1,9 @@
package org.jeecg.modules.huzhou.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.jeecg.modules.huzhou.entity.HuzhouPlanmodule;
@Mapper
public interface HuzhouPlanmoduleMapper extends BaseMapper<HuzhouPlanmodule> {
}

9
huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouPlanmoduledetailMapper.java

@ -0,0 +1,9 @@
package org.jeecg.modules.huzhou.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.jeecg.modules.huzhou.entity.HuzhouPlanmoduledetail;
@Mapper
public interface HuzhouPlanmoduledetailMapper extends BaseMapper<HuzhouPlanmoduledetail> {
}

9
huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouProcessinfoMapper.java

@ -0,0 +1,9 @@
package org.jeecg.modules.huzhou.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.jeecg.modules.huzhou.entity.HuzhouProcessinfo;
@Mapper
public interface HuzhouProcessinfoMapper extends BaseMapper<HuzhouProcessinfo> {
}

9
huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouProjectinfoMapper.java

@ -0,0 +1,9 @@
package org.jeecg.modules.huzhou.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.jeecg.modules.huzhou.entity.HuzhouProjectinfo;
@Mapper
public interface HuzhouProjectinfoMapper extends BaseMapper<HuzhouProjectinfo> {
}

9
huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouUploadfileinfoMapper.java

@ -0,0 +1,9 @@
package org.jeecg.modules.huzhou.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.jeecg.modules.huzhou.entity.HuzhouUploadfileinfo;
@Mapper
public interface HuzhouUploadfileinfoMapper extends BaseMapper<HuzhouUploadfileinfo> {
}

9
huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouUserprojectMapper.java

@ -0,0 +1,9 @@
package org.jeecg.modules.huzhou.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.jeecg.modules.huzhou.entity.HuzhouUserproject;
@Mapper
public interface HuzhouUserprojectMapper extends BaseMapper<HuzhouUserproject> {
}

13
huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/WorkflowMapper.java

@ -0,0 +1,13 @@
package org.jeecg.modules.huzhou.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Map;
@Mapper
public interface WorkflowMapper extends BaseMapper<Object> {
Page<Map<String,String>> getCompleteTaskByAssignee(Page page, @Param("userid") String id);
}

14
huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/xml/WorkflowMapper.xml

@ -0,0 +1,14 @@
<?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="org.jeecg.modules.huzhou.mapper.WorkflowMapper">
<select id="getCompleteTaskByAssignee" resultType="Map">
SELECT DISTINCT
RES.PROC_DEF_ID_ processDefinitionId,RES.PROC_INST_ID_ processInstanceId
FROM
ACT_HI_TASKINST RES
INNER JOIN ACT_RE_PROCDEF D ON RES.PROC_DEF_ID_ = D.ID_
WHERE
RES.ASSIGNEE_ = #{userid}
AND RES.END_TIME_ IS NOT NULL
</select>
</mapper>

16
huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouPlaninfoService.java

@ -0,0 +1,16 @@
package org.jeecg.modules.huzhou.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.huzhou.entity.HuzhouPlaninfo;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
/**
* (HuzhouPlaninfo)表服务接口
*
* @author makejava
* @since 2024-01-30 16:01:09
*/
public interface IHuzhouPlaninfoService extends IService<HuzhouPlaninfo> {
}

16
huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouPlanmoduleService.java

@ -0,0 +1,16 @@
package org.jeecg.modules.huzhou.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.huzhou.entity.HuzhouPlanmodule;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
/**
* (HuzhouPlanmodule)表服务接口
*
* @author makejava
* @since 2024-01-30 16:02:30
*/
public interface IHuzhouPlanmoduleService extends IService<HuzhouPlanmodule> {
}

18
huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouPlanmoduledetailService.java

@ -0,0 +1,18 @@
package org.jeecg.modules.huzhou.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.huzhou.entity.HuzhouPlanmoduledetail;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
/**
* (HuzhouPlanmoduledetail)表服务接口
*
* @author makejava
* @since 2024-01-30 16:02:46
*/
public interface IHuzhouPlanmoduledetailService extends IService<HuzhouPlanmoduledetail> {
}

1
huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouProcessinfoService.java

@ -5,4 +5,5 @@ import org.jeecg.modules.huzhou.entity.HuzhouProcessinfo;
import org.springframework.stereotype.Service;
public interface IHuzhouProcessinfoService extends IService<HuzhouProcessinfo> {
void callBack(String processId,String flag);
}

16
huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouProjectinfoService.java

@ -0,0 +1,16 @@
package org.jeecg.modules.huzhou.service;
import org.jeecg.modules.huzhou.entity.HuzhouProjectinfo;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.stereotype.Service;
/**
* (HuzhouProjectinfo)表服务接口
*
* @author makejava
* @since 2024-01-23 09:33:31
*/
public interface IHuzhouProjectinfoService extends IService<HuzhouProjectinfo>{
}

17
huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouUploadfileinfoService.java

@ -0,0 +1,17 @@
package org.jeecg.modules.huzhou.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.huzhou.entity.HuzhouUploadfileinfo;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
/**
* (HuzhouUploadfileinfo)表服务接口
*
* @author makejava
* @since 2024-01-29 14:21:06
*/
public interface IHuzhouUploadfileinfoService extends IService<HuzhouUploadfileinfo> {
void modifyUploadFile(MultipartFile[] files, String projectid, String status) throws IOException;
}

17
huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouUserprojectService.java

@ -0,0 +1,17 @@
package org.jeecg.modules.huzhou.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.huzhou.entity.HuzhouUserproject;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
/**
* (HuzhouUserproject)表服务接口
*
* @author makejava
* @since 2024-02-01 09:59:12
*/
public interface IHuzhouUserprojectService extends IService<HuzhouUserproject> {
}

11
huzhou/src/main/java/org/jeecg/modules/huzhou/service/IWorkflowService.java

@ -0,0 +1,11 @@
package org.jeecg.modules.huzhou.service;
import org.jeecg.modules.huzhou.entity.WorkFlow;
import java.util.ArrayList;
public interface IWorkflowService {
WorkFlow createFlow(String processDefinitionKey, ArrayList<String> nextList);
void callBack(String processId,String flag);
WorkFlow approveProjectInfo(String taskId,String flag,String comment,String status);
}

20
huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouPlaninfoServiceImpl.java

@ -0,0 +1,20 @@
package org.jeecg.modules.huzhou.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.modules.huzhou.entity.HuzhouPlaninfo;
import org.jeecg.modules.huzhou.mapper.HuzhouPlaninfoMapper;
import org.jeecg.modules.huzhou.service.IHuzhouPlaninfoService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* (HuzhouPlaninfo)表服务实现类
*
* @author makejava
* @since 2024-01-30 16:01:09
*/
@Service
public class HuzhouPlaninfoServiceImpl extends ServiceImpl<HuzhouPlaninfoMapper,HuzhouPlaninfo> implements IHuzhouPlaninfoService {
}

19
huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouPlanmoduleServiceImpl.java

@ -0,0 +1,19 @@
package org.jeecg.modules.huzhou.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.modules.huzhou.entity.HuzhouPlanmodule;
import org.jeecg.modules.huzhou.mapper.HuzhouPlanmoduleMapper;
import org.jeecg.modules.huzhou.service.IHuzhouPlanmoduleService;
import org.springframework.stereotype.Service;
/**
* (HuzhouPlanmodule)表服务实现类
*
* @author makejava
* @since 2024-01-30 16:02:30
*/
@Service
public class HuzhouPlanmoduleServiceImpl extends ServiceImpl<HuzhouPlanmoduleMapper,HuzhouPlanmodule> implements IHuzhouPlanmoduleService {
}

21
huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouPlanmoduledetailServiceImpl.java

@ -0,0 +1,21 @@
package org.jeecg.modules.huzhou.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.modules.huzhou.entity.HuzhouPlanmoduledetail;
import org.jeecg.modules.huzhou.mapper.HuzhouPlanmoduledetailMapper;
import org.jeecg.modules.huzhou.service.IHuzhouPlanmoduledetailService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* (HuzhouPlanmoduledetail)表服务实现类
*
* @author makejava
* @since 2024-01-30 16:02:46
*/
@Service
public class HuzhouPlanmoduledetailServiceImpl extends ServiceImpl<HuzhouPlanmoduledetailMapper,HuzhouPlanmoduledetail> implements IHuzhouPlanmoduledetailService {
}

165
huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouProcessinfoServiceImpl.java

@ -0,0 +1,165 @@
package org.jeecg.modules.huzhou.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.FlowNode;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.impl.identity.Authentication;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.task.Task;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.huzhou.entity.HuzhouProcessinfo;
import org.jeecg.modules.huzhou.mapper.HuzhouProcessinfoMapper;
import org.jeecg.modules.huzhou.service.IHuzhouProcessinfoService;
import org.jeecg.modules.huzhou.service.IHuzhouProjectinfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@Service
public class HuzhouProcessinfoServiceImpl extends ServiceImpl<HuzhouProcessinfoMapper, HuzhouProcessinfo> implements IHuzhouProcessinfoService {
@Autowired
private TaskService taskService;
@Autowired
private HistoryService historyService;
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Override
public void callBack(String processId, String flag) {
LoginUser currentUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
String userId = currentUser.getId();
//通过流程id查找到当前的任务
List<Task> tasks= taskService.createTaskQuery()
.processInstanceId(processId).orderByTaskCreateTime().desc()
.list();
//tasks.get(0).setAssignee("1748190800971665409");
//如果为空或者小于等于0则证明没有可查看到的任务
if (tasks == null||tasks.size()<=0) {
System.out.println("当前没有任务或者任务已执行完了");
}
//查看所有走过的历史任务
List<HistoricTaskInstance> htlist = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processId)
.finished().orderByHistoricTaskInstanceEndTime().desc()
.list();
if (htlist == null||htlist.size()<=0) {
System.out.println("请先提交任务");
}
String myTaskId = null;
HistoricTaskInstance myTask = null;
//前一个任务节点,也就是提交人 拿到前一个任务
for (HistoricTaskInstance hti : htlist) {
//回退到zhangsan也就是任务A,业务中这里就是当前登录的用户名 TODO:从登录名拿
if (userId.equals(hti.getAssignee())) {
myTaskId = hti.getId();
// taskService.set
// tasks.get(0).setName("");
myTask = hti;
break;
}
}
if (myTask == null) {
System.out.println("这个任务不是你的任务");
}
//流程定义id
String processDefinitionId = myTask.getProcessDefinitionId();
//整个流程节点对象
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
//我的节点
String myActivityId = null;
//历史节点完成节点
List<HistoricActivityInstance> haiList =
historyService
.createHistoricActivityInstanceQuery()
.executionId(myTask.getExecutionId())
.finished()
.list();
//拿到我的节点 _3
for (HistoricActivityInstance hai : haiList) {
if (myTaskId.equals(hai.getTaskId())) {
myActivityId = hai.getActivityId();
break;
}
}
//我的流程节点
FlowNode myFlowNode =
(FlowNode) bpmnModel.getMainProcess().getFlowElement(myActivityId);
//当前执行对象
Execution execution = runtimeService.createExecutionQuery()
.executionId(tasks.get(0).getExecutionId()).singleResult();
//当任务执行节点_4
String activityId = execution.getActivityId();
System.out.println(activityId);
//当前流程节点对象
FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess()
.getFlowElement(activityId);
// flowNode.getName() 节点名称
//记录原活动方向出方向
List<SequenceFlow> oriSequenceFlows = new ArrayList<SequenceFlow>();
oriSequenceFlows.addAll(flowNode.getOutgoingFlows());
//清理活动方向
flowNode.getOutgoingFlows().clear();
//建立新方向
List<SequenceFlow> newSequenceFlowList = new ArrayList<SequenceFlow>();
SequenceFlow newSequenceFlow = new SequenceFlow();
newSequenceFlow.setId("newSequenceFlowId");
newSequenceFlow.setSourceFlowElement(flowNode);
newSequenceFlow.setTargetFlowElement(myFlowNode);
newSequenceFlowList.add(newSequenceFlow);
flowNode.setOutgoingFlows(newSequenceFlowList);
//设置操作人记录 和备注信息
Authentication.setAuthenticatedUserId(userId);
taskService.claim(tasks.get(0).getId(),userId);
taskService.setVariableLocal(tasks.get(0).getId(),"approvalStatue",flag);
taskService.addComment(tasks.get(0).getId(), tasks.get(0).getProcessInstanceId(), "上一节点撤回");
String taskId= tasks.get(0).getId();
//完成任务
// if (tasks.size() > 1) {
// //会签撤回
// HashMap<String, Object> variables = new HashMap<>();
// variables.put("pass",true);
//// variables.put("param","y");
// taskService.complete(taskId,variables);
// //恢复原方向
// flowNode.setOutgoingFlows(oriSequenceFlows);
// ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(tasks.get(0).getProcessInstanceId()).singleResult();
// //更新数据库 从新设置state为未提交状态
// Apply apply = new Apply();
// apply.setCode(processInstance.getBusinessKey());
// apply.setState(0);
//
//
// return applyService.updateByCode(apply);
// }
//普通撤回
ArrayList<String> arrayList = new ArrayList<>();
HashMap<String, Object> hashMap = new HashMap<>();
//设置下一个节点处理人
//使用角色查询
arrayList.add(userId);
hashMap.put("users",arrayList);
taskService.complete(taskId,hashMap);
//恢复原方向
flowNode.setOutgoingFlows(oriSequenceFlows);
}
}

14
huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouProjectinfoServiceImpl.java

@ -0,0 +1,14 @@
package org.jeecg.modules.huzhou.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.modules.huzhou.entity.HuzhouProjectinfo;
import org.jeecg.modules.huzhou.mapper.HuzhouProjectinfoMapper;
import org.jeecg.modules.huzhou.service.IHuzhouProjectinfoService;
import org.springframework.stereotype.Service;
@Service
public class HuzhouProjectinfoServiceImpl extends ServiceImpl<HuzhouProjectinfoMapper, HuzhouProjectinfo>
implements IHuzhouProjectinfoService {
}

75
huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouUploadfileinfoServiceImpl.java

@ -0,0 +1,75 @@
package org.jeecg.modules.huzhou.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.constant.SymbolConstant;
import org.jeecg.common.util.CommonUtils;
import org.jeecg.modules.huzhou.entity.HuzhouUploadfileinfo;
import org.jeecg.modules.huzhou.mapper.HuzhouUploadfileinfoMapper;
import org.jeecg.modules.huzhou.service.IHuzhouUploadfileinfoService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
* (HuzhouUploadfileinfo)表服务实现类
*
* @author makejava
* @since 2024-01-29 14:21:06
*/
@Service
public class HuzhouUploadfileinfoServiceImpl extends ServiceImpl<HuzhouUploadfileinfoMapper,HuzhouUploadfileinfo> implements IHuzhouUploadfileinfoService {
@Value(value = "${jeecg.path.upload}")
private String uploadpath;
public void modifyUploadFile(MultipartFile[] files, String projectid, String status) throws IOException {
LambdaQueryWrapper<HuzhouUploadfileinfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(HuzhouUploadfileinfo::getProjectid,projectid);
queryWrapper.eq(HuzhouUploadfileinfo::getStatus,status);
List<HuzhouUploadfileinfo> list = this.list(queryWrapper);
list.forEach(item->{
File file = new File(item.getDocumentPath());
file.delete();
});
this.remove(queryWrapper);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
String currentDay = dateFormat.format(new Date());
File filePath = new File(uploadpath + File.separator + currentDay + File.separator);
//文件夹不存在则创建
if (!filePath.exists()) {
// 创建文件根目录
filePath.mkdirs();
}
for (MultipartFile item:files) {
String fileName =null;
String originalFilename = item.getOriginalFilename();
originalFilename = CommonUtils.getFileName(originalFilename);
if(originalFilename.indexOf(SymbolConstant.SPOT)!=-1){
fileName = originalFilename.substring(0, originalFilename.lastIndexOf(".")) + "_" + System.currentTimeMillis() + originalFilename.substring(originalFilename.lastIndexOf("."));
}else{
fileName = originalFilename+ "_" + System.currentTimeMillis();
}
String savePath = filePath.getPath() + File.separator + fileName;
File savefile = new File(savePath);
FileCopyUtils.copy(item.getBytes(), savefile);//保存文件
HuzhouUploadfileinfo huzhouUploadfileinfo = new HuzhouUploadfileinfo();
huzhouUploadfileinfo.setDocumentName(originalFilename);//未加工过的文件名称
huzhouUploadfileinfo.setDocumentType(item.getContentType());
huzhouUploadfileinfo.setDocumentPath(savePath);
huzhouUploadfileinfo.setStatus(status);
huzhouUploadfileinfo.setSize(item.getSize());
huzhouUploadfileinfo.setProjectid(projectid);
boolean save = this.save(huzhouUploadfileinfo);
}
}
}

23
huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouUserprojectServiceImpl.java

@ -0,0 +1,23 @@
package org.jeecg.modules.huzhou.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.modules.huzhou.entity.HuzhouUserproject;
import org.jeecg.modules.huzhou.mapper.HuzhouUserprojectMapper;
import org.jeecg.modules.huzhou.service.IHuzhouUserprojectService;
import org.springframework.stereotype.Service;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import javax.annotation.Resource;
/**
* (HuzhouUserproject)表服务实现类
*
* @author makejava
* @since 2024-02-01 09:59:12
*/
@Service("huzhouUserprojectService")
public class HuzhouUserprojectServiceImpl extends ServiceImpl<HuzhouUserprojectMapper,HuzhouUserproject> implements IHuzhouUserprojectService {
}

327
huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/WorkflowServiceImpl.java

@ -0,0 +1,327 @@
package org.jeecg.modules.huzhou.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.activiti.bpmn.model.*;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.impl.identity.Authentication;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.huzhou.entity.HuzhouProcessinfo;
import org.jeecg.modules.huzhou.entity.HuzhouProjectinfo;
import org.jeecg.modules.huzhou.entity.WorkFlow;
import org.jeecg.modules.huzhou.service.IWorkflowService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import java.text.SimpleDateFormat;
import java.util.*;
@Service
public class WorkflowServiceImpl implements IWorkflowService {
@Autowired
private TaskService taskService;
@Autowired
private HistoryService historyService;
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
public WorkFlow createFlow(String processDefinitionKey,ArrayList<String> nextList){
LoginUser currentUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
String userId = currentUser.getId();
//流程的创建
// 流程定义KEY(流程名字)
// 业务表KEY(用于把业务数据与Activiti7流程数据相关联)
String businessKey = UUID.randomUUID().toString().replace("-","");
// 参数
Map<String, Object> variables = new HashMap<>();
//设置流程发起人参数
variables.put("start",userId);
ProcessInstance processInstance = this.runtimeService
.startProcessInstanceByKey(processDefinitionKey, businessKey, variables);
String processInstanceId = processInstance.getProcessInstanceId();//流程实例id要存下来
System.out.println("流程实例ID:" + processInstanceId);
//发起人处理流程
Task task = taskService.createTaskQuery()
.processInstanceId(processInstanceId)
.orderByTaskCreateTime()
.desc()
.list()
.get(0);
String taskId = task.getId();
variables.clear();
Authentication.setAuthenticatedUserId(userId);//添加审批人
taskService.setVariableLocal(taskId,"approvalStatue","1");//添加审批状态
String comment = "同意";
taskService.addComment(taskId,processInstanceId,comment);//添加审批意见
ArrayList<String> arrayList = new ArrayList<>();
//设置下一个节点处理人
//使用角色查询
//下一个节点处理人 可以配置(测试默认这个)
variables.put("users",nextList);
taskService.complete(taskId, variables);
WorkFlow workFlow = new WorkFlow();
workFlow.setBusinessKey(businessKey);
workFlow.setProcessInstanceId(processInstanceId);
return workFlow;
}
public WorkFlow approveProjectInfo(String taskId,String flag,String comment,String status){
LoginUser currentUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
String userId = currentUser.getId();
// 获取当前任务
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
String processInstanceId = task.getProcessInstanceId();
//获取当前模型
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
// 获取当前节点
FlowElement flowElement = bpmnModel.getFlowElement(task.getTaskDefinitionKey());
UserTask userTask = (UserTask) flowElement;
WorkFlow workFlow = new WorkFlow();
workFlow.setUserTask(userTask.getName());
HashMap<String, Object> hashMap = new HashMap<>();
if("3".equals(flag)){
taskService.setVariableLocal(taskId,"approvalStatue",flag);
taskService.addComment(taskId,processInstanceId,comment);//添加审批意见
runtimeService.deleteProcessInstance(processInstanceId,"发起人删除");
return workFlow;
}else if("2".equals(flag)){
callBack(processInstanceId,flag);
return workFlow;
}
if("1".equals(status)){
if(!"管理单位审批".equals(userTask.getName())){
//搞到当前userTask的出处
List<SequenceFlow> outgoingFlows = userTask.getOutgoingFlows();
//直接获得目标元素
FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement();
//转换一下类型
UserTask nextUserTask = (UserTask) targetFlowElement;
String nextUserTaskName = nextUserTask.getName();
if("监管单位审批".equals(nextUserTaskName)){
ArrayList<String> arrayList = new ArrayList<>();
//设置下一个节点处理人
//使用角色查询
arrayList.add("1752895307869614081");
arrayList.add("1752895591849160705");
hashMap.put("users",arrayList);
}else if("管理单位审批".equals(nextUserTaskName)){
ArrayList<String> arrayList = new ArrayList<>();
//设置下一个节点处理人
//使用角色查询
arrayList.add("1752893978598207490");
hashMap.put("users",arrayList);
//TODO 流程审批通过,需要改变项目状态
}else {
if(!"管理单位审批".equals(userTask.getName())){
throw new RuntimeException("找不到下一个节点");
}
}
}
}else if("2".equals(status)){
if(!"流程审批二".equals(userTask.getName())){
//搞到当前userTask的出处
List<SequenceFlow> outgoingFlows = userTask.getOutgoingFlows();
//直接获得目标元素
FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement();
//转换一下类型
UserTask nextUserTask = (UserTask) targetFlowElement;
String nextUserTaskName = nextUserTask.getName();
if("流程审批一".equals(nextUserTaskName)){
ArrayList<String> arrayList = new ArrayList<>();
//设置下一个节点处理人
//使用角色查询
arrayList.add("1752895307869614081");
arrayList.add("1752895591849160705");
hashMap.put("users",arrayList);
}else if("流程审批二".equals(nextUserTaskName)){
ArrayList<String> arrayList = new ArrayList<>();
//设置下一个节点处理人
//使用角色查询
arrayList.add("1752893978598207490");
hashMap.put("users",arrayList);
//TODO 流程审批通过,需要改变项目状态
}else {
if(!"流程审批二".equals(userTask.getName())){
throw new RuntimeException("找不到下一个节点");
}
}
}
}else if("3".equals(status)){
if(!"计划审批二".equals(userTask.getName())){
//搞到当前userTask的出处
List<SequenceFlow> outgoingFlows = userTask.getOutgoingFlows();
//直接获得目标元素
FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement();
//转换一下类型
UserTask nextUserTask = (UserTask) targetFlowElement;
String nextUserTaskName = nextUserTask.getName();
if("计划审批一".equals(nextUserTaskName)){
ArrayList<String> arrayList = new ArrayList<>();
//设置下一个节点处理人
//使用角色查询
arrayList.add("1752895307869614081");
arrayList.add("1752895591849160705");
hashMap.put("users",arrayList);
}else if("计划审批二".equals(nextUserTaskName)){
ArrayList<String> arrayList = new ArrayList<>();
//设置下一个节点处理人
//使用角色查询
arrayList.add("1752893978598207490");
hashMap.put("users",arrayList);
//TODO 流程审批通过,需要改变项目状态
}else {
if(!"计划审批二".equals(userTask.getName())){
throw new RuntimeException("找不到下一个节点");
}
}
}
}
taskService.claim(task.getId(), userId);//拾取任务
Authentication.setAuthenticatedUserId(userId);//添加审批人
taskService.setVariableLocal(taskId,"approvalStatue",flag);
taskService.addComment(taskId,processInstanceId,comment);//添加审批意见
hashMap.put("type",flag);
taskService.complete(taskId, hashMap);
//Comment comment1 = taskService.getComment(taskId);
return workFlow;
}
public void callBack(String processId,String flag) {
LoginUser currentUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
String userId = currentUser.getId();
//通过流程id查找到当前的任务
List<Task> tasks= taskService.createTaskQuery()
.processInstanceId(processId).orderByTaskCreateTime().desc()
.list();
//tasks.get(0).setAssignee("1748190800971665409");
//如果为空或者小于等于0则证明没有可查看到的任务
if (tasks == null||tasks.size()<=0) {
System.out.println("当前没有任务或者任务已执行完了");
}
//查看所有走过的历史任务
List<HistoricTaskInstance> htlist = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processId)
.finished().orderByHistoricTaskInstanceEndTime().desc()
.list();
if (htlist == null||htlist.size()<=0) {
System.out.println("请先提交任务");
}
String myTaskId = null;
HistoricTaskInstance myTask = null;
//前一个任务节点,也就是提交人 拿到前一个任务
for (HistoricTaskInstance hti : htlist) {
//回退到zhangsan也就是任务A,业务中这里就是当前登录的用户名 TODO:从登录名拿
if (userId.equals(hti.getAssignee())) {
myTaskId = hti.getId();
// taskService.set
// tasks.get(0).setName("");
myTask = hti;
break;
}
}
if (myTask == null) {
System.out.println("这个任务不是你的任务");
}
//流程定义id
String processDefinitionId = myTask.getProcessDefinitionId();
//整个流程节点对象
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
//我的节点
String myActivityId = null;
//历史节点完成节点
List<HistoricActivityInstance> haiList =
historyService
.createHistoricActivityInstanceQuery()
.executionId(myTask.getExecutionId())
.finished()
.list();
//拿到我的节点 _3
for (HistoricActivityInstance hai : haiList) {
if (myTaskId.equals(hai.getTaskId())) {
myActivityId = hai.getActivityId();
break;
}
}
//我的流程节点
FlowNode myFlowNode =
(FlowNode) bpmnModel.getMainProcess().getFlowElement(myActivityId);
//当前执行对象
Execution execution = runtimeService.createExecutionQuery()
.executionId(tasks.get(0).getExecutionId()).singleResult();
//当任务执行节点_4
String activityId = execution.getActivityId();
System.out.println(activityId);
//当前流程节点对象
FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess()
.getFlowElement(activityId);
// flowNode.getName() 节点名称
//记录原活动方向出方向
List<SequenceFlow> oriSequenceFlows = new ArrayList<SequenceFlow>();
oriSequenceFlows.addAll(flowNode.getOutgoingFlows());
//清理活动方向
flowNode.getOutgoingFlows().clear();
//建立新方向
List<SequenceFlow> newSequenceFlowList = new ArrayList<SequenceFlow>();
SequenceFlow newSequenceFlow = new SequenceFlow();
newSequenceFlow.setId("newSequenceFlowId");
newSequenceFlow.setSourceFlowElement(flowNode);
newSequenceFlow.setTargetFlowElement(myFlowNode);
newSequenceFlowList.add(newSequenceFlow);
flowNode.setOutgoingFlows(newSequenceFlowList);
//设置操作人记录 和备注信息
Authentication.setAuthenticatedUserId(userId);
taskService.claim(tasks.get(0).getId(),userId);
taskService.setVariableLocal(tasks.get(0).getId(),"approvalStatue",flag);
taskService.addComment(tasks.get(0).getId(), tasks.get(0).getProcessInstanceId(), "上一节点撤回");
String taskId= tasks.get(0).getId();
//完成任务
// if (tasks.size() > 1) {
// //会签撤回
// HashMap<String, Object> variables = new HashMap<>();
// variables.put("pass",true);
//// variables.put("param","y");
// taskService.complete(taskId,variables);
// //恢复原方向
// flowNode.setOutgoingFlows(oriSequenceFlows);
// ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(tasks.get(0).getProcessInstanceId()).singleResult();
// //更新数据库 从新设置state为未提交状态
// Apply apply = new Apply();
// apply.setCode(processInstance.getBusinessKey());
// apply.setState(0);
//
//
// return applyService.updateByCode(apply);
// }
//普通撤回
ArrayList<String> arrayList = new ArrayList<>();
HashMap<String, Object> hashMap = new HashMap<>();
//设置下一个节点处理人
//使用角色查询
arrayList.add(userId);
hashMap.put("users",arrayList);
taskService.complete(taskId,hashMap);
//恢复原方向
flowNode.setOutgoingFlows(oriSequenceFlows);
}
}

17
huzhou/src/main/java/org/jeecg/modules/huzhou/vo/ProjectApproveOV.java

@ -0,0 +1,17 @@
package org.jeecg.modules.huzhou.vo;
import lombok.Data;
import org.jeecg.modules.huzhou.entity.HuzhouProjectinfo;
import org.springframework.web.multipart.MultipartFile;
@Data
public class ProjectApproveOV {
private String taskId;
private String flag;
private String comment;
private String projectid;
private String status;
private String isEdit;
private HuzhouProjectinfo projectInfo;
private MultipartFile[] file;
}

4
huzhou/src/main/resources/mapper/HuzhouUserprojectMapper.xml

@ -0,0 +1,4 @@
<?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="org.jeecg.modules.huzhou.mapper.HuzhouUserprojectMapper">
</mapper>

14
jeecg-module-system/jeecg-system-biz/pom.xml

@ -39,11 +39,15 @@
<artifactId>drag-free</artifactId>
<version>1.0.2</version>
</dependency>
<!-- 积木报表 mongo redis 支持包
<dependency>
<groupId>org.jeecgframework.jimureport</groupId>
<artifactId>jimureport-nosql-starter</artifactId>
</dependency>-->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
</dependency>
<!-- 积木报表 mongo redis 支持包
<dependency>
<groupId>org.jeecgframework.jimureport</groupId>
<artifactId>jimureport-nosql-starter</artifactId>
</dependency>-->
</dependencies>
</project>

3
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java

@ -14,6 +14,7 @@ import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.model.SysUserSysDepartModel;
import org.jeecg.modules.system.vo.lowapp.DepartAndUserInfo;
import org.jeecg.modules.system.vo.lowapp.UpdateDepartInfo;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.servlet.ModelAndView;
@ -31,7 +32,7 @@ import java.util.Set;
* @Author scott
* @since 2018-12-20
*/
public interface ISysUserService extends IService<SysUser> {
public interface ISysUserService extends IService<SysUser>, UserDetailsService {
/**
* 查询用户数据列表

17
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java

@ -55,6 +55,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.Lazy;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
@ -1798,6 +1802,19 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
systemSendMsgHandle.sendMessage(messageDTO);
//update-end---author:wangshuai ---date:20230710 for:【QQYUN-5731】导入用户时,没有提醒------------
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
SysUser sysUser = userMapper.selectById(username);
if(sysUser!=null){
Collection<GrantedAuthority> authorities = new ArrayList<>();
User user = new User(sysUser.getUsername(), sysUser.getPassword(), authorities);
return user;
}else {
return null;
}
}
//======================================= end 用户与部门 用户列表导入 =========================================
}

19
jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml

@ -7,7 +7,7 @@ server:
include-stacktrace: ALWAYS
include-message: ALWAYS
servlet:
context-path: /jeecg-boot #可以修改
context-path: /guoyan #可以修改/jeecg-boot
compression:
enabled: true
min-response-size: 1024
@ -174,7 +174,7 @@ mybatis-plus:
table-underline: true
configuration:
# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
#log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 返回类型为Map,显示null对应的字段
call-setters-on-nulls: true
#jeecg专用配置
@ -199,7 +199,8 @@ jeecg:
app: http://localhost:8051
path:
#文件上传根目录 设置
upload: /opt/upFiles
# upload: /opt/upFiles
upload: D:/ce
#webapp文件路径
webapp: /opt/webapp
shiro:
@ -245,14 +246,14 @@ jeecg:
logPath: logs/jeecg/job/jobhandler/
logRetentionDays: 30
#分布式锁配置
redisson:
address: 127.0.0.1:6379
password:
type: STANDALONE
enabled: true
# redisson:
# address: 127.0.0.1:6379
# password:
# type: STANDALONE
# enabled: true
#cas单点登录
cas:
prefixUrl: http://cas.example.org:8443/cas
prefixUrl: aaaaa #http://cas.example.org:8443/cas
#Mybatis输出sql日志
logging:
level:

166
jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml

@ -1,5 +1,5 @@
server:
port: 8080
port: 9001
tomcat:
max-swallow-size: -1
error:
@ -7,7 +7,7 @@ server:
include-stacktrace: ALWAYS
include-message: ALWAYS
servlet:
context-path: /jeecg-boot
context-path: /guoyan
compression:
enabled: true
min-response-size: 1024
@ -24,17 +24,29 @@ spring:
multipart:
max-file-size: 10MB
max-request-size: 10MB
mail:
host: smtp.163.com
username: ??
password: ??
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
activiti:
#1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常
#2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建
#3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)
#4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)
database-schema-update: true
# 检测历史信息表是否存在,activiti7默认不生成历史信息表,开启历史表
db-history-used: true
# 历史记录存储等级
history-level: full
check-process-definitions: true
process-definition-location-prefix: classpath:/processes/
# mail:
# host: smtp.163.com
# username: ??
# password: ??
# properties:
# mail:
# smtp:
# auth: true
# starttls:
# enable: true
# required: true
## quartz定时任务,采用数据库方式
quartz:
job-store-type: jdbc
@ -133,9 +145,9 @@ spring:
slow-sql-millis: 5000
datasource:
master:
url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
url: jdbc:mysql://218.246.6.173:3306/guoyan_huozhou?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: root
password: '1q2w#E$R1qaz@WSX'
driver-class-name: com.mysql.cj.jdbc.Driver
# 多数据源配置
#multi-datasource1:
@ -148,7 +160,7 @@ spring:
database: 0
host: 127.0.0.1
port: 6379
password: ''
password: 1q2wE$R1qaz@WSX
#mybatis plus 设置
mybatis-plus:
mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml
@ -180,48 +192,48 @@ jeecg:
#签名拦截接口
signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys
# local\minio\alioss
uploadType: alioss
uploadType: local
# 前端访问地址
domainUrl:
pc: http://localhost:3100
app: http://localhost:8051
path:
#文件上传根目录 设置
upload: /opt/jeecg-boot/upload
upload: /opt/guoyan/upload
#webapp文件路径
webapp: /opt/jeecg-boot/webapp
webapp: /opt/guoyan/webapp
shiro:
excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/jmreport/bigscreen2/**,/api/getUserInfo
#阿里云oss存储和大鱼短信秘钥配置
oss:
accessKey: ??
secretKey: ??
endpoint: oss-cn-beijing.aliyuncs.com
bucketName: jeecgdev
staticDomain: https://static.jeecg.com
# ElasticSearch 设置
elasticsearch:
cluster-name: jeecg-ES
cluster-nodes: 127.0.0.1:9200
check-enabled: true
# 在线预览文件服务器地址配置
file-view-domain: http://fileview.jeecg.com
# minio文件上传
minio:
minio_url: http://minio.jeecg.com
minio_name: ??
minio_pass: ??
bucketName: otatest
# oss:
# accessKey: ??
# secretKey: ??
# endpoint: oss-cn-beijing.aliyuncs.com
# bucketName: jeecgdev
# staticDomain: https://static.jeecg.com
# # ElasticSearch 设置
# elasticsearch:
# cluster-name: jeecg-ES
# cluster-nodes: 127.0.0.1:9200
# check-enabled: true
# # 在线预览文件服务器地址配置
file-view-domain: aaaa #http://fileview.jeecg.com
# # minio文件上传
# minio:
# minio_url: http://minio.jeecg.com
# minio_name: ??
# minio_pass: ??
# bucketName: otatest
#大屏报表参数设置
jmreport:
#多租户模式,默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)
saasMode: created
# 平台上线安全配置(v1.6.2+ 新增)
firewall:
# 数据源安全 (开启后,不允许使用平台数据源、SQL解析加签并且不允许查询数据库)
dataSourceSafe: true
# 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
lowCodeMode: prod
# jmreport:
# #多租户模式,默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)
# saasMode: created
# # 平台上线安全配置(v1.6.2+ 新增)
# firewall:
# # 数据源安全 (开启后,不允许使用平台数据源、SQL解析加签并且不允许查询数据库)
# dataSourceSafe: true
# # 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可以放开限制)
# lowCodeMode: prod
#xxl-job配置
xxljob:
enabled: false
@ -234,14 +246,14 @@ jeecg:
logPath: logs/jeecg/job/jobhandler/
logRetentionDays: 30
#分布式锁配置
redisson:
address: 127.0.0.1:6379
password:
type: STANDALONE
enabled: true
# redisson:
# address: 127.0.0.1:6379
# password:
# type: STANDALONE
# enabled: true
#cas单点登录
cas:
prefixUrl: http://cas.example.org:8443/cas
prefixUrl: aaaaaaa #http://cas.example.org:8443/cas
#Mybatis输出sql日志
logging:
level:
@ -257,27 +269,27 @@ knife4j:
username: jeecg
password: jeecg1314
#第三方登录
justauth:
enabled: true
type:
GITHUB:
client-id: ??
client-secret: ??
redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/github/callback
WECHAT_ENTERPRISE:
client-id: ??
client-secret: ??
redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_enterprise/callback
agent-id: ??
DINGTALK:
client-id: ??
client-secret: ??
redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/dingtalk/callback
WECHAT_OPEN:
client-id: ??
client-secret: ??
redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_open/callback
cache:
type: default
prefix: 'demo::'
timeout: 1h
#justauth:
# enabled: true
# type:
# GITHUB:
# client-id: ??
# client-secret: ??
# redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/github/callback
# WECHAT_ENTERPRISE:
# client-id: ??
# client-secret: ??
# redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_enterprise/callback
# agent-id: ??
# DINGTALK:
# client-id: ??
# client-secret: ??
# redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/dingtalk/callback
# WECHAT_OPEN:
# client-id: ??
# client-secret: ??
# redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_open/callback
# cache:
# type: default
# prefix: 'demo::'
# timeout: 1h

63
jeecg-module-system/jeecg-system-start/src/main/resources/process/initiatesProjects.bpmn20.xml

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
<process id="initiatesProjects" name="initiatesProjects" isExecutable="true">
<startEvent id="sid-2ddbdfc7-a61e-4340-856e-77d29149d6ec"/>
<userTask id="sid-8467fd8a-101e-4188-97f9-62eb1d3b32e3" name="发起人" activiti:assignee="${start}"/>
<userTask id="sid-7a4a2aef-83ab-4d33-8cb2-13bb0f622632" name="监管单位" activiti:candidateUsers="${users}"/>
<userTask id="sid-e3e4feb9-3ec8-4784-bd49-5ad75cb5aba9" name="管理单位" activiti:candidateUsers="${users}"/>
<endEvent id="sid-4b932b6d-d74a-4bf8-8459-f6266b952e57"/>
<sequenceFlow id="sid-bdfa8439-2d39-4a89-abc9-8bba8a79ff28" sourceRef="sid-2ddbdfc7-a61e-4340-856e-77d29149d6ec" targetRef="sid-8467fd8a-101e-4188-97f9-62eb1d3b32e3"/>
<sequenceFlow id="sid-775db3c7-0612-467d-9947-4201476eea11" sourceRef="sid-8467fd8a-101e-4188-97f9-62eb1d3b32e3" targetRef="sid-7a4a2aef-83ab-4d33-8cb2-13bb0f622632">
<conditionExpression/>
</sequenceFlow>
<sequenceFlow id="sid-f76597c2-2a1d-44b2-8179-40d9153417a4" sourceRef="sid-7a4a2aef-83ab-4d33-8cb2-13bb0f622632" targetRef="sid-e3e4feb9-3ec8-4784-bd49-5ad75cb5aba9">
<conditionExpression>${type==1}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-88fe0f0e-26e9-4958-987f-8101c24f53d5" sourceRef="sid-e3e4feb9-3ec8-4784-bd49-5ad75cb5aba9" targetRef="sid-8467fd8a-101e-4188-97f9-62eb1d3b32e3">
<conditionExpression>${type==0}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-62fe5c25-6c97-4bbb-b460-c4df2e7989a8" sourceRef="sid-7a4a2aef-83ab-4d33-8cb2-13bb0f622632" targetRef="sid-8467fd8a-101e-4188-97f9-62eb1d3b32e3">
<conditionExpression>${type==0}</conditionExpression>
</sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_initiatesProjects">
<bpmndi:BPMNPlane bpmnElement="initiatesProjects" id="BPMNPlane_initiatesProjects">
<bpmndi:BPMNShape id="shape-d0ea9c04-b3f5-439f-b11e-7736c9309205" bpmnElement="sid-2ddbdfc7-a61e-4340-856e-77d29149d6ec">
<omgdc:Bounds x="-370.0" y="-10.000001" width="30.0" height="30.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-a2fb3972-b9fa-4310-9dd1-026581bfb6e4" bpmnElement="sid-8467fd8a-101e-4188-97f9-62eb1d3b32e3">
<omgdc:Bounds x="-315.0" y="-30.0" width="100.0" height="80.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-d6bf1909-3f2e-4c04-8aa6-afb060583c0a" bpmnElement="sid-7a4a2aef-83ab-4d33-8cb2-13bb0f622632">
<omgdc:Bounds x="-175.0" y="-30.0" width="100.0" height="80.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-9c402e1b-2140-4126-a18d-68d9efcec310" bpmnElement="sid-e3e4feb9-3ec8-4784-bd49-5ad75cb5aba9">
<omgdc:Bounds x="-25.0" y="-25.0" width="100.0" height="80.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-cf988b9e-6332-40d2-ab0f-c6ecd66b3e08" bpmnElement="sid-4b932b6d-d74a-4bf8-8459-f6266b952e57">
<omgdc:Bounds x="140.0" y="0.0" width="30.0" height="30.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="edge-68116070-2442-4b7e-aa7b-33a297f550d9" bpmnElement="sid-bdfa8439-2d39-4a89-abc9-8bba8a79ff28">
<omgdi:waypoint x="-355.0" y="20.0"/>
<omgdi:waypoint x="-265.0" y="50.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-1676080c-e02c-48c2-827c-ec5665461b16" bpmnElement="sid-775db3c7-0612-467d-9947-4201476eea11">
<omgdi:waypoint x="-215.0" y="10.0"/>
<omgdi:waypoint x="-175.0" y="10.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-371d2a9b-23a7-4d2f-b694-060fea5692b3" bpmnElement="sid-f76597c2-2a1d-44b2-8179-40d9153417a4">
<omgdi:waypoint x="-75.0" y="10.0"/>
<omgdi:waypoint x="-25.0" y="15.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-359416ea-932b-4ddd-a6a7-b891c3c79003" bpmnElement="sid-88fe0f0e-26e9-4958-987f-8101c24f53d5">
<omgdi:waypoint x="-25.0" y="-5.0"/>
<omgdi:waypoint x="-120.0" y="-117.5"/>
<omgdi:waypoint x="-215.0" y="-10.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-62977425-9326-4f2b-9c6d-e40570db0b2d" bpmnElement="sid-62fe5c25-6c97-4bbb-b460-c4df2e7989a8">
<omgdi:waypoint x="-175.0" y="30.0"/>
<omgdi:waypoint x="-215.0" y="30.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

BIN
jeecg-module-system/jeecg-system-start/src/main/resources/process/initiatesProjects.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

68
jeecg-module-system/jeecg-system-start/src/main/resources/process/项目计划审批流程.bpmn20.xml

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
<process id="项目计划审批流程" name="项目计划审批流程" isExecutable="true">
<startEvent id="sid-e73b7a02-bc88-4b11-89bb-2c150d70e397"/>
<userTask id="sid-62be9d89-e8e5-4fda-9c33-3b4059ad2018" name="发起人" activiti:assignee="${start}"/>
<userTask id="sid-94c7064c-f1fc-4228-b126-8e45deb9ae5f" name="计划审批一" activiti:candidateUsers="${users}"/>
<userTask id="sid-65dfce6b-0e09-4f6a-afe2-f88ec495ebec" name="计划审批二" activiti:candidateUsers="${users}"/>
<sequenceFlow id="sid-431a0560-2ea1-487a-ac0d-e67d81e960bd" sourceRef="sid-e73b7a02-bc88-4b11-89bb-2c150d70e397" targetRef="sid-62be9d89-e8e5-4fda-9c33-3b4059ad2018"/>
<sequenceFlow id="sid-37de44c2-a93e-4135-8351-ae28197e4f1c" sourceRef="sid-94c7064c-f1fc-4228-b126-8e45deb9ae5f" targetRef="sid-65dfce6b-0e09-4f6a-afe2-f88ec495ebec">
<conditionExpression>${type==1}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-7daf1858-4982-412a-a291-135112779914" sourceRef="sid-94c7064c-f1fc-4228-b126-8e45deb9ae5f" targetRef="sid-62be9d89-e8e5-4fda-9c33-3b4059ad2018">
<conditionExpression>${type==0}</conditionExpression>
</sequenceFlow>
<endEvent id="sid-ed1def5c-cd64-4f86-8e63-6f5b4e656331"/>
<sequenceFlow id="sid-43a62ce3-012a-4cc2-8adb-cf8c60531962" sourceRef="sid-65dfce6b-0e09-4f6a-afe2-f88ec495ebec" targetRef="sid-ed1def5c-cd64-4f86-8e63-6f5b4e656331">
<conditionExpression>${type==1}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-b1c67a3c-9127-4bb9-8b5d-4f411bbc5d89" sourceRef="sid-65dfce6b-0e09-4f6a-afe2-f88ec495ebec" targetRef="sid-62be9d89-e8e5-4fda-9c33-3b4059ad2018">
<conditionExpression>${type==0}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-4fb52b4e-08cb-4753-a460-665d82a9de7b" sourceRef="sid-62be9d89-e8e5-4fda-9c33-3b4059ad2018" targetRef="sid-94c7064c-f1fc-4228-b126-8e45deb9ae5f"/>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_项目计划审批流程">
<bpmndi:BPMNPlane bpmnElement="项目计划审批流程" id="BPMNPlane_项目计划审批流程">
<bpmndi:BPMNShape id="shape-500338ae-e6f4-4621-adcd-303e949c6ca5" bpmnElement="sid-e73b7a02-bc88-4b11-89bb-2c150d70e397">
<omgdc:Bounds x="-360.0" y="5.0" width="30.0" height="30.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-d33dbd6c-271d-4c31-868c-2aae359a6602" bpmnElement="sid-62be9d89-e8e5-4fda-9c33-3b4059ad2018">
<omgdc:Bounds x="-305.0" y="-10.0" width="100.0" height="80.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-51d6a9eb-5b52-405e-99a0-5f9d7a6e4b29" bpmnElement="sid-94c7064c-f1fc-4228-b126-8e45deb9ae5f">
<omgdc:Bounds x="-170.0" y="-10.0" width="100.0" height="80.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-527c4526-deab-4042-bcd4-292fbe63250e" bpmnElement="sid-65dfce6b-0e09-4f6a-afe2-f88ec495ebec">
<omgdc:Bounds x="-45.0" y="-9.999999" width="100.0" height="80.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="edge-1e5ff341-bc16-4fa8-ad29-ab444468a92e" bpmnElement="sid-431a0560-2ea1-487a-ac0d-e67d81e960bd">
<omgdi:waypoint x="-330.0" y="12.5"/>
<omgdi:waypoint x="-305.0" y="10.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-f5f7ce87-461f-441e-913e-44b82705ea2b" bpmnElement="sid-37de44c2-a93e-4135-8351-ae28197e4f1c">
<omgdi:waypoint x="-70.0" y="30.0"/>
<omgdi:waypoint x="-45.0" y="30.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-b80849be-364d-49df-a033-cd69ddf73b91" bpmnElement="sid-7daf1858-4982-412a-a291-135112779914">
<omgdi:waypoint x="-170.0" y="10.0"/>
<omgdi:waypoint x="-205.0" y="10.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="shape-7d60ba40-b4c7-4512-933c-0974c83cbb15" bpmnElement="sid-ed1def5c-cd64-4f86-8e63-6f5b4e656331">
<omgdc:Bounds x="95.0" y="15.0" width="30.0" height="30.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="edge-09827345-6cc4-41c0-b2b1-c0957162175b" bpmnElement="sid-43a62ce3-012a-4cc2-8adb-cf8c60531962">
<omgdi:waypoint x="55.0" y="30.0"/>
<omgdi:waypoint x="95.0" y="30.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-4d317693-c8ea-4979-bcd3-ebbbe14ebb46" bpmnElement="sid-b1c67a3c-9127-4bb9-8b5d-4f411bbc5d89">
<omgdi:waypoint x="5.0" y="-10.0"/>
<omgdi:waypoint x="-120.0" y="-130.0"/>
<omgdi:waypoint x="-255.0" y="-10.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-eb899f1c-24e5-4d19-85be-3c6fc4997e21" bpmnElement="sid-4fb52b4e-08cb-4753-a460-665d82a9de7b">
<omgdi:waypoint x="-205.0" y="30.0"/>
<omgdi:waypoint x="-170.0" y="30.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

BIN
jeecg-module-system/jeecg-system-start/src/main/resources/process/项目计划审批流程.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

68
jeecg-module-system/jeecg-system-start/src/main/resources/process/项目资料上传流程.bpmn20.xml

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
<process id="项目资料上传流程" name="项目资料上传流程" isExecutable="true">
<startEvent id="sid-6f817ee4-e85c-43d5-bb1b-2d6843dc2197"/>
<userTask id="sid-a7256209-fa03-49f4-8fb3-132b60d1df8f" name="发起人" activiti:assignee="${start}"/>
<userTask id="sid-5aa6679d-8bd3-4bf2-9d05-4d871b33682e" name="流程审批一" activiti:candidateUsers="${users}"/>
<userTask id="sid-5c826bb0-3eff-4eb6-b98b-adf6318b5bd3" name="流程审批二" activiti:candidateUsers="${users}"/>
<endEvent id="sid-ab19179c-c70b-4a7e-96e2-7b593b947c50"/>
<sequenceFlow id="sid-1710b5f8-c0db-495a-a02c-cab58fce264b" sourceRef="sid-6f817ee4-e85c-43d5-bb1b-2d6843dc2197" targetRef="sid-a7256209-fa03-49f4-8fb3-132b60d1df8f"/>
<sequenceFlow id="sid-0f265dec-c03e-49f4-8e43-cd6d4f565bc3" sourceRef="sid-a7256209-fa03-49f4-8fb3-132b60d1df8f" targetRef="sid-5aa6679d-8bd3-4bf2-9d05-4d871b33682e">
<conditionExpression/>
</sequenceFlow>
<sequenceFlow id="sid-1659f764-5d0e-42d4-acb8-55008a420ea0" sourceRef="sid-5aa6679d-8bd3-4bf2-9d05-4d871b33682e" targetRef="sid-5c826bb0-3eff-4eb6-b98b-adf6318b5bd3">
<conditionExpression>${type==1}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-2c379972-6e99-4458-8138-034101a4ef24" sourceRef="sid-5c826bb0-3eff-4eb6-b98b-adf6318b5bd3" targetRef="sid-ab19179c-c70b-4a7e-96e2-7b593b947c50"/>
<sequenceFlow id="sid-73d2f9cf-c91f-4047-87be-3f9e7276a9bb" sourceRef="sid-5aa6679d-8bd3-4bf2-9d05-4d871b33682e" targetRef="sid-a7256209-fa03-49f4-8fb3-132b60d1df8f">
<conditionExpression>${type==0}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-a6e429ff-c9d9-4793-b4f2-877e352170bf" sourceRef="sid-5c826bb0-3eff-4eb6-b98b-adf6318b5bd3" targetRef="sid-a7256209-fa03-49f4-8fb3-132b60d1df8f">
<conditionExpression>${type==0}</conditionExpression>
</sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_项目资料上传流程">
<bpmndi:BPMNPlane bpmnElement="项目资料上传流程" id="BPMNPlane_项目资料上传流程">
<bpmndi:BPMNShape id="shape-df67e7d3-3794-48fc-9005-f761e2b7ce74" bpmnElement="sid-6f817ee4-e85c-43d5-bb1b-2d6843dc2197">
<omgdc:Bounds x="-275.0" y="-20.0" width="30.0" height="30.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-960fbb91-f11c-45ea-ac9d-7cc0ed75c721" bpmnElement="sid-a7256209-fa03-49f4-8fb3-132b60d1df8f">
<omgdc:Bounds x="-210.00002" y="-40.0" width="100.0" height="80.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-0cd38088-a1fb-4606-ace6-ebcf78a53821" bpmnElement="sid-5aa6679d-8bd3-4bf2-9d05-4d871b33682e">
<omgdc:Bounds x="-85.000015" y="-40.0" width="100.0" height="80.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-1388daba-4315-4c49-b8c6-ebfaa7cc92e0" bpmnElement="sid-5c826bb0-3eff-4eb6-b98b-adf6318b5bd3">
<omgdc:Bounds x="44.999985" y="-40.0" width="100.0" height="80.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="shape-4d8fce42-145e-4fbf-9f06-e8e1dc55ea58" bpmnElement="sid-ab19179c-c70b-4a7e-96e2-7b593b947c50">
<omgdc:Bounds x="189.99998" y="-15.0" width="30.0" height="30.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="edge-872ebcd1-c795-44e7-bb50-4431fa404285" bpmnElement="sid-1710b5f8-c0db-495a-a02c-cab58fce264b">
<omgdi:waypoint x="-245.0" y="2.5"/>
<omgdi:waypoint x="-210.00002" y="0.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-4ea5e51b-fa56-4343-a03c-ad748414787a" bpmnElement="sid-0f265dec-c03e-49f4-8e43-cd6d4f565bc3">
<omgdi:waypoint x="-110.000015" y="0.0"/>
<omgdi:waypoint x="-85.000015" y="0.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-4f0f6959-b074-47e5-9aad-7ca971d6cc00" bpmnElement="sid-1659f764-5d0e-42d4-acb8-55008a420ea0">
<omgdi:waypoint x="14.999985" y="0.0"/>
<omgdi:waypoint x="44.999985" y="0.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-46ebf852-c0e8-4067-b648-5e9fb3194b99" bpmnElement="sid-2c379972-6e99-4458-8138-034101a4ef24">
<omgdi:waypoint x="144.99998" y="0.0"/>
<omgdi:waypoint x="189.99998" y="0.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-b2931190-1527-458f-85c8-edc79ac98dc1" bpmnElement="sid-73d2f9cf-c91f-4047-87be-3f9e7276a9bb">
<omgdi:waypoint x="-85.000015" y="-20.0"/>
<omgdi:waypoint x="-110.000015" y="-20.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="edge-89c88fb7-0335-4368-a93e-5231753c1e4c" bpmnElement="sid-a6e429ff-c9d9-4793-b4f2-877e352170bf">
<omgdi:waypoint x="44.999985" y="-20.0"/>
<omgdi:waypoint x="-30.000015" y="-140.0"/>
<omgdi:waypoint x="-135.00002" y="-40.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>

BIN
jeecg-module-system/jeecg-system-start/src/main/resources/process/项目资料上传流程.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

251
jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/message/test/SendMessageTest.java

@ -2,20 +2,21 @@ package org.jeecg.modules.message.test;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.exceptions.ClientException;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.bpmn.model.UserTask;
import org.activiti.bpmn.model.*;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.impl.identity.Authentication;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Comment;
import org.activiti.engine.task.Task;
import org.activiti.spring.integration.Activiti;
import org.apache.shiro.SecurityUtils;
@ -32,16 +33,14 @@ import org.jeecg.common.constant.enums.SysAnnmentTypeEnum;
import org.jeecg.common.system.api.ISysBaseAPI;
import org.jeecg.common.util.DySmsHelper;
import org.junit.Test;
import org.junit.platform.commons.util.StringUtils;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.CollectionUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.*;
/**
* @Description: 消息推送测试
@ -65,9 +64,9 @@ public class SendMessageTest {
public void createproess(){
Deployment deployment = repositoryService
.createDeployment()
.addClasspathResource("process/initiatesProjects.bpmn20.xml")
.addClasspathResource("process/initiatesProjects.png")
.name("项目入库申请流程")
.addClasspathResource("process/项目计划审批流程.bpmn20.xml")
.addClasspathResource("process/项目计划审批流程.png")
.name("项目资料上传流程")
.deploy();
System.out.println("deployment.getId() = " + deployment.getId());
System.out.println("deployment.getName() = " + deployment.getName());
@ -120,14 +119,22 @@ public class SendMessageTest {
*/
@Test
public void getProcessInstance() {
String processInstanceId = "1d1d364f-b9ca-11ee-a2e6-f43bd81684b1";
ProcessInstance processInstance = this.runtimeService.createProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult();
System.out.println("ProcessInstanceId:" + processInstance.getProcessInstanceId());
System.out.println("ProcessDefinitionId:" + processInstance.getProcessDefinitionId());
System.out.println("isEnded:" + processInstance.isEnded());
System.out.println("isSuspended:" + processInstance.isSuspended());
// String processInstanceId = "c5d4854b-b9e6-11ee-bec0-f43bd81684b1";
// ProcessInstance processInstance = this.runtimeService.createProcessInstanceQuery()
// .processInstanceId(processInstanceId)
// .singleResult();
// System.out.println("ProcessInstanceId:" + processInstance.getProcessInstanceId());
// System.out.println("ProcessDefinitionId:" + processInstance.getProcessDefinitionId());
// System.out.println("isEnded:" + processInstance.isEnded());
// System.out.println("isSuspended:" + processInstance.isSuspended());
Task task = taskService.createTaskQuery().taskId("139023df-c28b-11ee-80e5-f43bd81684b1").singleResult();
String processInstanceId = task.getProcessInstanceId();
//获取当前模型
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
// 获取当前节点
FlowElement flowElement = bpmnModel.getFlowElement(task.getTaskDefinitionKey());
UserTask userTask = (UserTask) flowElement;
}
/**
* 查询流程实例列表
@ -141,6 +148,18 @@ public class SendMessageTest {
System.out.println("ProcessDefinitionId:" + processInstance.getProcessDefinitionId());
System.out.println("isEnded:" + processInstance.isEnded());
System.out.println("isSuspended:" + processInstance.isSuspended());
runtimeService.deleteProcessInstance(processInstance.getProcessInstanceId(),"发起人删除");
});
}
}
@Test
public void ldetel() {
List<HistoricProcessInstance> list = this.historyService.createHistoricProcessInstanceQuery().list();
if (!CollectionUtils.isEmpty(list)) {
list.forEach(processInstance -> {
});
}
}
@ -220,11 +239,38 @@ public class SendMessageTest {
*/
@Test
public void completeTask() {
String taskId = "c594f43d-b9d5-11ee-91b9-f43bd81684b1";
String taskId = "cb4ad75c-bb3e-11ee-b45e-f43bd81684b1";
Map<String, Object> variables = new HashMap<>();
variables.put("type",1);
ArrayList<String> arrayList = new ArrayList<>();
//设置下一个节点处理人
//使用角色查询
Authentication.setAuthenticatedUserId("12314");//添加审批人
String comment = "同意";
taskService.addComment(taskId,"278f4341-ba89-11ee-8201-f43bd81684b1",comment);
arrayList.add("1748190800971665409");
arrayList.add("1749362824117030913");
variables.put("users",arrayList);
this.taskService.complete(taskId, variables);
}
@Test
public void testClaimTask(){
//返回所有的任务
List<Task> tasks = taskService.createTaskQuery().taskId("75d63248-bbf4-11ee-ab92-f43bd81684b1").list();
// taskService.setAssignee("c42917dc-bc10-11ee-8f67-f43bd81684b1","1748190800971665409");
for (Task task : tasks) {
System.out.println("task.getId() = " + task.getId());
System.out.println("task.getName() = " + task.getName());
task.setName("监管单位撤回");
// taskService.claim(task.getId(), "1748190800971665409");//拾取任务
}
}
@Test
public void deleteprocess(){
runtimeService.deleteProcessInstance("c5d4854b-b9e6-11ee-bec0-f43bd81684b1","发起人删除");
}
/**
* 根据用户名查询历史记录
*/
@ -242,8 +288,173 @@ public class SendMessageTest {
});
}
}
@Test
public void getlishijilv(){
String processinstanceid = "c5d4854b-b9e6-11ee-bec0-f43bd81684b1";
List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processinstanceid)
.orderByTaskCreateTime().asc().list();
List<HashMap<String,Object>> approvalEntityList = new ArrayList<>();
// HashMap<String, String> hashMap = new HashMap<>();
String approvalSuggestion = "";
Object approvalStatus = "";
HistoricVariableInstance historicVariableInstance = null;
List<Comment> commentList = null;
for(HistoricTaskInstance item : list){
HashMap<String, Object> hashMap = new HashMap<>();
commentList = taskService.getTaskComments(item.getId());
if(commentList != null && !commentList.isEmpty()) {
approvalSuggestion = commentList.get(0).getFullMessage();
}else{
approvalSuggestion = "";
}
historicVariableInstance = historyService.createHistoricVariableInstanceQuery()
.taskId(item.getId()).variableName("approvalStatus").singleResult();
if(historicVariableInstance != null) {
approvalStatus = historicVariableInstance.getValue();
hashMap.put("approvalStatue",StringUtils.isBlank(approvalStatus.toString()) ? "0" : approvalStatus.toString());
}
hashMap.put("operateDate",item.getEndTime());
hashMap.put("operator",item.getAssignee());
hashMap.put("taskName",item.getName());
hashMap.put("comment",approvalSuggestion);
approvalEntityList.add(hashMap);
}
System.out.println(approvalEntityList.toString());
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId("c5d4854b-b9e6-11ee-bec0-f43bd81684b1").singleResult();
System.out.println(historicProcessInstance.toString());
}
@Test
public void callBack() {
String processId="ee972c54-bbea-11ee-8413-f43bd81684b1";
//通过流程id查找到当前的任务
List<Task> tasks= taskService.createTaskQuery()
.processInstanceId(processId).orderByTaskCreateTime().desc()
.list();
//tasks.get(0).setAssignee("1748190800971665409");
//如果为空或者小于等于0则证明没有可查看到的任务
if (tasks == null||tasks.size()<=0) {
System.out.println("当前没有任务或者任务已执行完了");
}
//查看所有走过的历史任务
List<HistoricTaskInstance> htlist = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processId)
.finished().orderByHistoricTaskInstanceEndTime().desc()
.list();
if (htlist == null||htlist.size()<=0) {
System.out.println("请先提交任务");
}
String myTaskId = null;
HistoricTaskInstance myTask = null;
//前一个任务节点,也就是提交人 拿到前一个任务
for (HistoricTaskInstance hti : htlist) {
//回退到zhangsan也就是任务A,业务中这里就是当前登录的用户名 TODO:从登录名拿
if ("1748190800971665409".equals(hti.getAssignee())) {
myTaskId = hti.getId();
// taskService.set
// tasks.get(0).setName("");
myTask = hti;
break;
}
}
if (myTask == null) {
System.out.println("这个任务不是你的任务");
}
//流程定义id
String processDefinitionId = myTask.getProcessDefinitionId();
//整个流程节点对象
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
//我的节点
String myActivityId = null;
//历史节点完成节点
List<HistoricActivityInstance> haiList =
historyService
.createHistoricActivityInstanceQuery()
.executionId(myTask.getExecutionId())
.finished()
.list();
//拿到我的节点 _3
for (HistoricActivityInstance hai : haiList) {
if (myTaskId.equals(hai.getTaskId())) {
myActivityId = hai.getActivityId();
break;
}
}
//我的流程节点
FlowNode myFlowNode =
(FlowNode) bpmnModel.getMainProcess().getFlowElement(myActivityId);
//当前执行对象
Execution execution = runtimeService.createExecutionQuery()
.executionId(tasks.get(0).getExecutionId()).singleResult();
//当任务执行节点_4
String activityId = execution.getActivityId();
System.out.println(activityId);
//当前流程节点对象
FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess()
.getFlowElement(activityId);
// flowNode.getName() 节点名称
//记录原活动方向出方向
List<SequenceFlow> oriSequenceFlows = new ArrayList<SequenceFlow>();
oriSequenceFlows.addAll(flowNode.getOutgoingFlows());
//清理活动方向
flowNode.getOutgoingFlows().clear();
//建立新方向
List<SequenceFlow> newSequenceFlowList = new ArrayList<SequenceFlow>();
SequenceFlow newSequenceFlow = new SequenceFlow();
newSequenceFlow.setId("newSequenceFlowId");
newSequenceFlow.setSourceFlowElement(flowNode);
newSequenceFlow.setTargetFlowElement(myFlowNode);
newSequenceFlowList.add(newSequenceFlow);
flowNode.setOutgoingFlows(newSequenceFlowList);
//设置操作人记录 和备注信息
Authentication.setAuthenticatedUserId("1748190800971665409");
taskService.claim(tasks.get(0).getId(),"1748190800971665409");
taskService.setVariableLocal(tasks.get(0).getId(),"approvalStatue","2");
taskService.addComment(tasks.get(0).getId(), tasks.get(0).getProcessInstanceId(), "撤回一下下");
String taskId= tasks.get(0).getId();
//完成任务
// if (tasks.size() > 1) {
// //会签撤回
// HashMap<String, Object> variables = new HashMap<>();
// variables.put("pass",true);
//// variables.put("param","y");
// taskService.complete(taskId,variables);
// //恢复原方向
// flowNode.setOutgoingFlows(oriSequenceFlows);
// ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(tasks.get(0).getProcessInstanceId()).singleResult();
// //更新数据库 从新设置state为未提交状态
// Apply apply = new Apply();
// apply.setCode(processInstance.getBusinessKey());
// apply.setState(0);
//
//
// return applyService.updateByCode(apply);
// }
//普通撤回
ArrayList<String> arrayList = new ArrayList<>();
HashMap<String, Object> hashMap = new HashMap<>();
//设置下一个节点处理人
//使用角色查询
arrayList.add("1748190800971665409");
hashMap.put("users",arrayList);
tasks.get(0).setName("dddddd");
taskService.complete(taskId,hashMap);
//恢复原方向
flowNode.setOutgoingFlows(oriSequenceFlows);
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(tasks.get(0).getProcessInstanceId()).singleResult();
// //更新数据库 从新设置state为未提交状态
// Apply apply = new Apply();
// apply.setCode(processInstance.getBusinessKey());
// apply.setState(0);
}

6
pom.xml

@ -21,7 +21,7 @@
<properties>
<jeecgboot.version>3.6.1</jeecgboot.version>
<java.version>1.8</java.version>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 微服务 -->
@ -405,8 +405,8 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>

Loading…
Cancel
Save