diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java index 28cc433..e069520 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java @@ -14,6 +14,7 @@ String IN_APPROVED = "3"; //审批中 String PASSED = "4"; //已通过 String FAILED = "5"; //未通过 + String FAILED_REJECT = "8"; //未通过-驳回 String CANCELED = "6"; //已取消 String UN_DRAFT = "7"; //非草稿状态,仅在枚举中设置,字典中不设置 } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java index 28cc433..e069520 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java @@ -14,6 +14,7 @@ String IN_APPROVED = "3"; //审批中 String PASSED = "4"; //已通过 String FAILED = "5"; //未通过 + String FAILED_REJECT = "8"; //未通过-驳回 String CANCELED = "6"; //已取消 String UN_DRAFT = "7"; //非草稿状态,仅在枚举中设置,字典中不设置 } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java index 30f7f3d..3082a7f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java @@ -6,10 +6,11 @@ * @Date: 2022/12/27 16:00 */ public interface AssigneeSetTypeEnum { - //1指定成员 2主管 4发起人自选 5发起人自己 7连续多级主管 + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 Integer ASSIGN_USER = 1; Integer LEADER = 2; Integer SELF_SELECT = 4; Integer SELF = 5; Integer LEADER_TOP = 7; + Integer ROLE = 11; } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java index 28cc433..e069520 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java @@ -14,6 +14,7 @@ String IN_APPROVED = "3"; //审批中 String PASSED = "4"; //已通过 String FAILED = "5"; //未通过 + String FAILED_REJECT = "8"; //未通过-驳回 String CANCELED = "6"; //已取消 String UN_DRAFT = "7"; //非草稿状态,仅在枚举中设置,字典中不设置 } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java index 30f7f3d..3082a7f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java @@ -6,10 +6,11 @@ * @Date: 2022/12/27 16:00 */ public interface AssigneeSetTypeEnum { - //1指定成员 2主管 4发起人自选 5发起人自己 7连续多级主管 + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 Integer ASSIGN_USER = 1; Integer LEADER = 2; Integer SELF_SELECT = 4; Integer SELF = 5; Integer LEADER_TOP = 7; + Integer ROLE = 11; } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 938b88a..2ee2301 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -36,7 +36,7 @@ * 节点的开始和结束。 * 网关的开始和结束。 * 中间事件的开始和结束。 - * 开始时间结束或结束事件开始。 + * 开始事件结束或结束事件开始。 * @Author: wangpeng * @Date: 2022/12/27 9:54 */ @@ -84,7 +84,7 @@ Integer settype = nodeUserJsonObject.getInteger("settype"); if(!Objects.isNull(settype)){ //根据节点不同审批人类型分别进行处理 - if (AssigneeSetTypeEnum.ASSIGN_USER == settype) { + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); //所选审批人分类 Iterator iterator = nodeUserArray.stream().iterator(); diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java index 28cc433..e069520 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java @@ -14,6 +14,7 @@ String IN_APPROVED = "3"; //审批中 String PASSED = "4"; //已通过 String FAILED = "5"; //未通过 + String FAILED_REJECT = "8"; //未通过-驳回 String CANCELED = "6"; //已取消 String UN_DRAFT = "7"; //非草稿状态,仅在枚举中设置,字典中不设置 } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java index 30f7f3d..3082a7f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java @@ -6,10 +6,11 @@ * @Date: 2022/12/27 16:00 */ public interface AssigneeSetTypeEnum { - //1指定成员 2主管 4发起人自选 5发起人自己 7连续多级主管 + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 Integer ASSIGN_USER = 1; Integer LEADER = 2; Integer SELF_SELECT = 4; Integer SELF = 5; Integer LEADER_TOP = 7; + Integer ROLE = 11; } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 938b88a..2ee2301 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -36,7 +36,7 @@ * 节点的开始和结束。 * 网关的开始和结束。 * 中间事件的开始和结束。 - * 开始时间结束或结束事件开始。 + * 开始事件结束或结束事件开始。 * @Author: wangpeng * @Date: 2022/12/27 9:54 */ @@ -84,7 +84,7 @@ Integer settype = nodeUserJsonObject.getInteger("settype"); if(!Objects.isNull(settype)){ //根据节点不同审批人类型分别进行处理 - if (AssigneeSetTypeEnum.ASSIGN_USER == settype) { + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); //所选审批人分类 Iterator iterator = nodeUserArray.stream().iterator(); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java index 4fb4b6c..4b9a6df 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -43,12 +43,12 @@ public void notify(DelegateTask delegateTask) { //审批人为空,任务自动通过/自动驳回执行 //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); - - if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey)))) { + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { taskService.complete(delegateTask.getId()); //保证流程驳回到发起人后不自动审批通过 - redisUtil.set(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey), taskDefinitionKey); + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); } else { if ("100000".equals(delegateTask.getAssignee())) { Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java index 28cc433..e069520 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java @@ -14,6 +14,7 @@ String IN_APPROVED = "3"; //审批中 String PASSED = "4"; //已通过 String FAILED = "5"; //未通过 + String FAILED_REJECT = "8"; //未通过-驳回 String CANCELED = "6"; //已取消 String UN_DRAFT = "7"; //非草稿状态,仅在枚举中设置,字典中不设置 } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java index 30f7f3d..3082a7f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java @@ -6,10 +6,11 @@ * @Date: 2022/12/27 16:00 */ public interface AssigneeSetTypeEnum { - //1指定成员 2主管 4发起人自选 5发起人自己 7连续多级主管 + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 Integer ASSIGN_USER = 1; Integer LEADER = 2; Integer SELF_SELECT = 4; Integer SELF = 5; Integer LEADER_TOP = 7; + Integer ROLE = 11; } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 938b88a..2ee2301 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -36,7 +36,7 @@ * 节点的开始和结束。 * 网关的开始和结束。 * 中间事件的开始和结束。 - * 开始时间结束或结束事件开始。 + * 开始事件结束或结束事件开始。 * @Author: wangpeng * @Date: 2022/12/27 9:54 */ @@ -84,7 +84,7 @@ Integer settype = nodeUserJsonObject.getInteger("settype"); if(!Objects.isNull(settype)){ //根据节点不同审批人类型分别进行处理 - if (AssigneeSetTypeEnum.ASSIGN_USER == settype) { + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); //所选审批人分类 Iterator iterator = nodeUserArray.stream().iterator(); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java index 4fb4b6c..4b9a6df 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -43,12 +43,12 @@ public void notify(DelegateTask delegateTask) { //审批人为空,任务自动通过/自动驳回执行 //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); - - if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey)))) { + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { taskService.complete(delegateTask.getId()); //保证流程驳回到发起人后不自动审批通过 - redisUtil.set(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey), taskDefinitionKey); + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); } else { if ("100000".equals(delegateTask.getAssignee())) { Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 diff --git a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java index 8d9482f..b7711b8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java @@ -6,5 +6,5 @@ * @Date: 2022/8/8 10:26 */ public interface CacheKeys { - String TASK_DEFINITION_KEY = "missiles:metering:taskDefinitionKey:{0}"; + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java index 28cc433..e069520 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java @@ -14,6 +14,7 @@ String IN_APPROVED = "3"; //审批中 String PASSED = "4"; //已通过 String FAILED = "5"; //未通过 + String FAILED_REJECT = "8"; //未通过-驳回 String CANCELED = "6"; //已取消 String UN_DRAFT = "7"; //非草稿状态,仅在枚举中设置,字典中不设置 } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java index 30f7f3d..3082a7f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java @@ -6,10 +6,11 @@ * @Date: 2022/12/27 16:00 */ public interface AssigneeSetTypeEnum { - //1指定成员 2主管 4发起人自选 5发起人自己 7连续多级主管 + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 Integer ASSIGN_USER = 1; Integer LEADER = 2; Integer SELF_SELECT = 4; Integer SELF = 5; Integer LEADER_TOP = 7; + Integer ROLE = 11; } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 938b88a..2ee2301 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -36,7 +36,7 @@ * 节点的开始和结束。 * 网关的开始和结束。 * 中间事件的开始和结束。 - * 开始时间结束或结束事件开始。 + * 开始事件结束或结束事件开始。 * @Author: wangpeng * @Date: 2022/12/27 9:54 */ @@ -84,7 +84,7 @@ Integer settype = nodeUserJsonObject.getInteger("settype"); if(!Objects.isNull(settype)){ //根据节点不同审批人类型分别进行处理 - if (AssigneeSetTypeEnum.ASSIGN_USER == settype) { + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); //所选审批人分类 Iterator iterator = nodeUserArray.stream().iterator(); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java index 4fb4b6c..4b9a6df 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -43,12 +43,12 @@ public void notify(DelegateTask delegateTask) { //审批人为空,任务自动通过/自动驳回执行 //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); - - if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey)))) { + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { taskService.complete(delegateTask.getId()); //保证流程驳回到发起人后不自动审批通过 - redisUtil.set(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey), taskDefinitionKey); + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); } else { if ("100000".equals(delegateTask.getAssignee())) { Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 diff --git a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java index 8d9482f..b7711b8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java @@ -6,5 +6,5 @@ * @Date: 2022/8/8 10:26 */ public interface CacheKeys { - String TASK_DEFINITION_KEY = "missiles:metering:taskDefinitionKey:{0}"; + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; } diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java index 30b8331..5494aca 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -16,4 +16,6 @@ List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java index 28cc433..e069520 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java @@ -14,6 +14,7 @@ String IN_APPROVED = "3"; //审批中 String PASSED = "4"; //已通过 String FAILED = "5"; //未通过 + String FAILED_REJECT = "8"; //未通过-驳回 String CANCELED = "6"; //已取消 String UN_DRAFT = "7"; //非草稿状态,仅在枚举中设置,字典中不设置 } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java index 30f7f3d..3082a7f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java @@ -6,10 +6,11 @@ * @Date: 2022/12/27 16:00 */ public interface AssigneeSetTypeEnum { - //1指定成员 2主管 4发起人自选 5发起人自己 7连续多级主管 + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 Integer ASSIGN_USER = 1; Integer LEADER = 2; Integer SELF_SELECT = 4; Integer SELF = 5; Integer LEADER_TOP = 7; + Integer ROLE = 11; } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 938b88a..2ee2301 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -36,7 +36,7 @@ * 节点的开始和结束。 * 网关的开始和结束。 * 中间事件的开始和结束。 - * 开始时间结束或结束事件开始。 + * 开始事件结束或结束事件开始。 * @Author: wangpeng * @Date: 2022/12/27 9:54 */ @@ -84,7 +84,7 @@ Integer settype = nodeUserJsonObject.getInteger("settype"); if(!Objects.isNull(settype)){ //根据节点不同审批人类型分别进行处理 - if (AssigneeSetTypeEnum.ASSIGN_USER == settype) { + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); //所选审批人分类 Iterator iterator = nodeUserArray.stream().iterator(); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java index 4fb4b6c..4b9a6df 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -43,12 +43,12 @@ public void notify(DelegateTask delegateTask) { //审批人为空,任务自动通过/自动驳回执行 //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); - - if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey)))) { + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { taskService.complete(delegateTask.getId()); //保证流程驳回到发起人后不自动审批通过 - redisUtil.set(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey), taskDefinitionKey); + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); } else { if ("100000".equals(delegateTask.getAssignee())) { Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 diff --git a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java index 8d9482f..b7711b8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java @@ -6,5 +6,5 @@ * @Date: 2022/8/8 10:26 */ public interface CacheKeys { - String TASK_DEFINITION_KEY = "missiles:metering:taskDefinitionKey:{0}"; + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; } diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java index 30b8331..5494aca 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -16,4 +16,6 @@ List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); } diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml index 2afb680..ad39ecd 100644 --- a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -72,8 +72,8 @@ su.name as directorName FROM ACT_RE_PROCDEF rp LEFT JOIN ACT_RE_DEPLOYMENT rd ON rp.deployment_id_ = rd.id_ - - INNER JOIN (SELECT max(arp.deployment_id_) AS deployment_id_ FROM ACT_RE_PROCDEF arp GROUP BY arp.key_) c ON rp.deployment_id_ = c.deployment_id_ + + LEFT JOIN system_flow_form sff ON sff.deploy_id = rd.id_ LEFT JOIN sys_user su ON su.id = rd.tenant_id_ WHERE sff.is_del = 0 @@ -92,12 +92,44 @@ and rp.suspension_state_ = #{request.suspensionState} - - and rd.tenant_id_ = #{request.directorId} + + and su.name like concat('%',#{request.directorName},'%') - - and rd.deploy_time_ <= #{request.deploymentTime} + + and rd.deploy_time_ >= #{request.deploymentStartTime} + + and rd.deploy_time_ <= #{request.deploymentEndTime} + + order by rd.deploy_time_ desc + + + diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java index 28cc433..e069520 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java @@ -14,6 +14,7 @@ String IN_APPROVED = "3"; //审批中 String PASSED = "4"; //已通过 String FAILED = "5"; //未通过 + String FAILED_REJECT = "8"; //未通过-驳回 String CANCELED = "6"; //已取消 String UN_DRAFT = "7"; //非草稿状态,仅在枚举中设置,字典中不设置 } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java index 30f7f3d..3082a7f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java @@ -6,10 +6,11 @@ * @Date: 2022/12/27 16:00 */ public interface AssigneeSetTypeEnum { - //1指定成员 2主管 4发起人自选 5发起人自己 7连续多级主管 + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 Integer ASSIGN_USER = 1; Integer LEADER = 2; Integer SELF_SELECT = 4; Integer SELF = 5; Integer LEADER_TOP = 7; + Integer ROLE = 11; } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 938b88a..2ee2301 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -36,7 +36,7 @@ * 节点的开始和结束。 * 网关的开始和结束。 * 中间事件的开始和结束。 - * 开始时间结束或结束事件开始。 + * 开始事件结束或结束事件开始。 * @Author: wangpeng * @Date: 2022/12/27 9:54 */ @@ -84,7 +84,7 @@ Integer settype = nodeUserJsonObject.getInteger("settype"); if(!Objects.isNull(settype)){ //根据节点不同审批人类型分别进行处理 - if (AssigneeSetTypeEnum.ASSIGN_USER == settype) { + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); //所选审批人分类 Iterator iterator = nodeUserArray.stream().iterator(); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java index 4fb4b6c..4b9a6df 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -43,12 +43,12 @@ public void notify(DelegateTask delegateTask) { //审批人为空,任务自动通过/自动驳回执行 //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); - - if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey)))) { + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { taskService.complete(delegateTask.getId()); //保证流程驳回到发起人后不自动审批通过 - redisUtil.set(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey), taskDefinitionKey); + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); } else { if ("100000".equals(delegateTask.getAssignee())) { Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 diff --git a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java index 8d9482f..b7711b8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java @@ -6,5 +6,5 @@ * @Date: 2022/8/8 10:26 */ public interface CacheKeys { - String TASK_DEFINITION_KEY = "missiles:metering:taskDefinitionKey:{0}"; + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; } diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java index 30b8331..5494aca 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -16,4 +16,6 @@ List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); } diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml index 2afb680..ad39ecd 100644 --- a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -72,8 +72,8 @@ su.name as directorName FROM ACT_RE_PROCDEF rp LEFT JOIN ACT_RE_DEPLOYMENT rd ON rp.deployment_id_ = rd.id_ - - INNER JOIN (SELECT max(arp.deployment_id_) AS deployment_id_ FROM ACT_RE_PROCDEF arp GROUP BY arp.key_) c ON rp.deployment_id_ = c.deployment_id_ + + LEFT JOIN system_flow_form sff ON sff.deploy_id = rd.id_ LEFT JOIN sys_user su ON su.id = rd.tenant_id_ WHERE sff.is_del = 0 @@ -92,12 +92,44 @@ and rp.suspension_state_ = #{request.suspensionState} - - and rd.tenant_id_ = #{request.directorId} + + and su.name like concat('%',#{request.directorName},'%') - - and rd.deploy_time_ <= #{request.deploymentTime} + + and rd.deploy_time_ >= #{request.deploymentStartTime} + + and rd.deploy_time_ <= #{request.deploymentEndTime} + + order by rd.deploy_time_ desc + + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java index 6ed94f1..bae35e5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + /** * @Description: 流程定义列表请求实体 * @Author: wangpeng @@ -53,4 +55,7 @@ @ApiModelProperty("部署时间(结束)") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java index 28cc433..e069520 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java @@ -14,6 +14,7 @@ String IN_APPROVED = "3"; //审批中 String PASSED = "4"; //已通过 String FAILED = "5"; //未通过 + String FAILED_REJECT = "8"; //未通过-驳回 String CANCELED = "6"; //已取消 String UN_DRAFT = "7"; //非草稿状态,仅在枚举中设置,字典中不设置 } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java index 30f7f3d..3082a7f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java @@ -6,10 +6,11 @@ * @Date: 2022/12/27 16:00 */ public interface AssigneeSetTypeEnum { - //1指定成员 2主管 4发起人自选 5发起人自己 7连续多级主管 + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 Integer ASSIGN_USER = 1; Integer LEADER = 2; Integer SELF_SELECT = 4; Integer SELF = 5; Integer LEADER_TOP = 7; + Integer ROLE = 11; } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 938b88a..2ee2301 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -36,7 +36,7 @@ * 节点的开始和结束。 * 网关的开始和结束。 * 中间事件的开始和结束。 - * 开始时间结束或结束事件开始。 + * 开始事件结束或结束事件开始。 * @Author: wangpeng * @Date: 2022/12/27 9:54 */ @@ -84,7 +84,7 @@ Integer settype = nodeUserJsonObject.getInteger("settype"); if(!Objects.isNull(settype)){ //根据节点不同审批人类型分别进行处理 - if (AssigneeSetTypeEnum.ASSIGN_USER == settype) { + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); //所选审批人分类 Iterator iterator = nodeUserArray.stream().iterator(); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java index 4fb4b6c..4b9a6df 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -43,12 +43,12 @@ public void notify(DelegateTask delegateTask) { //审批人为空,任务自动通过/自动驳回执行 //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); - - if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey)))) { + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { taskService.complete(delegateTask.getId()); //保证流程驳回到发起人后不自动审批通过 - redisUtil.set(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey), taskDefinitionKey); + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); } else { if ("100000".equals(delegateTask.getAssignee())) { Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 diff --git a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java index 8d9482f..b7711b8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java @@ -6,5 +6,5 @@ * @Date: 2022/8/8 10:26 */ public interface CacheKeys { - String TASK_DEFINITION_KEY = "missiles:metering:taskDefinitionKey:{0}"; + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; } diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java index 30b8331..5494aca 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -16,4 +16,6 @@ List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); } diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml index 2afb680..ad39ecd 100644 --- a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -72,8 +72,8 @@ su.name as directorName FROM ACT_RE_PROCDEF rp LEFT JOIN ACT_RE_DEPLOYMENT rd ON rp.deployment_id_ = rd.id_ - - INNER JOIN (SELECT max(arp.deployment_id_) AS deployment_id_ FROM ACT_RE_PROCDEF arp GROUP BY arp.key_) c ON rp.deployment_id_ = c.deployment_id_ + + LEFT JOIN system_flow_form sff ON sff.deploy_id = rd.id_ LEFT JOIN sys_user su ON su.id = rd.tenant_id_ WHERE sff.is_del = 0 @@ -92,12 +92,44 @@ and rp.suspension_state_ = #{request.suspensionState} - - and rd.tenant_id_ = #{request.directorId} + + and su.name like concat('%',#{request.directorName},'%') - - and rd.deploy_time_ <= #{request.deploymentTime} + + and rd.deploy_time_ >= #{request.deploymentStartTime} + + and rd.deploy_time_ <= #{request.deploymentEndTime} + + order by rd.deploy_time_ desc + + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java index 6ed94f1..bae35e5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + /** * @Description: 流程定义列表请求实体 * @Author: wangpeng @@ -53,4 +55,7 @@ @ApiModelProperty("部署时间(结束)") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java index 32d783f..acdf7d0 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -18,8 +18,8 @@ /** *

