package com.mossle.android.rs; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.ws.rs.FormParam; import javax.ws.rs.HeaderParam; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import com.mossle.api.form.FormDTO; import com.mossle.api.humantask.HumanTaskConnector; import com.mossle.api.humantask.HumanTaskDTO; import com.mossle.api.keyvalue.FormParameter; import com.mossle.api.keyvalue.KeyValueConnector; import com.mossle.api.keyvalue.Record; import com.mossle.api.keyvalue.RecordBuilder; import com.mossle.api.store.StoreConnector; import com.mossle.api.tenant.TenantHolder; import com.mossle.api.user.UserConnector; import com.mossle.bpm.persistence.manager.BpmProcessManager; import com.mossle.core.mapper.JsonMapper; import com.mossle.core.page.Page; import com.mossle.core.util.BaseDTO; import com.mossle.operation.service.OperationService; import com.mossle.pim.persistence.domain.PimDevice; import com.mossle.pim.persistence.manager.PimDeviceManager; import com.mossle.xform.Xform; import com.mossle.xform.XformBuilder; import org.activiti.engine.ProcessEngine; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @Component @Path("android/task") public class AndroidTaskResource { private static Logger logger = LoggerFactory .getLogger(AndroidTaskResource.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 JsonMapper jsonMapper = new JsonMapper(); private ProcessEngine processEngine; private BpmProcessManager bpmProcessManager; private TenantHolder tenantHolder; private HumanTaskConnector humanTaskConnector; private PimDeviceManager pimDeviceManager; private OperationService operationService; private KeyValueConnector keyValueConnector; private StoreConnector storeConnector; private UserConnector userConnector; @POST @Path("tasks") @Produces(MediaType.APPLICATION_JSON) public BaseDTO tasks(@HeaderParam("sessionId") String sessionId) throws Exception { logger.info("start"); PimDevice pimDevice = pimDeviceManager.findUniqueBy("sessionId", sessionId); if (pimDevice == null) { BaseDTO result = new BaseDTO(); result.setCode(401); result.setMessage("auth fail"); return result; } String userId = pimDevice.getUserId(); String tenantId = "1"; Page page = humanTaskConnector.findPersonalTasks(userId, tenantId, 1, 10); List<HumanTaskDTO> humanTaskDtos = (List<HumanTaskDTO>) page .getResult(); List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (HumanTaskDTO humanTaskDto : humanTaskDtos) { Map<String, Object> map = new HashMap<String, Object>(); map.put("id", humanTaskDto.getId()); map.put("name", humanTaskDto.getName()); map.put("presentationSubject", humanTaskDto.getPresentationSubject()); map.put("createTime", dateFormat.format(humanTaskDto.getCreateTime())); map.put("assignee", humanTaskDto.getAssignee()); map.put("assigneeDisplayName", userConnector.findById(userId) .getDisplayName()); list.add(map); } String json = jsonMapper.toJson(list); BaseDTO result = new BaseDTO(); result.setCode(200); result.setData(json); logger.info("end"); return result; } @POST @Path("tasksPersonal") @Produces(MediaType.APPLICATION_JSON) public BaseDTO tasksPersonal(@HeaderParam("sessionId") String sessionId) throws Exception { logger.info("start"); PimDevice pimDevice = pimDeviceManager.findUniqueBy("sessionId", sessionId); if (pimDevice == null) { BaseDTO result = new BaseDTO(); result.setCode(401); result.setMessage("auth fail"); return result; } String userId = pimDevice.getUserId(); String tenantId = "1"; Page page = humanTaskConnector.findPersonalTasks(userId, tenantId, 1, 10); List<HumanTaskDTO> humanTaskDtos = (List<HumanTaskDTO>) page .getResult(); List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (HumanTaskDTO humanTaskDto : humanTaskDtos) { Map<String, Object> map = new HashMap<String, Object>(); map.put("id", humanTaskDto.getId()); map.put("name", humanTaskDto.getName()); map.put("presentationSubject", humanTaskDto.getPresentationSubject()); map.put("createTime", dateFormat.format(humanTaskDto.getCreateTime())); map.put("assignee", humanTaskDto.getAssignee()); map.put("assigneeDisplayName", userConnector.findById(userId) .getDisplayName()); list.add(map); } String json = jsonMapper.toJson(list); BaseDTO result = new BaseDTO(); result.setCode(200); result.setData(json); logger.info("end"); return result; } @POST @Path("tasksGroup") @Produces(MediaType.APPLICATION_JSON) public BaseDTO tasksGroup(@HeaderParam("sessionId") String sessionId) throws Exception { logger.info("start"); PimDevice pimDevice = pimDeviceManager.findUniqueBy("sessionId", sessionId); if (pimDevice == null) { BaseDTO result = new BaseDTO(); result.setCode(401); result.setMessage("auth fail"); return result; } String userId = pimDevice.getUserId(); String tenantId = "1"; Page page = humanTaskConnector.findGroupTasks(userId, tenantId, 1, 10); List<HumanTaskDTO> humanTaskDtos = (List<HumanTaskDTO>) page .getResult(); List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (HumanTaskDTO humanTaskDto : humanTaskDtos) { Map<String, Object> map = new HashMap<String, Object>(); map.put("id", humanTaskDto.getId()); map.put("name", humanTaskDto.getName()); map.put("presentationSubject", humanTaskDto.getPresentationSubject()); map.put("createTime", dateFormat.format(humanTaskDto.getCreateTime())); map.put("assignee", humanTaskDto.getAssignee()); map.put("assigneeDisplayName", userConnector.findById(userId) .getDisplayName()); list.add(map); } String json = jsonMapper.toJson(list); BaseDTO result = new BaseDTO(); result.setCode(200); result.setData(json); logger.info("end"); return result; } @POST @Path("tasksComplete") @Produces(MediaType.APPLICATION_JSON) public BaseDTO tasksComplete(@HeaderParam("sessionId") String sessionId) throws Exception { logger.info("start"); PimDevice pimDevice = pimDeviceManager.findUniqueBy("sessionId", sessionId); if (pimDevice == null) { BaseDTO result = new BaseDTO(); result.setCode(401); result.setMessage("auth fail"); return result; } String userId = pimDevice.getUserId(); String tenantId = "1"; Page page = humanTaskConnector.findFinishedTasks(userId, tenantId, 1, 10); List<HumanTaskDTO> humanTaskDtos = (List<HumanTaskDTO>) page .getResult(); List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (HumanTaskDTO humanTaskDto : humanTaskDtos) { Map<String, Object> map = new HashMap<String, Object>(); map.put("id", humanTaskDto.getId()); map.put("name", humanTaskDto.getName()); map.put("presentationSubject", humanTaskDto.getPresentationSubject()); map.put("createTime", dateFormat.format(humanTaskDto.getCreateTime())); map.put("assignee", humanTaskDto.getAssignee()); map.put("assigneeDisplayName", userConnector.findById(userId) .getDisplayName()); list.add(map); } String json = jsonMapper.toJson(list); BaseDTO result = new BaseDTO(); result.setCode(200); result.setData(json); logger.info("end"); return result; } @POST @Path("tasksDelegate") @Produces(MediaType.APPLICATION_JSON) public BaseDTO tasksDelegate(@HeaderParam("sessionId") String sessionId) throws Exception { logger.info("start"); PimDevice pimDevice = pimDeviceManager.findUniqueBy("sessionId", sessionId); if (pimDevice == null) { BaseDTO result = new BaseDTO(); result.setCode(401); result.setMessage("auth fail"); return result; } String userId = pimDevice.getUserId(); String tenantId = "1"; Page page = humanTaskConnector.findDelegateTasks(userId, tenantId, 1, 10); List<HumanTaskDTO> humanTaskDtos = (List<HumanTaskDTO>) page .getResult(); List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (HumanTaskDTO humanTaskDto : humanTaskDtos) { Map<String, Object> map = new HashMap<String, Object>(); map.put("id", humanTaskDto.getId()); map.put("name", humanTaskDto.getName()); map.put("presentationSubject", humanTaskDto.getPresentationSubject()); map.put("createTime", dateFormat.format(humanTaskDto.getCreateTime())); map.put("assignee", humanTaskDto.getAssignee()); map.put("assigneeDisplayName", userConnector.findById(userId) .getDisplayName()); list.add(map); } String json = jsonMapper.toJson(list); BaseDTO result = new BaseDTO(); result.setCode(200); result.setData(json); logger.info("end"); return result; } @POST @Path("completeTask") @Produces(MediaType.APPLICATION_JSON) public BaseDTO completeTask(@HeaderParam("sessionId") String sessionId, @FormParam("taskId") String taskId, @FormParam("data") String data) throws Exception { logger.info("start : {} {}", taskId, data); String humanTaskId = taskId; PimDevice pimDevice = pimDeviceManager.findUniqueBy("sessionId", sessionId); if (pimDevice == null) { BaseDTO result = new BaseDTO(); result.setCode(401); result.setMessage("auth fail"); return result; } String userId = pimDevice.getUserId(); String tenantId = "1"; Map<String, Object> map = jsonMapper.fromJson(data, Map.class); map.put("taskId", humanTaskId); Record record = null; FormParameter formParameter = null; HumanTaskDTO humanTaskDto = null; FormDTO formDto = null; formParameter = doSaveRecord(map, userId, tenantId); 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, formParameter.getMultiValueMap(), tenantId); keyValueConnector.save(record); Xform xform = new XformBuilder().setStoreConnector(storeConnector) .setContent(formDto.getContent()).setRecord(record).build(); Map<String, Object> taskParameters = xform.getMapData(); logger.info("taskParameters : {}", taskParameters); String comment = ""; String action = ""; try { humanTaskConnector.completeTask(humanTaskId, userId, action, comment, taskParameters); } catch (IllegalStateException ex) { logger.error(ex.getMessage(), ex); return null; } if (record == null) { record = new Record(); } record = new RecordBuilder().build(record, STATUS_RUNNING, humanTaskDto.getProcessInstanceId()); keyValueConnector.save(record); BaseDTO result = new BaseDTO(); result.setCode(200); result.setData(data); logger.info("end"); return result; } /** * 把数据先保存到keyvalue里. */ public FormParameter doSaveRecord(Map<String, Object> map, String userId, String tenantId) throws Exception { FormParameter formParameter = new FormParameter(); MultiValueMap multiValueMap = new LinkedMultiValueMap(); for (Map.Entry<String, Object> entry : map.entrySet()) { multiValueMap.add(entry.getKey(), entry.getValue()); } formParameter.setMultiValueMap(multiValueMap); formParameter.setHumanTaskId((String) map.get("taskId")); 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, multiValueMap, tenantId); keyValueConnector.save(record); return formParameter; } // ~ ====================================================================== @Resource public void setProcessEngine(ProcessEngine processEngine) { this.processEngine = processEngine; } @Resource public void setTenantHolder(TenantHolder tenantHolder) { this.tenantHolder = tenantHolder; } @Resource public void setHumanTaskConnector(HumanTaskConnector humanTaskConnector) { this.humanTaskConnector = humanTaskConnector; } @Resource public void setPimDeviceManager(PimDeviceManager pimDeviceManager) { this.pimDeviceManager = pimDeviceManager; } @Resource public void setOperationService(OperationService operationService) { this.operationService = operationService; } @Resource public void setKeyValueConnector(KeyValueConnector keyValueConnector) { this.keyValueConnector = keyValueConnector; } @Resource public void setStoreConnector(StoreConnector storeConnector) { this.storeConnector = storeConnector; } @Resource public void setUserConnector(UserConnector userConnector) { this.userConnector = userConnector; } }