From 005d15165fa1571f2b2a7eaa67957a6faa2cb578 Mon Sep 17 00:00:00 2001 From: jinqiming <45981669@qq.com> Date: Fri, 23 Jul 2021 15:46:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/flowable/FlowController.java | 21 ++-- .../src/main/resources/application-druid.yml | 6 +- .../templates/flow/myStartProcess.html | 16 ++-- .../templates/flow/myStartProcessDetail.html | 71 ++++++++++++-- .../templates/system/leave/leaveDetail.html | 3 +- .../com/snow/flowable/domain/AppForm.java | 2 +- .../flowable/domain/ProcessInstanceDTO.java | 2 - .../flowable/domain/ProcessInstanceVO.java | 11 ++- .../flowable/service/FlowableService.java | 16 +++- .../service/impl/FlowableServiceImpl.java | 96 +++++++++++-------- sql/v1.8.sql | 6 +- 11 files changed, 171 insertions(+), 79 deletions(-) diff --git a/snow-admin/src/main/java/com/snow/web/controller/flowable/FlowController.java b/snow-admin/src/main/java/com/snow/web/controller/flowable/FlowController.java index 466d007..c5a7138 100644 --- a/snow-admin/src/main/java/com/snow/web/controller/flowable/FlowController.java +++ b/snow-admin/src/main/java/com/snow/web/controller/flowable/FlowController.java @@ -16,6 +16,7 @@ import com.snow.framework.util.ShiroUtils; import com.snow.system.domain.SysUser; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.task.api.Task; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -145,14 +146,16 @@ public class FlowController extends BaseController { @GetMapping("/myStartProcessDetail") @RequiresPermissions("system:flow:myStartProcessDetail") public String myStartProcessDetail(String processInstanceId,ModelMap modelMap) { - //已审批的 + ProcessInstanceVO processInstanceVo = flowableService.getProcessInstanceVoById(processInstanceId); + //已审批的任务 HistoricTaskInstanceDTO historicTaskInstanceDTO=new HistoricTaskInstanceDTO(); historicTaskInstanceDTO.setProcessInstanceId(processInstanceId); - //historicTaskInstanceDTO.setProcessStatus(1); List historicTaskInstanceList= flowableService.getHistoricTaskInstanceNoPage(historicTaskInstanceDTO); + //获取业务数据 AppForm appFrom = appFormService.getAppFrom(processInstanceId); modelMap.put("historicTaskInstanceList",historicTaskInstanceList); modelMap.put("processInstanceId",processInstanceId); + modelMap.put("processInstance",processInstanceVo); modelMap.put("busVarUrl",appFrom.getBusVarUrl()); modelMap.put("appId",ReflectUtil.getFieldValue(appFrom,"id")); return prefix +"/myStartProcessDetail"; @@ -259,17 +262,17 @@ public class FlowController extends BaseController { } /** - * 删除流程 - * @param id - * @param reason + * 取消流程 + * @param id 流程实例id + * @param reason 理由 * @return */ - @PostMapping("/deleteProcessInstance") - @RequiresPermissions("flow:process:deleteProcessInstance") + @PostMapping("/cancelProcessInstance") + @RequiresPermissions("flow:process:cancelProcessInstance") @ResponseBody @RepeatSubmit - public AjaxResult suspendProcessInstance(String id,String reason) { - flowableService.deleteProcessInstance(id,reason); + public AjaxResult cancelProcessInstanceFlag(String id,String reason) { + flowableService.cancelProcessInstance(id,reason); return AjaxResult.success(); } diff --git a/snow-admin/src/main/resources/application-druid.yml b/snow-admin/src/main/resources/application-druid.yml index e12ba98..fd52dce 100644 --- a/snow-admin/src/main/resources/application-druid.yml +++ b/snow-admin/src/main/resources/application-druid.yml @@ -6,9 +6,9 @@ spring: druid: # 主库数据源 master: - url: jdbc:mysql://rm-bp1j1554xv1qs04295o.mysql.rds.aliyuncs.com:3306/snow-dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8 - username: cloud_root - password: Jin!152377 + url: jdbc:mysql://localhost:3306/snow?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8 + username: root + password: root # 从库数据源 slave: # 从数据源开关/默认关闭 diff --git a/snow-admin/src/main/resources/templates/flow/myStartProcess.html b/snow-admin/src/main/resources/templates/flow/myStartProcess.html index 0376df8..d7905a3 100644 --- a/snow-admin/src/main/resources/templates/flow/myStartProcess.html +++ b/snow-admin/src/main/resources/templates/flow/myStartProcess.html @@ -44,7 +44,7 @@ var processInstanceStatusDatas = [[${@dict.getType('process_instance_status')}]]; var activeProcessInstanceFlag = [[${@permission.hasPermi('system:flow:activeProcessInstance')}]]; var suspendProcessInstanceFlag = [[${@permission.hasPermi('system:flow:suspendProcessInstance')}]]; - var deleteProcessInstanceFlag = [[${@permission.hasPermi('system:flow:deleteProcessInstance')}]]; + var cancelProcessInstanceFlag = [[${@permission.hasPermi('system:flow:cancelProcessInstance')}]]; var prefixFlow = ctx + "flow"; $(function() { @@ -119,7 +119,7 @@ actions.push('激活 '); } if(isFinished==0) { - actions.push('删除 '); + actions.push('取消 '); } actions.push('详情'); return actions.join(''); @@ -140,8 +140,8 @@ $.modal.openTab("详情", detailUrl); } - // 导入数据 - function deleteProcessInstance(id) { + // 取消流程 + function cancelProcessInstance(id) { layer.open({ type: 1, area: ['500px', '350px'], @@ -149,7 +149,7 @@ //不固定 maxmin: false, shade: 0.3, - title: '删除流程', + title: '取消流程', content: $('#deleteProcessInstanceTpl').html(), btn: ['提交', ' 取消'], // 弹层外区域关闭 @@ -157,7 +157,7 @@ btn1: function(index, layero){ var reason = layero.find('#reason').val(); if(reason==''||reason==null){ - $.modal.msgWarning("删除理由不能为空"); + $.modal.msgWarning("取消理由不能为空"); return false; } var index = layer.load(2, {shade: false}); @@ -194,9 +194,9 @@
- +
- +
diff --git a/snow-admin/src/main/resources/templates/flow/myStartProcessDetail.html b/snow-admin/src/main/resources/templates/flow/myStartProcessDetail.html index 2950e74..50958c0 100644 --- a/snow-admin/src/main/resources/templates/flow/myStartProcessDetail.html +++ b/snow-admin/src/main/resources/templates/flow/myStartProcessDetail.html @@ -10,16 +10,73 @@ -
-

业务数据

-

-

-
- 获取业务单 +
+

流程概况

+
+
+
+ +
+
+
+
+ +
+ 进行中 +
+
+ 结束 +
+
+ 取消 +
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ + +
-

+

流程图

diff --git a/snow-admin/src/main/resources/templates/system/leave/leaveDetail.html b/snow-admin/src/main/resources/templates/system/leave/leaveDetail.html index 0db5a9d..27bf18c 100644 --- a/snow-admin/src/main/resources/templates/system/leave/leaveDetail.html +++ b/snow-admin/src/main/resources/templates/system/leave/leaveDetail.html @@ -1,7 +1,7 @@ - + @@ -48,7 +48,6 @@
-
diff --git a/snow-flowable/src/main/java/com/snow/flowable/domain/AppForm.java b/snow-flowable/src/main/java/com/snow/flowable/domain/AppForm.java index a22be7b..eda6d93 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/domain/AppForm.java +++ b/snow-flowable/src/main/java/com/snow/flowable/domain/AppForm.java @@ -31,7 +31,7 @@ public abstract class AppForm implements Serializable { /** - * 业务参数URL + * 业务数据详情页URL */ private String busVarUrl; diff --git a/snow-flowable/src/main/java/com/snow/flowable/domain/ProcessInstanceDTO.java b/snow-flowable/src/main/java/com/snow/flowable/domain/ProcessInstanceDTO.java index 409dd7f..5dacf77 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/domain/ProcessInstanceDTO.java +++ b/snow-flowable/src/main/java/com/snow/flowable/domain/ProcessInstanceDTO.java @@ -1,7 +1,6 @@ package com.snow.flowable.domain; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @@ -75,5 +74,4 @@ public class ProcessInstanceDTO extends FlowBaseDTO implements Serializable { public String nameLikeIgnoreCase; - } diff --git a/snow-flowable/src/main/java/com/snow/flowable/domain/ProcessInstanceVO.java b/snow-flowable/src/main/java/com/snow/flowable/domain/ProcessInstanceVO.java index e769b94..75f6aaf 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/domain/ProcessInstanceVO.java +++ b/snow-flowable/src/main/java/com/snow/flowable/domain/ProcessInstanceVO.java @@ -112,7 +112,7 @@ public class ProcessInstanceVO implements Serializable { */ private String businessKey; /** - * 是否结束(0--进行中,1--结束) + * 是否结束(0--进行中,1--结束,2--取消) */ private Integer isFinished; @@ -131,14 +131,17 @@ public class ProcessInstanceVO implements Serializable { */ private Integer processInstanceStatus; + @Deprecated public static List warpList(List historicProcessInstanceList){ return historicProcessInstanceList.stream().map(t->{ ProcessInstanceVO processInstanceVO=new ProcessInstanceVO(); BeanUtils.copyProperties(t,processInstanceVO); - if(StringUtils.isEmpty(t.getEndActivityId())){ - processInstanceVO.setIsFinished(0); - }else { + if(StringUtils.isEmpty(t.getEndActivityId())&&StringUtils.isNotEmpty(t.getDeleteReason())){ + processInstanceVO.setIsFinished(2); + }else if(StringUtils.isNotEmpty(t.getEndActivityId())){ processInstanceVO.setIsFinished(1); + }else { + processInstanceVO.setIsFinished(0); } Map processVariables = t.getProcessVariables(); processInstanceVO.setProcessVariables(processVariables); diff --git a/snow-flowable/src/main/java/com/snow/flowable/service/FlowableService.java b/snow-flowable/src/main/java/com/snow/flowable/service/FlowableService.java index 953c68a..6880311 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/service/FlowableService.java +++ b/snow-flowable/src/main/java/com/snow/flowable/service/FlowableService.java @@ -120,6 +120,14 @@ public interface FlowableService { */ HistoricProcessInstance getHistoricProcessInstanceById(String id); + + /** + * 获取组装后的流程实例 + * @param id 流程实例id + * @return 组装后的实例对象 + */ + ProcessInstanceVO getProcessInstanceVoById(String id); + /** * 根据流程实例ID查询任务 * @param id @@ -184,11 +192,11 @@ public interface FlowableService { void suspendOrActiveProcessInstance(String instanceId, Integer suspendState); /** - * 删除流程 - * @param instanceId - * @param reason + * 取消流程 + * @param instanceId 流程实例id + * @param reason 理由 */ - void deleteProcessInstance(String instanceId, String reason); + void cancelProcessInstance(String instanceId, String reason); /** * 获取流程定义实体信息 * diff --git a/snow-flowable/src/main/java/com/snow/flowable/service/impl/FlowableServiceImpl.java b/snow-flowable/src/main/java/com/snow/flowable/service/impl/FlowableServiceImpl.java index 3daf0c2..5ab3a3e 100644 --- a/snow-flowable/src/main/java/com/snow/flowable/service/impl/FlowableServiceImpl.java +++ b/snow-flowable/src/main/java/com/snow/flowable/service/impl/FlowableServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.BetweenFormater; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -490,6 +491,18 @@ public class FlowableServiceImpl implements FlowableService { .singleResult(); } + @Override + public ProcessInstanceVO getProcessInstanceVoById(String id) { + ProcessInstanceVO processInstanceVO=new ProcessInstanceVO(); + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(id) + .includeProcessVariables() + .singleResult(); + BeanUtils.copyProperties(historicProcessInstance,processInstanceVO); + //组装参数 + warpProcessInstanceVo(processInstanceVO); + return processInstanceVO; + } + @Override public Task getTaskProcessInstanceById(String id){ @@ -661,7 +674,6 @@ public class FlowableServiceImpl implements FlowableService { PageModel pageModel = new PageModel<> (); pageModel.setTotalCount((int)count); pageModel.setPagedRecords(processInstanceVOS); - //List processInstanceVOS = com.snow.common.utils.bean.BeanUtils.transformList(pageInfo.getList(), ProcessInstanceVO.class); return pageModel; } @@ -705,42 +717,7 @@ public class FlowableServiceImpl implements FlowableService { * @param processInstanceVOS */ private void setProcessInstanceVOs(List processInstanceVOS){ - processInstanceVOS.parallelStream().forEach(t->{ - - Map processVariables = t.getProcessVariables(); - String url= Optional.ofNullable(String.valueOf(processVariables.get(FlowConstants.BUS_VAR_URL))).orElse(""); - //设置返回详情页 - if(!StringUtils.isEmpty(url)){ - if(!StringUtils.isEmpty(processVariables.get("id"))) - t.setFromDetailUrl(url+"/"+processVariables.get("id")); - } - AppForm appForm=(AppForm)processVariables.get(FlowConstants.APP_FORM); - t.setAppForm(appForm); - //计算流程用时 - if(StringUtils.isEmpty(t.getEndTime())){ - String spendTime = DateUtil.formatBetween(t.getStartTime(), new Date(), BetweenFormater.Level.SECOND); - t.setProcessSpendTime(spendTime); - }else { - String spendTime = DateUtil.formatBetween(t.getStartTime(), t.getEndTime(), BetweenFormater.Level.SECOND); - t.setProcessSpendTime(spendTime); - } - String startUserId = t.getStartUserId(); - SysUser sysUser = sysUserService.selectUserById(Long.parseLong(startUserId)); - t.setStartUserName(sysUser.getUserName()); - - //流程状态查询 ACT_RU_EXECUTION - List list = runtimeService.createExecutionQuery().processInstanceId(t.getId()).list(); - if(CollectionUtils.isEmpty(list)){ - t.setProcessInstanceStatus(FlowInstanceEnum.ACTIVATE.getCode()); - }else { - Execution execution=list.get(0); - if(execution.isSuspended()){ - t.setProcessInstanceStatus(FlowInstanceEnum.SUSPEND.getCode()); - }else { - t.setProcessInstanceStatus(FlowInstanceEnum.ACTIVATE.getCode()); - } - } - }); + processInstanceVOS.parallelStream().forEach(t-> warpProcessInstanceVo(t)); } @Override @@ -1095,7 +1072,7 @@ public class FlowableServiceImpl implements FlowableService { } @Override - public void deleteProcessInstance(String instanceId, String reason) { + public void cancelProcessInstance(String instanceId, String reason) { //调用这个方法会把历史数据全部删除 // historyService.deleteHistoricProcessInstance(); //调用该方法 @@ -1210,4 +1187,47 @@ public class FlowableServiceImpl implements FlowableService { return Sets.newHashSet(values); } + + /** + * 构建ProcessInstanceVO对象 + * @param processInstanceVO + */ + private void warpProcessInstanceVo(ProcessInstanceVO processInstanceVO){ + Map processVariables = processInstanceVO.getProcessVariables(); + String url= Optional.ofNullable(String.valueOf(processVariables.get(FlowConstants.BUS_VAR_URL))).orElse(""); + //设置返回详情页 + if(ObjectUtil.isNotNull(url)&&ObjectUtil.isNotNull(processVariables.get("id"))){ + processInstanceVO.setFromDetailUrl(url+"/"+processVariables.get("id")); + } + //设置表单数据 + AppForm appForm=(AppForm)processVariables.get(FlowConstants.APP_FORM); + processInstanceVO.setAppForm(appForm); + //计算流程已用时间 + String spendTime = StringUtils.isEmpty(processInstanceVO.getEndTime())?DateUtil.formatBetween(processInstanceVO.getStartTime(), new Date(), BetweenFormater.Level.SECOND):DateUtil.formatBetween(processInstanceVO.getStartTime(), processInstanceVO.getEndTime(), BetweenFormater.Level.SECOND); + processInstanceVO.setProcessSpendTime(spendTime); + //设置流程发起人 + SysUser sysUser = sysUserService.selectUserById(Long.parseLong(processInstanceVO.getStartUserId())); + processInstanceVO.setStartUserName(sysUser.getUserName()); + + //流程状态查询 ACT_RU_EXECUTION + List list = runtimeService.createExecutionQuery().processInstanceId(processInstanceVO.getId()).list(); + if(CollectionUtils.isEmpty(list)){ + processInstanceVO.setProcessInstanceStatus(FlowInstanceEnum.ACTIVATE.getCode()); + }else { + Execution execution=list.get(0); + if(execution.isSuspended()){ + processInstanceVO.setProcessInstanceStatus(FlowInstanceEnum.SUSPEND.getCode()); + }else { + processInstanceVO.setProcessInstanceStatus(FlowInstanceEnum.ACTIVATE.getCode()); + } + } + //设置流程状态 + if(ObjectUtil.isEmpty(processInstanceVO.getEndActivityId())&& ObjectUtil.isNotEmpty(processInstanceVO.getDeleteReason())){ + processInstanceVO.setIsFinished(2); + }else if(ObjectUtil.isNotEmpty(processInstanceVO.getEndActivityId())){ + processInstanceVO.setIsFinished(1); + }else { + processInstanceVO.setIsFinished(0); + } + } } diff --git a/sql/v1.8.sql b/sql/v1.8.sql index 994399f..3667fc8 100644 --- a/sql/v1.8.sql +++ b/sql/v1.8.sql @@ -18,4 +18,8 @@ INSERT INTO `sys_dict_data`( `dict_sort`, `dict_label`, `dict_value`, `dict_type INSERT INTO `sys_message_template`( `template_code`, `template_name`, `template_body`, `template_desc`, `template_type`, `pc_url`, `app_url`, `icon_class`, `template_status`, `is_delete`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ( '1411568525448978432', '拜访日志', '${userName}于${nowTime}向您推送了一条【${enterprice}】的拜访日志,请您及时前往客户管理查看。', '拜访日志', 4, '/system/customer/messageDetail/${id}', '', 'fa fa-modx', 0, 0, '1', NOW(), '1', NOW()); INSERT INTO `sys_message_template`( `template_code`, `template_name`, `template_body`, `template_desc`, `template_type`, `pc_url`, `app_url`, `icon_class`, `template_status`, `is_delete`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ( '1415927384573616128', '任务待办', '${startUser}于${startTime}发起的【${processInstance}】审批流程到达【${taskName}】审批节点,现需要您去协助处理。请点击详情前往处理。', '任务待办', 4, '/flow/toTaskDetail?taskId=${taskId}', '', 'fa fa-bullhorn', 0, 0, '1', '2021-07-17 10:09:37', '1', '2021-07-17 19:54:55'); -INSERT INTO `sys_message_template`( `template_code`, `template_name`, `template_body`, `template_desc`, `template_type`, `pc_url`, `app_url`, `icon_class`, `template_status`, `is_delete`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ( '1416370192572882944', '流程完结', '您于${startTime}发起的业务单号为【${businessKey}】的【${processInstance}】审批流程现已完结,流程总用时:【${spendTime}】。请点击详情前往查看。', '流程完结', 4, '/flow/myStartProcessDetail?processInstanceId=${processInstanceId}', '', 'fa fa-hourglass-start', 0, 0, '1', '2021-07-17 20:18:23', '1', '2021-07-17 23:07:39'); \ No newline at end of file +INSERT INTO `sys_message_template`( `template_code`, `template_name`, `template_body`, `template_desc`, `template_type`, `pc_url`, `app_url`, `icon_class`, `template_status`, `is_delete`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ( '1416370192572882944', '流程完结', '您于${startTime}发起的业务单号为【${businessKey}】的【${processInstance}】审批流程现已完结,流程总用时:【${spendTime}】。请点击详情前往查看。', '流程完结', 4, '/flow/myStartProcessDetail?processInstanceId=${processInstanceId}', '', 'fa fa-hourglass-start', 0, 0, '1', '2021-07-17 20:18:23', '1', '2021-07-17 23:07:39'); + +#2021-07-23 +INSERT INTO `sys_dict_data`( `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ( 3, '取消', '2', 'process_instance_status', NULL, 'warning', 'N', '0', 'admin', NOW(), '', NOW(), '取消'); +INSERT INTO `sys_menu`( `menu_name`, `parent_id`, `order_num`, `url`, `target`, `menu_type`, `visible`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`, `is_refresh`, `menu_source`) VALUES ('取消流程', 2043, 3, '#', 'menuItem', 'F', '0', 'cancelProcessInstance', '#', 'admin', NOW(), '', NULL, '', 1, 0);