流程定义列表实体类

*/ -@ColumnWidth(30) -@HeadRowHeight(15) +@ColumnWidth(35) +@HeadRowHeight(20) @ContentRowHeight(20) @ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) @ExcelIgnoreUnannotated diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java index 28cc433..e069520 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java @@ -14,6 +14,7 @@ String IN_APPROVED = "3"; //审批中 String PASSED = "4"; //已通过 String FAILED = "5"; //未通过 + String FAILED_REJECT = "8"; //未通过-驳回 String CANCELED = "6"; //已取消 String UN_DRAFT = "7"; //非草稿状态,仅在枚举中设置,字典中不设置 } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java index 30f7f3d..3082a7f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java @@ -6,10 +6,11 @@ * @Date: 2022/12/27 16:00 */ public interface AssigneeSetTypeEnum { - //1指定成员 2主管 4发起人自选 5发起人自己 7连续多级主管 + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 Integer ASSIGN_USER = 1; Integer LEADER = 2; Integer SELF_SELECT = 4; Integer SELF = 5; Integer LEADER_TOP = 7; + Integer ROLE = 11; } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 938b88a..2ee2301 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -36,7 +36,7 @@ * 节点的开始和结束。 * 网关的开始和结束。 * 中间事件的开始和结束。 - * 开始时间结束或结束事件开始。 + * 开始事件结束或结束事件开始。 * @Author: wangpeng * @Date: 2022/12/27 9:54 */ @@ -84,7 +84,7 @@ Integer settype = nodeUserJsonObject.getInteger("settype"); if(!Objects.isNull(settype)){ //根据节点不同审批人类型分别进行处理 - if (AssigneeSetTypeEnum.ASSIGN_USER == settype) { + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); //所选审批人分类 Iterator iterator = nodeUserArray.stream().iterator(); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java index 4fb4b6c..4b9a6df 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -43,12 +43,12 @@ public void notify(DelegateTask delegateTask) { //审批人为空,任务自动通过/自动驳回执行 //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); - - if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey)))) { + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { taskService.complete(delegateTask.getId()); //保证流程驳回到发起人后不自动审批通过 - redisUtil.set(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey), taskDefinitionKey); + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); } else { if ("100000".equals(delegateTask.getAssignee())) { Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 diff --git a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java index 8d9482f..b7711b8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java @@ -6,5 +6,5 @@ * @Date: 2022/8/8 10:26 */ public interface CacheKeys { - String TASK_DEFINITION_KEY = "missiles:metering:taskDefinitionKey:{0}"; + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; } diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java index 30b8331..5494aca 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -16,4 +16,6 @@ List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); } diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml index 2afb680..ad39ecd 100644 --- a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -72,8 +72,8 @@ su.name as directorName FROM ACT_RE_PROCDEF rp LEFT JOIN ACT_RE_DEPLOYMENT rd ON rp.deployment_id_ = rd.id_ - - INNER JOIN (SELECT max(arp.deployment_id_) AS deployment_id_ FROM ACT_RE_PROCDEF arp GROUP BY arp.key_) c ON rp.deployment_id_ = c.deployment_id_ + + LEFT JOIN system_flow_form sff ON sff.deploy_id = rd.id_ LEFT JOIN sys_user su ON su.id = rd.tenant_id_ WHERE sff.is_del = 0 @@ -92,12 +92,44 @@ and rp.suspension_state_ = #{request.suspensionState} - - and rd.tenant_id_ = #{request.directorId} + + and su.name like concat('%',#{request.directorName},'%') - - and rd.deploy_time_ <= #{request.deploymentTime} + + and rd.deploy_time_ >= #{request.deploymentStartTime} + + and rd.deploy_time_ <= #{request.deploymentEndTime} + + order by rd.deploy_time_ desc + + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java index 6ed94f1..bae35e5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + /** * @Description: 流程定义列表请求实体 * @Author: wangpeng @@ -53,4 +55,7 @@ @ApiModelProperty("部署时间(结束)") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java index 32d783f..acdf7d0 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -18,8 +18,8 @@ /** *

流程定义列表实体类

*/ -@ColumnWidth(30) -@HeadRowHeight(15) +@ColumnWidth(35) +@HeadRowHeight(20) @ContentRowHeight(20) @ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) @ExcelIgnoreUnannotated diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java index f53eeb5..b32478b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java @@ -23,4 +23,6 @@ List getFailedList(String formId); List getCanceledList(String formId); + + List getFailedRejectList(String formId); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java index 28cc433..e069520 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java @@ -14,6 +14,7 @@ String IN_APPROVED = "3"; //审批中 String PASSED = "4"; //已通过 String FAILED = "5"; //未通过 + String FAILED_REJECT = "8"; //未通过-驳回 String CANCELED = "6"; //已取消 String UN_DRAFT = "7"; //非草稿状态,仅在枚举中设置,字典中不设置 } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java index 30f7f3d..3082a7f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java @@ -6,10 +6,11 @@ * @Date: 2022/12/27 16:00 */ public interface AssigneeSetTypeEnum { - //1指定成员 2主管 4发起人自选 5发起人自己 7连续多级主管 + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 Integer ASSIGN_USER = 1; Integer LEADER = 2; Integer SELF_SELECT = 4; Integer SELF = 5; Integer LEADER_TOP = 7; + Integer ROLE = 11; } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 938b88a..2ee2301 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -36,7 +36,7 @@ * 节点的开始和结束。 * 网关的开始和结束。 * 中间事件的开始和结束。 - * 开始时间结束或结束事件开始。 + * 开始事件结束或结束事件开始。 * @Author: wangpeng * @Date: 2022/12/27 9:54 */ @@ -84,7 +84,7 @@ Integer settype = nodeUserJsonObject.getInteger("settype"); if(!Objects.isNull(settype)){ //根据节点不同审批人类型分别进行处理 - if (AssigneeSetTypeEnum.ASSIGN_USER == settype) { + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); //所选审批人分类 Iterator iterator = nodeUserArray.stream().iterator(); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java index 4fb4b6c..4b9a6df 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -43,12 +43,12 @@ public void notify(DelegateTask delegateTask) { //审批人为空,任务自动通过/自动驳回执行 //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); - - if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey)))) { + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { taskService.complete(delegateTask.getId()); //保证流程驳回到发起人后不自动审批通过 - redisUtil.set(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey), taskDefinitionKey); + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); } else { if ("100000".equals(delegateTask.getAssignee())) { Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 diff --git a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java index 8d9482f..b7711b8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java @@ -6,5 +6,5 @@ * @Date: 2022/8/8 10:26 */ public interface CacheKeys { - String TASK_DEFINITION_KEY = "missiles:metering:taskDefinitionKey:{0}"; + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; } diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java index 30b8331..5494aca 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -16,4 +16,6 @@ List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); } diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml index 2afb680..ad39ecd 100644 --- a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -72,8 +72,8 @@ su.name as directorName FROM ACT_RE_PROCDEF rp LEFT JOIN ACT_RE_DEPLOYMENT rd ON rp.deployment_id_ = rd.id_ - - INNER JOIN (SELECT max(arp.deployment_id_) AS deployment_id_ FROM ACT_RE_PROCDEF arp GROUP BY arp.key_) c ON rp.deployment_id_ = c.deployment_id_ + + LEFT JOIN system_flow_form sff ON sff.deploy_id = rd.id_ LEFT JOIN sys_user su ON su.id = rd.tenant_id_ WHERE sff.is_del = 0 @@ -92,12 +92,44 @@ and rp.suspension_state_ = #{request.suspensionState} - - and rd.tenant_id_ = #{request.directorId} + + and su.name like concat('%',#{request.directorName},'%') - - and rd.deploy_time_ <= #{request.deploymentTime} + + and rd.deploy_time_ >= #{request.deploymentStartTime} + + and rd.deploy_time_ <= #{request.deploymentEndTime} + + order by rd.deploy_time_ desc + + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java index 6ed94f1..bae35e5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + /** * @Description: 流程定义列表请求实体 * @Author: wangpeng @@ -53,4 +55,7 @@ @ApiModelProperty("部署时间(结束)") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java index 32d783f..acdf7d0 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -18,8 +18,8 @@ /** *

流程定义列表实体类

