From cbda7ee77614d874d494609be9ec984f100cc39d Mon Sep 17 00:00:00 2001 From: zhouhaibin Date: Mon, 5 Feb 2024 15:31:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/jeecgboot-mysql-5.7.sql | 4 +- huzhou/pom.xml | 16 + .../huzhou/common/HuzhouCommonUtils.java | 28 ++ .../controller/HuzhouPlanController.java | 148 +++++++ .../controller/HuzhouProjectController.java | 396 ++++++++++++++++++ .../controller/HuzhouUserController.java | 118 ++++++ .../huzhou/controller/WorkflowController.java | 367 ++++++++++++++++ .../modules/huzhou/entity/BaseEntity.java | 31 ++ .../modules/huzhou/entity/HuzhouPlaninfo.java | 57 +++ .../huzhou/entity/HuzhouPlanmodule.java | 34 ++ .../huzhou/entity/HuzhouPlanmoduledetail.java | 39 ++ .../huzhou/entity/HuzhouProcessinfo.java | 34 ++ .../huzhou/entity/HuzhouProjectinfo.java | 173 ++++++++ .../huzhou/entity/HuzhouUploadfileinfo.java | 45 ++ .../huzhou/entity/HuzhouUserproject.java | 32 ++ .../jeecg/modules/huzhou/entity/WorkFlow.java | 19 + .../huzhou/handler/MyMetaObjectHandler.java | 41 ++ .../huzhou/mapper/HuzhouPlaninfoMapper.java | 9 + .../huzhou/mapper/HuzhouPlanmoduleMapper.java | 9 + .../mapper/HuzhouPlanmoduledetailMapper.java | 9 + .../mapper/HuzhouProcessinfoMapper.java | 9 + .../mapper/HuzhouProjectinfoMapper.java | 9 + .../mapper/HuzhouUploadfileinfoMapper.java | 9 + .../mapper/HuzhouUserprojectMapper.java | 9 + .../modules/huzhou/mapper/WorkflowMapper.java | 13 + .../huzhou/mapper/xml/WorkflowMapper.xml | 14 + .../service/IHuzhouPlaninfoService.java | 16 + .../service/IHuzhouPlanmoduleService.java | 16 + .../IHuzhouPlanmoduledetailService.java | 18 + .../service/IHuzhouProcessinfoService.java | 1 + .../service/IHuzhouProjectinfoService.java | 16 + .../service/IHuzhouUploadfileinfoService.java | 17 + .../service/IHuzhouUserprojectService.java | 17 + .../huzhou/service/IWorkflowService.java | 11 + .../impl/HuzhouPlaninfoServiceImpl.java | 20 + .../impl/HuzhouPlanmoduleServiceImpl.java | 19 + .../HuzhouPlanmoduledetailServiceImpl.java | 21 + .../impl/HuzhouProcessinfoServiceImpl.java | 165 ++++++++ .../impl/HuzhouProjectinfoServiceImpl.java | 14 + .../impl/HuzhouUploadfileinfoServiceImpl.java | 75 ++++ .../impl/HuzhouUserprojectServiceImpl.java | 23 + .../service/impl/WorkflowServiceImpl.java | 327 +++++++++++++++ .../modules/huzhou/vo/ProjectApproveOV.java | 17 + .../mapper/HuzhouUserprojectMapper.xml | 4 + jeecg-module-system/jeecg-system-biz/pom.xml | 14 +- .../system/service/ISysUserService.java | 3 +- .../service/impl/SysUserServiceImpl.java | 17 + .../src/main/resources/application-dev.yml | 19 +- .../src/main/resources/application-prod.yml | 166 ++++---- .../process/initiatesProjects.bpmn20.xml | 63 +++ .../resources/process/initiatesProjects.png | Bin 0 -> 20124 bytes .../项目计划审批流程.bpmn20.xml | 68 +++ .../process/项目计划审批流程.png | Bin 0 -> 18370 bytes .../项目资料上传流程.bpmn20.xml | 68 +++ .../process/项目资料上传流程.png | Bin 0 -> 17732 bytes .../modules/message/test/SendMessageTest.java | 251 ++++++++++- pom.xml | 6 +- 57 files changed, 3027 insertions(+), 117 deletions(-) create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/common/HuzhouCommonUtils.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/controller/HuzhouPlanController.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/controller/HuzhouProjectController.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/controller/HuzhouUserController.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/controller/WorkflowController.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/entity/BaseEntity.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouPlaninfo.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouPlanmodule.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouPlanmoduledetail.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouProcessinfo.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouProjectinfo.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouUploadfileinfo.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouUserproject.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/entity/WorkFlow.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/handler/MyMetaObjectHandler.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouPlaninfoMapper.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouPlanmoduleMapper.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouPlanmoduledetailMapper.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouProcessinfoMapper.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouProjectinfoMapper.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouUploadfileinfoMapper.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouUserprojectMapper.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/WorkflowMapper.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/xml/WorkflowMapper.xml create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouPlaninfoService.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouPlanmoduleService.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouPlanmoduledetailService.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouProjectinfoService.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouUploadfileinfoService.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouUserprojectService.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/service/IWorkflowService.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouPlaninfoServiceImpl.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouPlanmoduleServiceImpl.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouPlanmoduledetailServiceImpl.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouProcessinfoServiceImpl.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouProjectinfoServiceImpl.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouUploadfileinfoServiceImpl.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouUserprojectServiceImpl.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/WorkflowServiceImpl.java create mode 100644 huzhou/src/main/java/org/jeecg/modules/huzhou/vo/ProjectApproveOV.java create mode 100644 huzhou/src/main/resources/mapper/HuzhouUserprojectMapper.xml create mode 100644 jeecg-module-system/jeecg-system-start/src/main/resources/process/initiatesProjects.bpmn20.xml create mode 100644 jeecg-module-system/jeecg-system-start/src/main/resources/process/initiatesProjects.png create mode 100644 jeecg-module-system/jeecg-system-start/src/main/resources/process/项目计划审批流程.bpmn20.xml create mode 100644 jeecg-module-system/jeecg-system-start/src/main/resources/process/项目计划审批流程.png create mode 100644 jeecg-module-system/jeecg-system-start/src/main/resources/process/项目资料上传流程.bpmn20.xml create mode 100644 jeecg-module-system/jeecg-system-start/src/main/resources/process/项目资料上传流程.png diff --git a/db/jeecgboot-mysql-5.7.sql b/db/jeecgboot-mysql-5.7.sql index 82eaf1f..1f1755c 100644 --- a/db/jeecgboot-mysql-5.7.sql +++ b/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 diff --git a/huzhou/pom.xml b/huzhou/pom.xml index 2d8d7d0..c3c8cd5 100644 --- a/huzhou/pom.xml +++ b/huzhou/pom.xml @@ -17,6 +17,10 @@ org.jeecgframework.boot jeecg-boot-base-core + + org.jeecgframework.boot + jeecg-system-biz + org.activiti activiti-spring-boot-starter @@ -29,4 +33,16 @@ + + + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + + + \ No newline at end of file diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/common/HuzhouCommonUtils.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/common/HuzhouCommonUtils.java new file mode 100644 index 0000000..3ab14a3 --- /dev/null +++ b/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 extractObjectAttributes(Object user) { + List 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; + } +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/controller/HuzhouPlanController.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/controller/HuzhouPlanController.java new file mode 100644 index 0000000..3b32ac2 --- /dev/null +++ b/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> queryPlanModulePage(HuzhouPlanmodule planmodule,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize){ + LambdaQueryWrapper 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 planmodulePage = new Page<>(pageNo,pageSize); + + Page page = planmoduleService.page(planmodulePage, queryWrapper); + return Result.OK(page); + } + + @GetMapping("/queryPlanModuleone") + public Result queryPlanModuleByid(HuzhouPlanmodule planmodule){ + LambdaQueryWrapper 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 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 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> queryPlanModuleDetailPage(HuzhouPlanmoduledetail planmoduledetail){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + String moduleId = planmoduledetail.getModuleId(); + queryWrapper.eq(StringUtils.isNotBlank(moduleId), HuzhouPlanmoduledetail::getModuleId,moduleId); + List list = planmoduledetailService.list(queryWrapper); + return Result.OK(list); + } + @PostMapping("/savePlanModuleDatail") + public Result savePlanModuleDatail(@RequestBody() List planmoduledetails){ + //先删除后增加 + String moduleId = planmoduledetails.get(0).getModuleId(); + LambdaQueryWrapper 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 planinfos){ + if(planinfos.size()==0){ + return Result.error("数量为0"); + } + ArrayList 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 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> queryProjectPlan(HuzhouPlaninfo planinfo){ + String projectId = planinfo.getProjectId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(StringUtils.isNotBlank(projectId),HuzhouPlaninfo::getProjectId,projectId); + queryWrapper.orderByAsc(HuzhouPlaninfo::getOrderNumber); + List list = planinfoService.list(queryWrapper); + return Result.OK(list); + } +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/controller/HuzhouProjectController.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/controller/HuzhouProjectController.java new file mode 100644 index 0000000..518cf0e --- /dev/null +++ b/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 minio:minio 阿里:alioss + */ + @Value(value="${jeecg.uploadType}") + private String uploadType; + @PostMapping("/submitProject") + public Result submitProject(@RequestBody HuzhouProjectinfo info){ + ArrayList 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 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 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 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 queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(HuzhouUserproject::getProjectId,projectid); + boolean remove = userprojectService.remove(queryWrapper); + //保存新的人员和项目对应信息 + List 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 updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(HuzhouProjectinfo::getStatus,"2"); + updateWrapper.eq(HuzhouProjectinfo::getId,projectid); + projectinfoService.update(updateWrapper); + } + if("流程审批二".equals(userTaskName)&&"1".equals(flag)){ + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(HuzhouProjectinfo::getStatus,"4"); + updateWrapper.eq(HuzhouProjectinfo::getId,projectid); + projectinfoService.update(updateWrapper); + } + if("计划审批二".equals(userTaskName)&&"1".equals(flag)){ + LambdaUpdateWrapper 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 updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(HuzhouProjectinfo::getStatus,"2"); + updateWrapper.eq(HuzhouProjectinfo::getId,projectid); + projectinfoService.update(updateWrapper); + } + if("流程审批二".equals(userTaskName)&&"1".equals(flag)){ + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(HuzhouProjectinfo::getStatus,"4"); + updateWrapper.eq(HuzhouProjectinfo::getId,projectid); + projectinfoService.update(updateWrapper); + } + if("计划审批二".equals(userTaskName)&&"1".equals(flag)){ + LambdaUpdateWrapper 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> queryPageList(@RequestParam Map params, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize){ + IPage page = new Page(pageNo, pageSize); + LambdaQueryWrapper 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 queryProjectInfoById(String projectid){ + //获取项目入库数据 + HuzhouProjectinfo projectinfo = projectinfoService.getById(projectid); +// List attributes = new ArrayList<>(); +// +// List 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 queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(HuzhouProcessinfo::getProjectid,projectid); +// HuzhouProcessinfo processinfo = processinfoService.getOne(queryWrapper); + //获取项目入库流程数据 + + return Result.OK(projectinfo); + + } + @GetMapping("/queryprocessinfoById") + public Result queryprocessinfoById(String projectid){ + LambdaQueryWrapper 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 arrayList = new ArrayList<>(); + //设置下一个节点处理人 + //使用角色查询 + arrayList.add("1752895307869614081"); + arrayList.add("1752895591849160705"); + WorkFlow workFlow = workflowService.createFlow("项目资料上传流程", arrayList); + String businessKey = workFlow.getBusinessKey(); + String processInstanceId = workFlow.getProcessInstanceId(); + //保存项目信息 + LambdaUpdateWrapper 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> queryResourceInfo(@RequestParam Map 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 huzhouUploadfileinfoIPage = new Page<>(pageNo,pageSize); + LambdaUpdateWrapper huzhouUploadfileinfoLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + huzhouUploadfileinfoLambdaUpdateWrapper.eq(HuzhouUploadfileinfo::getProjectid,projectid); + huzhouUploadfileinfoLambdaUpdateWrapper.eq(HuzhouUploadfileinfo::getStatus,status); + IPage uploadfileinfoIPage = uploadfileinfoService.page(huzhouUploadfileinfoIPage, huzhouUploadfileinfoLambdaUpdateWrapper); + return Result.OK(uploadfileinfoIPage); + } + + @GetMapping("/queryProjectApprovedPage") + public Result> queryProjectApprovedPage(HuzhouProjectinfo projectinfo, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize){ + Page projectinfoPage = new Page<>(pageNo, pageSize); + LambdaQueryWrapper 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 page = projectinfoService.page(projectinfoPage, queryWrapper); + return Result.OK(page); + } + + +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/controller/HuzhouUserController.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/controller/HuzhouUserController.java new file mode 100644 index 0000000..d6f9cad --- /dev/null +++ b/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> 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 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 projectinfoList = projectinfoService.list(projectinfoQueryWrapper); + List manageContactors = projectinfoList.stream() + .map(HuzhouProjectinfo::getManageContactor) + .collect(Collectors.toList()); + List controlerContactors = projectinfoList.stream() + .map(HuzhouProjectinfo::getControlerContactor) + .collect(Collectors.toList()); + List ownerContactors = projectinfoList.stream() + .map(HuzhouProjectinfo::getOwnerContactor) + .collect(Collectors.toList()); + List contructorContactor = projectinfoList.stream() + .map(HuzhouProjectinfo::getContructorContactor) + .collect(Collectors.toList()); + List supervisorContactor = projectinfoList.stream().map(HuzhouProjectinfo::getSupervisorContactor).collect(Collectors.toList()); + List consultContactor = projectinfoList.stream().map(HuzhouProjectinfo::getConsultContactor).collect(Collectors.toList()); + HashSet hashSet = new HashSet<>(); + hashSet.addAll(manageContactors); + hashSet.addAll(controlerContactors); + hashSet.addAll(ownerContactors); + hashSet.addAll(contructorContactor); + hashSet.addAll(supervisorContactor); + hashSet.addAll(consultContactor); + Page sysUserPage = new Page<>(pageNo,pageSize); + LambdaQueryWrapper sysUserQueryWrapper = new LambdaQueryWrapper<>(); + sysUserQueryWrapper.in(hashSet.size()>0,SysUser::getId,hashSet) + .or().eq(SysUser::getId,userId); + Page userPage = userService.page(sysUserPage, sysUserQueryWrapper); + return Result.OK(userPage); + } + @GetMapping("/getWorkPlaceTypeDict") + public Result getWorkPlaceDict(String workPlaceType){ + LambdaQueryWrapper sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysUserLambdaQueryWrapper.eq(SysUser::getWorkplaceType,workPlaceType) + .select(SysUser::getWorkplaceType,SysUser::getWorkplace); + List> 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 sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysUserLambdaQueryWrapper.eq(StringUtils.isNotBlank(workPlace),SysUser::getWorkplace,workPlace) + .eq(StringUtils.isNotBlank(workPlaceType),SysUser::getWorkplaceType,workPlaceType); + List> 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); + } +} + diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/controller/WorkflowController.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/controller/WorkflowController.java new file mode 100644 index 0000000..eb5310a --- /dev/null +++ b/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>> 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> taskMapList = new ArrayList<>(); + List taskList = taskService.createTaskQuery() + .orderByTaskCreateTime() + .desc() + .taskCandidateOrAssigned(userId) + .listPage((pageNo-1)*pageSize,pageSize); + if (!CollectionUtils.isEmpty(taskList)) { + for (Task task:taskList) { + HashMap 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 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 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 taskImpls = taskList.stream().map(x -> (TaskEntityImpl) x).collect(Collectors.toList()); +// //返回的结果相同 +// List collect = taskImpls.stream().map(TaskEntityImpl::getPersistentState).collect(Collectors.toList()); + + int taskCount = taskService.createTaskQuery() + .taskCandidateOrAssigned(userId) + .list() + .size(); + Page> taskPage = new Page<>(); + taskPage.setCurrent(pageNo); + taskPage.setSize(pageSize); + taskPage.setTotal(taskCount); + taskPage.setRecords(taskMapList); + return Result.ok(taskPage); + } + @GetMapping("/myCompleteTask") + public Result>> 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> resList = new ArrayList<>(); +// List historicTaskInstances = historyService.createHistoricTaskInstanceQuery() +// .taskAssignee(userId) +// .orderByTaskCreateTime() +// .desc() +// .listPage((pageNo-1)*pageSize, pageSize); + Page> mapPage = new Page<>(pageNo,pageSize); + Page> completeTaskByAssignee = workflowMapper.getCompleteTaskByAssignee(mapPage, userId); + List> records = completeTaskByAssignee.getRecords(); +// for (HistoricTaskInstance his: historicTaskInstances) { + for (Map his: records) { + HashMap reshashMap = new HashMap<>(); + String processInstanceId = his.get("processInstanceId"); + String processDefinitionId = his.get("processDefinitionId"); + reshashMap.put("processInstanceId",processInstanceId); + //获取taskid + List 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 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 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> taskPage = new Page<>(); + taskPage.setCurrent(pageNo); + taskPage.setSize(pageSize); + taskPage.setTotal(taskCount); + taskPage.setRecords(resList); + return Result.ok(taskPage); + } + @GetMapping("/getprocessInfo") + public Result>> 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 queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(HuzhouProcessinfo::getProjectid,projectid); + queryWrapper.eq(HuzhouProcessinfo::getStatus,status);//属于第几部流程 + HuzhouProcessinfo processinfo = processinfoService.getOne(queryWrapper); + String processinstanceid = processinfo.getProcessinstanceid(); + List list = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(processinstanceid) + .orderByTaskCreateTime().asc().listPage((pageNo-1)*pageSize,pageSize); + List> approvalEntityList = new ArrayList<>(); + String approvalSuggestion = ""; + HistoricVariableInstance historicVariableInstance = null; + List commentList = null; + for(HistoricTaskInstance item : list) { + HashMap hashMap = new HashMap<>(); + commentList = taskService.getTaskComments(item.getId()); + if (commentList != null && !commentList.isEmpty()) { + approvalSuggestion = commentList.get(0).getFullMessage(); + } else { + approvalSuggestion = ""; + } + Map taskLocalVariables = item.getTaskLocalVariables(); + //获取当前节点的任务变量 + List 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> 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 outRes = new HashMap<>(); + ArrayList 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 queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(HuzhouProcessinfo::getProjectid,projectid); + queryWrapper.eq(HuzhouProcessinfo::getStatus,status);//属于第几部流程 + HuzhouProcessinfo processinfo = processinfoService.getOne(queryWrapper); + String processinstanceid = processinfo.getProcessinstanceid(); + List 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 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 hashMap1 = new HashMap<>(); + hashMap1.put("label","同意"); + hashMap1.put("value","1"); + actionButtons.add(hashMap1); + HashMap hashMap = new HashMap<>(); + hashMap.put("label","作废"); + hashMap.put("value","3"); + outRes.put("IsEdit",true); + actionButtons.add(hashMap); + }else { + HashMap hashMap1 = new HashMap<>(); + hashMap1.put("label","同意"); + hashMap1.put("value","1"); + actionButtons.add(hashMap1); + HashMap hashMap = new HashMap<>(); + + hashMap.put("label","拒绝"); + hashMap.put("value","0"); + actionButtons.add(hashMap); + } + } + //获取上一个处理人 + outRes.put("buttons",actionButtons); + return Result.OK(outRes); + + } +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/BaseEntity.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/BaseEntity.java new file mode 100644 index 0000000..6ebc0e5 --- /dev/null +++ b/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; +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouPlaninfo.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouPlaninfo.java new file mode 100644 index 0000000..127f621 --- /dev/null +++ b/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; + + + +} + diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouPlanmodule.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouPlanmodule.java new file mode 100644 index 0000000..baed053 --- /dev/null +++ b/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; + +} + diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouPlanmoduledetail.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouPlanmoduledetail.java new file mode 100644 index 0000000..c3d7671 --- /dev/null +++ b/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; + +} + diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouProcessinfo.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouProcessinfo.java new file mode 100644 index 0000000..a28d970 --- /dev/null +++ b/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; + +} + diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouProjectinfo.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouProjectinfo.java new file mode 100644 index 0000000..43f3fd0 --- /dev/null +++ b/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; + + + +} + diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouUploadfileinfo.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouUploadfileinfo.java new file mode 100644 index 0000000..5bfb95b --- /dev/null +++ b/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; +} + diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouUserproject.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/HuzhouUserproject.java new file mode 100644 index 0000000..480a90f --- /dev/null +++ b/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; + + + +} + diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/WorkFlow.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/entity/WorkFlow.java new file mode 100644 index 0000000..d67638b --- /dev/null +++ b/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; +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/handler/MyMetaObjectHandler.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/handler/MyMetaObjectHandler.java new file mode 100644 index 0000000..7d5e744 --- /dev/null +++ b/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); + + } +} \ No newline at end of file diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouPlaninfoMapper.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouPlaninfoMapper.java new file mode 100644 index 0000000..4fbb864 --- /dev/null +++ b/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 { +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouPlanmoduleMapper.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouPlanmoduleMapper.java new file mode 100644 index 0000000..d6f0979 --- /dev/null +++ b/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 { +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouPlanmoduledetailMapper.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouPlanmoduledetailMapper.java new file mode 100644 index 0000000..b89cda8 --- /dev/null +++ b/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 { +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouProcessinfoMapper.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouProcessinfoMapper.java new file mode 100644 index 0000000..7b9612f --- /dev/null +++ b/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 { +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouProjectinfoMapper.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouProjectinfoMapper.java new file mode 100644 index 0000000..2d285b1 --- /dev/null +++ b/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 { +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouUploadfileinfoMapper.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouUploadfileinfoMapper.java new file mode 100644 index 0000000..354fec8 --- /dev/null +++ b/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 { +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouUserprojectMapper.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/HuzhouUserprojectMapper.java new file mode 100644 index 0000000..13cea1b --- /dev/null +++ b/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 { +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/WorkflowMapper.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/WorkflowMapper.java new file mode 100644 index 0000000..8966f42 --- /dev/null +++ b/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 { + Page> getCompleteTaskByAssignee(Page page, @Param("userid") String id); +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/xml/WorkflowMapper.xml b/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/xml/WorkflowMapper.xml new file mode 100644 index 0000000..e3ce965 --- /dev/null +++ b/huzhou/src/main/java/org/jeecg/modules/huzhou/mapper/xml/WorkflowMapper.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouPlaninfoService.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouPlaninfoService.java new file mode 100644 index 0000000..32a98df --- /dev/null +++ b/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 { + +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouPlanmoduleService.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouPlanmoduleService.java new file mode 100644 index 0000000..471b8a4 --- /dev/null +++ b/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 { + +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouPlanmoduledetailService.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouPlanmoduledetailService.java new file mode 100644 index 0000000..1d5a3c3 --- /dev/null +++ b/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 { + + + +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouProcessinfoService.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouProcessinfoService.java index c5f076d..1b25366 100644 --- a/huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouProcessinfoService.java +++ b/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 { + void callBack(String processId,String flag); } diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouProjectinfoService.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouProjectinfoService.java new file mode 100644 index 0000000..4a74d29 --- /dev/null +++ b/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{ + +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouUploadfileinfoService.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouUploadfileinfoService.java new file mode 100644 index 0000000..0760ef9 --- /dev/null +++ b/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 { + void modifyUploadFile(MultipartFile[] files, String projectid, String status) throws IOException; +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouUserprojectService.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/service/IHuzhouUserprojectService.java new file mode 100644 index 0000000..3f8f69d --- /dev/null +++ b/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 { + + +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/service/IWorkflowService.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/service/IWorkflowService.java new file mode 100644 index 0000000..7e67239 --- /dev/null +++ b/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 nextList); + void callBack(String processId,String flag); + WorkFlow approveProjectInfo(String taskId,String flag,String comment,String status); +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouPlaninfoServiceImpl.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouPlaninfoServiceImpl.java new file mode 100644 index 0000000..587b764 --- /dev/null +++ b/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 implements IHuzhouPlaninfoService { +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouPlanmoduleServiceImpl.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouPlanmoduleServiceImpl.java new file mode 100644 index 0000000..1cb1545 --- /dev/null +++ b/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 implements IHuzhouPlanmoduleService { + +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouPlanmoduledetailServiceImpl.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouPlanmoduledetailServiceImpl.java new file mode 100644 index 0000000..87c2787 --- /dev/null +++ b/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 implements IHuzhouPlanmoduledetailService { + +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouProcessinfoServiceImpl.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouProcessinfoServiceImpl.java new file mode 100644 index 0000000..ff5377d --- /dev/null +++ b/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 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 tasks= taskService.createTaskQuery() + .processInstanceId(processId).orderByTaskCreateTime().desc() + .list(); + //tasks.get(0).setAssignee("1748190800971665409"); + //如果为空或者小于等于0则证明没有可查看到的任务 + if (tasks == null||tasks.size()<=0) { + System.out.println("当前没有任务或者任务已执行完了"); + } + //查看所有走过的历史任务 + List 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 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 oriSequenceFlows = new ArrayList(); + oriSequenceFlows.addAll(flowNode.getOutgoingFlows()); + + //清理活动方向 + flowNode.getOutgoingFlows().clear(); + + //建立新方向 + List newSequenceFlowList = new ArrayList(); + 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 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 arrayList = new ArrayList<>(); + HashMap hashMap = new HashMap<>(); + //设置下一个节点处理人 + //使用角色查询 + arrayList.add(userId); + hashMap.put("users",arrayList); + taskService.complete(taskId,hashMap); + //恢复原方向 + flowNode.setOutgoingFlows(oriSequenceFlows); + } +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouProjectinfoServiceImpl.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouProjectinfoServiceImpl.java new file mode 100644 index 0000000..489f5d6 --- /dev/null +++ b/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 + implements IHuzhouProjectinfoService { + +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouUploadfileinfoServiceImpl.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouUploadfileinfoServiceImpl.java new file mode 100644 index 0000000..b61a639 --- /dev/null +++ b/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 implements IHuzhouUploadfileinfoService { + @Value(value = "${jeecg.path.upload}") + private String uploadpath; + public void modifyUploadFile(MultipartFile[] files, String projectid, String status) throws IOException { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(HuzhouUploadfileinfo::getProjectid,projectid); + queryWrapper.eq(HuzhouUploadfileinfo::getStatus,status); + List 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); + } + } + +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouUserprojectServiceImpl.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/HuzhouUserprojectServiceImpl.java new file mode 100644 index 0000000..b566c1c --- /dev/null +++ b/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 implements IHuzhouUserprojectService { + +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/WorkflowServiceImpl.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/service/impl/WorkflowServiceImpl.java new file mode 100644 index 0000000..9b3a5dd --- /dev/null +++ b/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 nextList){ + LoginUser currentUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + String userId = currentUser.getId(); + //流程的创建 + // 流程定义KEY(流程名字) + // 业务表KEY(用于把业务数据与Activiti7流程数据相关联) + String businessKey = UUID.randomUUID().toString().replace("-",""); + // 参数 + Map 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 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 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 outgoingFlows = userTask.getOutgoingFlows(); + //直接获得目标元素 + FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement(); + //转换一下类型 + UserTask nextUserTask = (UserTask) targetFlowElement; + String nextUserTaskName = nextUserTask.getName(); + + if("监管单位审批".equals(nextUserTaskName)){ + ArrayList arrayList = new ArrayList<>(); + //设置下一个节点处理人 + //使用角色查询 + arrayList.add("1752895307869614081"); + arrayList.add("1752895591849160705"); + hashMap.put("users",arrayList); + }else if("管理单位审批".equals(nextUserTaskName)){ + ArrayList 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 outgoingFlows = userTask.getOutgoingFlows(); + //直接获得目标元素 + FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement(); + //转换一下类型 + UserTask nextUserTask = (UserTask) targetFlowElement; + String nextUserTaskName = nextUserTask.getName(); + + if("流程审批一".equals(nextUserTaskName)){ + ArrayList arrayList = new ArrayList<>(); + //设置下一个节点处理人 + //使用角色查询 + arrayList.add("1752895307869614081"); + arrayList.add("1752895591849160705"); + hashMap.put("users",arrayList); + }else if("流程审批二".equals(nextUserTaskName)){ + ArrayList 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 outgoingFlows = userTask.getOutgoingFlows(); + //直接获得目标元素 + FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement(); + //转换一下类型 + UserTask nextUserTask = (UserTask) targetFlowElement; + String nextUserTaskName = nextUserTask.getName(); + + if("计划审批一".equals(nextUserTaskName)){ + ArrayList arrayList = new ArrayList<>(); + //设置下一个节点处理人 + //使用角色查询 + arrayList.add("1752895307869614081"); + arrayList.add("1752895591849160705"); + hashMap.put("users",arrayList); + }else if("计划审批二".equals(nextUserTaskName)){ + ArrayList 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 tasks= taskService.createTaskQuery() + .processInstanceId(processId).orderByTaskCreateTime().desc() + .list(); + //tasks.get(0).setAssignee("1748190800971665409"); + //如果为空或者小于等于0则证明没有可查看到的任务 + if (tasks == null||tasks.size()<=0) { + System.out.println("当前没有任务或者任务已执行完了"); + } + //查看所有走过的历史任务 + List 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 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 oriSequenceFlows = new ArrayList(); + oriSequenceFlows.addAll(flowNode.getOutgoingFlows()); + + //清理活动方向 + flowNode.getOutgoingFlows().clear(); + + //建立新方向 + List newSequenceFlowList = new ArrayList(); + 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 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 arrayList = new ArrayList<>(); + HashMap hashMap = new HashMap<>(); + //设置下一个节点处理人 + //使用角色查询 + arrayList.add(userId); + hashMap.put("users",arrayList); + taskService.complete(taskId,hashMap); + //恢复原方向 + flowNode.setOutgoingFlows(oriSequenceFlows); + } +} diff --git a/huzhou/src/main/java/org/jeecg/modules/huzhou/vo/ProjectApproveOV.java b/huzhou/src/main/java/org/jeecg/modules/huzhou/vo/ProjectApproveOV.java new file mode 100644 index 0000000..61d0d7d --- /dev/null +++ b/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; +} diff --git a/huzhou/src/main/resources/mapper/HuzhouUserprojectMapper.xml b/huzhou/src/main/resources/mapper/HuzhouUserprojectMapper.xml new file mode 100644 index 0000000..4a05c24 --- /dev/null +++ b/huzhou/src/main/resources/mapper/HuzhouUserprojectMapper.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/pom.xml b/jeecg-module-system/jeecg-system-biz/pom.xml index 31c7899..b044951 100644 --- a/jeecg-module-system/jeecg-system-biz/pom.xml +++ b/jeecg-module-system/jeecg-system-biz/pom.xml @@ -39,11 +39,15 @@ drag-free 1.0.2 - + + org.springframework.security + spring-security-core + + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java index a33f506..7b5fb98 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java +++ b/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 { +public interface ISysUserService extends IService, UserDetailsService { /** * 查询用户数据列表 diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java index bb64c87..0003506 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java +++ b/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 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 authorities = new ArrayList<>(); + User user = new User(sysUser.getUsername(), sysUser.getPassword(), authorities); + return user; + }else { + return null; + } + + } //======================================= end 用户与部门 用户列表导入 ========================================= } diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml b/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml index 288375b..2649774 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml +++ b/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: diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml b/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml index 092e517..caa4dd5 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml +++ b/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 diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/process/initiatesProjects.bpmn20.xml b/jeecg-module-system/jeecg-system-start/src/main/resources/process/initiatesProjects.bpmn20.xml new file mode 100644 index 0000000..cb85e58 --- /dev/null +++ b/jeecg-module-system/jeecg-system-start/src/main/resources/process/initiatesProjects.bpmn20.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + ${type==1} + + + ${type==0} + + + ${type==0} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/process/initiatesProjects.png b/jeecg-module-system/jeecg-system-start/src/main/resources/process/initiatesProjects.png new file mode 100644 index 0000000000000000000000000000000000000000..a17195e4f1bba051d6b7865a8d96fa95ffba3671 GIT binary patch literal 20124 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 LNkvXXu0mjfc0gd< literal 0 HcmV?d00001 diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/process/项目计划审批流程.bpmn20.xml b/jeecg-module-system/jeecg-system-start/src/main/resources/process/项目计划审批流程.bpmn20.xml new file mode 100644 index 0000000..6aaac69 --- /dev/null +++ b/jeecg-module-system/jeecg-system-start/src/main/resources/process/项目计划审批流程.bpmn20.xml @@ -0,0 +1,68 @@ + + + + + + + + + + ${type==1} + + + ${type==0} + + + + ${type==1} + + + ${type==0} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/process/项目计划审批流程.png b/jeecg-module-system/jeecg-system-start/src/main/resources/process/项目计划审批流程.png new file mode 100644 index 0000000000000000000000000000000000000000..0b3183ead40da0dc1988aa0c2efc295f72f0d16d GIT binary patch literal 18370 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 S{5t;6CCc*8 + + + + + + + + + + + + + ${type==1} + + + + ${type==0} + + + ${type==0} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/process/项目资料上传流程.png b/jeecg-module-system/jeecg-system-start/src/main/resources/process/项目资料上传流程.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc5e023e03aecb75610310be9051162d59d6130 GIT binary patch literal 17732 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

>5O(EuD16bF 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

=$|u%-4?k!bw-q9(OmPy)I*UkYbuqq$y~Y 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 nL(us@`Z)i`3IF-)CjP0|_Q 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 variables = new HashMap<>(); variables.put("type",1); + ArrayList 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 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 list = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(processinstanceid) + .orderByTaskCreateTime().asc().list(); + List> approvalEntityList = new ArrayList<>(); +// HashMap hashMap = new HashMap<>(); + String approvalSuggestion = ""; + Object approvalStatus = ""; + HistoricVariableInstance historicVariableInstance = null; + List commentList = null; + for(HistoricTaskInstance item : list){ + HashMap 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 tasks= taskService.createTaskQuery() + .processInstanceId(processId).orderByTaskCreateTime().desc() + .list(); + //tasks.get(0).setAssignee("1748190800971665409"); + //如果为空或者小于等于0则证明没有可查看到的任务 + if (tasks == null||tasks.size()<=0) { + System.out.println("当前没有任务或者任务已执行完了"); + } + //查看所有走过的历史任务 + List 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 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 oriSequenceFlows = new ArrayList(); + oriSequenceFlows.addAll(flowNode.getOutgoingFlows()); + + //清理活动方向 + flowNode.getOutgoingFlows().clear(); + + //建立新方向 + List newSequenceFlowList = new ArrayList(); + 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 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 arrayList = new ArrayList<>(); + HashMap 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); + } diff --git a/pom.xml b/pom.xml index ebe0a77..9481703 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 3.6.1 - 1.8 + 11 UTF-8 @@ -405,8 +405,8 @@ org.apache.maven.plugins maven-compiler-plugin - 1.8 - 1.8 + 11 + 11 UTF-8