package com.mossle.bpm.web.dev;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mossle.api.form.FormConnector;
import com.mossle.api.form.FormDTO;
import com.mossle.api.tenant.TenantHolder;
import com.mossle.bpm.persistence.domain.BpmCategory;
import com.mossle.bpm.persistence.domain.BpmConfAssign;
import com.mossle.bpm.persistence.domain.BpmConfBase;
import com.mossle.bpm.persistence.domain.BpmConfForm;
import com.mossle.bpm.persistence.domain.BpmConfListener;
import com.mossle.bpm.persistence.domain.BpmConfNode;
import com.mossle.bpm.persistence.domain.BpmConfNotice;
import com.mossle.bpm.persistence.domain.BpmConfOperation;
import com.mossle.bpm.persistence.domain.BpmConfRule;
import com.mossle.bpm.persistence.domain.BpmConfUser;
import com.mossle.bpm.persistence.domain.BpmProcess;
import com.mossle.bpm.persistence.manager.BpmCategoryManager;
import com.mossle.bpm.persistence.manager.BpmConfAssignManager;
import com.mossle.bpm.persistence.manager.BpmConfBaseManager;
import com.mossle.bpm.persistence.manager.BpmConfFormManager;
import com.mossle.bpm.persistence.manager.BpmConfListenerManager;
import com.mossle.bpm.persistence.manager.BpmConfNodeManager;
import com.mossle.bpm.persistence.manager.BpmConfNoticeManager;
import com.mossle.bpm.persistence.manager.BpmConfOperationManager;
import com.mossle.bpm.persistence.manager.BpmConfRuleManager;
import com.mossle.bpm.persistence.manager.BpmConfUserManager;
import com.mossle.bpm.persistence.manager.BpmProcessManager;
import com.mossle.bpm.persistence.manager.BpmTaskDefManager;
import com.mossle.bpm.support.TaskDefinitionBuilder;
import com.mossle.core.export.Exportor;
import com.mossle.core.export.TableModel;
import com.mossle.core.mapper.BeanMapper;
import com.mossle.core.mapper.JsonMapper;
import com.mossle.core.page.Page;
import com.mossle.core.query.PropertyFilter;
import com.mossle.core.spring.MessageHelper;
import com.mossle.spi.form.InternalFormConnector;
import com.mossle.spi.humantask.TaskDefinitionConnector;
import com.mossle.spi.humantask.TaskDefinitionDTO;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
@Controller("com.mossle.bpm.web.dev.BpmProcessController")
@RequestMapping("bpm/dev")
public class BpmProcessController {
private static Logger logger = LoggerFactory
.getLogger(BpmProcessController.class);
private BpmProcessManager bpmProcessManager;
private BpmCategoryManager bpmCategoryManager;
private BpmTaskDefManager bpmTaskDefManager;
private BpmConfBaseManager bpmConfBaseManager;
private BpmConfNodeManager bpmConfNodeManager;
private Exportor exportor;
private BeanMapper beanMapper = new BeanMapper();
private ProcessEngine processEngine;
private MessageHelper messageHelper;
private TenantHolder tenantHolder;
private JsonMapper jsonMapper = new JsonMapper();
private FormConnector formConnector;
private BpmConfUserManager bpmConfUserManager;
private BpmConfAssignManager bpmConfAssignManager;
private BpmConfListenerManager bpmConfListenerManager;
private BpmConfRuleManager bpmConfRuleManager;
private BpmConfFormManager bpmConfFormManager;
private BpmConfOperationManager bpmConfOperationManager;
private BpmConfNoticeManager bpmConfNoticeManager;
private InternalFormConnector internalFormConnector;
private TaskDefinitionConnector taskDefinitionConnector;
/**
* 导出.
*/
@RequestMapping("conf-export")
public String confExport(@RequestParam("id") Long id, Model model)
throws Exception {
// bpmProcess
BpmProcess bpmProcess = this.bpmProcessManager.get(id);
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("code", bpmProcess.getCode());
map.put("name", bpmProcess.getName());
map.put("useTaskConf",
Integer.valueOf(1).equals(bpmProcess.getUseTaskConf()));
map.put("description", bpmProcess.getDescn());
// bpmConfBase
BpmConfBase bpmConfBase = bpmProcess.getBpmConfBase();
map.put("processDefinitionKey", bpmConfBase.getProcessDefinitionKey());
map.put("processDefinitionVersion",
bpmConfBase.getProcessDefinitionVersion());
map.put("xml", this.readXml(bpmConfBase.getProcessDefinitionId()));
// bpmConfNode
List<Map<String, Object>> nodes = new ArrayList<Map<String, Object>>();
map.put("nodes", nodes);
for (BpmConfNode bpmConfNode : bpmConfBase.getBpmConfNodes()) {
Map<String, Object> nodeMap = this.exportNode(bpmConfNode);
nodes.add(nodeMap);
}
// json
String json = jsonMapper.toJson(map);
model.addAttribute("json", json);
return "bpm/dev/conf-export";
}
@RequestMapping("conf-import-input")
public String confImportInput() {
return "bpm/dev/conf-import-input";
}
/**
* 导入.
*/
@RequestMapping("conf-import-save")
public String confImportSave(@RequestParam("text") String text)
throws Exception {
Map<String, Object> json = jsonMapper.fromJson(text, Map.class);
// xml
ProcessDefinition processDefinition = this.importXml((String) json
.get("xml"));
// process
BpmProcess bpmProcess = this.importProcess(json);
// conf
BpmConfBase bpmConfBase = this.importConf(json, processDefinition);
bpmProcess.setBpmConfBase(bpmConfBase);
bpmProcessManager.save(bpmProcess);
return "bpm/dev/conf-import-save";
}
// 导出
public String readXml(String processDefinitionId) throws Exception {
RepositoryService repositoryService = processEngine
.getRepositoryService();
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId).singleResult();
String resourceName = processDefinition.getResourceName();
InputStream resourceAsStream = repositoryService.getResourceAsStream(
processDefinition.getDeploymentId(), resourceName);
return IOUtils.toString(resourceAsStream, "UTF-8");
}
public Map<String, Object> exportNode(BpmConfNode bpmConfNode) {
Map<String, Object> nodeMap = new LinkedHashMap<String, Object>();
nodeMap.put("code", bpmConfNode.getCode());
nodeMap.put("name", bpmConfNode.getName());
nodeMap.put("type", bpmConfNode.getType());
nodeMap.put("priority", bpmConfNode.getPriority());
nodeMap.put("confUser", bpmConfNode.getConfUser());
nodeMap.put("confListener", bpmConfNode.getConfListener());
nodeMap.put("confRule", bpmConfNode.getConfRule());
nodeMap.put("confForm", bpmConfNode.getConfForm());
nodeMap.put("confOperation", bpmConfNode.getConfOperation());
nodeMap.put("confNotice", bpmConfNode.getConfNotice());
List<Map<String, Object>> users = new ArrayList<Map<String, Object>>();
nodeMap.put("users", users);
for (BpmConfUser bpmConfUser : bpmConfNode.getBpmConfUsers()) {
users.add(this.exportUser(bpmConfUser));
}
List<Map<String, Object>> assigns = new ArrayList<Map<String, Object>>();
nodeMap.put("assigns", assigns);
for (BpmConfAssign bpmConfAssign : bpmConfNode.getBpmConfAssigns()) {
assigns.add(this.exportAssign(bpmConfAssign));
}
List<Map<String, Object>> listeners = new ArrayList<Map<String, Object>>();
nodeMap.put("listeners", listeners);
for (BpmConfListener bpmConfListener : bpmConfNode
.getBpmConfListeners()) {
listeners.add(this.exportListener(bpmConfListener));
}
List<Map<String, Object>> rules = new ArrayList<Map<String, Object>>();
nodeMap.put("rules", rules);
for (BpmConfRule bpmConfRule : bpmConfNode.getBpmConfRules()) {
rules.add(this.exportRule(bpmConfRule));
}
List<Map<String, Object>> forms = new ArrayList<Map<String, Object>>();
nodeMap.put("forms", forms);
for (BpmConfForm bpmConfForm : bpmConfNode.getBpmConfForms()) {
forms.add(this.exportForm(bpmConfForm));
}
List<Map<String, Object>> operations = new ArrayList<Map<String, Object>>();
nodeMap.put("operations", operations);
for (BpmConfOperation bpmConfOperation : bpmConfNode
.getBpmConfOperations()) {
operations.add(this.exportOperation(bpmConfOperation));
}
List<Map<String, Object>> notices = new ArrayList<Map<String, Object>>();
nodeMap.put("notices", notices);
for (BpmConfNotice bpmConfNotice : bpmConfNode.getBpmConfNotices()) {
notices.add(this.exportNotice(bpmConfNotice));
}
return nodeMap;
}
public Map<String, Object> exportUser(BpmConfUser bpmConfUser) {
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("value", bpmConfUser.getValue());
map.put("type", bpmConfUser.getType());
map.put("status", bpmConfUser.getStatus());
map.put("priority", bpmConfUser.getPriority());
return map;
}
public Map<String, Object> exportAssign(BpmConfAssign bpmConfAssign) {
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("name", bpmConfAssign.getName());
return map;
}
public Map<String, Object> exportListener(BpmConfListener bpmConfListener) {
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("value", bpmConfListener.getValue());
map.put("type", bpmConfListener.getType());
map.put("status", bpmConfListener.getStatus());
map.put("priority", bpmConfListener.getPriority());
return map;
}
public Map<String, Object> exportRule(BpmConfRule bpmConfRule) {
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("value", bpmConfRule.getValue());
return map;
}
public Map<String, Object> exportForm(BpmConfForm bpmConfForm) {
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("value", bpmConfForm.getValue());
map.put("type", bpmConfForm.getType());
map.put("originValue", bpmConfForm.getOriginValue());
map.put("originType", bpmConfForm.getOriginType());
map.put("status", bpmConfForm.getStatus());
FormDTO formDto = formConnector.findForm(bpmConfForm.getValue(), "1");
if (formDto != null) {
map.put("formContent", formDto.getContent());
} else {
logger.info("cannot find form : {}", bpmConfForm.getValue());
}
return map;
}
public Map<String, Object> exportOperation(BpmConfOperation bpmConfOperation) {
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("value", bpmConfOperation.getValue());
map.put("priority", bpmConfOperation.getPriority());
return map;
}
public Map<String, Object> exportNotice(BpmConfNotice bpmConfNotice) {
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("type", bpmConfNotice.getType());
map.put("receiver", bpmConfNotice.getReceiver());
map.put("dueDate", bpmConfNotice.getDueDate());
map.put("templateCode", bpmConfNotice.getTemplateCode());
map.put("notificationType", bpmConfNotice.getNotificationType());
return map;
}
// 导入
public ProcessDefinition importXml(String xml) throws Exception {
String fileName = "process.bpmn20.xml";
InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8"));
String tenantId = "1";
Deployment deployment = processEngine.getRepositoryService()
.createDeployment().addInputStream(fileName, is)
.tenantId(tenantId).deploy();
List<ProcessDefinition> processDefinitions = processEngine
.getRepositoryService().createProcessDefinitionQuery()
.deploymentId(deployment.getId()).list();
return processDefinitions.get(0);
}
public BpmProcess importProcess(Map<String, Object> json) {
BpmProcess bpmProcess = new BpmProcess();
bpmProcess.setCode((String) json.get("code"));
bpmProcess.setName((String) json.get("name"));
if (Boolean.TRUE.equals(json.get("useTaskConf"))) {
bpmProcess.setUseTaskConf(1);
} else {
bpmProcess.setUseTaskConf(0);
}
bpmProcess.setDescn((String) json.get("description"));
bpmProcessManager.save(bpmProcess);
return bpmProcess;
}
public BpmConfBase importConf(Map<String, Object> json,
ProcessDefinition processDefinition) {
BpmConfBase bpmConfBase = new BpmConfBase();
bpmConfBase.setProcessDefinitionId(processDefinition.getId());
bpmConfBase.setProcessDefinitionKey(processDefinition.getKey());
bpmConfBase.setProcessDefinitionVersion(processDefinition.getVersion());
bpmConfBaseManager.save(bpmConfBase);
List<Map<String, Object>> nodes = (List<Map<String, Object>>) json
.get("nodes");
for (Map<String, Object> nodeMap : nodes) {
this.importNode(nodeMap, bpmConfBase);
}
return bpmConfBase;
}
public void importNode(Map<String, Object> map, BpmConfBase bpmConfBase) {
BpmConfNode bpmConfNode = new BpmConfNode();
bpmConfNode.setBpmConfBase(bpmConfBase);
bpmConfNode.setCode((String) map.get("code"));
bpmConfNode.setName((String) map.get("name"));
bpmConfNode.setType((String) map.get("type"));
bpmConfNode.setPriority((Integer) map.get("priority"));
bpmConfNode.setConfUser((Integer) map.get("confUser"));
bpmConfNode.setConfListener((Integer) map.get("confListener"));
bpmConfNode.setConfRule((Integer) map.get("confRule"));
bpmConfNode.setConfForm((Integer) map.get("confForm"));
bpmConfNode.setConfOperation((Integer) map.get("confOperation"));
bpmConfNode.setConfNotice((Integer) map.get("confNotice"));
bpmConfNodeManager.save(bpmConfNode);
List<Map<String, Object>> users = (List<Map<String, Object>>) map
.get("users");
for (Map<String, Object> userMap : users) {
this.importUser(userMap, bpmConfNode);
}
List<Map<String, Object>> assigns = (List<Map<String, Object>>) map
.get("assigns");
for (Map<String, Object> assignMap : assigns) {
this.importAssign(assignMap, bpmConfNode);
}
List<Map<String, Object>> listeners = (List<Map<String, Object>>) map
.get("listeners");
for (Map<String, Object> listenerMap : listeners) {
this.importListener(listenerMap, bpmConfNode);
}
List<Map<String, Object>> rules = (List<Map<String, Object>>) map
.get("rules");
for (Map<String, Object> ruleMap : rules) {
this.importRule(ruleMap, bpmConfNode);
}
List<Map<String, Object>> forms = (List<Map<String, Object>>) map
.get("forms");
for (Map<String, Object> formMap : forms) {
this.importForm(formMap, bpmConfNode);
}
List<Map<String, Object>> operations = (List<Map<String, Object>>) map
.get("operations");
for (Map<String, Object> operationMap : operations) {
this.importOperation(operationMap, bpmConfNode);
}
List<Map<String, Object>> notices = (List<Map<String, Object>>) map
.get("notices");
for (Map<String, Object> noticeMap : notices) {
this.importNotice(noticeMap, bpmConfNode);
}
if ("userTask".equals(bpmConfNode.getType())) {
TaskDefinitionDTO taskDefinition = new TaskDefinitionDTO();
taskDefinition.setCode(bpmConfNode.getCode());
taskDefinition.setName(bpmConfNode.getName());
taskDefinition.setProcessDefinitionId(bpmConfBase
.getProcessDefinitionId());
for (Map<String, Object> userMap : users) {
if (Integer.valueOf(0).equals(userMap.get("type"))) {
if (Integer.valueOf(0).equals(userMap.get("status"))
|| Integer.valueOf(1).equals(userMap.get("status"))) {
taskDefinition.setAssignee((String) userMap
.get("value"));
}
} else if (Integer.valueOf(1).equals(userMap.get("type"))) {
taskDefinition.addCandidateUser((String) userMap
.get("value"));
} else if (Integer.valueOf(2).equals(userMap.get("type"))) {
taskDefinition.addCandidateGroup((String) userMap
.get("value"));
}
}
for (Map<String, Object> formMap : forms) {
com.mossle.spi.humantask.FormDTO formDto = new com.mossle.spi.humantask.FormDTO();
formDto.setKey((String) formMap.get("value"));
formDto.setType("internal");
taskDefinition.setForm(formDto);
}
taskDefinitionConnector.create(taskDefinition);
}
}
public void importUser(Map<String, Object> map, BpmConfNode bpmConfNode) {
BpmConfUser bpmConfUser = new BpmConfUser();
bpmConfUser.setBpmConfNode(bpmConfNode);
bpmConfUser.setValue((String) map.get("value"));
bpmConfUser.setType((Integer) map.get("type"));
bpmConfUser.setStatus((Integer) map.get("status"));
bpmConfUser.setPriority((Integer) map.get("priority"));
bpmConfUserManager.save(bpmConfUser);
}
public void importAssign(Map<String, Object> map, BpmConfNode bpmConfNode) {
BpmConfAssign bpmConfAssign = new BpmConfAssign();
bpmConfAssign.setBpmConfNode(bpmConfNode);
bpmConfAssign.setName((String) map.get("name"));
bpmConfAssignManager.save(bpmConfAssign);
}
public void importListener(Map<String, Object> map, BpmConfNode bpmConfNode) {
BpmConfListener bpmConfListener = new BpmConfListener();
bpmConfListener.setBpmConfNode(bpmConfNode);
bpmConfListener.setValue((String) map.get("value"));
bpmConfListener.setType((Integer) map.get("type"));
bpmConfListener.setStatus((Integer) map.get("status"));
bpmConfListener.setPriority((Integer) map.get("priority"));
bpmConfListenerManager.save(bpmConfListener);
}
public void importRule(Map<String, Object> map, BpmConfNode bpmConfNode) {
BpmConfRule bpmConfRule = new BpmConfRule();
bpmConfRule.setBpmConfNode(bpmConfNode);
bpmConfRule.setValue((String) map.get("value"));
bpmConfRuleManager.save(bpmConfRule);
}
public void importForm(Map<String, Object> map, BpmConfNode bpmConfNode) {
BpmConfForm bpmConfForm = new BpmConfForm();
bpmConfForm.setBpmConfNode(bpmConfNode);
bpmConfForm.setValue((String) map.get("value"));
bpmConfForm.setType((Integer) map.get("type"));
bpmConfForm.setOriginValue((String) map.get("originValue"));
bpmConfForm.setOriginType((Integer) map.get("originType"));
bpmConfForm.setStatus((Integer) map.get("status"));
bpmConfFormManager.save(bpmConfForm);
// formTemplate
internalFormConnector.save(bpmConfForm.getValue(),
(String) map.get("formContent"), bpmConfForm.getType());
}
public void importOperation(Map<String, Object> map, BpmConfNode bpmConfNode) {
BpmConfOperation bpmConfOperation = new BpmConfOperation();
bpmConfOperation.setBpmConfNode(bpmConfNode);
bpmConfOperation.setValue((String) map.get("value"));
bpmConfOperation.setPriority((Integer) map.get("priority"));
bpmConfOperationManager.save(bpmConfOperation);
}
public void importNotice(Map<String, Object> map, BpmConfNode bpmConfNode) {
BpmConfNotice bpmConfNotice = new BpmConfNotice();
bpmConfNotice.setBpmConfNode(bpmConfNode);
bpmConfNotice.setType((Integer) map.get("type"));
bpmConfNotice.setReceiver((String) map.get("receiver"));
bpmConfNotice.setDueDate((String) map.get("dueDate"));
bpmConfNotice.setTemplateCode((String) map.get("templateCode"));
bpmConfNotice.setNotificationType((String) map.get("noticationType"));
bpmConfNoticeManager.save(bpmConfNotice);
}
// ~ ======================================================================
@Resource
public void setBpmProcessManager(BpmProcessManager bpmProcessManager) {
this.bpmProcessManager = bpmProcessManager;
}
@Resource
public void setBpmCategoryManager(BpmCategoryManager bpmCategoryManager) {
this.bpmCategoryManager = bpmCategoryManager;
}
@Resource
public void setBpmTaskDefManager(BpmTaskDefManager bpmTaskDefManager) {
this.bpmTaskDefManager = bpmTaskDefManager;
}
@Resource
public void setBpmConfBaseManager(BpmConfBaseManager bpmConfBaseManager) {
this.bpmConfBaseManager = bpmConfBaseManager;
}
@Resource
public void setBpmConfNodeManager(BpmConfNodeManager bpmConfNodeManager) {
this.bpmConfNodeManager = bpmConfNodeManager;
}
@Resource
public void setProcessEngine(ProcessEngine processEngine) {
this.processEngine = processEngine;
}
@Resource
public void setExportor(Exportor exportor) {
this.exportor = exportor;
}
@Resource
public void setMessageHelper(MessageHelper messageHelper) {
this.messageHelper = messageHelper;
}
@Resource
public void setTenantHolder(TenantHolder tenantHolder) {
this.tenantHolder = tenantHolder;
}
@Resource
public void setFormConnector(FormConnector formConnector) {
this.formConnector = formConnector;
}
@Resource
public void setBpmConfUserManager(BpmConfUserManager bpmConfUserManager) {
this.bpmConfUserManager = bpmConfUserManager;
}
@Resource
public void setBpmConfAssignManager(
BpmConfAssignManager bpmConfAssignManager) {
this.bpmConfAssignManager = bpmConfAssignManager;
}
@Resource
public void setBpmConfListenerManager(
BpmConfListenerManager bpmConfListenerManager) {
this.bpmConfListenerManager = bpmConfListenerManager;
}
@Resource
public void setBpmConfRuleManger(BpmConfRuleManager bpmConfRuleManager) {
this.bpmConfRuleManager = bpmConfRuleManager;
}
@Resource
public void setBpmConfFormManager(BpmConfFormManager bpmConfFormManager) {
this.bpmConfFormManager = bpmConfFormManager;
}
@Resource
public void setBpmConfOperationManager(
BpmConfOperationManager bpmConfOperationManager) {
this.bpmConfOperationManager = bpmConfOperationManager;
}
@Resource
public void setBpmConfNoticeManager(
BpmConfNoticeManager bpmConfNoticeManager) {
this.bpmConfNoticeManager = bpmConfNoticeManager;
}
@Resource
public void setInternalFormConnector(
InternalFormConnector internalFormConnector) {
this.internalFormConnector = internalFormConnector;
}
@Resource
public void setTaskDefinitionConnector(
TaskDefinitionConnector taskDefinitionConnector) {
this.taskDefinitionConnector = taskDefinitionConnector;
}
}