package com.mossle.operation.web; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import com.mossle.api.form.FormDTO; import com.mossle.api.humantask.HumanTaskConnector; import com.mossle.api.humantask.HumanTaskConstants; import com.mossle.api.humantask.HumanTaskDTO; import com.mossle.api.keyvalue.FormParameter; import com.mossle.api.keyvalue.KeyValueConnector; import com.mossle.api.keyvalue.Prop; import com.mossle.api.keyvalue.Record; import com.mossle.api.keyvalue.RecordBuilder; import com.mossle.api.process.ProcessConnector; import com.mossle.api.store.StoreConnector; import com.mossle.api.tenant.TenantHolder; import com.mossle.api.user.UserConnector; import com.mossle.button.ButtonDTO; import com.mossle.button.ButtonHelper; import com.mossle.core.MultipartHandler; import com.mossle.core.auth.CurrentUserHolder; import com.mossle.core.mapper.BeanMapper; import com.mossle.core.mapper.JsonMapper; import com.mossle.core.spring.MessageHelper; import com.mossle.operation.service.OperationService; import com.mossle.xform.Xform; import com.mossle.xform.XformBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.servlet.mvc.support.RedirectAttributes; /** * 任务工具条. * * @author Lingo */ @Controller @RequestMapping("operation") public class TaskOperationController { private static Logger logger = LoggerFactory .getLogger(TaskOperationController.class); public static final int STATUS_DRAFT_PROCESS = 0; public static final int STATUS_DRAFT_TASK = 1; public static final int STATUS_RUNNING = 2; private OperationService operationService; private KeyValueConnector keyValueConnector; private MessageHelper messageHelper; private CurrentUserHolder currentUserHolder; private ProcessConnector processConnector; private HumanTaskConnector humanTaskConnector; private MultipartResolver multipartResolver; private StoreConnector storeConnector; private ButtonHelper buttonHelper = new ButtonHelper(); private JsonMapper jsonMapper = new JsonMapper(); private TenantHolder tenantHolder; private BeanMapper beanMapper = new BeanMapper(); private UserConnector userConnector; /** * 保存草稿. */ @RequestMapping("task-operation-saveDraft") public String saveDraft(HttpServletRequest request) throws Exception { this.doSaveRecord(request); return "operation/task-operation-saveDraft"; } /** * 显示任务表单. */ @RequestMapping("task-operation-viewTaskForm") public String viewTaskForm(@RequestParam("humanTaskId") String humanTaskId, Model model, RedirectAttributes redirectAttributes) throws Exception { HumanTaskDTO humanTaskDto = humanTaskConnector .findHumanTask(humanTaskId); if (humanTaskDto == null) { messageHelper.addFlashMessage(redirectAttributes, "任务不存在"); return "redirect:/humantask/workspace-listPersonalTasks.do"; } // 处理转发抄送任务,设置为已读 if (HumanTaskConstants.CATALOG_COPY.equals(humanTaskDto.getCatalog())) { humanTaskDto.setStatus("complete"); humanTaskDto.setAction("read"); humanTaskConnector.saveHumanTask(humanTaskDto); } // 表单 FormDTO formDto = this.findTaskForm(humanTaskDto); if (formDto.isRedirect()) { String redirectUrl = formDto.getUrl() + "?humanTaskId=" + formDto.getTaskId(); return "redirect:" + redirectUrl; } model.addAttribute("formDto", formDto); model.addAttribute("humanTaskId", humanTaskId); model.addAttribute("humanTask", humanTaskDto); if (humanTaskDto.getParentId() != null) { model.addAttribute("parentHumanTask", humanTaskConnector .findHumanTask(humanTaskDto.getParentId())); } // 表单和数据 if ((humanTaskId != null) && (!"".equals(humanTaskId))) { // 如果是任务草稿,直接通过processInstanceId获得record,更新数据 // TODO: 分支肯定有问题 String processInstanceId = humanTaskDto.getProcessInstanceId(); String json = this.findTaskFormData(processInstanceId); if (json != null) { model.addAttribute("json", json); } Record record = keyValueConnector.findByRef(processInstanceId); Xform xform = new XformBuilder().setStoreConnector(storeConnector) .setUserConnector(userConnector) .setContent(formDto.getContent()).setRecord(record).build(); model.addAttribute("xform", xform); } // 操作 List<ButtonDTO> buttons = new ArrayList<ButtonDTO>(); for (String button : formDto.getButtons()) { buttons.add(buttonHelper.findButton(button.trim())); } if (buttons.isEmpty()) { buttons.add(buttonHelper.findButton("saveDraft")); buttons.add(buttonHelper.findButton("completeTask")); } model.addAttribute("buttons", buttons); // 沟通 List<HumanTaskDTO> children = humanTaskConnector .findSubTasks(humanTaskId); model.addAttribute("children", children); // 审批记录 List<HumanTaskDTO> logHumanTaskDtos = humanTaskConnector .findHumanTasksByProcessInstanceId(humanTaskDto .getProcessInstanceId()); model.addAttribute("logHumanTaskDtos", logHumanTaskDtos); return "operation/task-operation-viewTaskForm"; } /** * 完成任务. */ @RequestMapping("task-operation-completeTask") public String completeTask(HttpServletRequest request, RedirectAttributes redirectAttributes) throws Exception { String userId = currentUserHolder.getUserId(); String tenantId = tenantHolder.getTenantId(); MultipartHandler multipartHandler = new MultipartHandler( multipartResolver); Record record = null; String humanTaskId = null; FormParameter formParameter = null; HumanTaskDTO humanTaskDto = null; FormDTO formDto = null; try { multipartHandler.handle(request); logger.debug("getMultiValueMap : {}", multipartHandler.getMultiValueMap()); logger.debug("getMultiFileMap : {}", multipartHandler.getMultiFileMap()); formParameter = this.buildFormParameter(multipartHandler); humanTaskId = formParameter.getHumanTaskId(); operationService.saveDraft(userId, tenantId, formParameter); formDto = humanTaskConnector.findTaskForm(humanTaskId); humanTaskDto = humanTaskConnector.findHumanTask(humanTaskId); String processInstanceId = humanTaskDto.getProcessInstanceId(); record = keyValueConnector.findByRef(processInstanceId); record = new RecordBuilder().build(record, multipartHandler, storeConnector, tenantId); keyValueConnector.save(record); } finally { multipartHandler.clear(); } Xform xform = new XformBuilder().setStoreConnector(storeConnector) .setUserConnector(userConnector) .setContent(formDto.getContent()).setRecord(record).build(); Map<String, Object> taskParameters = xform.getMapData(); logger.info("taskParameters : {}", taskParameters); try { // humanTaskConnector.completeTask(humanTaskId, // currentUserHolder.getUserId(), formParameter.getAction(), // formParameter.getComment(), taskParameters); this.operationService.completeTask(humanTaskId, userId, formParameter, taskParameters, record, humanTaskDto.getProcessInstanceId()); } catch (IllegalStateException ex) { logger.error(ex.getMessage(), ex); messageHelper.addFlashMessage(redirectAttributes, ex.getMessage()); return "redirect:/humantask/workspace-personalTasks.do"; } // if (record == null) { // record = new Record(); // } // record = new RecordBuilder().build(record, STATUS_RUNNING, // humanTaskDto.getProcessInstanceId()); // keyValueConnector.save(record); return "operation/task-operation-completeTask"; } /** * 领取任务. */ @RequestMapping("task-operation-claimTask") public String claimTask(@RequestParam("humanTaskId") String humanTaskId) { String userId = currentUserHolder.getUserId(); humanTaskConnector.claimTask(humanTaskId, userId); return "redirect:/humantask/workspace-personalTasks.do"; } /** * 释放任务. */ @RequestMapping("task-operation-releaseTask") public String releaseTask(@RequestParam("humanTaskId") String humanTaskId) { humanTaskConnector.releaseTask(humanTaskId, ""); return "redirect:/humantask/workspace-personalTasks.do"; } /** * 回退任务,前一个任务. */ @RequestMapping("task-operation-rollbackPrevious") public String rollbackPrevious( @RequestParam("humanTaskId") String humanTaskId) { humanTaskConnector.rollbackPrevious(humanTaskId, ""); return "redirect:/humantask/workspace-personalTasks.do"; } /** * 回退任务,开始事件. */ @RequestMapping("task-operation-rollbackStart") public String rollbackStart(@RequestParam("humanTaskId") String humanTaskId) { humanTaskConnector.rollbackStart(humanTaskId, ""); return "redirect:/humantask/workspace-personalTasks.do"; } /** * 回退任务,发起人. */ @RequestMapping("task-operation-rollbackInitiator") public String rollbackInitiator( @RequestParam("humanTaskId") String humanTaskId, @RequestParam("_humantask_comment_") String comment) { humanTaskConnector.rollbackInitiator(humanTaskId, comment); return "redirect:/humantask/workspace-personalTasks.do"; } /** * 撤销任务. */ @RequestMapping("task-operation-withdraw") public String withdraw(@RequestParam("humanTaskId") String humanTaskId, @RequestParam("comment") String comment) { humanTaskConnector.withdraw(humanTaskId, comment); return "redirect:/humantask/workspace-personalTasks.do"; } /** * 转办. */ @RequestMapping("task-operation-transfer") public String transfer(@RequestParam("humanTaskId") String humanTaskId, @RequestParam("userId") String userId, @RequestParam("comment") String comment) { humanTaskConnector.transfer(humanTaskId, userId, comment); return "redirect:/humantask/workspace-delegatedTasks.do"; } /** * 取消. */ @RequestMapping("task-operation-cancel") public String cancel(@RequestParam("humanTaskId") String humanTaskId, @RequestParam("userId") String userId, @RequestParam("comment") String comment) { humanTaskConnector.cancel(humanTaskId, userId, comment); return "redirect:/humantask/workspace-personalTasks.do"; } /** * 协办. */ @RequestMapping("task-operation-delegateTask") public String delegateTask(@RequestParam("humanTaskId") String humanTaskId, @RequestParam("userId") String userId, @RequestParam("comment") String comment) { humanTaskConnector.delegateTask(humanTaskId, userId, comment); return "redirect:/humantask/workspace-delegatedTasks.do"; } /** * 链状协办. */ @RequestMapping("task-operation-delegateTaskCreate") public String delegateTaskCreate( @RequestParam("humanTaskId") String humanTaskId, @RequestParam("userId") String userId, @RequestParam("comment") String comment) { humanTaskConnector.delegateTaskCreate(humanTaskId, userId, comment); return "redirect:/humantask/workspace-delegatedTasks.do"; } /** * 沟通. */ @RequestMapping("task-operation-communicate") public String communicate(@RequestParam("humanTaskId") String humanTaskId, @RequestParam("userId") String userId, @RequestParam("comment") String comment) { logger.info( "communicate : humanTaskId : {}, userId : {}, comment : {}", humanTaskId, userId, comment); humanTaskConnector.communicate(humanTaskId, userId, comment); return "redirect:/humantask/workspace-personalTasks.do"; } /** * 反馈. */ @RequestMapping("task-operation-callback") public String callback(@RequestParam("humanTaskId") String humanTaskId, @RequestParam("comment") String comment) { humanTaskConnector.callback(humanTaskId, "", comment); return "redirect:/humantask/workspace-personalTasks.do"; } /** * 加签. */ @RequestMapping("task-operation-createVote") public String createVote(@RequestParam("humanTaskId") String humanTaskId, @RequestParam("userIds") String userIds, @RequestParam("comment") String comment) { HumanTaskDTO parentTask = humanTaskConnector.findHumanTask(humanTaskId); parentTask.setOwner(parentTask.getAssignee()); parentTask.setAssignee(""); humanTaskConnector.saveHumanTask(parentTask, false); for (String userId : userIds.split(",")) { HumanTaskDTO childTask = humanTaskConnector.createHumanTask(); // copy childTask.setName(parentTask.getName()); childTask.setPresentationSubject(parentTask .getPresentationSubject()); childTask.setForm(parentTask.getForm()); childTask.setProcessInstanceId(parentTask.getProcessInstanceId()); childTask.setProcessDefinitionId(parentTask .getProcessDefinitionId()); childTask.setTaskId(parentTask.getTaskId()); childTask.setCode(parentTask.getCode()); childTask.setBusinessKey(parentTask.getBusinessKey()); childTask.setTenantId(parentTask.getTenantId()); childTask.setStatus("active"); // config childTask.setParentId(humanTaskId); childTask.setAssignee(userId); childTask.setCatalog(HumanTaskConstants.CATALOG_VOTE); humanTaskConnector.saveHumanTask(childTask, false); } return "redirect:/humantask/workspace-personalTasks.do"; } // ~ ====================================================================== /** * 通过multipart请求构建formParameter. */ public FormParameter buildFormParameter(MultipartHandler multipartHandler) { FormParameter formParameter = new FormParameter(); formParameter.setMultiValueMap(multipartHandler.getMultiValueMap()); formParameter.setMultiFileMap(multipartHandler.getMultiFileMap()); formParameter.setBusinessKey(multipartHandler.getMultiValueMap() .getFirst("businessKey")); formParameter.setBpmProcessId(multipartHandler.getMultiValueMap() .getFirst("bpmProcessId")); formParameter.setHumanTaskId(multipartHandler.getMultiValueMap() .getFirst("humanTaskId")); formParameter.setComment(multipartHandler.getMultiValueMap().getFirst( "_humantask_comment_")); formParameter.setAction(multipartHandler.getMultiValueMap().getFirst( "_humantask_action_")); return formParameter; } /** * 把数据先保存到keyvalue里. */ public FormParameter doSaveRecord(HttpServletRequest request) throws Exception { String userId = currentUserHolder.getUserId(); String tenantId = tenantHolder.getTenantId(); MultipartHandler multipartHandler = new MultipartHandler( multipartResolver); FormParameter formParameter = null; try { multipartHandler.handle(request); logger.info("{}", multipartHandler.getMultiValueMap()); logger.info("{}", multipartHandler.getMultiFileMap()); formParameter = this.buildFormParameter(multipartHandler); String businessKey = operationService.saveDraft(userId, tenantId, formParameter); if ((formParameter.getBusinessKey() == null) || "".equals(formParameter.getBusinessKey().trim())) { formParameter.setBusinessKey(businessKey); } Record record = keyValueConnector.findByCode(businessKey); record = new RecordBuilder().build(record, multipartHandler, storeConnector, tenantId); keyValueConnector.save(record); } finally { multipartHandler.clear(); } return formParameter; } /** * 读取任务对应的表单数据,转换成json. */ public String findTaskFormData(String processInstanceId) throws Exception { Record record = keyValueConnector.findByRef(processInstanceId); if (record == null) { return null; } Map map = new HashMap(); for (Prop prop : record.getProps().values()) { map.put(prop.getCode(), prop.getValue()); } String json = jsonMapper.toJson(map); return json; } /** * 根据taskId获得formDto. */ public FormDTO findTaskForm(HumanTaskDTO humanTaskDto) { FormDTO formDto = humanTaskConnector.findTaskForm(humanTaskDto.getId()); return formDto; } // ~ ====================================================================== @Resource public void setKeyValueConnector(KeyValueConnector keyValueConnector) { this.keyValueConnector = keyValueConnector; } @Resource public void setMessageHelper(MessageHelper messageHelper) { this.messageHelper = messageHelper; } @Resource public void setCurrentUserHolder(CurrentUserHolder currentUserHolder) { this.currentUserHolder = currentUserHolder; } @Resource public void setOperationService(OperationService operationService) { this.operationService = operationService; } @Resource public void setProcessConnector(ProcessConnector processConnector) { this.processConnector = processConnector; } @Resource public void setHumanTaskConnector(HumanTaskConnector humanTaskConnector) { this.humanTaskConnector = humanTaskConnector; } @Resource public void setMultipartResolver(MultipartResolver multipartResolver) { this.multipartResolver = multipartResolver; } @Resource public void setStoreConnector(StoreConnector storeConnector) { this.storeConnector = storeConnector; } @Resource public void setTenantHolder(TenantHolder tenantHolder) { this.tenantHolder = tenantHolder; } @Resource public void setUserConnector(UserConnector userConnector) { this.userConnector = userConnector; } }