package com.mossle.operation.service;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
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.process.ProcessConnector;
import com.mossle.api.process.ProcessDTO;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@Component
@Transactional
public class OperationService {
private static Logger logger = LoggerFactory
.getLogger(OperationService.class);
public static final String OPERATION_BUSINESS_KEY = "businessKey";
public static final String OPERATION_TASK_ID = "taskId";
public static final String OPERATION_BPM_PROCESS_ID = "bpmProcessId";
public static final int STATUS_DRAFT_PROCESS = 0;
public static final int STATUS_DRAFT_TASK = 1;
public static final int STATUS_RUNNING = 2;
private KeyValueConnector keyValueConnector;
private HumanTaskConnector humanTaskConnector;
private ProcessConnector processConnector;
/**
* 保存草稿.
*/
public String saveDraft(String userId, String tenantId,
FormParameter formParameter) {
String humanTaskId = formParameter.getHumanTaskId();
String businessKey = formParameter.getBusinessKey();
String bpmProcessId = formParameter.getBpmProcessId();
if (StringUtils.isNotBlank(humanTaskId)) {
// 如果是任务草稿,直接通过processInstanceId获得record,更新数据
// TODO: 分支肯定有问题
HumanTaskDTO humanTaskDto = humanTaskConnector
.findHumanTask(humanTaskId);
if (humanTaskDto == null) {
throw new IllegalStateException("任务不存在");
}
String processInstanceId = humanTaskDto.getProcessInstanceId();
Record record = keyValueConnector.findByRef(processInstanceId);
if (record != null) {
record = new RecordBuilder().build(record, STATUS_DRAFT_TASK,
formParameter);
keyValueConnector.save(record);
businessKey = record.getCode();
if (record.getBusinessKey() == null) {
record.setBusinessKey(businessKey);
keyValueConnector.save(record);
}
}
} else if (StringUtils.isNotBlank(businessKey)) {
// 如果是流程草稿,直接通过businessKey获得record,更新数据
Record record = keyValueConnector.findByCode(businessKey);
record = new RecordBuilder().build(record, STATUS_DRAFT_PROCESS,
formParameter);
keyValueConnector.save(record);
} else if (StringUtils.isNotBlank(bpmProcessId)) {
// 如果是第一次保存草稿,肯定是流程草稿,先初始化record,再保存数据
Record record = new RecordBuilder().build(bpmProcessId,
STATUS_DRAFT_PROCESS, formParameter, userId, tenantId);
ProcessDTO processDto = processConnector.findProcess(bpmProcessId);
record.setName(processDto.getProcessDefinitionName());
keyValueConnector.save(record);
businessKey = record.getCode();
if (record.getBusinessKey() == null) {
record.setBusinessKey(businessKey);
keyValueConnector.save(record);
}
} else {
logger.error(
"humanTaskId, businessKey, bpmProcessId all null : {}",
formParameter.getMultiValueMap());
throw new IllegalArgumentException(
"humanTaskId, businessKey, bpmProcessId all null");
}
return businessKey;
}
/**
* 发起流程.
*/
public void startProcessInstance(String userId, String businessKey,
String processDefinitionId, Map<String, Object> processParameters,
Record record) {
String processInstanceId = processConnector.startProcess(userId,
businessKey, processDefinitionId, processParameters);
record = new RecordBuilder().build(record, STATUS_RUNNING,
processInstanceId);
keyValueConnector.save(record);
}
/**
* 完成任务.
*/
public void completeTask(String humanTaskId, String userId,
FormParameter formParameter, Map<String, Object> taskParameters,
Record record, String processInstanceId) {
// try {
humanTaskConnector.completeTask(humanTaskId, userId,
formParameter.getAction(), formParameter.getComment(),
taskParameters);
// } 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,
processInstanceId);
keyValueConnector.save(record);
}
public String getParameter(Map<String, String[]> parameters, String name) {
String[] value = parameters.get(name);
if ((value == null) || (value.length == 0)) {
return null;
}
return value[0];
}
public List<String> getParameterValues(Map<String, String[]> parameters,
String name) {
String[] value = parameters.get(name);
if ((value == null) || (value.length == 0)) {
return Collections.EMPTY_LIST;
}
return Arrays.asList(value);
}
public Map<String, Object> getVariables(Map<String, String[]> parameters) {
Map<String, Object> variables = new HashMap<String, Object>();
for (Map.Entry<String, String[]> entry : parameters.entrySet()) {
String key = entry.getKey();
String[] value = entry.getValue();
if ((value == null) || (value.length == 0)) {
variables.put(key, null);
} else {
variables.put(key, value[0]);
}
}
return variables;
}
@Resource
public void setKeyValueConnector(KeyValueConnector keyValueConnector) {
this.keyValueConnector = keyValueConnector;
}
@Resource
public void setHumanTaskConnector(HumanTaskConnector humanTaskConnector) {
this.humanTaskConnector = humanTaskConnector;
}
@Resource
public void setProcessConnector(ProcessConnector processConnector) {
this.processConnector = processConnector;
}
}