package com.java110.common.bmo.workflow.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.java110.common.bmo.workflow.IQueryWorkFlowFirstStaffBMO; import com.java110.common.dao.IWorkflowServiceDao; import com.java110.common.dao.IWorkflowStepServiceDao; import com.java110.common.dao.IWorkflowStepStaffServiceDao; import com.java110.core.annotation.Java110Transactional; import com.java110.core.factory.GenerateCodeFactory; import com.java110.dto.oaWorkflow.OaWorkflowDto; import com.java110.dto.oaWorkflowForm.OaWorkflowFormDto; import com.java110.dto.oaWorkflowXml.OaWorkflowXmlDto; import com.java110.dto.org.OrgDto; import com.java110.dto.workflow.WorkflowDto; import com.java110.dto.workflow.WorkflowModelDto; import com.java110.intf.oa.IOaWorkflowFormInnerServiceSMO; import com.java110.intf.oa.IOaWorkflowInnerServiceSMO; import com.java110.intf.oa.IOaWorkflowXmlInnerServiceSMO; import com.java110.intf.user.IOrgInnerServiceSMO; import com.java110.po.oaWorkflow.OaWorkflowPo; import com.java110.po.oaWorkflowXml.OaWorkflowXmlPo; import com.java110.utils.util.Assert; import com.java110.utils.util.Base64Convert; import com.java110.utils.util.BeanConvertUtil; import com.java110.utils.util.StringUtil; import com.java110.vo.ResultVo; import org.activiti.editor.constants.ModelDataJsonConstants; import org.activiti.engine.ActivitiException; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.Model; import org.activiti.engine.repository.ProcessDefinition; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.image.PNGTranscoder; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; @Service("queryWorkFlowFirstStaffServiceImpl") public class QueryWorkFlowFirstStaffBMOImpl implements IQueryWorkFlowFirstStaffBMO { private static final Logger logger = LoggerFactory.getLogger(QueryWorkFlowFirstStaffBMOImpl.class); @Autowired private IWorkflowServiceDao workflowServiceDaoImpl; @Autowired private IWorkflowStepServiceDao workflowStepServiceDaoImpl; @Autowired private IWorkflowStepStaffServiceDao workflowStepStaffServiceDaoImpl; @Autowired private IOrgInnerServiceSMO orgInnerServiceSMOImpl; @Autowired private IOaWorkflowInnerServiceSMO oaWorkflowInnerServiceSMOImpl; @Autowired private IOaWorkflowXmlInnerServiceSMO oaWorkflowXmlInnerServiceSMOImpl; @Autowired private IOaWorkflowFormInnerServiceSMO oaWorkflowFormInnerServiceSMOImpl; @Autowired private RepositoryService repositoryService; @Autowired private ObjectMapper objectMapper; String MODEL_ID = "modelId"; String MODEL_NAME = "name"; String MODEL_REVISION = "revision"; String MODEL_DESCRIPTION = "description"; @Override public ResponseEntity query(WorkflowDto workflowDto) { List workflows = workflowServiceDaoImpl.getWorkflowInfo(BeanConvertUtil.beanCovertMap(workflowDto)); if (workflows == null || workflows.size() < 1) { return null; } WorkflowDto tmpWorkflowDto = BeanConvertUtil.covertBean(workflows.get(0), WorkflowDto.class); Map param = new HashMap(); param.put("statusCd", "0"); param.put("flowId", tmpWorkflowDto.getFlowId()); param.put("seq", "1"); param.put("communityId", tmpWorkflowDto.getCommunityId()); param.put("storeId", tmpWorkflowDto.getStoreId()); //查询步骤 List workflowSteps = workflowStepServiceDaoImpl.getWorkflowStepInfo(param); if (workflowSteps == null || workflowSteps.size() < 1) { return ResultVo.createResponseEntity(ResultVo.CODE_ERROR, "未查询到流程定义"); } param = new HashMap(); param.put("statusCd", "0"); param.put("communityId", tmpWorkflowDto.getCommunityId()); param.put("stepId", workflowSteps.get(0).get("stepId")); param.put("storeId", tmpWorkflowDto.getStoreId()); List workflowStepStaffs = workflowStepStaffServiceDaoImpl.getWorkflowStepStaffInfo(param); if (workflowStepStaffs == null || workflowStepStaffs.size() < 1) { return ResultVo.createResponseEntity(ResultVo.CODE_ERROR, "未查询到流程定义"); } Map staffInfo = workflowStepStaffs.get(0); OrgDto orgDto = new OrgDto(); orgDto.setStaffId(staffInfo.get("staffId") + ""); List orgDtos = orgInnerServiceSMOImpl.queryOrgs(orgDto); if (orgDtos == null || orgDtos.size() < 1) { return ResultVo.createResponseEntity(ResultVo.CODE_ERROR, "未查询到员工组织信息"); } orgDto = orgDtos.get(0); orgDto.setStaffName(staffInfo.get("staffName") + ""); return ResultVo.createResponseEntity(orgDto); } @Override public ResponseEntity deployModel(WorkflowModelDto workflowModelDto) { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); OaWorkflowDto oaWorkflowDto = new OaWorkflowDto(); oaWorkflowDto.setModelId(workflowModelDto.getModelId()); List oaWorkflowDtos = oaWorkflowInnerServiceSMOImpl.queryOaWorkflows(oaWorkflowDto); Assert.listOnlyOne(oaWorkflowDtos, "未包含流程"); //表单 部署 deployForm(oaWorkflowDtos.get(0)); String deploymentid = ""; try { Model modelData = repositoryService.getModel(workflowModelDto.getModelId()); byte[] bpmnBytes = null; bpmnBytes = repositoryService.getModelEditorSource(workflowModelDto.getModelId()); String encoded = Base64Convert.byteToBase64(bpmnBytes); byte[] decoded = Base64Convert.base64ToByte(encoded); String xml = new String(decoded); String processName = modelData.getName() + ".bpmn20.xml"; ByteArrayInputStream in = new ByteArrayInputStream(bpmnBytes); Deployment deployment = repositoryService.createDeployment().name(oaWorkflowDtos.get(0).getFlowName()) .addInputStream(processName, in).deploy(); deploymentid = deployment.getId(); } catch (Exception e) { throw new IllegalArgumentException(e); } Assert.isTrue(!StringUtil.isEmpty(deploymentid), "流程部署出错"); ProcessDefinition processDefinition = repositoryService .createProcessDefinitionQuery() .deploymentId(deploymentid) .singleResult(); //更新部门流程关系表 workflowModelDto.setDeploymentId(deploymentid); OaWorkflowPo oaWorkflowPo = new OaWorkflowPo(); oaWorkflowPo.setFlowId(oaWorkflowDtos.get(0).getFlowId()); oaWorkflowPo.setStoreId(oaWorkflowDtos.get(0).getStoreId()); oaWorkflowPo.setProcessDefinitionKey(deploymentid); oaWorkflowPo.setState(OaWorkflowDto.STATE_COMPLAINT); oaWorkflowInnerServiceSMOImpl.updateOaWorkflow(oaWorkflowPo); // //部署历史表 // List deployHistoryEntities = deployHistoryRepository.getDeployHistoryByDeptWithProcessKeyId(deptWithProcessKeyId); // for (DeployHistoryEntity deployHistoryEntity : deployHistoryEntities) { // if (deployHistoryEntity.getModelKeyid().equals(modelId)) { // deployHistoryEntity.setDeploy(true); // } else { // deployHistoryEntity.setDeploy(false); // } // deployHistoryRepository.update(deployHistoryEntity); // } return ResultVo.success(); } /** * 部署表单 * * @param oaWorkflowDto */ private void deployForm(OaWorkflowDto oaWorkflowDto) { if (StringUtil.isEmpty(oaWorkflowDto.getCurFormId())) { throw new IllegalArgumentException("未设置表单"); } OaWorkflowFormDto oaWorkflowFormDto = new OaWorkflowFormDto(); oaWorkflowFormDto.setFormId(oaWorkflowDto.getCurFormId()); oaWorkflowFormDto.setStoreId(oaWorkflowDto.getStoreId()); List oaWorkflowFormDtos = oaWorkflowFormInnerServiceSMOImpl.queryOaWorkflowForms(oaWorkflowFormDto); Assert.listOnlyOne(oaWorkflowFormDtos, "未设置表单"); //查询表是否存在 String formJson = oaWorkflowFormDtos.get(0).getFormJson(); Assert.isJsonObject(formJson, "表单设计出错,请重新设计"); JSONObject form = JSONObject.parseObject(formJson); JSONArray components = form.getJSONArray("components"); JSONObject component = null; StringBuffer sql = new StringBuffer("create table if not exists "); sql.append(oaWorkflowFormDtos.get(0).getTableName()); sql.append(" ("); sql.append("id varchar(30) NOT NULL PRIMARY KEY COMMENT '主键ID',"); boolean isVarchar = false; JSONObject validate = null; for (int componentIndex = 0; componentIndex < components.size(); componentIndex++) { component = components.getJSONObject(componentIndex); if ("text".equals(component.getString("type")) || "button".equals(component.getString("type"))) { continue; } isVarchar = false; sql.append(component.getString("key")); sql.append(" "); if ("number".equals(component.getString("type"))) { sql.append(" bigint"); } else if ("textfield".equals(component.getString("type"))) { sql.append(" varchar"); isVarchar = true; } else if ("checkbox".equals(component.getString("type"))) { sql.append(" varchar"); isVarchar = true; } else if ("radio".equals(component.getString("type"))) { sql.append(" varchar"); isVarchar = true; } else if ("select".equals(component.getString("type"))) { sql.append(" varchar"); isVarchar = true; } else if ("textarea".equals(component.getString("type"))) { sql.append(" longtext"); } else if ("textdate".equals(component.getString("type"))) { sql.append(" date"); } else if ("textdatetime".equals(component.getString("type"))) { sql.append(" time"); } else { throw new IllegalArgumentException("不支持的类型"); } if (component.containsKey("validate")) { validate = component.getJSONObject("validate"); if (isVarchar && validate.containsKey("maxLength")) { sql.append("("); sql.append(validate.getIntValue("maxLength")); sql.append(") "); } if (isVarchar && !validate.containsKey("maxLength")) { sql.append("(64) "); } if (validate.containsKey("required") && validate.getBoolean("required")) { sql.append(" not null "); } } if (!component.containsKey("validate") && isVarchar) { sql.append("(64) "); } sql.append(" comment '"); sql.append(component.getString("label")); sql.append("',"); } sql.append("store_id varchar(30) not null COMMENT '商户ID',"); sql.append("create_user_id varchar(30) not null COMMENT '创建人ID',"); sql.append("create_user_name varchar(64) not null COMMENT '创建人',"); sql.append("state varchar(12) not null COMMENT '状态 1001 申请 1002 待审核 1003 退回 1004 委托 1005 办结',"); sql.append("create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',"); sql.append("status_cd varchar(2) NOT NULL DEFAULT '0' COMMENT '数据状态,详细参考c_status表,S 保存,0, 在用 1失效'"); sql.append(")"); logger.debug("部署表单sql" + sql.toString()); oaWorkflowFormInnerServiceSMOImpl.createTable(sql.toString()); // int count = oaWorkflowFormInnerServiceSMOImpl.createTable(sqlStr); // if (count < 1) { // 已经部署过不用再部署 // throw new IllegalArgumentException("部署表单失败"); // } } /** * 创建model * 微信 17797173942 * * @param workflowModelDto * @return */ @Override @Java110Transactional public ResponseEntity saveModel(WorkflowModelDto workflowModelDto) { //根据 OaWorkflowDto oaWorkflowDto = new OaWorkflowDto(); oaWorkflowDto.setModelId(workflowModelDto.getModelId()); List oaWorkflowDtos = oaWorkflowInnerServiceSMOImpl.queryOaWorkflows(oaWorkflowDto); Assert.listOnlyOne(oaWorkflowDtos, "未包含流程"); workflowModelDto.setFlowId(oaWorkflowDtos.get(0).getFlowId()); //这里决定对bpmn xml 文件做过滤处理 dealBpmnXml(workflowModelDto); OaWorkflowXmlPo oaWorkflowXmlPo = new OaWorkflowXmlPo(); oaWorkflowXmlPo.setStoreId(oaWorkflowDtos.get(0).getStoreId()); oaWorkflowXmlPo.setBpmnXml(workflowModelDto.getJson_xml()); oaWorkflowXmlPo.setFlowId(oaWorkflowDtos.get(0).getFlowId()); oaWorkflowXmlPo.setSvgXml(workflowModelDto.getSvg_xml()); //查询部署 OaWorkflowXmlDto oaWorkflowXmlDto = new OaWorkflowXmlDto(); oaWorkflowXmlDto.setFlowId(oaWorkflowDtos.get(0).getFlowId()); oaWorkflowXmlDto.setStoreId(oaWorkflowDtos.get(0).getStoreId()); List oaWorkflowXmlDtos = oaWorkflowXmlInnerServiceSMOImpl.queryOaWorkflowXmls(oaWorkflowXmlDto); int flag = 0; if (oaWorkflowXmlDtos == null || oaWorkflowXmlDtos.size() < 1) { oaWorkflowXmlPo.setXmlId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_xmlId)); flag = oaWorkflowXmlInnerServiceSMOImpl.saveOaWorkflowXml(oaWorkflowXmlPo); } else { oaWorkflowXmlPo.setXmlId(oaWorkflowXmlDtos.get(0).getXmlId()); flag = oaWorkflowXmlInnerServiceSMOImpl.updateOaWorkflowXml(oaWorkflowXmlPo); } if (flag < 1) { throw new IllegalArgumentException("流程图处理失败"); } try { Model model = repositoryService.getModel(workflowModelDto.getModelId()); ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo()); modelJson.put(MODEL_NAME, oaWorkflowDtos.get(0).getFlowName()); modelJson.put(MODEL_DESCRIPTION, oaWorkflowDtos.get(0).getDescrible()); modelJson.put(ModelDataJsonConstants.MODEL_REVISION, model.getVersion() + 1); model.setMetaInfo(modelJson.toString()); model.setName(oaWorkflowDtos.get(0).getFlowName()); model.setKey("java110_" + oaWorkflowDtos.get(0).getFlowId()); repositoryService.saveModel(model); repositoryService.addModelEditorSource(model.getId(), workflowModelDto.getJson_xml().getBytes("utf-8")); InputStream svgStream = new ByteArrayInputStream(workflowModelDto.getSvg_xml().getBytes("utf-8")); TranscoderInput input = new TranscoderInput(svgStream); PNGTranscoder transcoder = new PNGTranscoder(); // Setup output ByteArrayOutputStream outStream = new ByteArrayOutputStream(); TranscoderOutput output = new TranscoderOutput(outStream); // Do the transformation transcoder.transcode(input, output); final byte[] result = outStream.toByteArray(); repositoryService.addModelEditorSourceExtra(model.getId(), result); outStream.close(); } catch (Exception e) { logger.error("Error saving model", e); throw new ActivitiException("Error saving model", e); } OaWorkflowPo oaWorkflowPo = new OaWorkflowPo(); oaWorkflowPo.setFlowId(oaWorkflowDtos.get(0).getFlowId()); oaWorkflowPo.setState(OaWorkflowDto.STATE_WAIT); flag = oaWorkflowInnerServiceSMOImpl.updateOaWorkflow(oaWorkflowPo); if (flag < 1) { return ResultVo.createResponseEntity(ResultVo.CODE_ERROR, "保存失败"); } return ResultVo.success(); } /** * 过滤BpmnXml * * @param workflowModelDto */ private void dealBpmnXml(WorkflowModelDto workflowModelDto) { String bpmnXml = workflowModelDto.getJson_xml(); Document doc = null; try { doc = DocumentHelper.parseText(bpmnXml); } catch (Exception e) { throw new IllegalArgumentException(e); } Element rootElement = doc.getRootElement(); Element process = rootElement.element("process"); List userTasks = process.elements("userTask"); for (Element userTask : userTasks) { Attribute assignee = userTask.attribute("assignee"); if (assignee == null) { userTask.addAttribute("activiti:assignee", "${nextUserId}"); } } Attribute processId = process.attribute("id"); if (processId == null) { workflowModelDto.setJson_xml(rootElement.asXML()); return; } String processIdValue = processId.getValue(); String newXml = rootElement.asXML(); newXml = newXml.replaceAll(processIdValue, "java110_" + workflowModelDto.getFlowId()); workflowModelDto.setJson_xml(newXml); } public static void main(String[] args) { String xml = getXml(); Document doc = null; try { doc = DocumentHelper.parseText(xml); } catch (Exception e) { throw new IllegalArgumentException(e); } Element rootElement = doc.getRootElement(); Element process = rootElement.element("process"); List userTasks = process.elements("userTask1"); for (Element userTask : userTasks) { Attribute assignee = userTask.attribute("assignee"); if (assignee == null) { userTask.addAttribute("camunda:assignee", "${createUserId}"); } } Attribute processId = process.attribute("id"); if (processId == null) { return; } String processIdValue = processId.getValue(); String newXml = rootElement.asXML(); newXml = newXml.replaceAll(processIdValue, "你好兄弟"); System.out.printf("xml=\n" + newXml); } private static String getXml() { return "\n" + "\n" + " \n" + " \n" + " \n" + " Flow_1gyk5nu\n" + " Flow_0vajlrg\n" + " \n" + " \n" + " Flow_1pn6kje\n" + " \n" + " \n" + " \n" + " Flow_1gyk5nu\n" + " \n" + " \n" + " Flow_0vajlrg\n" + " Flow_1pn6kje\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + ""; } }