*/ -@ColumnWidth(30) -@HeadRowHeight(15) +@ColumnWidth(35) +@HeadRowHeight(20) @ContentRowHeight(20) @ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) @ExcelIgnoreUnannotated diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java index f53eeb5..b32478b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java @@ -23,4 +23,6 @@ List getFailedList(String formId); List getCanceledList(String formId); + + List getFailedRejectList(String formId); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java index 67b11d2..bf83b75 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java @@ -108,9 +108,10 @@ List historicProcessInstances = new ArrayList<>(); //管理员or其他用户 if(ShiroKit.isAdmin()){ - //根据业务状态、流程定义查询该业务所有未通过的流程实例-拒绝 + //根据业务状态、流程定义查询该业务所有已取消的流程实例-拒绝 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .deleted() //拒绝的要执行删除操作,也要设置业务状态,此处可同时设置为条件进行查询 .processInstanceBusinessStatus(ApprovalStatusEnum.CANCELED) //对应取消按钮中设置的业务状态 .orderByProcessInstanceStartTime().desc() @@ -122,7 +123,8 @@ }); //根据业务状态、流程定义、登录用户id查询该业务已取消的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .startedBy(String.valueOf(user.getId())) .processInstanceBusinessStatus(ApprovalStatusEnum.CANCELED) .orderByProcessInstanceStartTime().desc() @@ -146,8 +148,9 @@ if(ShiroKit.isAdmin()){ //根据业务状态、流程定义查询该业务所有未通过的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) -// .deleted() //拒绝的审批流程要执行删除操作,也要设置业务状态,所以使用下行的状态可满足拒绝和驳回的查询 + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) +// .deleted() //拒绝的审批流程要执行删除操作,也要设置业务状态,所以使用下行的状态可满足拒绝的查询 .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED) //todo:拒绝按钮已增加业务状态,需验证不加deleted查询的是未删除的还是所有的 .orderByProcessInstanceStartTime().desc() .list(); @@ -158,14 +161,16 @@ }); //根据业务状态、流程定义、登录用户id查询该业务未通过的流程实例(作为发起者) historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .startedBy(String.valueOf(user.getId())) .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED) .orderByProcessInstanceStartTime().desc() .list(); //根据业务状态、流程定义、登录用户id获取该业务的未通过的流程实例的审批者已完成任务(作为审批者) List tasks = historyService.createHistoricTaskInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) .finished() //审批者已完成审批 .processUnfinished() //todo:此参数若表示实例未完成,则这里使用正确,需验证 @@ -182,7 +187,60 @@ } List businessKeys = historicProcessInstances.stream().map(HistoricProcessInstance::getBusinessKey).collect(Collectors.toList()); return businessKeys; + } + @Override + public List getFailedRejectList(String formId) { + //根据业务表单id获取流程定义 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm flowForm = flowFormService.getOne(wrapper); + if (Objects.isNull(flowForm) || StringUtils.isEmpty(flowForm.getDeployId()) || StringUtils.isEmpty(flowForm.getProcDefId())) { + log.error("查询未通过-驳回的流程,该表单不存在对应的流程定义,formId:{}", formId); + return new ArrayList<>(); + } + List historicProcessInstances = new ArrayList<>(); + //管理员or其他用户 + if(ShiroKit.isAdmin()){ + //根据业务状态、流程定义查询该业务所有未通过的流程实例 + historicProcessInstances = historyService.createHistoricProcessInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .orderByProcessInstanceStartTime().desc() + .list(); + }else{ + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + //根据业务状态、流程定义、登录用户id查询该业务未通过的流程实例(作为发起者) + historicProcessInstances = historyService.createHistoricProcessInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) + .startedBy(String.valueOf(user.getId())) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .orderByProcessInstanceStartTime().desc() + .list(); + //根据业务状态、流程定义、登录用户id获取该业务的未通过的流程实例的审批者已完成任务(作为审批者) + List tasks = historyService.createHistoricTaskInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) + .taskAssignee(String.valueOf(user.getId())) + .finished() //审批者已完成审批 + .processUnfinished() //todo:此参数若表示实例未完成,则这里使用正确,需验证 + .orderByTaskCreateTime().desc() + .list(); + //根据作为审批者的任务查询未通过的流程实例 + for (HistoricTaskInstance task : tasks) { + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .singleResult(); + historicProcessInstances.add(historicProcessInstance); + } + } + List businessKeys = historicProcessInstances.stream().map(HistoricProcessInstance::getBusinessKey).collect(Collectors.toList()); + return businessKeys; } public List getPassedList(String formId) { @@ -199,8 +257,10 @@ if(ShiroKit.isAdmin()){ //根据流程定义查询该业务所有已完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .finished() + .notDeleted() .orderByProcessInstanceStartTime().desc() .list(); }else{ @@ -210,14 +270,17 @@ }); //根据流程定义、登录用户id查询该业务已完成的流程实例(作为发起者) historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .finished() + .notDeleted() .startedBy(String.valueOf(user.getId())) .orderByProcessInstanceStartTime().desc() .list(); //根据流程定义、登录用户id获取该业务流程的实例结束的已办任务(作为审批者) List tasks = historyService.createHistoricTaskInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) .processFinished() //todo:此参数若表示实例已完成,则这里使用正确,需验证 .orderByTaskCreateTime().desc() @@ -225,6 +288,7 @@ //根据作为审批者的任务查询流程实例 for (HistoricTaskInstance task : tasks) { HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .notDeleted() .processInstanceId(task.getProcessInstanceId()).singleResult(); historicProcessInstances.add(historicProcessInstance); } @@ -247,7 +311,8 @@ if(ShiroKit.isAdmin()){ //根据流程定义查询该业务所有未完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) //这里使用流程定义,因为更新流程定义不会更新定义id,会更新部署id +// .deploymentId(flowForm.getDeployId()) .or() .unfinished() .processInstanceBusinessStatus(ApprovalStatusEnum.IN_APPROVED) //查询审批中状态,因为驳回后的编辑操作中设置为该状态 @@ -261,7 +326,8 @@ }); //根据流程定义、登录用户id查询该业务未完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .or() .unfinished() .processInstanceBusinessStatus(ApprovalStatusEnum.IN_APPROVED) //查询审批中状态,因为驳回后的编辑操作中设置为该状态 @@ -289,7 +355,8 @@ }); //根据流程定义、登录用户id获取该业务待办任务 List tasks = taskService.createTaskQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) // .includeProcessVariables() .orderByTaskCreateTime().desc() diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java index 28cc433..e069520 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java @@ -14,6 +14,7 @@ String IN_APPROVED = "3"; //审批中 String PASSED = "4"; //已通过 String FAILED = "5"; //未通过 + String FAILED_REJECT = "8"; //未通过-驳回 String CANCELED = "6"; //已取消 String UN_DRAFT = "7"; //非草稿状态,仅在枚举中设置,字典中不设置 } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java index 30f7f3d..3082a7f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java @@ -6,10 +6,11 @@ * @Date: 2022/12/27 16:00 */ public interface AssigneeSetTypeEnum { - //1指定成员 2主管 4发起人自选 5发起人自己 7连续多级主管 + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 Integer ASSIGN_USER = 1; Integer LEADER = 2; Integer SELF_SELECT = 4; Integer SELF = 5; Integer LEADER_TOP = 7; + Integer ROLE = 11; } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 938b88a..2ee2301 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -36,7 +36,7 @@ * 节点的开始和结束。 * 网关的开始和结束。 * 中间事件的开始和结束。 - * 开始时间结束或结束事件开始。 + * 开始事件结束或结束事件开始。 * @Author: wangpeng * @Date: 2022/12/27 9:54 */ @@ -84,7 +84,7 @@ Integer settype = nodeUserJsonObject.getInteger("settype"); if(!Objects.isNull(settype)){ //根据节点不同审批人类型分别进行处理 - if (AssigneeSetTypeEnum.ASSIGN_USER == settype) { + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); //所选审批人分类 Iterator iterator = nodeUserArray.stream().iterator(); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java index 4fb4b6c..4b9a6df 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -43,12 +43,12 @@ public void notify(DelegateTask delegateTask) { //审批人为空,任务自动通过/自动驳回执行 //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); - - if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey)))) { + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { taskService.complete(delegateTask.getId()); //保证流程驳回到发起人后不自动审批通过 - redisUtil.set(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey), taskDefinitionKey); + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); } else { if ("100000".equals(delegateTask.getAssignee())) { Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 diff --git a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java index 8d9482f..b7711b8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java @@ -6,5 +6,5 @@ * @Date: 2022/8/8 10:26 */ public interface CacheKeys { - String TASK_DEFINITION_KEY = "missiles:metering:taskDefinitionKey:{0}"; + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; } diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java index 30b8331..5494aca 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -16,4 +16,6 @@ List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); } diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml index 2afb680..ad39ecd 100644 --- a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -72,8 +72,8 @@ su.name as directorName FROM ACT_RE_PROCDEF rp LEFT JOIN ACT_RE_DEPLOYMENT rd ON rp.deployment_id_ = rd.id_ - - INNER JOIN (SELECT max(arp.deployment_id_) AS deployment_id_ FROM ACT_RE_PROCDEF arp GROUP BY arp.key_) c ON rp.deployment_id_ = c.deployment_id_ + + LEFT JOIN system_flow_form sff ON sff.deploy_id = rd.id_ LEFT JOIN sys_user su ON su.id = rd.tenant_id_ WHERE sff.is_del = 0 @@ -92,12 +92,44 @@ and rp.suspension_state_ = #{request.suspensionState} - - and rd.tenant_id_ = #{request.directorId} + + and su.name like concat('%',#{request.directorName},'%') - - and rd.deploy_time_ <= #{request.deploymentTime} + + and rd.deploy_time_ >= #{request.deploymentStartTime} + + and rd.deploy_time_ <= #{request.deploymentEndTime} + + order by rd.deploy_time_ desc + + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java index 6ed94f1..bae35e5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + /** * @Description: 流程定义列表请求实体 * @Author: wangpeng @@ -53,4 +55,7 @@ @ApiModelProperty("部署时间(结束)") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java index 32d783f..acdf7d0 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -18,8 +18,8 @@ /** *

流程定义列表实体类

*/ -@ColumnWidth(30) -@HeadRowHeight(15) +@ColumnWidth(35) +@HeadRowHeight(20) @ContentRowHeight(20) @ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) @ExcelIgnoreUnannotated diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java index f53eeb5..b32478b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java @@ -23,4 +23,6 @@ List getFailedList(String formId); List getCanceledList(String formId); + + List getFailedRejectList(String formId); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java index 67b11d2..bf83b75 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java @@ -108,9 +108,10 @@ List historicProcessInstances = new ArrayList<>(); //管理员or其他用户 if(ShiroKit.isAdmin()){ - //根据业务状态、流程定义查询该业务所有未通过的流程实例-拒绝 + //根据业务状态、流程定义查询该业务所有已取消的流程实例-拒绝 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .deleted() //拒绝的要执行删除操作,也要设置业务状态,此处可同时设置为条件进行查询 .processInstanceBusinessStatus(ApprovalStatusEnum.CANCELED) //对应取消按钮中设置的业务状态 .orderByProcessInstanceStartTime().desc() @@ -122,7 +123,8 @@ }); //根据业务状态、流程定义、登录用户id查询该业务已取消的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .startedBy(String.valueOf(user.getId())) .processInstanceBusinessStatus(ApprovalStatusEnum.CANCELED) .orderByProcessInstanceStartTime().desc() @@ -146,8 +148,9 @@ if(ShiroKit.isAdmin()){ //根据业务状态、流程定义查询该业务所有未通过的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) -// .deleted() //拒绝的审批流程要执行删除操作,也要设置业务状态,所以使用下行的状态可满足拒绝和驳回的查询 + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) +// .deleted() //拒绝的审批流程要执行删除操作,也要设置业务状态,所以使用下行的状态可满足拒绝的查询 .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED) //todo:拒绝按钮已增加业务状态,需验证不加deleted查询的是未删除的还是所有的 .orderByProcessInstanceStartTime().desc() .list(); @@ -158,14 +161,16 @@ }); //根据业务状态、流程定义、登录用户id查询该业务未通过的流程实例(作为发起者) historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .startedBy(String.valueOf(user.getId())) .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED) .orderByProcessInstanceStartTime().desc() .list(); //根据业务状态、流程定义、登录用户id获取该业务的未通过的流程实例的审批者已完成任务(作为审批者) List tasks = historyService.createHistoricTaskInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) .finished() //审批者已完成审批 .processUnfinished() //todo:此参数若表示实例未完成,则这里使用正确,需验证 @@ -182,7 +187,60 @@ } List businessKeys = historicProcessInstances.stream().map(HistoricProcessInstance::getBusinessKey).collect(Collectors.toList()); return businessKeys; + } + @Override + public List getFailedRejectList(String formId) { + //根据业务表单id获取流程定义 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm flowForm = flowFormService.getOne(wrapper); + if (Objects.isNull(flowForm) || StringUtils.isEmpty(flowForm.getDeployId()) || StringUtils.isEmpty(flowForm.getProcDefId())) { + log.error("查询未通过-驳回的流程,该表单不存在对应的流程定义,formId:{}", formId); + return new ArrayList<>(); + } + List historicProcessInstances = new ArrayList<>(); + //管理员or其他用户 + if(ShiroKit.isAdmin()){ + //根据业务状态、流程定义查询该业务所有未通过的流程实例 + historicProcessInstances = historyService.createHistoricProcessInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .orderByProcessInstanceStartTime().desc() + .list(); + }else{ + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + //根据业务状态、流程定义、登录用户id查询该业务未通过的流程实例(作为发起者) + historicProcessInstances = historyService.createHistoricProcessInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) + .startedBy(String.valueOf(user.getId())) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .orderByProcessInstanceStartTime().desc() + .list(); + //根据业务状态、流程定义、登录用户id获取该业务的未通过的流程实例的审批者已完成任务(作为审批者) + List tasks = historyService.createHistoricTaskInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) + .taskAssignee(String.valueOf(user.getId())) + .finished() //审批者已完成审批 + .processUnfinished() //todo:此参数若表示实例未完成,则这里使用正确,需验证 + .orderByTaskCreateTime().desc() + .list(); + //根据作为审批者的任务查询未通过的流程实例 + for (HistoricTaskInstance task : tasks) { + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .singleResult(); + historicProcessInstances.add(historicProcessInstance); + } + } + List businessKeys = historicProcessInstances.stream().map(HistoricProcessInstance::getBusinessKey).collect(Collectors.toList()); + return businessKeys; } public List getPassedList(String formId) { @@ -199,8 +257,10 @@ if(ShiroKit.isAdmin()){ //根据流程定义查询该业务所有已完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .finished() + .notDeleted() .orderByProcessInstanceStartTime().desc() .list(); }else{ @@ -210,14 +270,17 @@ }); //根据流程定义、登录用户id查询该业务已完成的流程实例(作为发起者) historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .finished() + .notDeleted() .startedBy(String.valueOf(user.getId())) .orderByProcessInstanceStartTime().desc() .list(); //根据流程定义、登录用户id获取该业务流程的实例结束的已办任务(作为审批者) List tasks = historyService.createHistoricTaskInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) .processFinished() //todo:此参数若表示实例已完成,则这里使用正确,需验证 .orderByTaskCreateTime().desc() @@ -225,6 +288,7 @@ //根据作为审批者的任务查询流程实例 for (HistoricTaskInstance task : tasks) { HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .notDeleted() .processInstanceId(task.getProcessInstanceId()).singleResult(); historicProcessInstances.add(historicProcessInstance); } @@ -247,7 +311,8 @@ if(ShiroKit.isAdmin()){ //根据流程定义查询该业务所有未完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) //这里使用流程定义,因为更新流程定义不会更新定义id,会更新部署id +// .deploymentId(flowForm.getDeployId()) .or() .unfinished() .processInstanceBusinessStatus(ApprovalStatusEnum.IN_APPROVED) //查询审批中状态,因为驳回后的编辑操作中设置为该状态 @@ -261,7 +326,8 @@ }); //根据流程定义、登录用户id查询该业务未完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .or() .unfinished() .processInstanceBusinessStatus(ApprovalStatusEnum.IN_APPROVED) //查询审批中状态,因为驳回后的编辑操作中设置为该状态 @@ -289,7 +355,8 @@ }); //根据流程定义、登录用户id获取该业务待办任务 List tasks = taskService.createTaskQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) // .includeProcessVariables() .orderByTaskCreateTime().desc() diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java index 1207b86..f38edca 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java @@ -136,7 +136,7 @@ taskService.addComment(task.getId(), task.getProcessInstanceId(),"3", request.getComments()); } //设置驳回状态为未通过 - runtimeService.updateBusinessStatus(task.getProcessInstanceId(), ApprovalStatusEnum.FAILED); + runtimeService.updateBusinessStatus(task.getProcessInstanceId(), ApprovalStatusEnum.FAILED_REJECT); //驳回至指定节点,现驳回到起始节点 HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java index 28cc433..e069520 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java @@ -14,6 +14,7 @@ String IN_APPROVED = "3"; //审批中 String PASSED = "4"; //已通过 String FAILED = "5"; //未通过 + String FAILED_REJECT = "8"; //未通过-驳回 String CANCELED = "6"; //已取消 String UN_DRAFT = "7"; //非草稿状态,仅在枚举中设置,字典中不设置 } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java index 30f7f3d..3082a7f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java @@ -6,10 +6,11 @@ * @Date: 2022/12/27 16:00 */ public interface AssigneeSetTypeEnum { - //1指定成员 2主管 4发起人自选 5发起人自己 7连续多级主管 + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 Integer ASSIGN_USER = 1; Integer LEADER = 2; Integer SELF_SELECT = 4; Integer SELF = 5; Integer LEADER_TOP = 7; + Integer ROLE = 11; } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 938b88a..2ee2301 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -36,7 +36,7 @@ * 节点的开始和结束。 * 网关的开始和结束。 * 中间事件的开始和结束。 - * 开始时间结束或结束事件开始。 + * 开始事件结束或结束事件开始。 * @Author: wangpeng * @Date: 2022/12/27 9:54 */ @@ -84,7 +84,7 @@ Integer settype = nodeUserJsonObject.getInteger("settype"); if(!Objects.isNull(settype)){ //根据节点不同审批人类型分别进行处理 - if (AssigneeSetTypeEnum.ASSIGN_USER == settype) { + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); //所选审批人分类 Iterator iterator = nodeUserArray.stream().iterator(); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java index 4fb4b6c..4b9a6df 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -43,12 +43,12 @@ public void notify(DelegateTask delegateTask) { //审批人为空,任务自动通过/自动驳回执行 //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); - - if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey)))) { + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { taskService.complete(delegateTask.getId()); //保证流程驳回到发起人后不自动审批通过 - redisUtil.set(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey), taskDefinitionKey); + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); } else { if ("100000".equals(delegateTask.getAssignee())) { Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 diff --git a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java index 8d9482f..b7711b8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java @@ -6,5 +6,5 @@ * @Date: 2022/8/8 10:26 */ public interface CacheKeys { - String TASK_DEFINITION_KEY = "missiles:metering:taskDefinitionKey:{0}"; + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; } diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java index 30b8331..5494aca 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -16,4 +16,6 @@ List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); } diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml index 2afb680..ad39ecd 100644 --- a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -72,8 +72,8 @@ su.name as directorName FROM ACT_RE_PROCDEF rp LEFT JOIN ACT_RE_DEPLOYMENT rd ON rp.deployment_id_ = rd.id_ - - INNER JOIN (SELECT max(arp.deployment_id_) AS deployment_id_ FROM ACT_RE_PROCDEF arp GROUP BY arp.key_) c ON rp.deployment_id_ = c.deployment_id_ + + LEFT JOIN system_flow_form sff ON sff.deploy_id = rd.id_ LEFT JOIN sys_user su ON su.id = rd.tenant_id_ WHERE sff.is_del = 0 @@ -92,12 +92,44 @@ and rp.suspension_state_ = #{request.suspensionState} - - and rd.tenant_id_ = #{request.directorId} + + and su.name like concat('%',#{request.directorName},'%') - - and rd.deploy_time_ <= #{request.deploymentTime} + + and rd.deploy_time_ >= #{request.deploymentStartTime} + + and rd.deploy_time_ <= #{request.deploymentEndTime} + + order by rd.deploy_time_ desc + + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java index 6ed94f1..bae35e5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + /** * @Description: 流程定义列表请求实体 * @Author: wangpeng @@ -53,4 +55,7 @@ @ApiModelProperty("部署时间(结束)") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java index 32d783f..acdf7d0 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -18,8 +18,8 @@ /** *

