package com.mossle.android.rs;
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.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 com.mossle.api.store.StoreConnector;
import com.mossle.api.tenant.TenantHolder;
import com.mossle.bpm.persistence.domain.BpmProcess;
import com.mossle.bpm.persistence.manager.BpmProcessManager;
import com.mossle.core.mapper.JsonMapper;
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.activiti.engine.history.HistoricProcessInstance;
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/bpm")
public class AndroidBpmResource {
private static Logger logger = LoggerFactory
.getLogger(AndroidBpmResource.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 PimDeviceManager pimDeviceManager;
private KeyValueConnector keyValueConnector;
private ProcessConnector processConnector;
private StoreConnector storeConnector;
private OperationService operationService;
@POST
@Path("processDefinitions")
@Produces(MediaType.APPLICATION_JSON)
public BaseDTO processDefinitions() throws Exception {
logger.info("start");
String hql = "from BpmProcess where tenantId=? order by priority";
List<BpmProcess> bpmProcesses = bpmProcessManager.find(hql, "1");
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (BpmProcess bpmProcess : bpmProcesses) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", bpmProcess.getName());
map.put("processDefinitionId", bpmProcess.getBpmConfBase()
.getProcessDefinitionId());
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("processInstances")
@Produces(MediaType.APPLICATION_JSON)
public BaseDTO processInstances(@HeaderParam("sessionId") String sessionId)
throws Exception {
return this.processInstancesRunning(sessionId);
}
@POST
@Path("processInstancesRunning")
@Produces(MediaType.APPLICATION_JSON)
public BaseDTO processInstancesRunning(
@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";
List<HistoricProcessInstance> historicProcessInstances = processEngine
.getHistoryService().createHistoricProcessInstanceQuery()
.processInstanceTenantId(tenantId).startedBy(userId)
.unfinished().list();
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (HistoricProcessInstance historicProcessInstance : historicProcessInstances) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", historicProcessInstance.getName());
map.put("processInstanceId", historicProcessInstance.getId());
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("processInstancesComplete")
@Produces(MediaType.APPLICATION_JSON)
public BaseDTO processInstancesComplete(
@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";
List<HistoricProcessInstance> historicProcessInstances = processEngine
.getHistoryService().createHistoricProcessInstanceQuery()
.processInstanceTenantId(tenantId).startedBy(userId).finished()
.list();
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (HistoricProcessInstance historicProcessInstance : historicProcessInstances) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", historicProcessInstance.getName());
map.put("processInstanceId", historicProcessInstance.getId());
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("processInstancesDraft")
@Produces(MediaType.APPLICATION_JSON)
public BaseDTO processInstancesDraft(
@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";
List<Record> records = keyValueConnector.findByStatus(
STATUS_DRAFT_PROCESS, userId, tenantId);
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (Record record : records) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", record.getName());
map.put("formTemplateCode", record.getFormTemplateCode());
map.put("code", record.getCode());
map.put("category", record.getCategory());
map.put("status", record.getStatus());
map.put("ref", record.getRef());
map.put("createTime", record.getCreateTime());
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("startProcess")
@Produces(MediaType.APPLICATION_JSON)
public BaseDTO startProcess(@HeaderParam("sessionId") String sessionId,
@FormParam("processDefinitionId") String processDefinitionId,
@FormParam("data") String data) throws Exception {
logger.info("start : {} {}", processDefinitionId, data);
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";
String hql = "from BpmProcess where bpmConfBase.processDefinitionId=? order by priority";
BpmProcess bpmProcess = bpmProcessManager.findUnique(hql,
processDefinitionId);
Map<String, Object> map = jsonMapper.fromJson(data, Map.class);
map.put("bpmProcessId", Long.toString(bpmProcess.getId()));
FormParameter formParameter = this.doSaveRecord(map, userId, tenantId);
// doConfirmStartProcess(formParameter, model);
Record record = keyValueConnector.findByCode(formParameter
.getBusinessKey());
ProcessDTO processDto = processConnector.findProcess(formParameter
.getBpmProcessId());
// String processDefinitionId = processDto.getProcessDefinitionId();
// 获得form的信息
FormDTO formDto = processConnector.findStartForm(processDefinitionId);
Xform xform = new XformBuilder().setStoreConnector(storeConnector)
.setContent(formDto.getContent()).setRecord(record).build();
Map<String, Object> processParameters = xform.getMapData();
logger.info("processParameters : {}", processParameters);
String processInstanceId = processConnector.startProcess(userId,
formParameter.getBusinessKey(), processDefinitionId,
processParameters);
record = new RecordBuilder().build(record, STATUS_RUNNING,
processInstanceId);
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.setBpmProcessId((String) map.get("bpmProcessId"));
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 setBpmProcessManager(BpmProcessManager bpmProcessManager) {
this.bpmProcessManager = bpmProcessManager;
}
@Resource
public void setTenantHolder(TenantHolder tenantHolder) {
this.tenantHolder = tenantHolder;
}
@Resource
public void setPimDeviceManager(PimDeviceManager pimDeviceManager) {
this.pimDeviceManager = pimDeviceManager;
}
@Resource
public void setKeyValueConnector(KeyValueConnector keyValueConnector) {
this.keyValueConnector = keyValueConnector;
}
@Resource
public void setProcessConnector(ProcessConnector processConnector) {
this.processConnector = processConnector;
}
@Resource
public void setStoreConnector(StoreConnector storeConnector) {
this.storeConnector = storeConnector;
}
@Resource
public void setOperationService(OperationService operationService) {
this.operationService = operationService;
}
}