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 new file mode 100644 index 0000000..d504b61 --- /dev/null +++ b/snow-admin/src/main/java/com/snow/web/controller/flowable/FlowController.java @@ -0,0 +1,104 @@ +package com.snow.web.controller.flowable; + +import com.google.common.collect.Lists; +import com.snow.common.annotation.Log; +import com.snow.common.core.domain.AjaxResult; +import com.snow.common.enums.BusinessType; +import com.snow.common.exception.BusinessException; +import com.snow.common.utils.StringUtils; +import com.snow.flowable.domain.CompleteTaskDTO; +import com.snow.flowable.domain.FileEntry; +import com.snow.flowable.domain.FinishTaskDTO; +import com.snow.flowable.service.impl.FlowableServiceImpl; +import com.snow.framework.util.ShiroUtils; +import com.snow.system.domain.SysOaLeave; +import com.snow.system.domain.SysUser; +import com.snow.system.service.ISysOaLeaveService; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.task.api.Task; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +/** + * @program: snow + * @description + * @author: 没用的阿吉 + * @create: 2020-11-23 21:17 + **/ +@Controller +@RequestMapping("/flow") +public class FlowController { + private String prefix = "flow"; + + @Autowired + private ISysOaLeaveService sysOaLeaveService; + @Autowired + private FlowableServiceImpl flowableService; + + + /** + * 跳转流程编译器 + * @return + */ + //@RequiresPermissions("modeler:flow:view") + @GetMapping("/toFinishTask") + public String toFinishTask(String businessKey,String taskId,ModelMap mmap) + { + Task task = flowableService.getTask(taskId); + HistoricProcessInstance historicProcessInstance= flowableService.getHistoricProcessInstanceById(task.getProcessInstanceId()); + String processDefinitionKey = historicProcessInstance.getProcessDefinitionKey(); + if(processDefinitionKey.equals("snow_oa_leave")){ + SysOaLeave sysOaLeave=new SysOaLeave(); + sysOaLeave.setLeaveNo(businessKey); + List sysOaLeaves = sysOaLeaveService.selectSysOaLeaveList(sysOaLeave); + if(StringUtils.isEmpty(sysOaLeaves)){ + throw new BusinessException("跳转请假申请页面异常"); + } + mmap.put("sysOaLeave", sysOaLeaves.get(0)); + mmap.put("taskId", taskId); + return "system/leave/finishTask"; + } + return ""; + } + + /** + * 完成任务 + */ + //@RequiresPermissions("system:leave:startLeaveProcess") + @Log(title = "完成审批", businessType = BusinessType.INSERT) + @PostMapping("/finishTask") + @ResponseBody + @Transactional(rollbackFor = Exception.class) + public AjaxResult finishTask(FinishTaskDTO finishTaskDTO) + + { + SysUser sysUser = ShiroUtils.getSysUser(); + + List files=Lists.newArrayList(); + FileEntry fileEntry=new FileEntry(); + fileEntry.setName("请假申请"); + fileEntry.setUrl(finishTaskDTO.getSuggestionFileUrl()); + files.add(fileEntry); + CompleteTaskDTO completeTaskDTO=new CompleteTaskDTO(); + completeTaskDTO.setTaskId(finishTaskDTO.getTaskId()); + completeTaskDTO.setUserId(String.valueOf(sysUser.getUserId())); + completeTaskDTO.setFiles(files); + completeTaskDTO.setComment(finishTaskDTO.getSuggestion()); + Integer checkStatus = finishTaskDTO.getCheckStatus(); + if(checkStatus==0){ + completeTaskDTO.setIsPass(true); + }else { + completeTaskDTO.setIsPass(false); + } + flowableService.completeTask(completeTaskDTO); + return AjaxResult.success(); + } +} diff --git a/snow-admin/src/main/java/com/snow/web/controller/system/SysOaLeaveController.java b/snow-admin/src/main/java/com/snow/web/controller/system/SysOaLeaveController.java index 2d3402b..f542fc0 100644 --- a/snow-admin/src/main/java/com/snow/web/controller/system/SysOaLeaveController.java +++ b/snow-admin/src/main/java/com/snow/web/controller/system/SysOaLeaveController.java @@ -3,14 +3,17 @@ package com.snow.web.controller.system; import java.util.List; import com.snow.common.constant.SequenceContants; +import com.snow.common.utils.StringUtils; import com.snow.flowable.domain.CompleteTaskDTO; import com.snow.flowable.domain.StartProcessDTO; import com.snow.flowable.service.impl.FlowableServiceImpl; import com.snow.framework.util.ShiroUtils; import com.snow.system.domain.SysUser; import com.snow.system.service.ISysSequenceService; +import com.snow.system.service.impl.SysOaLeaveServiceImpl; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.task.api.Task; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -50,6 +53,7 @@ public class SysOaLeaveController extends BaseController @Autowired private ISysSequenceService sequenceService; + @RequiresPermissions("system:leave:view") @GetMapping() public String leave() @@ -114,23 +118,29 @@ public class SysOaLeaveController extends BaseController /** - * 发起审批 + * 完成任务 */ - @RequiresPermissions("system:leave:startLeaveProcess") + //@RequiresPermissions("system:leave:startLeaveProcess") @Log(title = "发起审批", businessType = BusinessType.INSERT) - @PostMapping("/startLeaveProcess") + @PostMapping("/finishTask") @ResponseBody @Transactional(rollbackFor = Exception.class) - public AjaxResult startLeaveProcess(Integer id) + public AjaxResult startLeaveProcess(String businessKey) { - SysOaLeave sysOaLeave = sysOaLeaveService.selectSysOaLeaveById(id); + SysOaLeave sysOaLeave=new SysOaLeave(); + sysOaLeave.setLeaveNo(businessKey); + List sysOaLeaves = sysOaLeaveService.selectSysOaLeaveList(sysOaLeave); + if(StringUtils.isEmpty(sysOaLeaves)){ + return AjaxResult.error("该业务参数不存在"); + } SysUser sysUser = ShiroUtils.getSysUser(); CompleteTaskDTO CompleteTaskDTO=new CompleteTaskDTO(); CompleteTaskDTO.setUserId(String.valueOf(sysUser.getUserId())); flowableService.completeTask(CompleteTaskDTO); sysOaLeave.setProcessStatus(1); sysOaLeave.setCreateBy(sysUser.getUserName()); + sysOaLeave.setApplyPerson(String.valueOf(sysUser.getUserId())); int i = sysOaLeaveService.updateSysOaLeave(sysOaLeave); return toAjax(i); } @@ -162,9 +172,11 @@ public class SysOaLeaveController extends BaseController startProcessDTO.setProcessDefinitionKey("snow_oa_leave"); startProcessDTO.setStartUserId(String.valueOf(sysUser.getUserId())); ProcessInstance processInstance = flowableService.startProcessInstanceByKey(startProcessDTO); - CompleteTaskDTO CompleteTaskDTO=new CompleteTaskDTO(); - CompleteTaskDTO.setUserId(String.valueOf(sysUser.getUserId())); - flowableService.completeTask(CompleteTaskDTO); + CompleteTaskDTO completeTaskDTO=new CompleteTaskDTO(); + completeTaskDTO.setUserId(String.valueOf(sysUser.getUserId())); + Task task= flowableService.getTaskProcessInstanceById(processInstance.getProcessInstanceId()); + completeTaskDTO.setTaskId(task.getId()); + flowableService.completeTask(completeTaskDTO); sysOaLeave.setProcessStatus(1); sysOaLeave.setCreateBy(sysUser.getUserName()); BeanUtils.copyProperties(sysOaLeave,oldSysOaLeave); diff --git a/snow-admin/src/main/resources/templates/main_v1.html b/snow-admin/src/main/resources/templates/main_v1.html index fb0c1ed..3655144 100644 --- a/snow-admin/src/main/resources/templates/main_v1.html +++ b/snow-admin/src/main/resources/templates/main_v1.html @@ -113,7 +113,7 @@ var capitalStatusDatas = [[${@dict.getType('capital_status')}]]; var billTypeDatas = [[${@dict.getType('bill_type')}]]; var prefix = ctx + "modeler"; - + var prefixFlow = ctx + "flow"; $(function() { var options = { url: prefix + "/findTasksByUserId", @@ -146,7 +146,7 @@ }, { - field: 'startUserId', + field: 'startUserName', title: '流程发起人' }, { @@ -163,14 +163,25 @@ align: 'center', formatter: function(value, row, index) { var actions = []; - actions.push('处理 '); - actions.push('删除'); + actions.push('处理 '); + actions.push('获取流程图'); return actions.join(''); } }] }; $.table.init(options); }); + + function cancelTask(businessKey,taskId) { + console.log(JSON.stringify(taskId)); + var preViewUrl=prefixFlow+'/toFinishTask?businessKey='+businessKey+'&taskId='+taskId; + $.modal.openTab("审批", preViewUrl); + } + function getProcessDiagram(processInstanceId) { + + var preViewUrl=prefix+'/getProcessDiagram?processInstanceId='+processInstanceId; + $.modal.openTab("流程图", preViewUrl); + } diff --git a/snow-admin/src/main/resources/templates/system/leave/edit.html b/snow-admin/src/main/resources/templates/system/leave/edit.html index fa715d7..2f35569 100644 --- a/snow-admin/src/main/resources/templates/system/leave/edit.html +++ b/snow-admin/src/main/resources/templates/system/leave/edit.html @@ -25,7 +25,7 @@
- +
@@ -34,32 +34,11 @@
- +
- -
- -
- -
-
-
- -
- -
-
-
- -
- -
-
diff --git a/snow-admin/src/main/resources/templates/system/leave/finishTask.html b/snow-admin/src/main/resources/templates/system/leave/finishTask.html new file mode 100644 index 0000000..5ec5cf7 --- /dev/null +++ b/snow-admin/src/main/resources/templates/system/leave/finishTask.html @@ -0,0 +1,104 @@ + + + + + + + + +
+ +
+
+
+   +   + +
+
+ +

请假信息

+
+ +
+
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+

填写信息

+
+ +
+ +
+
+
+ +
+ +
+ +
+
+
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/snow-flowable/src/main/java/com/snow/flowable/domain/FinishTaskDTO.java b/snow-flowable/src/main/java/com/snow/flowable/domain/FinishTaskDTO.java new file mode 100644 index 0000000..f7779d7 --- /dev/null +++ b/snow-flowable/src/main/java/com/snow/flowable/domain/FinishTaskDTO.java @@ -0,0 +1,31 @@ +package com.snow.flowable.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @program: snow + * @description + * @author: 没用的阿吉 + * @create: 2020-11-23 22:13 + **/ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FinishTaskDTO implements Serializable { + + private String taskId; + + private String suggestion; + + private String suggestionFileUrl; + /** + * 0通过,1--驳回 + */ + private Integer checkStatus; +} 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 a893e08..16769fe 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 @@ -1,6 +1,7 @@ package com.snow.flowable.service; import com.snow.flowable.domain.*; +import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; @@ -74,4 +75,20 @@ public interface FlowableService { * @param processId */ void getProcessDiagram(HttpServletResponse httpServletResponse, String processId); + + /** + * 获取流程实例 + * @param id + * @return + */ + ProcessInstance getProcessInstanceById(String id); + + /** + * 获取历史流程实例 + * @param id + * @return + */ + HistoricProcessInstance getHistoricProcessInstanceById(String id); + + Task getTaskProcessInstanceById(String id); } 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 eb36a21..6370fb7 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 @@ -7,7 +7,9 @@ import com.snow.common.exception.BusinessException; import com.snow.flowable.domain.*; import com.snow.flowable.service.FlowableService; import com.snow.system.domain.SysRole; +import com.snow.system.domain.SysUser; import com.snow.system.service.ISysRoleService; +import com.snow.system.service.impl.SysUserServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.flowable.bpmn.model.BpmnModel; @@ -67,6 +69,9 @@ public class FlowableServiceImpl implements FlowableService { @Autowired private ProcessEngine processEngine; + @Autowired + private SysUserServiceImpl sysUserService; + @Override public List getDeploymentList(DeploymentQueryDTO deploymentQueryDTO) { @@ -225,7 +230,10 @@ public class FlowableServiceImpl implements FlowableService { taskVO.setOwner(t.getOwner()); HistoricProcessInstance historicProcessInstance = getHistoricProcessInstanceById(t.getProcessInstanceId()); taskVO.setProcessDefinitionName(historicProcessInstance.getProcessDefinitionName()); - taskVO.setStartUserId(historicProcessInstance.getStartUserId()); + String startUserId = historicProcessInstance.getStartUserId(); + SysUser sysUser = sysUserService.selectUserById(Long.parseLong(startUserId)); + taskVO.setStartUserId(startUserId); + taskVO.setStartUserName(sysUser.getUserName()); taskVO.setBusinessKey(historicProcessInstance.getBusinessKey()); taskVO.setStartTime(historicProcessInstance.getStartTime()); return taskVO; @@ -242,7 +250,7 @@ public class FlowableServiceImpl implements FlowableService { log.info("完成任务时,该任务ID:%不存在",completeTaskDTO.getTaskId()); throw new BusinessException(String.format("该任务ID:%不存在",completeTaskDTO.getTaskId())); } - if(StringUtils.isEmpty(completeTaskDTO.getComment())){ + if(!StringUtils.isEmpty(completeTaskDTO.getComment())){ taskService.addComment(task.getId(),task.getProcessInstanceId(),completeTaskDTO.getComment()); } List files = completeTaskDTO.getFiles(); @@ -252,7 +260,7 @@ public class FlowableServiceImpl implements FlowableService { ); } runtimeService.setVariable(task.getExecutionId(),CompleteTaskDTO.IS_PASS,completeTaskDTO.getIsPass()); - Map paramMap = completeTaskDTO.getParamMap(); + Map paramMap = StringUtils.isEmpty(completeTaskDTO.getParamMap())?Maps.newHashMap():completeTaskDTO.getParamMap(); if(!CollectionUtils.isEmpty(paramMap)){ Set> entries = paramMap.entrySet(); entries.stream().forEach(t-> @@ -260,6 +268,7 @@ public class FlowableServiceImpl implements FlowableService { ); } paramMap.put(CompleteTaskDTO.IS_PASS,completeTaskDTO.getIsPass()); + taskService.claim(task.getId(),completeTaskDTO.getUserId()); taskService.complete(task.getId(),paramMap,true); } @@ -321,15 +330,24 @@ public class FlowableServiceImpl implements FlowableService { .processInstanceId(processInstanceId).count() > 0; } + @Override public ProcessInstance getProcessInstanceById(String id){ return runtimeService.createProcessInstanceQuery() .processInstanceId(id) .singleResult(); } + @Override public HistoricProcessInstance getHistoricProcessInstanceById(String id){ return historyService.createHistoricProcessInstanceQuery() .processInstanceId(id) .singleResult(); } + + @Override + public Task getTaskProcessInstanceById(String id){ + return taskService.createTaskQuery() + .processInstanceId(id) + .singleResult(); + } }