流程定义列表实体类

*/ -@ColumnWidth(30) -@HeadRowHeight(15) +@ColumnWidth(35) +@HeadRowHeight(20) @ContentRowHeight(20) @ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) @ExcelIgnoreUnannotated diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java index f53eeb5..b32478b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java @@ -23,4 +23,6 @@ List getFailedList(String formId); List getCanceledList(String formId); + + List getFailedRejectList(String formId); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java index 67b11d2..bf83b75 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java @@ -108,9 +108,10 @@ List historicProcessInstances = new ArrayList<>(); //管理员or其他用户 if(ShiroKit.isAdmin()){ - //根据业务状态、流程定义查询该业务所有未通过的流程实例-拒绝 + //根据业务状态、流程定义查询该业务所有已取消的流程实例-拒绝 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .deleted() //拒绝的要执行删除操作,也要设置业务状态,此处可同时设置为条件进行查询 .processInstanceBusinessStatus(ApprovalStatusEnum.CANCELED) //对应取消按钮中设置的业务状态 .orderByProcessInstanceStartTime().desc() @@ -122,7 +123,8 @@ }); //根据业务状态、流程定义、登录用户id查询该业务已取消的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .startedBy(String.valueOf(user.getId())) .processInstanceBusinessStatus(ApprovalStatusEnum.CANCELED) .orderByProcessInstanceStartTime().desc() @@ -146,8 +148,9 @@ if(ShiroKit.isAdmin()){ //根据业务状态、流程定义查询该业务所有未通过的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) -// .deleted() //拒绝的审批流程要执行删除操作,也要设置业务状态,所以使用下行的状态可满足拒绝和驳回的查询 + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) +// .deleted() //拒绝的审批流程要执行删除操作,也要设置业务状态,所以使用下行的状态可满足拒绝的查询 .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED) //todo:拒绝按钮已增加业务状态,需验证不加deleted查询的是未删除的还是所有的 .orderByProcessInstanceStartTime().desc() .list(); @@ -158,14 +161,16 @@ }); //根据业务状态、流程定义、登录用户id查询该业务未通过的流程实例(作为发起者) historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .startedBy(String.valueOf(user.getId())) .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED) .orderByProcessInstanceStartTime().desc() .list(); //根据业务状态、流程定义、登录用户id获取该业务的未通过的流程实例的审批者已完成任务(作为审批者) List tasks = historyService.createHistoricTaskInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) .finished() //审批者已完成审批 .processUnfinished() //todo:此参数若表示实例未完成,则这里使用正确,需验证 @@ -182,7 +187,60 @@ } List businessKeys = historicProcessInstances.stream().map(HistoricProcessInstance::getBusinessKey).collect(Collectors.toList()); return businessKeys; + } + @Override + public List getFailedRejectList(String formId) { + //根据业务表单id获取流程定义 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm flowForm = flowFormService.getOne(wrapper); + if (Objects.isNull(flowForm) || StringUtils.isEmpty(flowForm.getDeployId()) || StringUtils.isEmpty(flowForm.getProcDefId())) { + log.error("查询未通过-驳回的流程,该表单不存在对应的流程定义,formId:{}", formId); + return new ArrayList<>(); + } + List historicProcessInstances = new ArrayList<>(); + //管理员or其他用户 + if(ShiroKit.isAdmin()){ + //根据业务状态、流程定义查询该业务所有未通过的流程实例 + historicProcessInstances = historyService.createHistoricProcessInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .orderByProcessInstanceStartTime().desc() + .list(); + }else{ + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + //根据业务状态、流程定义、登录用户id查询该业务未通过的流程实例(作为发起者) + historicProcessInstances = historyService.createHistoricProcessInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) + .startedBy(String.valueOf(user.getId())) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .orderByProcessInstanceStartTime().desc() + .list(); + //根据业务状态、流程定义、登录用户id获取该业务的未通过的流程实例的审批者已完成任务(作为审批者) + List tasks = historyService.createHistoricTaskInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) + .taskAssignee(String.valueOf(user.getId())) + .finished() //审批者已完成审批 + .processUnfinished() //todo:此参数若表示实例未完成,则这里使用正确,需验证 + .orderByTaskCreateTime().desc() + .list(); + //根据作为审批者的任务查询未通过的流程实例 + for (HistoricTaskInstance task : tasks) { + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .singleResult(); + historicProcessInstances.add(historicProcessInstance); + } + } + List businessKeys = historicProcessInstances.stream().map(HistoricProcessInstance::getBusinessKey).collect(Collectors.toList()); + return businessKeys; } public List getPassedList(String formId) { @@ -199,8 +257,10 @@ if(ShiroKit.isAdmin()){ //根据流程定义查询该业务所有已完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .finished() + .notDeleted() .orderByProcessInstanceStartTime().desc() .list(); }else{ @@ -210,14 +270,17 @@ }); //根据流程定义、登录用户id查询该业务已完成的流程实例(作为发起者) historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .finished() + .notDeleted() .startedBy(String.valueOf(user.getId())) .orderByProcessInstanceStartTime().desc() .list(); //根据流程定义、登录用户id获取该业务流程的实例结束的已办任务(作为审批者) List tasks = historyService.createHistoricTaskInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) .processFinished() //todo:此参数若表示实例已完成,则这里使用正确,需验证 .orderByTaskCreateTime().desc() @@ -225,6 +288,7 @@ //根据作为审批者的任务查询流程实例 for (HistoricTaskInstance task : tasks) { HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .notDeleted() .processInstanceId(task.getProcessInstanceId()).singleResult(); historicProcessInstances.add(historicProcessInstance); } @@ -247,7 +311,8 @@ if(ShiroKit.isAdmin()){ //根据流程定义查询该业务所有未完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) //这里使用流程定义,因为更新流程定义不会更新定义id,会更新部署id +// .deploymentId(flowForm.getDeployId()) .or() .unfinished() .processInstanceBusinessStatus(ApprovalStatusEnum.IN_APPROVED) //查询审批中状态,因为驳回后的编辑操作中设置为该状态 @@ -261,7 +326,8 @@ }); //根据流程定义、登录用户id查询该业务未完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .or() .unfinished() .processInstanceBusinessStatus(ApprovalStatusEnum.IN_APPROVED) //查询审批中状态,因为驳回后的编辑操作中设置为该状态 @@ -289,7 +355,8 @@ }); //根据流程定义、登录用户id获取该业务待办任务 List tasks = taskService.createTaskQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) // .includeProcessVariables() .orderByTaskCreateTime().desc() diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java index 1207b86..f38edca 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java @@ -136,7 +136,7 @@ taskService.addComment(task.getId(), task.getProcessInstanceId(),"3", request.getComments()); } //设置驳回状态为未通过 - runtimeService.updateBusinessStatus(task.getProcessInstanceId(), ApprovalStatusEnum.FAILED); + runtimeService.updateBusinessStatus(task.getProcessInstanceId(), ApprovalStatusEnum.FAILED_REJECT); //驳回至指定节点,现驳回到起始节点 HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java index 5f44e68..a0b1046 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java @@ -271,11 +271,19 @@ break; //未通过(包括拒绝、驳回,拒绝为直接删除实例,驳回为驳回到起点),该状态维护在flowable case ApprovalStatusEnum.FAILED: - businessKey = baseApprovalService.getFailedList(request.getFormId()); + businessKey = baseApprovalService.getFailedList(request.getFormId()); //未通过-拒绝 + List rejectBusinessKey = baseApprovalService.getFailedRejectList(request.getFormId()); //未通过-驳回 if(!CollectionUtils.isEmpty(businessKey)){ list = meterFileMapper.selectBatchForApproval(request, businessKey); approvalList = handleApprovalListResponse(approvalList, list, ApprovalStatusEnum.FAILED); } + List rejectApprovalList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(rejectBusinessKey)){ + List rejectList = meterFileMapper.selectBatchForApproval(request, rejectBusinessKey); + rejectApprovalList = handleApprovalListResponse(approvalList, rejectList, ApprovalStatusEnum.FAILED_REJECT); + } + //合并未通过-拒绝和未通过-驳回 + approvalList.addAll(rejectApprovalList); break; //已取消(直接删除实例),该状态维护在flowable case ApprovalStatusEnum.CANCELED: diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java index 28cc433..e069520 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java @@ -14,6 +14,7 @@ String IN_APPROVED = "3"; //审批中 String PASSED = "4"; //已通过 String FAILED = "5"; //未通过 + String FAILED_REJECT = "8"; //未通过-驳回 String CANCELED = "6"; //已取消 String UN_DRAFT = "7"; //非草稿状态,仅在枚举中设置,字典中不设置 } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java index 30f7f3d..3082a7f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java @@ -6,10 +6,11 @@ * @Date: 2022/12/27 16:00 */ public interface AssigneeSetTypeEnum { - //1指定成员 2主管 4发起人自选 5发起人自己 7连续多级主管 + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 Integer ASSIGN_USER = 1; Integer LEADER = 2; Integer SELF_SELECT = 4; Integer SELF = 5; Integer LEADER_TOP = 7; + Integer ROLE = 11; } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 938b88a..2ee2301 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -36,7 +36,7 @@ * 节点的开始和结束。 * 网关的开始和结束。 * 中间事件的开始和结束。 - * 开始时间结束或结束事件开始。 + * 开始事件结束或结束事件开始。 * @Author: wangpeng * @Date: 2022/12/27 9:54 */ @@ -84,7 +84,7 @@ Integer settype = nodeUserJsonObject.getInteger("settype"); if(!Objects.isNull(settype)){ //根据节点不同审批人类型分别进行处理 - if (AssigneeSetTypeEnum.ASSIGN_USER == settype) { + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); //所选审批人分类 Iterator iterator = nodeUserArray.stream().iterator(); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java index 4fb4b6c..4b9a6df 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -43,12 +43,12 @@ public void notify(DelegateTask delegateTask) { //审批人为空,任务自动通过/自动驳回执行 //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); - - if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey)))) { + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { taskService.complete(delegateTask.getId()); //保证流程驳回到发起人后不自动审批通过 - redisUtil.set(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey), taskDefinitionKey); + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); } else { if ("100000".equals(delegateTask.getAssignee())) { Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 diff --git a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java index 8d9482f..b7711b8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java @@ -6,5 +6,5 @@ * @Date: 2022/8/8 10:26 */ public interface CacheKeys { - String TASK_DEFINITION_KEY = "missiles:metering:taskDefinitionKey:{0}"; + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; } diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java index 30b8331..5494aca 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -16,4 +16,6 @@ List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); } diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml index 2afb680..ad39ecd 100644 --- a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -72,8 +72,8 @@ su.name as directorName FROM ACT_RE_PROCDEF rp LEFT JOIN ACT_RE_DEPLOYMENT rd ON rp.deployment_id_ = rd.id_ - - INNER JOIN (SELECT max(arp.deployment_id_) AS deployment_id_ FROM ACT_RE_PROCDEF arp GROUP BY arp.key_) c ON rp.deployment_id_ = c.deployment_id_ + + LEFT JOIN system_flow_form sff ON sff.deploy_id = rd.id_ LEFT JOIN sys_user su ON su.id = rd.tenant_id_ WHERE sff.is_del = 0 @@ -92,12 +92,44 @@ and rp.suspension_state_ = #{request.suspensionState} - - and rd.tenant_id_ = #{request.directorId} + + and su.name like concat('%',#{request.directorName},'%') - - and rd.deploy_time_ <= #{request.deploymentTime} + + and rd.deploy_time_ >= #{request.deploymentStartTime} + + and rd.deploy_time_ <= #{request.deploymentEndTime} + + order by rd.deploy_time_ desc + + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java index 6ed94f1..bae35e5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + /** * @Description: 流程定义列表请求实体 * @Author: wangpeng @@ -53,4 +55,7 @@ @ApiModelProperty("部署时间(结束)") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java index 32d783f..acdf7d0 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -18,8 +18,8 @@ /** *

流程定义列表实体类

*/ -@ColumnWidth(30) -@HeadRowHeight(15) +@ColumnWidth(35) +@HeadRowHeight(20) @ContentRowHeight(20) @ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) @ExcelIgnoreUnannotated diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java index f53eeb5..b32478b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java @@ -23,4 +23,6 @@ List getFailedList(String formId); List getCanceledList(String formId); + + List getFailedRejectList(String formId); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java index 67b11d2..bf83b75 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java @@ -108,9 +108,10 @@ List historicProcessInstances = new ArrayList<>(); //管理员or其他用户 if(ShiroKit.isAdmin()){ - //根据业务状态、流程定义查询该业务所有未通过的流程实例-拒绝 + //根据业务状态、流程定义查询该业务所有已取消的流程实例-拒绝 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .deleted() //拒绝的要执行删除操作,也要设置业务状态,此处可同时设置为条件进行查询 .processInstanceBusinessStatus(ApprovalStatusEnum.CANCELED) //对应取消按钮中设置的业务状态 .orderByProcessInstanceStartTime().desc() @@ -122,7 +123,8 @@ }); //根据业务状态、流程定义、登录用户id查询该业务已取消的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .startedBy(String.valueOf(user.getId())) .processInstanceBusinessStatus(ApprovalStatusEnum.CANCELED) .orderByProcessInstanceStartTime().desc() @@ -146,8 +148,9 @@ if(ShiroKit.isAdmin()){ //根据业务状态、流程定义查询该业务所有未通过的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) -// .deleted() //拒绝的审批流程要执行删除操作,也要设置业务状态,所以使用下行的状态可满足拒绝和驳回的查询 + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) +// .deleted() //拒绝的审批流程要执行删除操作,也要设置业务状态,所以使用下行的状态可满足拒绝的查询 .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED) //todo:拒绝按钮已增加业务状态,需验证不加deleted查询的是未删除的还是所有的 .orderByProcessInstanceStartTime().desc() .list(); @@ -158,14 +161,16 @@ }); //根据业务状态、流程定义、登录用户id查询该业务未通过的流程实例(作为发起者) historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .startedBy(String.valueOf(user.getId())) .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED) .orderByProcessInstanceStartTime().desc() .list(); //根据业务状态、流程定义、登录用户id获取该业务的未通过的流程实例的审批者已完成任务(作为审批者) List tasks = historyService.createHistoricTaskInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) .finished() //审批者已完成审批 .processUnfinished() //todo:此参数若表示实例未完成,则这里使用正确,需验证 @@ -182,7 +187,60 @@ } List businessKeys = historicProcessInstances.stream().map(HistoricProcessInstance::getBusinessKey).collect(Collectors.toList()); return businessKeys; + } + @Override + public List getFailedRejectList(String formId) { + //根据业务表单id获取流程定义 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm flowForm = flowFormService.getOne(wrapper); + if (Objects.isNull(flowForm) || StringUtils.isEmpty(flowForm.getDeployId()) || StringUtils.isEmpty(flowForm.getProcDefId())) { + log.error("查询未通过-驳回的流程,该表单不存在对应的流程定义,formId:{}", formId); + return new ArrayList<>(); + } + List historicProcessInstances = new ArrayList<>(); + //管理员or其他用户 + if(ShiroKit.isAdmin()){ + //根据业务状态、流程定义查询该业务所有未通过的流程实例 + historicProcessInstances = historyService.createHistoricProcessInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .orderByProcessInstanceStartTime().desc() + .list(); + }else{ + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + //根据业务状态、流程定义、登录用户id查询该业务未通过的流程实例(作为发起者) + historicProcessInstances = historyService.createHistoricProcessInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) + .startedBy(String.valueOf(user.getId())) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .orderByProcessInstanceStartTime().desc() + .list(); + //根据业务状态、流程定义、登录用户id获取该业务的未通过的流程实例的审批者已完成任务(作为审批者) + List tasks = historyService.createHistoricTaskInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) + .taskAssignee(String.valueOf(user.getId())) + .finished() //审批者已完成审批 + .processUnfinished() //todo:此参数若表示实例未完成,则这里使用正确,需验证 + .orderByTaskCreateTime().desc() + .list(); + //根据作为审批者的任务查询未通过的流程实例 + for (HistoricTaskInstance task : tasks) { + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .singleResult(); + historicProcessInstances.add(historicProcessInstance); + } + } + List businessKeys = historicProcessInstances.stream().map(HistoricProcessInstance::getBusinessKey).collect(Collectors.toList()); + return businessKeys; } public List getPassedList(String formId) { @@ -199,8 +257,10 @@ if(ShiroKit.isAdmin()){ //根据流程定义查询该业务所有已完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .finished() + .notDeleted() .orderByProcessInstanceStartTime().desc() .list(); }else{ @@ -210,14 +270,17 @@ }); //根据流程定义、登录用户id查询该业务已完成的流程实例(作为发起者) historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .finished() + .notDeleted() .startedBy(String.valueOf(user.getId())) .orderByProcessInstanceStartTime().desc() .list(); //根据流程定义、登录用户id获取该业务流程的实例结束的已办任务(作为审批者) List tasks = historyService.createHistoricTaskInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) .processFinished() //todo:此参数若表示实例已完成,则这里使用正确,需验证 .orderByTaskCreateTime().desc() @@ -225,6 +288,7 @@ //根据作为审批者的任务查询流程实例 for (HistoricTaskInstance task : tasks) { HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .notDeleted() .processInstanceId(task.getProcessInstanceId()).singleResult(); historicProcessInstances.add(historicProcessInstance); } @@ -247,7 +311,8 @@ if(ShiroKit.isAdmin()){ //根据流程定义查询该业务所有未完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) //这里使用流程定义,因为更新流程定义不会更新定义id,会更新部署id +// .deploymentId(flowForm.getDeployId()) .or() .unfinished() .processInstanceBusinessStatus(ApprovalStatusEnum.IN_APPROVED) //查询审批中状态,因为驳回后的编辑操作中设置为该状态 @@ -261,7 +326,8 @@ }); //根据流程定义、登录用户id查询该业务未完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .or() .unfinished() .processInstanceBusinessStatus(ApprovalStatusEnum.IN_APPROVED) //查询审批中状态,因为驳回后的编辑操作中设置为该状态 @@ -289,7 +355,8 @@ }); //根据流程定义、登录用户id获取该业务待办任务 List tasks = taskService.createTaskQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) // .includeProcessVariables() .orderByTaskCreateTime().desc() diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java index 1207b86..f38edca 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java @@ -136,7 +136,7 @@ taskService.addComment(task.getId(), task.getProcessInstanceId(),"3", request.getComments()); } //设置驳回状态为未通过 - runtimeService.updateBusinessStatus(task.getProcessInstanceId(), ApprovalStatusEnum.FAILED); + runtimeService.updateBusinessStatus(task.getProcessInstanceId(), ApprovalStatusEnum.FAILED_REJECT); //驳回至指定节点,现驳回到起始节点 HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java index 5f44e68..a0b1046 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java @@ -271,11 +271,19 @@ break; //未通过(包括拒绝、驳回,拒绝为直接删除实例,驳回为驳回到起点),该状态维护在flowable case ApprovalStatusEnum.FAILED: - businessKey = baseApprovalService.getFailedList(request.getFormId()); + businessKey = baseApprovalService.getFailedList(request.getFormId()); //未通过-拒绝 + List rejectBusinessKey = baseApprovalService.getFailedRejectList(request.getFormId()); //未通过-驳回 if(!CollectionUtils.isEmpty(businessKey)){ list = meterFileMapper.selectBatchForApproval(request, businessKey); approvalList = handleApprovalListResponse(approvalList, list, ApprovalStatusEnum.FAILED); } + List rejectApprovalList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(rejectBusinessKey)){ + List rejectList = meterFileMapper.selectBatchForApproval(request, rejectBusinessKey); + rejectApprovalList = handleApprovalListResponse(approvalList, rejectList, ApprovalStatusEnum.FAILED_REJECT); + } + //合并未通过-拒绝和未通过-驳回 + approvalList.addAll(rejectApprovalList); break; //已取消(直接删除实例),该状态维护在flowable case ApprovalStatusEnum.CANCELED: diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTraceSupplierServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTraceSupplierServiceImpl.java index c08bd5d..e7720f8 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTraceSupplierServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTraceSupplierServiceImpl.java @@ -251,11 +251,19 @@ break; //未通过(包括拒绝、驳回,拒绝为直接删除实例,驳回为驳回到起点),该状态维护在flowable case ApprovalStatusEnum.FAILED: - businessKey = baseApprovalService.getFailedList(request.getFormId()); + businessKey = baseApprovalService.getFailedList(request.getFormId()); //未通过-拒绝 + List rejectBusinessKey = baseApprovalService.getFailedRejectList(request.getFormId()); //未通过-驳回 if(!CollectionUtils.isEmpty(businessKey)){ list = traceSupplierMapper.selectBatchForApproval(request, businessKey); approvalList = handleApprovalListResponse(approvalList, list, ApprovalStatusEnum.FAILED); } + List rejectApprovalList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(rejectBusinessKey)){ + List rejectList = traceSupplierMapper.selectBatchForApproval(request, rejectBusinessKey); + rejectApprovalList = handleApprovalListResponse(approvalList, rejectList, ApprovalStatusEnum.FAILED_REJECT); + } + //合并未通过-拒绝和未通过-驳回 + approvalList.addAll(rejectApprovalList); break; //已取消(直接删除实例),该状态维护在flowable case ApprovalStatusEnum.CANCELED: diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java index 28cc433..e069520 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java @@ -14,6 +14,7 @@ String IN_APPROVED = "3"; //审批中 String PASSED = "4"; //已通过 String FAILED = "5"; //未通过 + String FAILED_REJECT = "8"; //未通过-驳回 String CANCELED = "6"; //已取消 String UN_DRAFT = "7"; //非草稿状态,仅在枚举中设置,字典中不设置 } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java index 30f7f3d..3082a7f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java @@ -6,10 +6,11 @@ * @Date: 2022/12/27 16:00 */ public interface AssigneeSetTypeEnum { - //1指定成员 2主管 4发起人自选 5发起人自己 7连续多级主管 + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 Integer ASSIGN_USER = 1; Integer LEADER = 2; Integer SELF_SELECT = 4; Integer SELF = 5; Integer LEADER_TOP = 7; + Integer ROLE = 11; } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 938b88a..2ee2301 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -36,7 +36,7 @@ * 节点的开始和结束。 * 网关的开始和结束。 * 中间事件的开始和结束。 - * 开始时间结束或结束事件开始。 + * 开始事件结束或结束事件开始。 * @Author: wangpeng * @Date: 2022/12/27 9:54 */ @@ -84,7 +84,7 @@ Integer settype = nodeUserJsonObject.getInteger("settype"); if(!Objects.isNull(settype)){ //根据节点不同审批人类型分别进行处理 - if (AssigneeSetTypeEnum.ASSIGN_USER == settype) { + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); //所选审批人分类 Iterator iterator = nodeUserArray.stream().iterator(); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java index 4fb4b6c..4b9a6df 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -43,12 +43,12 @@ public void notify(DelegateTask delegateTask) { //审批人为空,任务自动通过/自动驳回执行 //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); - - if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey)))) { + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { taskService.complete(delegateTask.getId()); //保证流程驳回到发起人后不自动审批通过 - redisUtil.set(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey), taskDefinitionKey); + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); } else { if ("100000".equals(delegateTask.getAssignee())) { Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 diff --git a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java index 8d9482f..b7711b8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java @@ -6,5 +6,5 @@ * @Date: 2022/8/8 10:26 */ public interface CacheKeys { - String TASK_DEFINITION_KEY = "missiles:metering:taskDefinitionKey:{0}"; + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; } diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java index 30b8331..5494aca 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -16,4 +16,6 @@ List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); } diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml index 2afb680..ad39ecd 100644 --- a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -72,8 +72,8 @@ su.name as directorName FROM ACT_RE_PROCDEF rp LEFT JOIN ACT_RE_DEPLOYMENT rd ON rp.deployment_id_ = rd.id_ - - INNER JOIN (SELECT max(arp.deployment_id_) AS deployment_id_ FROM ACT_RE_PROCDEF arp GROUP BY arp.key_) c ON rp.deployment_id_ = c.deployment_id_ + + LEFT JOIN system_flow_form sff ON sff.deploy_id = rd.id_ LEFT JOIN sys_user su ON su.id = rd.tenant_id_ WHERE sff.is_del = 0 @@ -92,12 +92,44 @@ and rp.suspension_state_ = #{request.suspensionState} - - and rd.tenant_id_ = #{request.directorId} + + and su.name like concat('%',#{request.directorName},'%') - - and rd.deploy_time_ <= #{request.deploymentTime} + + and rd.deploy_time_ >= #{request.deploymentStartTime} + + and rd.deploy_time_ <= #{request.deploymentEndTime} + + order by rd.deploy_time_ desc + + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java index 6ed94f1..bae35e5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + /** * @Description: 流程定义列表请求实体 * @Author: wangpeng @@ -53,4 +55,7 @@ @ApiModelProperty("部署时间(结束)") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java index 32d783f..acdf7d0 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -18,8 +18,8 @@ /** *

流程定义列表实体类

*/ -@ColumnWidth(30) -@HeadRowHeight(15) +@ColumnWidth(35) +@HeadRowHeight(20) @ContentRowHeight(20) @ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) @ExcelIgnoreUnannotated diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java index f53eeb5..b32478b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java @@ -23,4 +23,6 @@ List getFailedList(String formId); List getCanceledList(String formId); + + List getFailedRejectList(String formId); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java index 67b11d2..bf83b75 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java @@ -108,9 +108,10 @@ List historicProcessInstances = new ArrayList<>(); //管理员or其他用户 if(ShiroKit.isAdmin()){ - //根据业务状态、流程定义查询该业务所有未通过的流程实例-拒绝 + //根据业务状态、流程定义查询该业务所有已取消的流程实例-拒绝 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .deleted() //拒绝的要执行删除操作,也要设置业务状态,此处可同时设置为条件进行查询 .processInstanceBusinessStatus(ApprovalStatusEnum.CANCELED) //对应取消按钮中设置的业务状态 .orderByProcessInstanceStartTime().desc() @@ -122,7 +123,8 @@ }); //根据业务状态、流程定义、登录用户id查询该业务已取消的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .startedBy(String.valueOf(user.getId())) .processInstanceBusinessStatus(ApprovalStatusEnum.CANCELED) .orderByProcessInstanceStartTime().desc() @@ -146,8 +148,9 @@ if(ShiroKit.isAdmin()){ //根据业务状态、流程定义查询该业务所有未通过的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) -// .deleted() //拒绝的审批流程要执行删除操作,也要设置业务状态,所以使用下行的状态可满足拒绝和驳回的查询 + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) +// .deleted() //拒绝的审批流程要执行删除操作,也要设置业务状态,所以使用下行的状态可满足拒绝的查询 .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED) //todo:拒绝按钮已增加业务状态,需验证不加deleted查询的是未删除的还是所有的 .orderByProcessInstanceStartTime().desc() .list(); @@ -158,14 +161,16 @@ }); //根据业务状态、流程定义、登录用户id查询该业务未通过的流程实例(作为发起者) historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .startedBy(String.valueOf(user.getId())) .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED) .orderByProcessInstanceStartTime().desc() .list(); //根据业务状态、流程定义、登录用户id获取该业务的未通过的流程实例的审批者已完成任务(作为审批者) List tasks = historyService.createHistoricTaskInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) .finished() //审批者已完成审批 .processUnfinished() //todo:此参数若表示实例未完成,则这里使用正确,需验证 @@ -182,7 +187,60 @@ } List businessKeys = historicProcessInstances.stream().map(HistoricProcessInstance::getBusinessKey).collect(Collectors.toList()); return businessKeys; + } + @Override + public List getFailedRejectList(String formId) { + //根据业务表单id获取流程定义 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm flowForm = flowFormService.getOne(wrapper); + if (Objects.isNull(flowForm) || StringUtils.isEmpty(flowForm.getDeployId()) || StringUtils.isEmpty(flowForm.getProcDefId())) { + log.error("查询未通过-驳回的流程,该表单不存在对应的流程定义,formId:{}", formId); + return new ArrayList<>(); + } + List historicProcessInstances = new ArrayList<>(); + //管理员or其他用户 + if(ShiroKit.isAdmin()){ + //根据业务状态、流程定义查询该业务所有未通过的流程实例 + historicProcessInstances = historyService.createHistoricProcessInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .orderByProcessInstanceStartTime().desc() + .list(); + }else{ + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + //根据业务状态、流程定义、登录用户id查询该业务未通过的流程实例(作为发起者) + historicProcessInstances = historyService.createHistoricProcessInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) + .startedBy(String.valueOf(user.getId())) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .orderByProcessInstanceStartTime().desc() + .list(); + //根据业务状态、流程定义、登录用户id获取该业务的未通过的流程实例的审批者已完成任务(作为审批者) + List tasks = historyService.createHistoricTaskInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) + .taskAssignee(String.valueOf(user.getId())) + .finished() //审批者已完成审批 + .processUnfinished() //todo:此参数若表示实例未完成,则这里使用正确,需验证 + .orderByTaskCreateTime().desc() + .list(); + //根据作为审批者的任务查询未通过的流程实例 + for (HistoricTaskInstance task : tasks) { + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .singleResult(); + historicProcessInstances.add(historicProcessInstance); + } + } + List businessKeys = historicProcessInstances.stream().map(HistoricProcessInstance::getBusinessKey).collect(Collectors.toList()); + return businessKeys; } public List getPassedList(String formId) { @@ -199,8 +257,10 @@ if(ShiroKit.isAdmin()){ //根据流程定义查询该业务所有已完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .finished() + .notDeleted() .orderByProcessInstanceStartTime().desc() .list(); }else{ @@ -210,14 +270,17 @@ }); //根据流程定义、登录用户id查询该业务已完成的流程实例(作为发起者) historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .finished() + .notDeleted() .startedBy(String.valueOf(user.getId())) .orderByProcessInstanceStartTime().desc() .list(); //根据流程定义、登录用户id获取该业务流程的实例结束的已办任务(作为审批者) List tasks = historyService.createHistoricTaskInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) .processFinished() //todo:此参数若表示实例已完成,则这里使用正确,需验证 .orderByTaskCreateTime().desc() @@ -225,6 +288,7 @@ //根据作为审批者的任务查询流程实例 for (HistoricTaskInstance task : tasks) { HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .notDeleted() .processInstanceId(task.getProcessInstanceId()).singleResult(); historicProcessInstances.add(historicProcessInstance); } @@ -247,7 +311,8 @@ if(ShiroKit.isAdmin()){ //根据流程定义查询该业务所有未完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) //这里使用流程定义,因为更新流程定义不会更新定义id,会更新部署id +// .deploymentId(flowForm.getDeployId()) .or() .unfinished() .processInstanceBusinessStatus(ApprovalStatusEnum.IN_APPROVED) //查询审批中状态,因为驳回后的编辑操作中设置为该状态 @@ -261,7 +326,8 @@ }); //根据流程定义、登录用户id查询该业务未完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .or() .unfinished() .processInstanceBusinessStatus(ApprovalStatusEnum.IN_APPROVED) //查询审批中状态,因为驳回后的编辑操作中设置为该状态 @@ -289,7 +355,8 @@ }); //根据流程定义、登录用户id获取该业务待办任务 List tasks = taskService.createTaskQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) // .includeProcessVariables() .orderByTaskCreateTime().desc() diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java index 1207b86..f38edca 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java @@ -136,7 +136,7 @@ taskService.addComment(task.getId(), task.getProcessInstanceId(),"3", request.getComments()); } //设置驳回状态为未通过 - runtimeService.updateBusinessStatus(task.getProcessInstanceId(), ApprovalStatusEnum.FAILED); + runtimeService.updateBusinessStatus(task.getProcessInstanceId(), ApprovalStatusEnum.FAILED_REJECT); //驳回至指定节点,现驳回到起始节点 HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java index 5f44e68..a0b1046 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java @@ -271,11 +271,19 @@ break; //未通过(包括拒绝、驳回,拒绝为直接删除实例,驳回为驳回到起点),该状态维护在flowable case ApprovalStatusEnum.FAILED: - businessKey = baseApprovalService.getFailedList(request.getFormId()); + businessKey = baseApprovalService.getFailedList(request.getFormId()); //未通过-拒绝 + List rejectBusinessKey = baseApprovalService.getFailedRejectList(request.getFormId()); //未通过-驳回 if(!CollectionUtils.isEmpty(businessKey)){ list = meterFileMapper.selectBatchForApproval(request, businessKey); approvalList = handleApprovalListResponse(approvalList, list, ApprovalStatusEnum.FAILED); } + List rejectApprovalList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(rejectBusinessKey)){ + List rejectList = meterFileMapper.selectBatchForApproval(request, rejectBusinessKey); + rejectApprovalList = handleApprovalListResponse(approvalList, rejectList, ApprovalStatusEnum.FAILED_REJECT); + } + //合并未通过-拒绝和未通过-驳回 + approvalList.addAll(rejectApprovalList); break; //已取消(直接删除实例),该状态维护在flowable case ApprovalStatusEnum.CANCELED: diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTraceSupplierServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTraceSupplierServiceImpl.java index c08bd5d..e7720f8 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTraceSupplierServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTraceSupplierServiceImpl.java @@ -251,11 +251,19 @@ break; //未通过(包括拒绝、驳回,拒绝为直接删除实例,驳回为驳回到起点),该状态维护在flowable case ApprovalStatusEnum.FAILED: - businessKey = baseApprovalService.getFailedList(request.getFormId()); + businessKey = baseApprovalService.getFailedList(request.getFormId()); //未通过-拒绝 + List rejectBusinessKey = baseApprovalService.getFailedRejectList(request.getFormId()); //未通过-驳回 if(!CollectionUtils.isEmpty(businessKey)){ list = traceSupplierMapper.selectBatchForApproval(request, businessKey); approvalList = handleApprovalListResponse(approvalList, list, ApprovalStatusEnum.FAILED); } + List rejectApprovalList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(rejectBusinessKey)){ + List rejectList = traceSupplierMapper.selectBatchForApproval(request, rejectBusinessKey); + rejectApprovalList = handleApprovalListResponse(approvalList, rejectList, ApprovalStatusEnum.FAILED_REJECT); + } + //合并未通过-拒绝和未通过-驳回 + approvalList.addAll(rejectApprovalList); break; //已取消(直接删除实例),该状态维护在flowable case ApprovalStatusEnum.CANCELED: diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTrainPlanServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTrainPlanServiceImpl.java index 2b54745..cbc5d52 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTrainPlanServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTrainPlanServiceImpl.java @@ -294,11 +294,19 @@ break; //未通过(包括拒绝、驳回,拒绝为直接删除实例,驳回为驳回到起点),该状态维护在flowable case ApprovalStatusEnum.FAILED: - businessKey = baseApprovalService.getFailedList(request.getFormId()); + businessKey = baseApprovalService.getFailedList(request.getFormId()); //未通过-拒绝 + List rejectBusinessKey = baseApprovalService.getFailedRejectList(request.getFormId()); //未通过-驳回 if(!CollectionUtils.isEmpty(businessKey)){ list = trainPlanMapper.selectBatchForApproval(request, businessKey); approvalList = handleApprovalListResponse(approvalList, list, ApprovalStatusEnum.FAILED); } + List rejectApprovalList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(rejectBusinessKey)){ + List rejectList = trainPlanMapper.selectBatchForApproval(request, rejectBusinessKey); + rejectApprovalList = handleApprovalListResponse(approvalList, rejectList, ApprovalStatusEnum.FAILED_REJECT); + } + //合并未通过-拒绝和未通过-驳回 + approvalList.addAll(rejectApprovalList); break; //已取消(直接删除实例),该状态维护在flowable case ApprovalStatusEnum.CANCELED: diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java index 28cc433..e069520 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java @@ -14,6 +14,7 @@ String IN_APPROVED = "3"; //审批中 String PASSED = "4"; //已通过 String FAILED = "5"; //未通过 + String FAILED_REJECT = "8"; //未通过-驳回 String CANCELED = "6"; //已取消 String UN_DRAFT = "7"; //非草稿状态,仅在枚举中设置,字典中不设置 } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java index 30f7f3d..3082a7f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java @@ -6,10 +6,11 @@ * @Date: 2022/12/27 16:00 */ public interface AssigneeSetTypeEnum { - //1指定成员 2主管 4发起人自选 5发起人自己 7连续多级主管 + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 Integer ASSIGN_USER = 1; Integer LEADER = 2; Integer SELF_SELECT = 4; Integer SELF = 5; Integer LEADER_TOP = 7; + Integer ROLE = 11; } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 938b88a..2ee2301 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -36,7 +36,7 @@ * 节点的开始和结束。 * 网关的开始和结束。 * 中间事件的开始和结束。 - * 开始时间结束或结束事件开始。 + * 开始事件结束或结束事件开始。 * @Author: wangpeng * @Date: 2022/12/27 9:54 */ @@ -84,7 +84,7 @@ Integer settype = nodeUserJsonObject.getInteger("settype"); if(!Objects.isNull(settype)){ //根据节点不同审批人类型分别进行处理 - if (AssigneeSetTypeEnum.ASSIGN_USER == settype) { + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); //所选审批人分类 Iterator iterator = nodeUserArray.stream().iterator(); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java index 4fb4b6c..4b9a6df 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -43,12 +43,12 @@ public void notify(DelegateTask delegateTask) { //审批人为空,任务自动通过/自动驳回执行 //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); - - if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey)))) { + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { taskService.complete(delegateTask.getId()); //保证流程驳回到发起人后不自动审批通过 - redisUtil.set(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey), taskDefinitionKey); + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); } else { if ("100000".equals(delegateTask.getAssignee())) { Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 diff --git a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java index 8d9482f..b7711b8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java @@ -6,5 +6,5 @@ * @Date: 2022/8/8 10:26 */ public interface CacheKeys { - String TASK_DEFINITION_KEY = "missiles:metering:taskDefinitionKey:{0}"; + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; } diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java index 30b8331..5494aca 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -16,4 +16,6 @@ List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); } diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml index 2afb680..ad39ecd 100644 --- a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -72,8 +72,8 @@ su.name as directorName FROM ACT_RE_PROCDEF rp LEFT JOIN ACT_RE_DEPLOYMENT rd ON rp.deployment_id_ = rd.id_ - - INNER JOIN (SELECT max(arp.deployment_id_) AS deployment_id_ FROM ACT_RE_PROCDEF arp GROUP BY arp.key_) c ON rp.deployment_id_ = c.deployment_id_ + + LEFT JOIN system_flow_form sff ON sff.deploy_id = rd.id_ LEFT JOIN sys_user su ON su.id = rd.tenant_id_ WHERE sff.is_del = 0 @@ -92,12 +92,44 @@ and rp.suspension_state_ = #{request.suspensionState} - - and rd.tenant_id_ = #{request.directorId} + + and su.name like concat('%',#{request.directorName},'%') - - and rd.deploy_time_ <= #{request.deploymentTime} + + and rd.deploy_time_ >= #{request.deploymentStartTime} + + and rd.deploy_time_ <= #{request.deploymentEndTime} + + order by rd.deploy_time_ desc + + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java index 6ed94f1..bae35e5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + /** * @Description: 流程定义列表请求实体 * @Author: wangpeng @@ -53,4 +55,7 @@ @ApiModelProperty("部署时间(结束)") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java index 32d783f..acdf7d0 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -18,8 +18,8 @@ /** *

流程定义列表实体类

*/ -@ColumnWidth(30) -@HeadRowHeight(15) +@ColumnWidth(35) +@HeadRowHeight(20) @ContentRowHeight(20) @ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) @ExcelIgnoreUnannotated diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java index f53eeb5..b32478b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java @@ -23,4 +23,6 @@ List getFailedList(String formId); List getCanceledList(String formId); + + List getFailedRejectList(String formId); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java index 67b11d2..bf83b75 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java @@ -108,9 +108,10 @@ List historicProcessInstances = new ArrayList<>(); //管理员or其他用户 if(ShiroKit.isAdmin()){ - //根据业务状态、流程定义查询该业务所有未通过的流程实例-拒绝 + //根据业务状态、流程定义查询该业务所有已取消的流程实例-拒绝 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .deleted() //拒绝的要执行删除操作,也要设置业务状态,此处可同时设置为条件进行查询 .processInstanceBusinessStatus(ApprovalStatusEnum.CANCELED) //对应取消按钮中设置的业务状态 .orderByProcessInstanceStartTime().desc() @@ -122,7 +123,8 @@ }); //根据业务状态、流程定义、登录用户id查询该业务已取消的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .startedBy(String.valueOf(user.getId())) .processInstanceBusinessStatus(ApprovalStatusEnum.CANCELED) .orderByProcessInstanceStartTime().desc() @@ -146,8 +148,9 @@ if(ShiroKit.isAdmin()){ //根据业务状态、流程定义查询该业务所有未通过的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) -// .deleted() //拒绝的审批流程要执行删除操作,也要设置业务状态,所以使用下行的状态可满足拒绝和驳回的查询 + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) +// .deleted() //拒绝的审批流程要执行删除操作,也要设置业务状态,所以使用下行的状态可满足拒绝的查询 .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED) //todo:拒绝按钮已增加业务状态,需验证不加deleted查询的是未删除的还是所有的 .orderByProcessInstanceStartTime().desc() .list(); @@ -158,14 +161,16 @@ }); //根据业务状态、流程定义、登录用户id查询该业务未通过的流程实例(作为发起者) historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .startedBy(String.valueOf(user.getId())) .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED) .orderByProcessInstanceStartTime().desc() .list(); //根据业务状态、流程定义、登录用户id获取该业务的未通过的流程实例的审批者已完成任务(作为审批者) List tasks = historyService.createHistoricTaskInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) .finished() //审批者已完成审批 .processUnfinished() //todo:此参数若表示实例未完成,则这里使用正确,需验证 @@ -182,7 +187,60 @@ } List businessKeys = historicProcessInstances.stream().map(HistoricProcessInstance::getBusinessKey).collect(Collectors.toList()); return businessKeys; + } + @Override + public List getFailedRejectList(String formId) { + //根据业务表单id获取流程定义 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm flowForm = flowFormService.getOne(wrapper); + if (Objects.isNull(flowForm) || StringUtils.isEmpty(flowForm.getDeployId()) || StringUtils.isEmpty(flowForm.getProcDefId())) { + log.error("查询未通过-驳回的流程,该表单不存在对应的流程定义,formId:{}", formId); + return new ArrayList<>(); + } + List historicProcessInstances = new ArrayList<>(); + //管理员or其他用户 + if(ShiroKit.isAdmin()){ + //根据业务状态、流程定义查询该业务所有未通过的流程实例 + historicProcessInstances = historyService.createHistoricProcessInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .orderByProcessInstanceStartTime().desc() + .list(); + }else{ + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + //根据业务状态、流程定义、登录用户id查询该业务未通过的流程实例(作为发起者) + historicProcessInstances = historyService.createHistoricProcessInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) + .startedBy(String.valueOf(user.getId())) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .orderByProcessInstanceStartTime().desc() + .list(); + //根据业务状态、流程定义、登录用户id获取该业务的未通过的流程实例的审批者已完成任务(作为审批者) + List tasks = historyService.createHistoricTaskInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) + .taskAssignee(String.valueOf(user.getId())) + .finished() //审批者已完成审批 + .processUnfinished() //todo:此参数若表示实例未完成,则这里使用正确,需验证 + .orderByTaskCreateTime().desc() + .list(); + //根据作为审批者的任务查询未通过的流程实例 + for (HistoricTaskInstance task : tasks) { + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .singleResult(); + historicProcessInstances.add(historicProcessInstance); + } + } + List businessKeys = historicProcessInstances.stream().map(HistoricProcessInstance::getBusinessKey).collect(Collectors.toList()); + return businessKeys; } public List getPassedList(String formId) { @@ -199,8 +257,10 @@ if(ShiroKit.isAdmin()){ //根据流程定义查询该业务所有已完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .finished() + .notDeleted() .orderByProcessInstanceStartTime().desc() .list(); }else{ @@ -210,14 +270,17 @@ }); //根据流程定义、登录用户id查询该业务已完成的流程实例(作为发起者) historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .finished() + .notDeleted() .startedBy(String.valueOf(user.getId())) .orderByProcessInstanceStartTime().desc() .list(); //根据流程定义、登录用户id获取该业务流程的实例结束的已办任务(作为审批者) List tasks = historyService.createHistoricTaskInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) .processFinished() //todo:此参数若表示实例已完成,则这里使用正确,需验证 .orderByTaskCreateTime().desc() @@ -225,6 +288,7 @@ //根据作为审批者的任务查询流程实例 for (HistoricTaskInstance task : tasks) { HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .notDeleted() .processInstanceId(task.getProcessInstanceId()).singleResult(); historicProcessInstances.add(historicProcessInstance); } @@ -247,7 +311,8 @@ if(ShiroKit.isAdmin()){ //根据流程定义查询该业务所有未完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) //这里使用流程定义,因为更新流程定义不会更新定义id,会更新部署id +// .deploymentId(flowForm.getDeployId()) .or() .unfinished() .processInstanceBusinessStatus(ApprovalStatusEnum.IN_APPROVED) //查询审批中状态,因为驳回后的编辑操作中设置为该状态 @@ -261,7 +326,8 @@ }); //根据流程定义、登录用户id查询该业务未完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .or() .unfinished() .processInstanceBusinessStatus(ApprovalStatusEnum.IN_APPROVED) //查询审批中状态,因为驳回后的编辑操作中设置为该状态 @@ -289,7 +355,8 @@ }); //根据流程定义、登录用户id获取该业务待办任务 List tasks = taskService.createTaskQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) // .includeProcessVariables() .orderByTaskCreateTime().desc() diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java index 1207b86..f38edca 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java @@ -136,7 +136,7 @@ taskService.addComment(task.getId(), task.getProcessInstanceId(),"3", request.getComments()); } //设置驳回状态为未通过 - runtimeService.updateBusinessStatus(task.getProcessInstanceId(), ApprovalStatusEnum.FAILED); + runtimeService.updateBusinessStatus(task.getProcessInstanceId(), ApprovalStatusEnum.FAILED_REJECT); //驳回至指定节点,现驳回到起始节点 HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java index 5f44e68..a0b1046 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java @@ -271,11 +271,19 @@ break; //未通过(包括拒绝、驳回,拒绝为直接删除实例,驳回为驳回到起点),该状态维护在flowable case ApprovalStatusEnum.FAILED: - businessKey = baseApprovalService.getFailedList(request.getFormId()); + businessKey = baseApprovalService.getFailedList(request.getFormId()); //未通过-拒绝 + List rejectBusinessKey = baseApprovalService.getFailedRejectList(request.getFormId()); //未通过-驳回 if(!CollectionUtils.isEmpty(businessKey)){ list = meterFileMapper.selectBatchForApproval(request, businessKey); approvalList = handleApprovalListResponse(approvalList, list, ApprovalStatusEnum.FAILED); } + List rejectApprovalList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(rejectBusinessKey)){ + List rejectList = meterFileMapper.selectBatchForApproval(request, rejectBusinessKey); + rejectApprovalList = handleApprovalListResponse(approvalList, rejectList, ApprovalStatusEnum.FAILED_REJECT); + } + //合并未通过-拒绝和未通过-驳回 + approvalList.addAll(rejectApprovalList); break; //已取消(直接删除实例),该状态维护在flowable case ApprovalStatusEnum.CANCELED: diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTraceSupplierServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTraceSupplierServiceImpl.java index c08bd5d..e7720f8 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTraceSupplierServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTraceSupplierServiceImpl.java @@ -251,11 +251,19 @@ break; //未通过(包括拒绝、驳回,拒绝为直接删除实例,驳回为驳回到起点),该状态维护在flowable case ApprovalStatusEnum.FAILED: - businessKey = baseApprovalService.getFailedList(request.getFormId()); + businessKey = baseApprovalService.getFailedList(request.getFormId()); //未通过-拒绝 + List rejectBusinessKey = baseApprovalService.getFailedRejectList(request.getFormId()); //未通过-驳回 if(!CollectionUtils.isEmpty(businessKey)){ list = traceSupplierMapper.selectBatchForApproval(request, businessKey); approvalList = handleApprovalListResponse(approvalList, list, ApprovalStatusEnum.FAILED); } + List rejectApprovalList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(rejectBusinessKey)){ + List rejectList = traceSupplierMapper.selectBatchForApproval(request, rejectBusinessKey); + rejectApprovalList = handleApprovalListResponse(approvalList, rejectList, ApprovalStatusEnum.FAILED_REJECT); + } + //合并未通过-拒绝和未通过-驳回 + approvalList.addAll(rejectApprovalList); break; //已取消(直接删除实例),该状态维护在flowable case ApprovalStatusEnum.CANCELED: diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTrainPlanServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTrainPlanServiceImpl.java index 2b54745..cbc5d52 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTrainPlanServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTrainPlanServiceImpl.java @@ -294,11 +294,19 @@ break; //未通过(包括拒绝、驳回,拒绝为直接删除实例,驳回为驳回到起点),该状态维护在flowable case ApprovalStatusEnum.FAILED: - businessKey = baseApprovalService.getFailedList(request.getFormId()); + businessKey = baseApprovalService.getFailedList(request.getFormId()); //未通过-拒绝 + List rejectBusinessKey = baseApprovalService.getFailedRejectList(request.getFormId()); //未通过-驳回 if(!CollectionUtils.isEmpty(businessKey)){ list = trainPlanMapper.selectBatchForApproval(request, businessKey); approvalList = handleApprovalListResponse(approvalList, list, ApprovalStatusEnum.FAILED); } + List rejectApprovalList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(rejectBusinessKey)){ + List rejectList = trainPlanMapper.selectBatchForApproval(request, rejectBusinessKey); + rejectApprovalList = handleApprovalListResponse(approvalList, rejectList, ApprovalStatusEnum.FAILED_REJECT); + } + //合并未通过-拒绝和未通过-驳回 + approvalList.addAll(rejectApprovalList); break; //已取消(直接删除实例),该状态维护在flowable case ApprovalStatusEnum.CANCELED: diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/system/FlowDefDefServiceImpl.java index 243321f..fb925f4 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/system/FlowDefDefServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/system/FlowDefDefServiceImpl.java @@ -22,6 +22,8 @@ import com.casic.missiles.service.system.IFlowDefService; import com.casic.missiles.utils.SnowflakeUtil; import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; @@ -294,6 +296,12 @@ return dataList; } + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + /** * 方法功能:根据上个节点id及本节点信息生成本节点 @@ -403,32 +411,39 @@ Iterator iterator = nodeUserList.stream().iterator(); List userIds = new ArrayList<>(); while (iterator.hasNext()) { - HashMap map = (HashMap) iterator.next(); - if ("1".equals(String.valueOf(map.get("type")))) { - //用户id - String targetId = String.valueOf(map.get("targetId")); - userIds.add(targetId); - } else if ("2".equals(String.valueOf(map.get("type")))) { - //角色id - String targetId = String.valueOf(map.get("targetId")); - IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); - BaseMapper baseMapper = relationService.getBaseMapper(); - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("ROLEID", targetId); - List ruRelations = baseMapper.selectList(wrapper); - ruRelations.forEach(ruRelation -> { - userIds.add(String.valueOf(ruRelation.getUserId())); - }); - } else if ("3".equals(String.valueOf(map.get("type")))) { - //部门id - String targetId = String.valueOf(map.get("targetId")); - UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("DEPT_ID", targetId); - List users = userMapper.selectList(wrapper); - users.forEach(user -> { - userIds.add(String.valueOf(user.getId())); - }); + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if ("1".equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if ("2".equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if ("3".equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); } } String str = StringUtils.join(userIds, ","); diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java index 89850fb..050e2a2 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/SystemFlowDefController.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -138,7 +139,13 @@ @PostMapping("/listExport") @ResponseBody public void export(@RequestBody FlowListRequest request) throws IOException { - super.exportExcel(FlowProcDefDTO.class, processService.list(request), ExportEnum.FLOW_DEF_EXPORT.getSheetName()); + List list; + if (!CollectionUtils.isEmpty(request.getIds())) { + list = processService.listByIds(request.getIds()); + } else { + list = processService.list(request); + } + super.exportExcel(FlowProcDefDTO.class, list, ExportEnum.FLOW_DEF_EXPORT.getSheetName()); } /** diff --git a/casic-metering-api/src/main/resources/config/application-dev.yml b/casic-metering-api/src/main/resources/config/application-dev.yml index 12beee9..a934826 100644 --- a/casic-metering-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-api/src/main/resources/config/application-dev.yml @@ -20,8 +20,7 @@ # store-type: redis casic: #kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken - #/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources + no-login-urls: /**/**,${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/v2/api-docs,/v2/api-docs-ext,/doc.html,/webjars/**,/swagger-ui.html,/swagger-resources #flowable数据源和多数据源配置 db: init: diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java index 28cc433..e069520 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/ApprovalStatusEnum.java @@ -14,6 +14,7 @@ String IN_APPROVED = "3"; //审批中 String PASSED = "4"; //已通过 String FAILED = "5"; //未通过 + String FAILED_REJECT = "8"; //未通过-驳回 String CANCELED = "6"; //已取消 String UN_DRAFT = "7"; //非草稿状态,仅在枚举中设置,字典中不设置 } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java index 30f7f3d..3082a7f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/AssigneeSetTypeEnum.java @@ -6,10 +6,11 @@ * @Date: 2022/12/27 16:00 */ public interface AssigneeSetTypeEnum { - //1指定成员 2主管 4发起人自选 5发起人自己 7连续多级主管 + //1指定成员 11指定角色 2主管 4发起人自选 5发起人自己 7连续多级主管 Integer ASSIGN_USER = 1; Integer LEADER = 2; Integer SELF_SELECT = 4; Integer SELF = 5; Integer LEADER_TOP = 7; + Integer ROLE = 11; } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java index 938b88a..2ee2301 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/CounterSignListener.java @@ -36,7 +36,7 @@ * 节点的开始和结束。 * 网关的开始和结束。 * 中间事件的开始和结束。 - * 开始时间结束或结束事件开始。 + * 开始事件结束或结束事件开始。 * @Author: wangpeng * @Date: 2022/12/27 9:54 */ @@ -84,7 +84,7 @@ Integer settype = nodeUserJsonObject.getInteger("settype"); if(!Objects.isNull(settype)){ //根据节点不同审批人类型分别进行处理 - if (AssigneeSetTypeEnum.ASSIGN_USER == settype) { + if (AssigneeSetTypeEnum.ASSIGN_USER == settype || AssigneeSetTypeEnum.ROLE == settype) { JSONArray nodeUserArray = nodeUserJsonObject.getJSONArray("nodeUserList"); //所选审批人分类 Iterator iterator = nodeUserArray.stream().iterator(); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java index 4fb4b6c..4b9a6df 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/flowable/TaskCreatedListener.java @@ -43,12 +43,12 @@ public void notify(DelegateTask delegateTask) { //审批人为空,任务自动通过/自动驳回执行 //任务定义唯一标识,通过id("userTask")方法生成,即代码中设置的userTask.setId(id); + String taskProcessInstanceId = delegateTask.getProcessInstanceId(); String taskDefinitionKey = delegateTask.getTaskDefinitionKey(); - - if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey)))) { + if (taskDefinitionKey.startsWith("root_") && Objects.isNull(redisUtil.get(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId)))) { taskService.complete(delegateTask.getId()); //保证流程驳回到发起人后不自动审批通过 - redisUtil.set(MessageFormat.format(CacheKeys.TASK_DEFINITION_KEY, taskDefinitionKey), taskDefinitionKey); + redisUtil.set(MessageFormat.format(CacheKeys.TASK_PROCESS_INSTANCE_ID, taskProcessInstanceId), taskProcessInstanceId); } else { if ("100000".equals(delegateTask.getAssignee())) { Object autoRefuse = delegateTask.getVariable("autoRefuse");//CounterSignListener中设置的变量 diff --git a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java index 8d9482f..b7711b8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/redis/key/CacheKeys.java @@ -6,5 +6,5 @@ * @Date: 2022/8/8 10:26 */ public interface CacheKeys { - String TASK_DEFINITION_KEY = "missiles:metering:taskDefinitionKey:{0}"; + String TASK_PROCESS_INSTANCE_ID = "missiles:metering:taskDefinitionKey:{0}"; } diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java index 30b8331..5494aca 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/system/FlowDefMapper.java @@ -16,4 +16,6 @@ List selectDeployListPage(@Param("page") Page page, @Param("request") FlowListRequest request); List selectDeployList(@Param("request") FlowListRequest request); + + List selectListByIds(@Param("ids") List ids); } diff --git a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml index 2afb680..ad39ecd 100644 --- a/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/system/FlowDefMapper.xml @@ -72,8 +72,8 @@ su.name as directorName FROM ACT_RE_PROCDEF rp LEFT JOIN ACT_RE_DEPLOYMENT rd ON rp.deployment_id_ = rd.id_ - - INNER JOIN (SELECT max(arp.deployment_id_) AS deployment_id_ FROM ACT_RE_PROCDEF arp GROUP BY arp.key_) c ON rp.deployment_id_ = c.deployment_id_ + + LEFT JOIN system_flow_form sff ON sff.deploy_id = rd.id_ LEFT JOIN sys_user su ON su.id = rd.tenant_id_ WHERE sff.is_del = 0 @@ -92,12 +92,44 @@ and rp.suspension_state_ = #{request.suspensionState} - - and rd.tenant_id_ = #{request.directorId} + + and su.name like concat('%',#{request.directorName},'%') - - and rd.deploy_time_ <= #{request.deploymentTime} + + and rd.deploy_time_ >= #{request.deploymentStartTime} + + and rd.deploy_time_ <= #{request.deploymentEndTime} + + order by rd.deploy_time_ desc + + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java index 6ed94f1..bae35e5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowListRequest.java @@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + /** * @Description: 流程定义列表请求实体 * @Author: wangpeng @@ -53,4 +55,7 @@ @ApiModelProperty("部署时间(结束)") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private String deploymentEndTime; + + @ApiModelProperty(value = "筛选ids", dataType = "List") + private List ids; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java index 32d783f..acdf7d0 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/system/FlowProcDefDTO.java @@ -18,8 +18,8 @@ /** *

流程定义列表实体类

*/ -@ColumnWidth(30) -@HeadRowHeight(15) +@ColumnWidth(35) +@HeadRowHeight(20) @ContentRowHeight(20) @ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN) @ExcelIgnoreUnannotated diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java index f53eeb5..b32478b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/IBaseApprovalService.java @@ -23,4 +23,6 @@ List getFailedList(String formId); List getCanceledList(String formId); + + List getFailedRejectList(String formId); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java index 67b11d2..bf83b75 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/BaseApprovalServiceImpl.java @@ -108,9 +108,10 @@ List historicProcessInstances = new ArrayList<>(); //管理员or其他用户 if(ShiroKit.isAdmin()){ - //根据业务状态、流程定义查询该业务所有未通过的流程实例-拒绝 + //根据业务状态、流程定义查询该业务所有已取消的流程实例-拒绝 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .deleted() //拒绝的要执行删除操作,也要设置业务状态,此处可同时设置为条件进行查询 .processInstanceBusinessStatus(ApprovalStatusEnum.CANCELED) //对应取消按钮中设置的业务状态 .orderByProcessInstanceStartTime().desc() @@ -122,7 +123,8 @@ }); //根据业务状态、流程定义、登录用户id查询该业务已取消的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .startedBy(String.valueOf(user.getId())) .processInstanceBusinessStatus(ApprovalStatusEnum.CANCELED) .orderByProcessInstanceStartTime().desc() @@ -146,8 +148,9 @@ if(ShiroKit.isAdmin()){ //根据业务状态、流程定义查询该业务所有未通过的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) -// .deleted() //拒绝的审批流程要执行删除操作,也要设置业务状态,所以使用下行的状态可满足拒绝和驳回的查询 + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) +// .deleted() //拒绝的审批流程要执行删除操作,也要设置业务状态,所以使用下行的状态可满足拒绝的查询 .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED) //todo:拒绝按钮已增加业务状态,需验证不加deleted查询的是未删除的还是所有的 .orderByProcessInstanceStartTime().desc() .list(); @@ -158,14 +161,16 @@ }); //根据业务状态、流程定义、登录用户id查询该业务未通过的流程实例(作为发起者) historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .startedBy(String.valueOf(user.getId())) .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED) .orderByProcessInstanceStartTime().desc() .list(); //根据业务状态、流程定义、登录用户id获取该业务的未通过的流程实例的审批者已完成任务(作为审批者) List tasks = historyService.createHistoricTaskInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) .finished() //审批者已完成审批 .processUnfinished() //todo:此参数若表示实例未完成,则这里使用正确,需验证 @@ -182,7 +187,60 @@ } List businessKeys = historicProcessInstances.stream().map(HistoricProcessInstance::getBusinessKey).collect(Collectors.toList()); return businessKeys; + } + @Override + public List getFailedRejectList(String formId) { + //根据业务表单id获取流程定义 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("form_id", formId); + SystemFlowForm flowForm = flowFormService.getOne(wrapper); + if (Objects.isNull(flowForm) || StringUtils.isEmpty(flowForm.getDeployId()) || StringUtils.isEmpty(flowForm.getProcDefId())) { + log.error("查询未通过-驳回的流程,该表单不存在对应的流程定义,formId:{}", formId); + return new ArrayList<>(); + } + List historicProcessInstances = new ArrayList<>(); + //管理员or其他用户 + if(ShiroKit.isAdmin()){ + //根据业务状态、流程定义查询该业务所有未通过的流程实例 + historicProcessInstances = historyService.createHistoricProcessInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .orderByProcessInstanceStartTime().desc() + .list(); + }else{ + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + //根据业务状态、流程定义、登录用户id查询该业务未通过的流程实例(作为发起者) + historicProcessInstances = historyService.createHistoricProcessInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) + .startedBy(String.valueOf(user.getId())) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .orderByProcessInstanceStartTime().desc() + .list(); + //根据业务状态、流程定义、登录用户id获取该业务的未通过的流程实例的审批者已完成任务(作为审批者) + List tasks = historyService.createHistoricTaskInstanceQuery() + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) + .taskAssignee(String.valueOf(user.getId())) + .finished() //审批者已完成审批 + .processUnfinished() //todo:此参数若表示实例未完成,则这里使用正确,需验证 + .orderByTaskCreateTime().desc() + .list(); + //根据作为审批者的任务查询未通过的流程实例 + for (HistoricTaskInstance task : tasks) { + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(task.getProcessInstanceId()) + .processInstanceBusinessStatus(ApprovalStatusEnum.FAILED_REJECT) + .singleResult(); + historicProcessInstances.add(historicProcessInstance); + } + } + List businessKeys = historicProcessInstances.stream().map(HistoricProcessInstance::getBusinessKey).collect(Collectors.toList()); + return businessKeys; } public List getPassedList(String formId) { @@ -199,8 +257,10 @@ if(ShiroKit.isAdmin()){ //根据流程定义查询该业务所有已完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .finished() + .notDeleted() .orderByProcessInstanceStartTime().desc() .list(); }else{ @@ -210,14 +270,17 @@ }); //根据流程定义、登录用户id查询该业务已完成的流程实例(作为发起者) historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .finished() + .notDeleted() .startedBy(String.valueOf(user.getId())) .orderByProcessInstanceStartTime().desc() .list(); //根据流程定义、登录用户id获取该业务流程的实例结束的已办任务(作为审批者) List tasks = historyService.createHistoricTaskInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) .processFinished() //todo:此参数若表示实例已完成,则这里使用正确,需验证 .orderByTaskCreateTime().desc() @@ -225,6 +288,7 @@ //根据作为审批者的任务查询流程实例 for (HistoricTaskInstance task : tasks) { HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .notDeleted() .processInstanceId(task.getProcessInstanceId()).singleResult(); historicProcessInstances.add(historicProcessInstance); } @@ -247,7 +311,8 @@ if(ShiroKit.isAdmin()){ //根据流程定义查询该业务所有未完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) //这里使用流程定义,因为更新流程定义不会更新定义id,会更新部署id +// .deploymentId(flowForm.getDeployId()) .or() .unfinished() .processInstanceBusinessStatus(ApprovalStatusEnum.IN_APPROVED) //查询审批中状态,因为驳回后的编辑操作中设置为该状态 @@ -261,7 +326,8 @@ }); //根据流程定义、登录用户id查询该业务未完成的流程实例 historicProcessInstances = historyService.createHistoricProcessInstanceQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .or() .unfinished() .processInstanceBusinessStatus(ApprovalStatusEnum.IN_APPROVED) //查询审批中状态,因为驳回后的编辑操作中设置为该状态 @@ -289,7 +355,8 @@ }); //根据流程定义、登录用户id获取该业务待办任务 List tasks = taskService.createTaskQuery() - .deploymentId(flowForm.getDeployId()) + .processDefinitionKey(flowForm.getProcDefId()) +// .deploymentId(flowForm.getDeployId()) .taskAssignee(String.valueOf(user.getId())) // .includeProcessVariables() .orderByTaskCreateTime().desc() diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java index 1207b86..f38edca 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java @@ -136,7 +136,7 @@ taskService.addComment(task.getId(), task.getProcessInstanceId(),"3", request.getComments()); } //设置驳回状态为未通过 - runtimeService.updateBusinessStatus(task.getProcessInstanceId(), ApprovalStatusEnum.FAILED); + runtimeService.updateBusinessStatus(task.getProcessInstanceId(), ApprovalStatusEnum.FAILED_REJECT); //驳回至指定节点,现驳回到起始节点 HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery() diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java index 5f44e68..a0b1046 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterFileServiceImpl.java @@ -271,11 +271,19 @@ break; //未通过(包括拒绝、驳回,拒绝为直接删除实例,驳回为驳回到起点),该状态维护在flowable case ApprovalStatusEnum.FAILED: - businessKey = baseApprovalService.getFailedList(request.getFormId()); + businessKey = baseApprovalService.getFailedList(request.getFormId()); //未通过-拒绝 + List rejectBusinessKey = baseApprovalService.getFailedRejectList(request.getFormId()); //未通过-驳回 if(!CollectionUtils.isEmpty(businessKey)){ list = meterFileMapper.selectBatchForApproval(request, businessKey); approvalList = handleApprovalListResponse(approvalList, list, ApprovalStatusEnum.FAILED); } + List rejectApprovalList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(rejectBusinessKey)){ + List rejectList = meterFileMapper.selectBatchForApproval(request, rejectBusinessKey); + rejectApprovalList = handleApprovalListResponse(approvalList, rejectList, ApprovalStatusEnum.FAILED_REJECT); + } + //合并未通过-拒绝和未通过-驳回 + approvalList.addAll(rejectApprovalList); break; //已取消(直接删除实例),该状态维护在flowable case ApprovalStatusEnum.CANCELED: diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTraceSupplierServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTraceSupplierServiceImpl.java index c08bd5d..e7720f8 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTraceSupplierServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTraceSupplierServiceImpl.java @@ -251,11 +251,19 @@ break; //未通过(包括拒绝、驳回,拒绝为直接删除实例,驳回为驳回到起点),该状态维护在flowable case ApprovalStatusEnum.FAILED: - businessKey = baseApprovalService.getFailedList(request.getFormId()); + businessKey = baseApprovalService.getFailedList(request.getFormId()); //未通过-拒绝 + List rejectBusinessKey = baseApprovalService.getFailedRejectList(request.getFormId()); //未通过-驳回 if(!CollectionUtils.isEmpty(businessKey)){ list = traceSupplierMapper.selectBatchForApproval(request, businessKey); approvalList = handleApprovalListResponse(approvalList, list, ApprovalStatusEnum.FAILED); } + List rejectApprovalList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(rejectBusinessKey)){ + List rejectList = traceSupplierMapper.selectBatchForApproval(request, rejectBusinessKey); + rejectApprovalList = handleApprovalListResponse(approvalList, rejectList, ApprovalStatusEnum.FAILED_REJECT); + } + //合并未通过-拒绝和未通过-驳回 + approvalList.addAll(rejectApprovalList); break; //已取消(直接删除实例),该状态维护在flowable case ApprovalStatusEnum.CANCELED: diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTrainPlanServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTrainPlanServiceImpl.java index 2b54745..cbc5d52 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTrainPlanServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/meter/MeterTrainPlanServiceImpl.java @@ -294,11 +294,19 @@ break; //未通过(包括拒绝、驳回,拒绝为直接删除实例,驳回为驳回到起点),该状态维护在flowable case ApprovalStatusEnum.FAILED: - businessKey = baseApprovalService.getFailedList(request.getFormId()); + businessKey = baseApprovalService.getFailedList(request.getFormId()); //未通过-拒绝 + List rejectBusinessKey = baseApprovalService.getFailedRejectList(request.getFormId()); //未通过-驳回 if(!CollectionUtils.isEmpty(businessKey)){ list = trainPlanMapper.selectBatchForApproval(request, businessKey); approvalList = handleApprovalListResponse(approvalList, list, ApprovalStatusEnum.FAILED); } + List rejectApprovalList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(rejectBusinessKey)){ + List rejectList = trainPlanMapper.selectBatchForApproval(request, rejectBusinessKey); + rejectApprovalList = handleApprovalListResponse(approvalList, rejectList, ApprovalStatusEnum.FAILED_REJECT); + } + //合并未通过-拒绝和未通过-驳回 + approvalList.addAll(rejectApprovalList); break; //已取消(直接删除实例),该状态维护在flowable case ApprovalStatusEnum.CANCELED: diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/system/FlowDefDefServiceImpl.java index 243321f..fb925f4 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/system/FlowDefDefServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/system/FlowDefDefServiceImpl.java @@ -22,6 +22,8 @@ import com.casic.missiles.service.system.IFlowDefService; import com.casic.missiles.utils.SnowflakeUtil; import com.casic.missiles.utils.SpringContextUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; @@ -294,6 +296,12 @@ return dataList; } + @Override + public List listByIds(List ids) { + List list = flowDefMapper.selectListByIds(ids); + return list; + } + /** * 方法功能:根据上个节点id及本节点信息生成本节点 @@ -403,32 +411,39 @@ Iterator iterator = nodeUserList.stream().iterator(); List userIds = new ArrayList<>(); while (iterator.hasNext()) { - HashMap map = (HashMap) iterator.next(); - if ("1".equals(String.valueOf(map.get("type")))) { - //用户id - String targetId = String.valueOf(map.get("targetId")); - userIds.add(targetId); - } else if ("2".equals(String.valueOf(map.get("type")))) { - //角色id - String targetId = String.valueOf(map.get("targetId")); - IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); - BaseMapper baseMapper = relationService.getBaseMapper(); - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("ROLEID", targetId); - List ruRelations = baseMapper.selectList(wrapper); - ruRelations.forEach(ruRelation -> { - userIds.add(String.valueOf(ruRelation.getUserId())); - }); - } else if ("3".equals(String.valueOf(map.get("type")))) { - //部门id - String targetId = String.valueOf(map.get("targetId")); - UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("DEPT_ID", targetId); - List users = userMapper.selectList(wrapper); - users.forEach(user -> { - userIds.add(String.valueOf(user.getId())); - }); + try { + String s = JSONObject.toJSONString(iterator.next()); + HashMap map = new ObjectMapper().readValue(s, HashMap.class); +// HashMap map = (HashMap) iterator.next(); + if ("1".equals(String.valueOf(map.get("type")))) { + //用户id + String targetId = String.valueOf(map.get("targetId")); + userIds.add(targetId); + } else if ("2".equals(String.valueOf(map.get("type")))) { + //角色id + String targetId = String.valueOf(map.get("targetId")); + IUserRoleRelationService relationService = SpringContextUtil.getBean(IUserRoleRelationService.class); + BaseMapper baseMapper = relationService.getBaseMapper(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("ROLEID", targetId); + List ruRelations = baseMapper.selectList(wrapper); + ruRelations.forEach(ruRelation -> { + userIds.add(String.valueOf(ruRelation.getUserId())); + }); + } else if ("3".equals(String.valueOf(map.get("type")))) { + //部门id + String targetId = String.valueOf(map.get("targetId")); + UserMapper userMapper = SpringContextUtil.getBean(UserMapper.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("DEPT_ID", targetId); + List users = userMapper.selectList(wrapper); + users.forEach(user -> { + userIds.add(String.valueOf(user.getId())); + }); + } + } catch (JsonProcessingException e) { + log.error("构造条件分支,json转换为hashMap异常!"); + e.printStackTrace(); } } String str = StringUtils.join(userIds, ","); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java index a8c1df2..acd6e07 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/system/IFlowDefService.java @@ -30,4 +30,6 @@ ReturnDTO delete(FlowDeleteRequest request); List list(FlowListRequest request); + + List listByIds(List ids); }