package cn.ksource.core.workflow; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import cn.ksource.beans.GG_USER; import cn.ksource.beans.WORKFLOW_BASE; import cn.ksource.beans.WORKFLOW_NODE; import cn.ksource.beans.WORKFLOW_PARAMETER; import cn.ksource.beans.WORKFLOW_TEMPLATE_BASE; import cn.ksource.beans.WORKFLOW_TEMPLATE_NODE; import cn.ksource.beans.WORKFLOW_TEMPLATE_NODE_DEALRORE; import cn.ksource.beans.WORKFLOW_TEMPLATE_NODE_PARTNER; import cn.ksource.beans.WORKFLOW_TEMPLATE_NODE_USER; import cn.ksource.beans.WORKFLOW_USER_CMDB; import cn.ksource.core.dao.BaseDao; import cn.ksource.core.dao.SqlParameter; import cn.ksource.core.util.ConvertUtil; import cn.ksource.core.util.DateUtil; import cn.ksource.core.util.StringUtil; import cn.ksource.core.workflow.interfac.WorkFlowInterface; import cn.ksource.web.Constants; import cn.ksource.web.service.BillReportCodeService; @Service public class WorkflowCoreServiceImpl implements WorkflowCoreService { @Autowired private BaseDao baseDao; @Autowired private BillReportCodeService billReportCodeService; private void callInterface(String methodname, WORKFLOW_BASE base, WORKFLOW_NODE node, WORKFLOW_TEMPLATE_BASE template, WORKFLOW_TEMPLATE_NODE templateNode) { try { if ("onWorkFlowStart".equals(methodname)) { if (StringUtils.isNotBlank(template.getWf_start_interface())) { Class demo = Class.forName(template.getWf_start_interface()); WorkFlowInterface inter = (WorkFlowInterface) demo.newInstance(); inter.onWorkFlowStart(baseDao, base); } } if ("onWorkFlowClose".equals(methodname)) { if (StringUtils.isNotBlank(template.getWf_end_interface())) { Class demo = Class.forName(template.getWf_end_interface()); WorkFlowInterface inter = (WorkFlowInterface) demo.newInstance(); inter.onWorkFlowClose(baseDao, base); } } if ("onWorkFlowFinish".equals(methodname)) { if (StringUtils.isNotBlank(template.getWf_finish_interface())) { Class demo = Class.forName(template.getWf_finish_interface()); WorkFlowInterface inter = (WorkFlowInterface) demo.newInstance(); inter.onWorkFlowFinish(baseDao, base); } } if ("onWorkFlowUp".equals(methodname)) { if (StringUtils.isNotBlank(template.getWf_finish_interface())) { Class demo = Class.forName(template.getWf_finish_interface()); WorkFlowInterface inter = (WorkFlowInterface) demo.newInstance(); inter.onWorkFlowFinish(baseDao, base); } } if ("onNodeStart".equals(methodname)) { if (StringUtils.isNotBlank(templateNode.getNode_start_interface())) { Class demo = Class.forName(templateNode.getNode_start_interface()); WorkFlowInterface inter = (WorkFlowInterface) demo.newInstance(); inter.onNodeStart(baseDao, base, node); } } if ("onNodeAnswer".equals(methodname)) { if (StringUtils.isNotBlank(templateNode.getNode_answer_interface())) { Class demo = Class.forName(templateNode.getNode_answer_interface()); WorkFlowInterface inter = (WorkFlowInterface) demo.newInstance(); inter.onNodeStart(baseDao, base, node); } } if ("onNodeEnd".equals(methodname)) { if (StringUtils.isNotBlank(templateNode.getNode_end_interface())) { Class demo = Class.forName(templateNode.getNode_end_interface()); WorkFlowInterface inter = (WorkFlowInterface) demo.newInstance(); inter.onNodeEnd(baseDao, base, node); } } if ("onNodeFinish".equals(methodname)) { if (StringUtils.isNotBlank(templateNode.getNode_finish_interface())) { Class demo = Class.forName(templateNode.getNode_finish_interface()); WorkFlowInterface inter = (WorkFlowInterface) demo.newInstance(); inter.onNodeFinish(baseDao, base, node); } } } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public NodeDealEntity getNextNodeDealer(WORKFLOW_BASE base) { WORKFLOW_TEMPLATE_NODE node = getNextTemplateNode(base); if (node == null) { return null; } NodeDealEntity entity = getNodeDealerInfo(base, node); return entity; } public boolean finishNode(WORKFLOW_BASE base, WORKFLOW_NODE node, NodeFinishEntity entity) { //检查有没有同环节的节点还没有结束 //如果没有同环节的节点,那么该环节可以结束 //如果有同环节的节点,其他所有节点都已经结束,那么该节点也可以结束 // 其他有节点没有结束,则检查该环节是否为主要负责人,如果不是主要负责人,那么该环节可以结束,如果为主要负责人,该环节不可以结束 /* List nodeList = baseDao.queryForList("select * from WORKFLOW_NODE where FLOWID=:FLOWID and NODE_TEMPLATE_ID=:NODE_TEMPLATE_ID and FLOWSTATE <> 3 and ID <> :NODEID", new SqlParameter("FLOWID",base.getId()).addValue("NODEID", node.getId()).addValue("NODE_TEMPLATE_ID", node.getNode_template_id())); //如果存在其他环节,且当前环节是主负责人,不可以关闭 if (nodeList.size() > 0 && node.getIs_admin() == 1) { return false; }*/ node.setDeal_note(entity.getDeal_note()); node.setDeal_note_title(entity.getDeal_note_title()); node.setDeal_result(entity.getDeal_result()); node.setDealtime(DateUtil.getCurrentDate14()); node.setFlowstate(3); node.setDeal_usetime(DateUtil.getMillisFormDate2Date(node.getAnswer_time(), node.getDealtime()) / 1000); node.update(); return true; } public boolean answerNode(WORKFLOW_BASE base, WORKFLOW_NODE node, NodeAnswerEntity entity) { //如果是指定角色,则更新流程的当前处理人 if (base.getDeal_type() == 1) { //如果是指定角色,当前处理人不为空,说明已经响应过 String currentDealerId = base.getCurrent_dealer_id(); if (StringUtil.notEmpty(currentDealerId)) { return false; } base.setCurrent_dealer_id(entity.getUser_id()); base.setCurrent_dealer_name(entity.getUser_name()); base.setDeal_type(2); base.update(); } Integer flowState = node.getFlowstate(); if (null != flowState && flowState == 2 || flowState == 3) { return false; } node.setAnswer_time(DateUtil.getCurrentDate14()); node.setCurrent_dealer_id(entity.getUser_id()); node.setCurrent_dealer_name(entity.getUser_name()); node.setFlowstate(2); node.setAnswer_usertime(DateUtil.getMillisFormDate2Date(node.getCreatetime(), node.getAnswer_time()) / 1000); node.update(); WORKFLOW_TEMPLATE_BASE template = new WORKFLOW_TEMPLATE_BASE(base.getWf_template_id()).getInstanceById(); WORKFLOW_TEMPLATE_NODE templateNode = new WORKFLOW_TEMPLATE_NODE(node.getNode_template_id()).getInstanceById(); callInterface("onNodeAnswer", base, null, template, templateNode); return true; } /** * 获取环节执行人信息 * * @param base * @param node * @return * @version V1.0.0 * @author 杨凯 * @date May 6, 2015 3:00:33 PM */ private NodeDealEntity getNodeDealerInfo(WORKFLOW_BASE base, WORKFLOW_TEMPLATE_NODE node) { String getNode_PartnerSql = "select * from WORKFLOW_TEMPLATE_NODE_PARTNER where PARTNER_ID=:PARTNER_ID and NODE_ID = :NODE_ID limit 1"; WORKFLOW_TEMPLATE_NODE_PARTNER node_partner = baseDao.queryForBean(getNode_PartnerSql, new SqlParameter("PARTNER_ID", "").addValue("NODE_ID", node.getId()), new WORKFLOW_TEMPLATE_NODE_PARTNER() ); NodeDealEntity entity = new NodeDealEntity(); entity.setWorkflow_template_node(node); entity.setDealer_type(node_partner.getDealer_type()); //指定角色 if (entity.getDealer_type() == 1) { Map map = baseDao.queryForMap("select * from WORKFLOW_TEMPLATE_NODE_DEALRORE where PARTNER_NODE_ID=:PARTNER_NODE_ID limit 1", new SqlParameter("PARTNER_NODE_ID", node_partner.getId())); if (!map.isEmpty()) { entity.setRoleID(ConvertUtil.obj2Str(map.get("ROLE_ID"))); entity.setRoleName(ConvertUtil.obj2Str(map.get("ROLE_NAME"))); } //指定人员 } else if (entity.getDealer_type() == 2) { List list = baseDao.queryForList("select * from WORKFLOW_TEMPLATE_NODE_USER where PARTNER_NODE_ID=:PARTNER_NODE_ID", new SqlParameter("PARTNER_NODE_ID", node_partner.getId())); if (list.size() > 0) { List ryList = new ArrayList(); for (Map map : list) { ryList.add(map); } entity.setDealerList(ryList); } } else if (entity.getDealer_type() == 4) { List list = new ArrayList(); Map map = new HashMap(); map.put("USER_ID", base.getCreaterid()); map.put("USER_NAME", base.getCreatername()); map.put("IS_ADMIN", "1"); entity.setDealerList(list); } return entity; } @Override public NodeDealEntity getNodeDealer(WORKFLOW_BASE base, String node_template_id) { WORKFLOW_TEMPLATE_NODE node = new WORKFLOW_TEMPLATE_NODE(node_template_id).getInstanceById(); if (node == null) { return null; } NodeDealEntity entity = getNodeDealerInfo(base, node); return entity; } /** * 获取下一个模版信息 * * @param base * @return * @version V1.0.0 * @author 杨凯 * @date May 4, 2015 6:28:49 PM */ private WORKFLOW_TEMPLATE_NODE getNextTemplateNode(WORKFLOW_BASE base) { String sql = "SELECT * FROM WORKFLOW_TEMPLATE_NODE \n" + "WHERE WORKFLOW_TEMPLATE_NODE.MAINFLOWTEMPID = :MAINFLOWTEMPID \n" + "AND WORKFLOW_TEMPLATE_NODE.ORDERNUMBER > (SELECT ORDERNUMBER FROM WORKFLOW_TEMPLATE_NODE WHERE id = :NODEID)\n" + "AND WORKFLOW_TEMPLATE_NODE.USINGSTATE = 1\n" + "LIMIT 1"; SqlParameter param = new SqlParameter(); param.addValue("MAINFLOWTEMPID", base.getWf_template_id()); param.addValue("NODEID", new WORKFLOW_NODE(base.getCurrent_node_id()).getInstanceById().getNode_template_id()); WORKFLOW_TEMPLATE_NODE node = baseDao.queryForBean(sql.toString(), param, new WORKFLOW_TEMPLATE_NODE()); return node; } public void toNextNode(WORKFLOW_BASE base, NodeDealEntity entity) { //当前流程实例编号 String curWfId = base.getId(); //下个节点模板 WORKFLOW_TEMPLATE_NODE nextNodeTemplate = getNextTemplateNode(base); if (nextNodeTemplate == null) { //结束流程 finishWorkFlow(base); return; } //保存环节信息 //指定角色 或上一环节指定角色 if (entity.getDealer_type() == NodeDealEntity.Dealer_Type_ROLE || entity.getBefore_Dealer_type() == NodeDealEntity.Dealer_Type_ROLE) { WORKFLOW_NODE node = new WORKFLOW_NODE(); node.setDeal_type(1); node.setCurrent_deal_roleida(entity.getRoleID()); node.setCurrent_deal_rolename(entity.getRoleName()); node.setCreatetime(DateUtil.getCurrentDate14()) .setFlow_type(1) .setFlowid(base.getId()) .setFlowstate(1) .setNode_template_id(nextNodeTemplate.getId()) .setNodename(nextNodeTemplate.getNodename()) .insert(); base.setCurrent_deal_roleida(node.getCurrent_deal_roleida()) .setCurrent_deal_rolename(node.getCurrent_deal_rolename()) .setCurrent_node_id(node.getId()) .setCurrent_node_name(node.getNodename()) .setDeal_type(1) .update(); //指定人员 或上一环节指定人员 或流程发起人 } else if (entity.getDealer_type() == NodeDealEntity.Dealer_Type_USER || entity.getBefore_Dealer_type() == NodeDealEntity.Dealer_Type_USER || entity.getDealer_type() == NodeDealEntity.Dealer_Type_Flow_Creater) { List userList = entity.getDealerList(); for (Map map : userList) { WORKFLOW_NODE node = new WORKFLOW_NODE(); node.setDeal_type(2); node.setCurrent_dealer_id(ConvertUtil.obj2Str(map.get("USER_ID"))); node.setCurrent_dealer_name(ConvertUtil.obj2Str(map.get("USER_NAME"))); node.setCreatetime(DateUtil.getCurrentDate14()) .setFlow_type(1) .setFlowid(base.getId()) .setFlowstate(1) .setNode_template_id(nextNodeTemplate.getId()) .setNodename(nextNodeTemplate.getNodename()) .insert(); if ("1".equals(ConvertUtil.obj2Str(map.get("IS_ADMIN")))) { base.setCurrent_dealer_id(node.getCurrent_dealer_id()) .setCurrent_dealer_name(node.getCurrent_dealer_name()) .setCurrent_node_id(node.getId()) .setCurrent_node_name(node.getNodename()) .setDeal_type(2) .update(); } } } } public void toNode(WORKFLOW_BASE base, String node_template_id, NodeDealEntity entity) { //当前流程实例编号 String curWfId = base.getId(); //指定节点模板 WORKFLOW_TEMPLATE_NODE nodeTemplate = new WORKFLOW_TEMPLATE_NODE(node_template_id).getInstanceById(); String sameNodeKey = StringUtil.getUUID(); long createTime = DateUtil.getCurrentDate14() + 1; //保存环节信息 //指定角色 或上一环节指定角色 if (entity.getDealer_type() == NodeDealEntity.Dealer_Type_ROLE || entity.getBefore_Dealer_type() == NodeDealEntity.Dealer_Type_ROLE) { WORKFLOW_NODE node = new WORKFLOW_NODE(); node.setFlow_type(entity.getFlow_type()); node.setSource_node_instance_id(entity.getSource_node_instance_id()); node.setDeal_type(1); node.setCurrent_deal_roleida(entity.getRoleID()); node.setCurrent_deal_rolename(entity.getRoleName()); node.setCreatetime(createTime) .setFlowid(base.getId()) .setFlowstate(1) .setNode_template_id(nodeTemplate.getId()) .setNodename(nodeTemplate.getNodename()) .setIs_admin(1) .setSource_node_instance_id(base.getCurrent_node_id()) .setSame_node_key(sameNodeKey) .setDeal_note(base.getNote()) .insert(); base.setCurrent_deal_roleida(node.getCurrent_deal_roleida()) .setCurrent_deal_rolename(node.getCurrent_deal_rolename()) .setCurrent_node_id(node.getId()) .setCurrent_node_name(node.getNodename()) .setDeal_type(1) .setCurrent_dealer_id(null) .setCurrent_dealer_name(null) .update(); //指定人员 或上一环节指定人员 或流程发起人 } else if (entity.getDealer_type() == NodeDealEntity.Dealer_Type_USER || entity.getBefore_Dealer_type() == NodeDealEntity.Dealer_Type_USER || entity.getDealer_type() == NodeDealEntity.Dealer_Type_Flow_Creater) { List userList = entity.getDealerList(); for (Map map : userList) { WORKFLOW_NODE node = new WORKFLOW_NODE(); node.setFlow_type(entity.getFlow_type()); node.setSource_node_instance_id(entity.getSource_node_instance_id()); node.setDeal_type(2); node.setCurrent_dealer_id(ConvertUtil.obj2Str(map.get("USER_ID"))); node.setCurrent_dealer_name(ConvertUtil.obj2Str(map.get("USER_NAME"))); node.setCreatetime(createTime) .setFlowid(base.getId()) .setFlowstate(1) .setNode_template_id(nodeTemplate.getId()) .setNodename(nodeTemplate.getNodename()); if ("1".equals(ConvertUtil.obj2Str(map.get("IS_ADMIN")))) { node.setIs_admin(1).setSource_node_instance_id(base.getCurrent_node_id()); } node.setSame_node_key(sameNodeKey).insert(); if ("1".equals(ConvertUtil.obj2Str(map.get("IS_ADMIN")))) { base.setCurrent_dealer_id(node.getCurrent_dealer_id()) .setCurrent_dealer_name(node.getCurrent_dealer_name()) .setCurrent_node_id(node.getId()) .setCurrent_node_name(node.getNodename()) .setDeal_type(2) .setCurrent_deal_roleida(null) .setCurrent_deal_rolename(null) .update(); } } } } @Override public void setParameters(String wfInstanceId, Map param) { if (param == null || param.size() <= 0) { return; } for (String key : param.keySet()) { WORKFLOW_PARAMETER workflow_parameter = new WORKFLOW_PARAMETER(); workflow_parameter.setPname(key) .setPvalue(ConvertUtil.obj2Str(param.get(key))) .setWorkflowid(wfInstanceId) .insert(); } } @Override public WORKFLOW_BASE startWorkflow(WorkflowStartEntity start, Map param) { //根据业务类型获取流程模板信息 WORKFLOW_TEMPLATE_BASE wfTemplate = this.getWfTemplate(start.getBusinessType()); if (wfTemplate == null) { return null; } //获取开始节点 WORKFLOW_TEMPLATE_NODE firstNodeTemplate = this.getMainTemplateFirstNode(wfTemplate.getId()); if (firstNodeTemplate == null) { return null; } //保存流程实例信息 WORKFLOW_BASE wf = new WORKFLOW_BASE(); wf = wf.setBusiness_id(start.getBusinessId()) .setBusinesstype(start.getBusinessType()) .setWf_template_id(wfTemplate.getId()) .setWfname(StringUtil.isEmpty(start.getFlowName()) ? wfTemplate.getWfname() : start.getFlowName()) .setWfstate(Constants.WORKFLOW_BASE_WFSTATE_DOING) .setCreaterid(start.getUserId()) .setCreatername(start.getUserName()) .setCreatetime(DateUtil.getCurrentDate14()) .setWorkflowtype(wfTemplate.getWorkflowtype()) .setOrder_code(start.getOrderCode()) .setNote(start.getNote()) .setCustomer_id(start.getCustomerId()) .setCustomer_name(start.getCustomerName()) .setWfnote(start.getWfNote()) .setSub_customer_id(start.getSubCustomerId()) .setSub_customer_name(start.getSubCustomerName()) .insert(); //保存发起环节信息 WORKFLOW_NODE node = new WORKFLOW_NODE(); node.setCreatetime(DateUtil.getCurrentDate14()) .setDeal_note_title("发起工单流程") .setDeal_result(1) .setDeal_type(4) .setDeal_usetime(0L) .setAnswer_time(DateUtil.getCurrentDate14()) .setDealtime(DateUtil.getCurrentDate14()) .setFlow_type(1) .setFlowid(wf.getId()) .setFlowstate(3) .setNode_template_id(firstNodeTemplate.getId()) .setNodename(firstNodeTemplate.getNodename()) .setCurrent_dealer_id(wf.getCreaterid()) .setCurrent_dealer_name(wf.getCreatername()) .setIs_admin(1) .setDeal_note(start.getNote()) .insert(); //更新当前所处环节 wf.setCurrent_node_id(node.getId()).setCurrent_node_name(node.getNodename()).update(); //保存流程参数 List workflowParameters = new ArrayList(); for (Map.Entry entry : param.entrySet()) { WORKFLOW_PARAMETER wfparam = new WORKFLOW_PARAMETER(); wfparam = wfparam.setPname(ConvertUtil.obj2Str(entry.getKey())) .setPvalue(ConvertUtil.obj2Str(entry.getValue())) .setWorkflowid(wf.getId()) .insert(); workflowParameters.add(wfparam); } //保存用户及设备涉及工单 //this.insertWorkflowUserCmdb(wf.getId(), start.getUserId(), start.getCiList()); WORKFLOW_TEMPLATE_BASE template = new WORKFLOW_TEMPLATE_BASE(wf.getWf_template_id()).getInstanceById(); callInterface("onWorkFlowStart", wf, null, template, null); WORKFLOW_TEMPLATE_NODE templateNode = new WORKFLOW_TEMPLATE_NODE(node.getNode_template_id()).getInstanceById(); callInterface("onNodeStart", wf, null, template, templateNode); callInterface("onNodeFinish", wf, null, template, templateNode); //调用流程启动时接口 //this.callInterfaceForWorkflowStart(wfTemplate.getWf_start_interface(), wf, workflowParameters); //调用节点进入时接口 //this.callInterfaceForNodeStart(firstNodeTemplate.getNode_start_interface(), wf, node, workflowParameters); //返回流程实例 return wf; } public void closeWorkFlow(WORKFLOW_BASE base) { base.setWfstate(3).setEndtime(DateUtil.getCurrentDate14()).update(); WORKFLOW_TEMPLATE_BASE template = new WORKFLOW_TEMPLATE_BASE(base.getWf_template_id()).getInstanceById(); callInterface("onWorkFlowClose", base, null, template, null); } public void finishWorkFlow(WORKFLOW_BASE base) { base.setWfstate(2).setEndtime(DateUtil.getCurrentDate14()).update(); WORKFLOW_TEMPLATE_BASE template = new WORKFLOW_TEMPLATE_BASE(base.getWf_template_id()).getInstanceById(); callInterface("onWorkFlowFinish", base, null, template, null); } public void upWorkFlow(WORKFLOW_BASE base) { base.setWfstate(6).update(); WORKFLOW_TEMPLATE_BASE template = new WORKFLOW_TEMPLATE_BASE(base.getWf_template_id()).getInstanceById(); callInterface("onWorkFlowUp", base, null, template, null); } @Override public void toBack(WorkflowDealEntity deal, Map param) { if (deal == null || StringUtil.isEmpty(deal.getBackNodeId())) { return; } String curWfId = deal.getWfInstanceId(); String curNodeId = deal.getNodeInstanceId(); //获取当前流程实例、流程模板 WORKFLOW_BASE wfInstance = this.getWfInstance(curWfId); //获取当前节点实例可回退到的节点模板 WORKFLOW_TEMPLATE_NODE backNodeTemplate = this.getNodeTemplate(deal.getBackNodeId()); //更新当前节点完成情况 new WORKFLOW_NODE().setDeal_note(deal.getNote()) .setDeal_result(deal.getResult()) .setDealtime(DateUtil.getCurrentDate14()) .setId(deal.getNodeInstanceId()) .setFlowstate(Constants.WORKFLOW_NODE_FLOWSTATE_FINISH) .setCurrent_dealer_id(deal.getUserId()) .setCurrent_dealer_name(deal.getUserName()) .update(); //删除其它未处理节点 baseDao.execute("delete from workflow_node where FLOWID=:flowid and FLOWSTATE!=3", new SqlParameter("flowid", curWfId)); //进入回退节点 WORKFLOW_NODE node = new WORKFLOW_NODE(); List dutyerList = this.getNodeDutyer(backNodeTemplate.getId(), null, wfInstance.getCreaterid(), wfInstance.getCreatername(), wfInstance.getId()); WORKFLOW_NODE curNodeInstance = this.insertNodeInstance(curWfId, Constants.WORKFLOW_NODE_FLOW_TYPE_BACK, backNodeTemplate, dutyerList); //更新流程实例当前节点 wfInstance = this.updateWfCurrentNode(curNodeInstance); //流程参数 WORKFLOW_PARAMETER wfparam = new WORKFLOW_PARAMETER(); List workflowParameters = new ArrayList(); for (Map.Entry entry : param.entrySet()) { wfparam = wfparam.setPname(ConvertUtil.obj2Str(entry.getKey())) .setPvalue(ConvertUtil.obj2Str(entry.getValue())) .setWorkflowid(curWfId); workflowParameters.add(wfparam); } //调用节点进入时接口 this.callInterfaceForNodeStart(backNodeTemplate.getNode_start_interface(), wfInstance, node, workflowParameters); } @Override public void toNext(WorkflowDealEntity deal, Map param) { if (deal == null) { return; } String curWfId = deal.getWfInstanceId(); String curNodeId = deal.getNodeInstanceId(); //获取当前流程实例、流程模板 WORKFLOW_BASE wfInstance = this.getWfInstance(curWfId); //获取当前节点实例、节点模板 WORKFLOW_NODE nodeInstance = this.getNodeInstance(curNodeId); WORKFLOW_TEMPLATE_NODE nodeTemplate = this.getNodeTemplate(nodeInstance.getNode_template_id()); //更新当前节点完成情况 nodeInstance = nodeInstance.setDeal_note(deal.getNote()) .setDeal_result(deal.getResult()) .setDealtime(DateUtil.getCurrentDate14()) .setId(deal.getNodeInstanceId()) .setFlowstate(Constants.WORKFLOW_NODE_FLOWSTATE_FINISH) //节点指定角色时,需要设置真正的处理人 .setCurrent_dealer_id(deal.getUserId()) .setCurrent_dealer_name(deal.getUserName()) .update(); //主要负责人更新当前节点完成情况时,表示结束该节点,需要同时更新其他负责人的完成状态 this.updateNodeFlowstateForPartner(curWfId, nodeInstance.getNode_template_id()); WORKFLOW_PARAMETER wfparam = new WORKFLOW_PARAMETER(); List workflowParameters = new ArrayList(); for (Map.Entry entry : param.entrySet()) { wfparam = wfparam.setPname(ConvertUtil.obj2Str(entry.getKey())) .setPvalue(ConvertUtil.obj2Str(entry.getValue())) .setWorkflowid(curWfId); workflowParameters.add(wfparam); } //调用当前节点结束时接口 this.callInterfaceForNodeEnd(nodeTemplate.getNode_end_interface(), wfInstance, nodeInstance, workflowParameters); //进入下一个节点,考虑并行和串行,以及阅知等节点类型 //如果是并行 if (Constants.WORKFLOW_TEMPLATE_NODE_FLOWTYPE_PARALLEL.equals(nodeTemplate.getFlowtype())) { Integer parallelType = nodeTemplate.getParalleltype(); Integer parallelScale = nodeTemplate.getParallelscale(); int total = this.getParallelNodeTotalCount(curWfId, nodeInstance.getNode_template_id()); int agree = this.getParallelNodePassCount(curWfId, nodeInstance.getNode_template_id()); int undisposed = this.getParallelNodeUndisposedCount(curWfId, nodeInstance.getNode_template_id()); //是否是最后一个并行节点 if (undisposed == 0) { if (Constants.WORKFLOW_PARALLEL_TYPE_ONE_AGREE.equals(parallelType)) { //是否有1个同意 if (agree >= 1) { //进入下一个节点 this.toNextNode(wfInstance, nodeInstance, param); } else { //整体不通过,关闭流程 this.closeWorkflow(curWfId, workflowParameters); } } else if (Constants.WORKFLOW_PARALLEL_TYPE_ALL_AGREE.equals(parallelType)) { //是否已全部同意 if (total == agree) { //进入下一个节点 this.toNextNode(wfInstance, nodeInstance, param); } else { //整体不通过,关闭流程 this.closeWorkflow(curWfId, workflowParameters); } } else if (Constants.WORKFLOW_PARALLEL_TYPE_SCALE_AGREE.equals(parallelType)) { //同意比例是否已达到 if (Math.abs(agree / total - parallelScale) <= 10) { //进入下一个节点 this.toNextNode(wfInstance, nodeInstance, param); } else { //整体不通过,关闭流程 this.closeWorkflow(curWfId, workflowParameters); } } } else { //进入其他并行节点 this.toNextParallelNode(curWfId, nodeInstance.getNode_template_id()); } } else { //串行 WORKFLOW_TEMPLATE_NODE nextNodeTemplate = this.getNextNodeTemplate(wfInstance.getWf_template_id(), nodeInstance.getNode_template_id()); if (nextNodeTemplate == null && Constants.WORKFLOW_NODE_DEAL_RESULT_PASS.equals(deal.getResult())) { //结束流程 this.finishWorkflow(curWfId, workflowParameters); } else if (nextNodeTemplate == null && Constants.WORKFLOW_NODE_DEAL_RESULT_NOPASS.equals(deal.getResult())) { //关闭流程 this.closeWorkflow(curWfId, workflowParameters); } else { //进入下个节点 this.toNextNode(wfInstance, nodeInstance, param); } } } @Override public void toNext(WorkflowDealEntity deal, List dutyers, Map param) { //保存指定的负责人 if (dutyers == null || dutyers.size() <= 0) { return; } WORKFLOW_BASE wfInstance = this.getWfInstance(deal.getWfInstanceId()); WORKFLOW_NODE nodeInstance = this.getNodeInstance(deal.getNodeInstanceId()); WORKFLOW_TEMPLATE_NODE nextTemplateNode = this.getNextNodeTemplate(wfInstance.getWf_template_id(), nodeInstance.getNode_template_id()); //先删除以前指定的负责人 SqlParameter sparam = new SqlParameter(); sparam.addValue("node_id", nextTemplateNode.getId()); sparam.addValue("flow_instance_id", deal.getWfInstanceId()); baseDao.execute("delete from workflow_template_node_user where node_id=:node_id and flow_instance_id=:flow_instance_id ", sparam); //插入新的 for (WorkflowDutyerEntity dutyer : dutyers) { new WORKFLOW_TEMPLATE_NODE_USER() // .setNode_id(nextTemplateNode.getId()) .setUser_id(dutyer.getDealId()) .setUser_name(StringUtil.isEmpty(dutyer.getDealName()) ? new GG_USER(dutyer.getDealId()).getInstanceById().getZsxm() : dutyer.getDealName()) .setIs_admin(dutyer.getIsAdmin()) // .setFlow_instance_id(deal.getWfInstanceId()) .insert(); } //进入下一个节点 this.toNext(deal, param); } @Override public void toNextByPartner(WorkflowDealEntity deal, Map param) { if (deal == null) { return; } String curWfId = deal.getWfInstanceId(); String curNodeId = deal.getNodeInstanceId(); //获取当前流程实例、流程模板 WORKFLOW_BASE wfInstance = this.getWfInstance(curWfId); WORKFLOW_TEMPLATE_BASE wfTemplate = this.getWfTemplate(wfInstance.getBusinesstype()); //获取当前节点实例、节点模板 WORKFLOW_NODE nodeInstance = this.getNodeInstance(curNodeId); WORKFLOW_TEMPLATE_NODE nodeTemplate = this.getNodeTemplate(nodeInstance.getNode_template_id()); //更新当前节点完成情况 nodeInstance = nodeInstance.setDeal_note(deal.getNote()) .setDeal_result(deal.getResult()) .setDealtime(DateUtil.getCurrentDate14()) .setFlow_type(!Constants.WORKFLOW_NODE_DEAL_RESULT_BACK.equals(deal.getResult()) ? Constants.WORKFLOW_NODE_FLOW_TYPE_NORMAL : Constants.WORKFLOW_NODE_FLOW_TYPE_BACK) .setId(deal.getNodeInstanceId()) .setFlowstate(Constants.WORKFLOW_NODE_FLOWSTATE_FINISH) //节点指定角色时,需要设置真正的处理人 .setCurrent_dealer_id(deal.getUserId()) .setCurrent_dealer_name(deal.getUserName()) .update(); WORKFLOW_PARAMETER wfparam = new WORKFLOW_PARAMETER(); List workflowParameters = new ArrayList(); for (Map.Entry entry : param.entrySet()) { wfparam = wfparam.setPname(ConvertUtil.obj2Str(entry.getKey())) .setPvalue(ConvertUtil.obj2Str(entry.getValue())) .setWorkflowid(curWfId); workflowParameters.add(wfparam); } //获取其他的参与者节点,取第一个 WORKFLOW_NODE nextNode = new WORKFLOW_NODE(); StringBuilder sql = new StringBuilder(); sql.append("select * "); sql.append("from workflow_node "); sql.append("where NODE_TEMPLATE_ID=:node_template_id and FLOWID=:flowid and FLOWSTATE=1 "); WORKFLOW_NODE paramBean = new WORKFLOW_NODE(); paramBean.setNode_template_id(nodeInstance.getNode_template_id()); paramBean.setFlowid(curWfId); List nextNodeList = baseDao.queryForList(sql.toString(), paramBean); if (nextNodeList != null && nextNodeList.size() > 0) { nextNode = nextNodeList.get(0); //更新流程实例当前节点 wfInstance = this.updateWfCurrentNode(nextNode); } } /** * 进入下个节点,如果下个节点是阅知节点,进入下下个节点 * * @param wfInstance * @param nodeInstance */ private void toNextNode(WORKFLOW_BASE wfInstance, WORKFLOW_NODE nodeInstance, Map param) { //当前流程实例编号 String curWfId = wfInstance.getId(); //流程参数 WORKFLOW_PARAMETER wfparam = new WORKFLOW_PARAMETER(); List workflowParameters = new ArrayList(); for (Map.Entry entry : param.entrySet()) { wfparam = wfparam.setPname(ConvertUtil.obj2Str(entry.getKey())) .setPvalue(ConvertUtil.obj2Str(entry.getValue())) .setWorkflowid(curWfId); workflowParameters.add(wfparam); } //下个节点模板 WORKFLOW_TEMPLATE_NODE nextNodeTemplate = this.getNextNodeTemplate(wfInstance.getWf_template_id(), nodeInstance.getNode_template_id()); if (nextNodeTemplate == null) { //结束流程 this.finishWorkflow(curWfId, workflowParameters); return; } //进入下个节点 List dutyerList = this.getNodeDutyer(nextNodeTemplate.getId(), null, wfInstance.getCreaterid(), wfInstance.getCreatername(), wfInstance.getId()); Integer flowType = nodeInstance.getDeal_result() - Constants.WORKFLOW_NODE_DEAL_RESULT_BACK == 0 ? Constants.WORKFLOW_NODE_FLOW_TYPE_BACK : Constants.WORKFLOW_NODE_FLOW_TYPE_NORMAL; WORKFLOW_NODE node = this.insertNodeInstance(wfInstance.getId(), flowType, nextNodeTemplate, dutyerList); //更新流程实例当前节点 wfInstance = this.updateWfCurrentNode(node); //调用节点进入时接口 this.callInterfaceForNodeStart(nextNodeTemplate.getNode_start_interface(), wfInstance, node, workflowParameters); if (Constants.WORKFLOW_TEMPLATE_NODE_NODETYPE_READ.equals(nextNodeTemplate.getNodetype())) { //阅知节点,继续寻找下个节点 nodeInstance = node; this.toNextNode(wfInstance, nodeInstance, param); } } /** * 获取其他并行节点 * * @return */ private List getParallelTemplateNodes( WORKFLOW_TEMPLATE_NODE nodeTemplate) { StringBuilder sql = new StringBuilder(); sql.append("select * "); sql.append("from workflow_template_node "); sql.append("where MAINFLOWTEMPID = :mainflowtempid "); WORKFLOW_TEMPLATE_NODE node = new WORKFLOW_TEMPLATE_NODE(); node.setMainflowtempid(nodeTemplate.getMainflowtempid()) .setOrdernumber(nodeTemplate.getOrdernumber()) .setId(nodeTemplate.getId()); //没有子流程时 if (StringUtil.isEmpty(nodeTemplate.getSubflowtempid())) { sql.append("and SUBFLOWTEMPID is null "); } else { sql.append("and SUBFLOWTEMPID = :subflowtempid "); node.setSubflowtempid(nodeTemplate.getSubflowtempid()); } sql.append("and ORDERNUMBER = :ordernumber "); sql.append("and ID <> :id "); sql.append("and USINGSTATE = 1 "); return baseDao.queryForList(sql.toString(), node); } /** * 进入其他并行节点 * * @param wfInstanceId * @param nodeTemplateId */ private void toNextParallelNode(String wfInstanceId, String nodeTemplateId) { //进入其他并行节点 WORKFLOW_NODE paraNode = this.getParallelNodeUndisposed(wfInstanceId, nodeTemplateId); //更新流程当前状态 new WORKFLOW_BASE().setCurrent_node_id(paraNode.getId()) .setCurrent_node_name(paraNode.getNodename()) .setDeal_type(paraNode.getDeal_type()) .setCurrent_deal_roleida(paraNode.getCurrent_deal_roleida()) .setCurrent_deal_rolename(paraNode.getCurrent_deal_rolename()) .setCurrent_dealer_id(paraNode.getCurrent_dealer_id()) .setCurrent_dealer_name(paraNode.getCurrent_dealer_name()) .setId(wfInstanceId) .update(); } /** * 结束流程 * * @param wfInstanceId */ private void finishWorkflow(String wfInstanceId, List workflowParameters) { //结束流程 WORKFLOW_BASE wfInstance = new WORKFLOW_BASE().setEndtime(DateUtil.getCurrentDate14()) .setWfstate(Constants.WORKFLOW_BASE_WFSTATE_FINISH) .setId(wfInstanceId) .setEndtime(DateUtil.getCurrentDate14()) .setCurrent_node_id("") .setCurrent_node_name("") .setCurrent_deal_roleida("") .setCurrent_deal_rolename("") .setCurrent_dealer_id("") .setCurrent_dealer_name("") .update(); //写入待评价工单 wfInstance = new WORKFLOW_BASE().setId(wfInstanceId).queryForBean(); /*if (wfInstance != null) { CUSTOMER_SATIS_INFO satis = new CUSTOMER_SATIS_INFO().setBusiness_id(wfInstanceId) .setCode(billReportCodeService.getCustomerSatisCode(wfInstance.getPartner_id())) .setPartner_id(wfInstance.getPartner_id()) .setCustomer_id(wfInstance.getCustomer_id()) .setCustomer_name(wfInstance.getCustomer_name()) .setPlan_invest_time(DateUtil.getCurrentDate8()) .setState(Constants.CUSTOMER_SATIS_INFO_STATE_WDC) .insert(); String sql = "SELECT ID,NAME FROM CUSTOMER_SATIS_CONFIG WHERE LEVEL = 1 AND SATIS_TYPE = 1 AND STATE = 1 AND PARTNER_ID = :partner_id "; List list = baseDao.queryForList(sql, new SqlParameter("partner_id",wfInstance.getPartner_id())); List paramList = new ArrayList(); if(list.size()>0){ for(Map map:list){ SqlParameter param = new SqlParameter(); param.addValue("id", StringUtil.getUUID()); param.addValue("bussinessid", satis.getId()); param.addValue("configid", map.get("ID")); param.addValue("configname", map.get("NAME")); paramList.add(param); } String detailsql = "INSERT INTO CUSTOMER_SATIS_INFO_DETAIL(ID,BUSSINESSID,CONFIGID,CONFIGNAME) VALUES(:id,:bussinessid,:configid,:configname)"; baseDao.executeBatch(detailsql, paramList); } }*/ //调用流程结束接口 wfInstance = new WORKFLOW_BASE(wfInstanceId).getInstanceById(); WORKFLOW_TEMPLATE_BASE wfTemplate = this.getWfTemplate(wfInstance.getBusinesstype()); this.callInterfaceForWorkflowEnd(wfTemplate.getWf_end_interface(), wfInstance, workflowParameters); } /** * 关闭流程 * * @param wfInstanceId */ private void closeWorkflow(String wfInstanceId, List workflowParameters) { //关闭流程 WORKFLOW_BASE wfInstance = new WORKFLOW_BASE().setEndtime(DateUtil.getCurrentDate14()) .setWfstate(Constants.WORKFLOW_BASE_WFSTATE_CLOSE) .setId(wfInstanceId) .update(); } /** * 插入新的节点实例,有多个负责人时,取插入的第一个节点作为当前节点 * * @param wfInstanceId * @param flowType * @param tnode * @return */ private WORKFLOW_NODE insertNodeInstance(String wfInstanceId, Integer flowType, WORKFLOW_TEMPLATE_NODE tnode, List dutyerList) { if (dutyerList == null || dutyerList.size() <= 0) { return null; } List resultList = new ArrayList(); for (WorkflowDutyerEntity dutyer : dutyerList) { WORKFLOW_NODE node = new WORKFLOW_NODE() .setFlowid(wfInstanceId) .setCreatetime(DateUtil.getCurrentDate14()) .setFlow_type(flowType) .setFlowstate(Constants.WORKFLOW_NODE_FLOWSTATE_UNDISPOSE) .setNode_template_id(tnode.getId()) .setNodename(tnode.getNodename()) .setDeal_type(null); if (Constants.WORKFLOW_TEMPLATE_NODE_DEALER_TYPE_USER == 0 || Constants.WORKFLOW_TEMPLATE_NODE_DEALER_TYPE_ASSIGN == 0 || Constants.WORKFLOW_TEMPLATE_NODE_DEALER_TYPE_START == 0) { node.setCurrent_dealer_id(dutyer.getDealId()) .setCurrent_dealer_name(dutyer.getDealName()); } node = node.insert(); resultList.add(node); } return resultList.size() > 0 ? resultList.get(0) : null; } /** * 更新流程实例当前节点 * * @param nodeInstance * @return */ private WORKFLOW_BASE updateWfCurrentNode(WORKFLOW_NODE nodeInstance) { if (nodeInstance == null) { return null; } WORKFLOW_BASE wf = new WORKFLOW_BASE(nodeInstance.getFlowid()) .setCurrent_node_id(nodeInstance.getId()) .setCurrent_node_name(nodeInstance.getNodename()) .setDeal_type(nodeInstance.getDeal_type()) .setCurrent_deal_roleida(nodeInstance.getCurrent_deal_roleida()) .setCurrent_deal_rolename(nodeInstance.getCurrent_deal_rolename()) .setCurrent_dealer_id(nodeInstance.getCurrent_dealer_id()) .setCurrent_dealer_name(nodeInstance.getCurrent_dealer_name()) .update(); return wf.getInstanceById(); } /** * 根据业务类型,获取流程模板 * * @param businessType * @return */ private WORKFLOW_TEMPLATE_BASE getWfTemplate(Integer businessType) { StringBuilder sql = new StringBuilder(); sql.append("select * "); sql.append("from workflow_template_base "); sql.append("where BUSINESSTYPE = :businesstype "); sql.append("and ACTIVESTATE = 1 "); SqlParameter param = new SqlParameter(); param.addValue("businesstype", businessType); return baseDao.queryForBean(sql.toString(), param, new WORKFLOW_TEMPLATE_BASE()); } /** * 获取主流程模板下第一个节点 * * @param workflowId * @return */ private WORKFLOW_TEMPLATE_NODE getMainTemplateFirstNode(String workflowId) { StringBuilder sql = new StringBuilder(); sql.append("select * "); sql.append("from workflow_template_node "); sql.append("where MAINFLOWTEMPID = :mainflowtempid "); sql.append("and USINGSTATE = 1 "); sql.append("order by ORDERNUMBER "); sql.append("limit 0,1 "); SqlParameter param = new SqlParameter(); param.addValue("mainflowtempid", workflowId); return baseDao.queryForBean(sql.toString(), param, new WORKFLOW_TEMPLATE_NODE()); } /** * 获取子流程下所有节点 * * @param workflowId * @return */ private List getNodeTemplateSub(String workflowId) { StringBuilder sql = new StringBuilder(); sql.append("select * "); sql.append("from workflow_template_node "); sql.append("where SUBFLOWTEMPID = :subflowtempid "); sql.append("and USINGSTATE = 1 "); sql.append("order by ORDERNUMBER "); WORKFLOW_TEMPLATE_NODE node = new WORKFLOW_TEMPLATE_NODE(); node.setSubflowtempid(workflowId); return baseDao.queryForList(sql.toString(), node); } /** * 获取节点负责人 * * @param nodeId * @return */ private List getNodeTemplateUser(String nodeId) { StringBuilder sql = new StringBuilder(); sql.append("select * "); sql.append("from workflow_template_node_user "); sql.append("where NODE_ID=:node_id "); WORKFLOW_TEMPLATE_NODE_USER user = new WORKFLOW_TEMPLATE_NODE_USER(); //user.setNode_id(nodeId); return baseDao.queryForList(sql.toString(), user); } /** * 获取节点负责人,流程上个环节指定责任人时 * * @param nodeId * @return */ private List getNodeTemplateUser(String nodeId, String workflowInstanceId) { StringBuilder sql = new StringBuilder(); sql.append("select * "); sql.append("from workflow_template_node_user "); sql.append("where NODE_ID=:node_id and FLOW_INSTANCE_ID=:flow_instance_id "); WORKFLOW_TEMPLATE_NODE_USER user = new WORKFLOW_TEMPLATE_NODE_USER(); //user.setNode_id(nodeId); // user.setFlow_instance_id(workflowInstanceId); return baseDao.queryForList(sql.toString(), user); } /** * 获取节点负责角色 * * @param nodeId * @return */ private List getNodeTemplateRole(String nodeId) { StringBuilder sql = new StringBuilder(); sql.append("select * "); sql.append("from workflow_template_node_dealrore "); sql.append("where NODE_ID=:node_id "); WORKFLOW_TEMPLATE_NODE_DEALRORE role = new WORKFLOW_TEMPLATE_NODE_DEALRORE(); //role.setNode_id(nodeId); return baseDao.queryForList(sql.toString(), role); } /** * 获取节点负责人,包括人员、角色 * * @param temNodeId * @param dealerType * @return */ private List getNodeDutyer(String temNodeId, Integer dealerType, String createrId, String createrName, String workflowInstanceId) { List dutyerList = null; if (Constants.WORKFLOW_TEMPLATE_NODE_DEALER_TYPE_USER - dealerType == 0) { List userList = this.getNodeTemplateUser(temNodeId); if (userList == null || userList.size() <= 0) { return null; } dutyerList = new ArrayList(); for (WORKFLOW_TEMPLATE_NODE_USER user : userList) { WorkflowDutyerEntity dutyer = new WorkflowDutyerEntity(dealerType, user.getUser_id(), user.getUser_name(), user.getIs_admin()); dutyerList.add(dutyer); } } else if (Constants.WORKFLOW_TEMPLATE_NODE_DEALER_TYPE_ASSIGN - dealerType == 0) { List userList = this.getNodeTemplateUser(temNodeId, workflowInstanceId); if (userList == null || userList.size() <= 0) { return null; } dutyerList = new ArrayList(); for (WORKFLOW_TEMPLATE_NODE_USER user : userList) { WorkflowDutyerEntity dutyer = new WorkflowDutyerEntity(dealerType, user.getUser_id(), user.getUser_name(), user.getIs_admin()); dutyerList.add(dutyer); } } else if (Constants.WORKFLOW_TEMPLATE_NODE_DEALER_TYPE_ROLE - dealerType == 0) { List roleList = this.getNodeTemplateRole(temNodeId); if (roleList == null || roleList.size() <= 0) { return null; } dutyerList = new ArrayList(); for (WORKFLOW_TEMPLATE_NODE_DEALRORE role : roleList) { WorkflowDutyerEntity dutyer = new WorkflowDutyerEntity(dealerType, role.getRole_id(), role.getRole_name(), 0); dutyerList.add(dutyer); } } else if (Constants.WORKFLOW_TEMPLATE_NODE_DEALER_TYPE_START - dealerType == 0) { dutyerList = new ArrayList(); WorkflowDutyerEntity dutyer = new WorkflowDutyerEntity(Constants.WORKFLOW_TEMPLATE_NODE_DEALER_TYPE_START, createrId, createrName, 0); dutyerList.add(dutyer); } return dutyerList; } /** * 调用流程启动时接口 */ private void callInterfaceForWorkflowStart(String classFullName, WORKFLOW_BASE workflowInstance, List workflowParameters) { if (StringUtil.isEmpty(classFullName)) { return; } //根据类名全路径,反射 Class demo = null; try { demo = Class.forName(classFullName); } catch (Exception e) { e.printStackTrace(); } if (demo == null) { return; } //调用流程接口 Class intes[] = demo.getInterfaces(); //执行接口 for (int i = 0; i < intes.length; i++) { if ("cn.ksource.core.workflow.WorkflowDeal".equals(intes[i].getName())) { try { Method method = intes[i].getMethod("onWorkflowStart", WORKFLOW_BASE.class, List.class); method.invoke(demo.newInstance(), workflowInstance, workflowParameters); } catch (Exception e) { e.printStackTrace(); } break; } } } /** * 调用流程结束时接口 */ private void callInterfaceForWorkflowEnd(String classFullName, WORKFLOW_BASE workflowInstance, List workflowParameters) { if (StringUtil.isEmpty(classFullName)) { return; } //根据类名全路径,反射 Class demo = null; try { demo = Class.forName(classFullName); } catch (Exception e) { e.printStackTrace(); } if (demo == null) { return; } //调用流程接口 Class intes[] = demo.getInterfaces(); //执行接口 for (int i = 0; i < intes.length; i++) { if ("cn.ksource.core.workflow.WorkflowDeal".equals(intes[i].getName())) { try { Method method = intes[i].getMethod("onWorkflowEnd", WORKFLOW_BASE.class, List.class, BaseDao.class); method.invoke(demo.newInstance(), workflowInstance, workflowParameters, baseDao); } catch (Exception e) { e.printStackTrace(); } break; } } } /** * 调用节点进入时接口 */ private void callInterfaceForNodeStart(String classFullName, WORKFLOW_BASE workflowInstance, WORKFLOW_NODE nodeInstance, List workflowParameters) { if (StringUtil.isEmpty(classFullName)) { return; } //根据类名全路径,反射 Class demo = null; try { demo = Class.forName(classFullName); } catch (Exception e) { e.printStackTrace(); } if (demo == null) { return; } //调用流程接口 Class intes[] = demo.getInterfaces(); //执行接口 for (int i = 0; i < intes.length; i++) { if ("cn.ksource.core.workflow.WorkflowNodeDeal".equals(intes[i].getName())) { try { Method method = intes[i].getMethod("onNodeStart", WORKFLOW_BASE.class, WORKFLOW_NODE.class, List.class); method.invoke(demo.newInstance(), workflowInstance, nodeInstance, workflowParameters); } catch (Exception e) { e.printStackTrace(); } break; } } } /** * 调用节点结束时接口 */ private void callInterfaceForNodeEnd(String classFullName, WORKFLOW_BASE workflowInstance, WORKFLOW_NODE nodeInstance, List workflowParameters) { if (StringUtil.isEmpty(classFullName)) { return; } //根据类名全路径,反射 Class demo = null; try { demo = Class.forName(classFullName); } catch (Exception e) { e.printStackTrace(); } if (demo == null) { return; } //调用流程接口 Class intes[] = demo.getInterfaces(); //执行接口 for (int i = 0; i < intes.length; i++) { if ("cn.ksource.core.workflow.WorkflowNodeDeal".equals(intes[i].getName())) { try { Method method = intes[i].getMethod("onNodeEnd", WORKFLOW_BASE.class, WORKFLOW_NODE.class, List.class); method.invoke(demo.newInstance(), workflowInstance, nodeInstance, workflowParameters); } catch (Exception e) { e.printStackTrace(); } break; } } } /** * 获取流程实例 * * @param wfInstanceId * @return */ private WORKFLOW_BASE getWfInstance(String wfInstanceId) { StringBuilder sql = new StringBuilder(); sql.append("select * "); sql.append("from workflow_base "); sql.append("where ID = :id "); SqlParameter param = new SqlParameter(); param.addValue("id", wfInstanceId); return baseDao.queryForBean(sql.toString(), param, new WORKFLOW_BASE()); } /** * 获取流程节点实例 * * @param nodeInstanceId * @return */ private WORKFLOW_NODE getNodeInstance(String nodeInstanceId) { StringBuilder sql = new StringBuilder(); sql.append("select * "); sql.append("from workflow_node "); sql.append("where ID = :id "); SqlParameter param = new SqlParameter(); param.addValue("id", nodeInstanceId); return baseDao.queryForBean(sql.toString(), param, new WORKFLOW_NODE()); } /** * 获取流程节点模板 * * @param nodeTemplateId * @return */ private WORKFLOW_TEMPLATE_NODE getNodeTemplate(String nodeTemplateId) { StringBuilder sql = new StringBuilder(); sql.append("select * "); sql.append("from workflow_template_node "); sql.append("where ID = :id "); SqlParameter param = new SqlParameter(); param.addValue("id", nodeTemplateId); return baseDao.queryForBean(sql.toString(), param, new WORKFLOW_TEMPLATE_NODE()); } /** * 获取下个节点模板 * * @param wfTemplateId * @param nodeTemplateId * @return */ private WORKFLOW_TEMPLATE_NODE getNextNodeTemplate(String wfTemplateId, String nodeTemplateId) { StringBuilder sql = new StringBuilder(); sql.append("select tn.* "); sql.append("from workflow_template_node tn "); sql.append("where tn.MAINFLOWTEMPID=:mainflowtempid "); sql.append("and tn.ORDERNUMBER > (select ORDERNUMBER from workflow_template_node where id=:id) "); sql.append("and USINGSTATE=1 "); sql.append("order by ORDERNUMBER "); sql.append("limit 0,1 "); SqlParameter param = new SqlParameter(); param.addValue("mainflowtempid", wfTemplateId); param.addValue("id", nodeTemplateId); return baseDao.queryForBean(sql.toString(), param, new WORKFLOW_TEMPLATE_NODE()); } /** * 获取最后一个节点模板(结束节点) * * @param wfTemplateId * @return */ private WORKFLOW_TEMPLATE_NODE getLastNodeTemplate(String wfTemplateId) { StringBuilder sql = new StringBuilder(); sql.append("select tn.* "); sql.append("from workflow_template_node tn "); sql.append("where tn.MAINFLOWTEMPID=:mainflowtempid "); sql.append("and tn.NODETYPE=2 "); sql.append("and USINGSTATE=1 "); SqlParameter param = new SqlParameter(); param.addValue("mainflowtempid", wfTemplateId); return baseDao.queryForBean(sql.toString(), param, new WORKFLOW_TEMPLATE_NODE()); } /** * 获取回退到的节点模板 * * @param nodeTemplateId * @return */ private WORKFLOW_TEMPLATE_NODE getBackNodeTemplate(String nodeTemplateId) { StringBuilder sql = new StringBuilder(); sql.append("select tn.* "); sql.append("from workflow_template_node tn "); sql.append("where exists(select ROLEBACKNODEID from workflow_roleback_node where NODETEMPLEID=:nodetempid and tn.ID=ROLEBACKNODEID) "); SqlParameter param = new SqlParameter(); param.addValue("nodetempid", nodeTemplateId); return baseDao.queryForBean(sql.toString(), param, new WORKFLOW_TEMPLATE_NODE()); } /** * 并行节点处理中,未处理的数量 * * @param wfInstanceId * @param nodeTemplateId * @return */ private int getParallelNodeUndisposedCount(String wfInstanceId, String nodeTemplateId) { StringBuilder sql = new StringBuilder(); sql = new StringBuilder(); sql.append("select count(n.ID) "); sql.append("from workflow_node n "); sql.append("where n.FLOWSTATE<>3 "); sql.append("and n.FLOWID=:flowid "); sql.append("and n.NODE_TEMPLATE_ID=:node_template_id "); SqlParameter param = new SqlParameter(); param.addValue("flowid", wfInstanceId); param.addValue("node_template_id", nodeTemplateId); Integer count = baseDao.queryForInteger(sql.toString(), param); return count == null ? 0 : count; } /** * 并行节点处理中,通过的数量 * * @param wfInstanceId * @return */ private int getParallelNodePassCount(String wfInstanceId, String nodeTemplateId) { StringBuilder sql = new StringBuilder(); sql = new StringBuilder(); sql.append("select count(n.ID) "); sql.append("from workflow_node n "); sql.append("where n.FLOWSTATE=3 "); sql.append("and n.DEAL_RESULT=1 "); sql.append("and n.FLOWID=:flowid "); sql.append("and n.NODE_TEMPLATE_ID=:node_template_id "); SqlParameter param = new SqlParameter(); param.addValue("flowid", wfInstanceId); param.addValue("node_template_id", nodeTemplateId); Integer count = baseDao.queryForInteger(sql.toString(), param); return count == null ? 0 : count; } /** * 并行节点处理中,总共需要处理的数量 * * @param wfInstanceId * @param nodeTemplateId * @return */ private int getParallelNodeTotalCount(String wfInstanceId, String nodeTemplateId) { StringBuilder sql = new StringBuilder(); sql = new StringBuilder(); sql.append("select count(n.ID) "); sql.append("from workflow_node n "); sql.append("where n.FLOWID=:flowid "); sql.append("and n.NODE_TEMPLATE_ID=:node_template_id "); SqlParameter param = new SqlParameter(); param.addValue("flowid", wfInstanceId); param.addValue("node_template_id", nodeTemplateId); Integer count = baseDao.queryForInteger(sql.toString(), param); return count == null ? 0 : count; } /** * 获取第一个未处理的并行节点 * * @param wfInstanceId * @param nodeTemplateId * @return */ private WORKFLOW_NODE getParallelNodeUndisposed(String wfInstanceId, String nodeTemplateId) { StringBuilder sql = new StringBuilder(); sql = new StringBuilder(); sql.append("select n.* "); sql.append("from workflow_node n "); sql.append("where n.FLOWSTATE=1 "); sql.append("and n.FLOWID=:flowid "); sql.append("and n.NODE_TEMPLATE_ID=:node_template_id "); sql.append("limit 0,1 "); SqlParameter param = new SqlParameter(); param.addValue("mainflowid", wfInstanceId); param.addValue("node_template_id", nodeTemplateId); return baseDao.queryForBean(sql.toString(), param, new WORKFLOW_NODE()); } /** * 保存用户设备涉及工单信息 * * @param wfInstanceId * @param customerId * @param ciIds */ private void insertWorkflowUserCmdb(String wfInstanceId, String customerId, List ciIds) { //设备工单 if (ciIds != null && ciIds.size() > 0) { for (Map map : ciIds) { new WORKFLOW_USER_CMDB().setUser_id(customerId) .setCi_id(ConvertUtil.obj2StrBlank(map.get("CI_ID"))) .setWf_id(wfInstanceId) .setType(Constants.WORKFLOW_USER_CMDB_TYPE_CI) .insert(); } } else { //用户工单 new WORKFLOW_USER_CMDB().setUser_id(customerId) .setWf_id(wfInstanceId) .setType(Constants.WORKFLOW_USER_CMDB_TYPE_USER) .insert(); } return; } @Override public void handCloseWorkflow(WorkflowDealEntity deal, Map param) { if (deal == null) { return; } String curWfId = deal.getWfInstanceId(); String curNodeId = deal.getNodeInstanceId(); //获取当前流程实例 WORKFLOW_BASE wfInstance = this.getWfInstance(curWfId); //获取当前节点实例、节点模板 WORKFLOW_NODE nodeInstance = this.getNodeInstance(curNodeId); WORKFLOW_TEMPLATE_NODE nodeTemplate = this.getNodeTemplate(nodeInstance.getNode_template_id()); //更新当前节点完成情况 nodeInstance = nodeInstance.setDeal_note(deal.getNote()) .setDeal_result(deal.getResult()) .setDealtime(DateUtil.getCurrentDate14()) .setFlow_type(!Constants.WORKFLOW_NODE_DEAL_RESULT_BACK.equals(deal.getResult()) ? Constants.WORKFLOW_NODE_FLOW_TYPE_NORMAL : Constants.WORKFLOW_NODE_FLOW_TYPE_BACK) .setId(deal.getNodeInstanceId()) .setFlowstate(Constants.WORKFLOW_NODE_FLOWSTATE_FINISH) .update(); //主要负责人更新当前节点完成情况时,表示结束该节点,需要同时更新其他负责人的完成状态 if (isAdminWorkflowNode(curWfId, curNodeId, deal.getUserId())) { this.updateNodeFlowstateForPartner(curWfId, nodeInstance.getNode_template_id()); } WORKFLOW_PARAMETER wfparam = new WORKFLOW_PARAMETER(); List workflowParameters = new ArrayList(); for (Map.Entry entry : param.entrySet()) { wfparam = wfparam.setPname(ConvertUtil.obj2Str(entry.getKey())) .setPvalue(ConvertUtil.obj2Str(entry.getValue())) .setWorkflowid(curWfId); workflowParameters.add(wfparam); } //调用当前节点结束时接口 this.callInterfaceForNodeEnd(nodeTemplate.getNode_end_interface(), wfInstance, nodeInstance, workflowParameters); //关闭流程 this.closeWorkflow(curWfId, workflowParameters); } @Override public void handFinishWorkflow(WorkflowDealEntity deal, Map param) { if (deal == null) { return; } String curWfId = deal.getWfInstanceId(); String curNodeId = deal.getNodeInstanceId(); //获取当前流程实例 WORKFLOW_BASE wfInstance = this.getWfInstance(curWfId); //获取当前节点实例、节点模板 WORKFLOW_NODE nodeInstance = this.getNodeInstance(curNodeId); WORKFLOW_TEMPLATE_NODE nodeTemplate = this.getNodeTemplate(nodeInstance.getNode_template_id()); //更新当前节点完成情况 nodeInstance = nodeInstance.setDeal_note(deal.getNote()) .setDeal_result(deal.getResult()) .setDealtime(DateUtil.getCurrentDate14()) .setFlow_type(!Constants.WORKFLOW_NODE_DEAL_RESULT_BACK.equals(deal.getResult()) ? Constants.WORKFLOW_NODE_FLOW_TYPE_NORMAL : Constants.WORKFLOW_NODE_FLOW_TYPE_BACK) .setId(deal.getNodeInstanceId()) .setFlowstate(Constants.WORKFLOW_NODE_FLOWSTATE_FINISH) //节点指定角色时,需要设置真正的处理人 .setCurrent_dealer_id(deal.getUserId()) .setCurrent_dealer_name(deal.getUserName()) .update(); //主要负责人更新当前节点完成情况时,表示结束该节点,需要同时更新其他负责人的完成状态 if (isAdminWorkflowNode(curWfId, curNodeId, deal.getUserId())) { this.updateNodeFlowstateForPartner(curWfId, nodeInstance.getNode_template_id()); } WORKFLOW_PARAMETER wfparam = new WORKFLOW_PARAMETER(); List workflowParameters = new ArrayList(); for (Map.Entry entry : param.entrySet()) { wfparam = wfparam.setPname(ConvertUtil.obj2Str(entry.getKey())) .setPvalue(ConvertUtil.obj2Str(entry.getValue())) .setWorkflowid(curWfId); workflowParameters.add(wfparam); } //调用当前节点结束时接口 this.callInterfaceForNodeEnd(nodeTemplate.getNode_end_interface(), wfInstance, nodeInstance, workflowParameters); //结束流程 this.finishWorkflow(curWfId, workflowParameters); } /** * 更新非主要负责人的节点完成状态 * * @param flowInstanceId */ private void updateNodeFlowstateForPartner(String flowInstanceId, String nodeTemplateId) { String sql = "update workflow_node set FLOWSTATE=3 where FLOWID=:flowid and NODE_TEMPLATE_ID=:node_template_id and FLOWSTATE<>3 "; SqlParameter param = new SqlParameter(); param.addValue("flowid", flowInstanceId); param.addValue("node_template_id", nodeTemplateId); baseDao.execute(sql, param); } @Override public void toLast(WorkflowDealEntity deal, Map param) { if (deal == null) { return; } String curWfId = deal.getWfInstanceId(); String curNodeId = deal.getNodeInstanceId(); //获取当前流程实例 WORKFLOW_BASE wfInstance = this.getWfInstance(curWfId); //获取当前节点实例、节点模板 WORKFLOW_NODE nodeInstance = this.getNodeInstance(curNodeId); //流程参数 WORKFLOW_PARAMETER wfparam = new WORKFLOW_PARAMETER(); List workflowParameters = new ArrayList(); for (Map.Entry entry : param.entrySet()) { wfparam = wfparam.setPname(ConvertUtil.obj2Str(entry.getKey())) .setPvalue(ConvertUtil.obj2Str(entry.getValue())) .setWorkflowid(curWfId); workflowParameters.add(wfparam); } //最后一个节点模板 WORKFLOW_TEMPLATE_NODE lastNodeTemplate = this.getLastNodeTemplate(wfInstance.getWf_template_id()); //进入最后一个节点 List dutyerList = this.getNodeDutyer(lastNodeTemplate.getId(), null, wfInstance.getCreaterid(), wfInstance.getCreatername(), wfInstance.getId()); WORKFLOW_NODE node = this.insertNodeInstance(wfInstance.getId(), nodeInstance.getFlow_type(), lastNodeTemplate, dutyerList); //更新流程实例当前节点 wfInstance = this.updateWfCurrentNode(node); //调用节点进入时接口 this.callInterfaceForNodeStart(lastNodeTemplate.getNode_start_interface(), wfInstance, node, workflowParameters); } /** * 判断是否是主要负责人 * * @param flowId * @param nodeId * @param userId * @return */ private boolean isAdminWorkflowNode(String flowId, String nodeId, String userId) { StringBuilder sql = new StringBuilder(); sql.append("select count(u.ID) "); sql.append("from workflow_template_node_user u "); sql.append("where u.NODE_ID=(select NODE_TEMPLATE_ID from workflow_node where ID=:id) "); sql.append("and u.USER_ID=:user_id "); sql.append("and u.IS_ADMIN=1 "); sql.append("and u.FLOW_INSTANCE_ID=:flow_instance_id "); SqlParameter param = new SqlParameter(); param.addValue("id", nodeId); param.addValue("user_id", userId); param.addValue("flow_instance_id", flowId); return baseDao.queryForInteger(sql.toString(), param) > 0 ? true : false; } @Override public void toNode(int nodeNum, WorkflowDealEntity deal, List dutyers, Map param) { if (deal == null) { return; } if (dutyers == null || dutyers.size() <= 0) { return; } String curWfId = deal.getWfInstanceId(); String curNodeId = deal.getNodeInstanceId(); //获取当前流程实例 WORKFLOW_BASE wfInstance = this.getWfInstance(curWfId); //获取当前节点实例、节点模板 WORKFLOW_NODE nodeInstance = this.getNodeInstance(curNodeId); //流程参数 WORKFLOW_PARAMETER wfparam = new WORKFLOW_PARAMETER(); List workflowParameters = new ArrayList(); for (Map.Entry entry : param.entrySet()) { wfparam = wfparam.setPname(ConvertUtil.obj2Str(entry.getKey())) .setPvalue(ConvertUtil.obj2Str(entry.getValue())) .setWorkflowid(curWfId); workflowParameters.add(wfparam); } //指定节点模板 WORKFLOW_TEMPLATE_NODE nodeTemplate = this.getNodeTemplate(wfInstance.getWf_template_id(), nodeNum); //先删除以前指定的负责人 SqlParameter sparam = new SqlParameter(); sparam.addValue("node_id", nodeTemplate.getId()); sparam.addValue("flow_instance_id", deal.getWfInstanceId()); baseDao.execute("delete from workflow_template_node_user where node_id=:node_id and flow_instance_id=:flow_instance_id ", sparam); //插入新的 for (WorkflowDutyerEntity dutyer : dutyers) { new WORKFLOW_TEMPLATE_NODE_USER() //.setNode_id(nodeTemplate.getId()) .setUser_id(dutyer.getDealId()) .setUser_name(StringUtil.isEmpty(dutyer.getDealName()) ? new GG_USER(dutyer.getDealId()).getInstanceById().getZsxm() : dutyer.getDealName()) .setIs_admin(dutyer.getIsAdmin()) // .setFlow_instance_id(deal.getWfInstanceId()) .insert(); } //进入指定节点 List dutyerList = this.getNodeDutyer(nodeTemplate.getId(), null, wfInstance.getCreaterid(), wfInstance.getCreatername(), wfInstance.getId()); WORKFLOW_NODE node = this.insertNodeInstance(wfInstance.getId(), nodeInstance.getFlow_type(), nodeTemplate, dutyerList); //更新流程实例当前节点 wfInstance = this.updateWfCurrentNode(node); //调用节点进入时接口 this.callInterfaceForNodeStart(nodeTemplate.getNode_start_interface(), wfInstance, node, workflowParameters); } private WORKFLOW_TEMPLATE_NODE getNodeTemplate(String wf_template_id, int nodeNum) { StringBuilder sql = new StringBuilder(); sql.append("select tn.* "); sql.append("from workflow_template_node tn "); sql.append("where tn.MAINFLOWTEMPID=:mainflowtempid "); sql.append("and tn.USINGSTATE=1 "); sql.append("order by tn.ORDERNUMBER "); sql.append("limit :limit,1 "); SqlParameter param = new SqlParameter(); param.addValue("mainflowtempid", wf_template_id); param.addValue("limit", nodeNum - 1); return baseDao.queryForBean(sql.toString(), param, new WORKFLOW_TEMPLATE_NODE()); } @Override public void handDeleteWorkflow(WorkflowDealEntity deal, Map param) { if (deal == null) { return; } String curWfId = deal.getWfInstanceId(); String curNodeId = deal.getNodeInstanceId(); //获取当前流程实例 WORKFLOW_BASE wfInstance = this.getWfInstance(curWfId); //获取当前节点实例、节点模板 WORKFLOW_NODE nodeInstance = this.getNodeInstance(curNodeId); WORKFLOW_TEMPLATE_NODE nodeTemplate = this.getNodeTemplate(nodeInstance.getNode_template_id()); //更新当前节点完成情况 nodeInstance = nodeInstance.setDeal_note(deal.getNote()) .setDeal_result(deal.getResult()) .setDealtime(DateUtil.getCurrentDate14()) .setFlow_type(!Constants.WORKFLOW_NODE_DEAL_RESULT_BACK.equals(deal.getResult()) ? Constants.WORKFLOW_NODE_FLOW_TYPE_NORMAL : Constants.WORKFLOW_NODE_FLOW_TYPE_BACK) .setId(deal.getNodeInstanceId()) .setFlowstate(Constants.WORKFLOW_NODE_FLOWSTATE_FINISH) .update(); //主要负责人更新当前节点完成情况时,表示结束该节点,需要同时更新其他负责人的完成状态 if (isAdminWorkflowNode(curWfId, curNodeId, deal.getUserId())) { this.updateNodeFlowstateForPartner(curWfId, nodeInstance.getNode_template_id()); } WORKFLOW_PARAMETER wfparam = new WORKFLOW_PARAMETER(); List workflowParameters = new ArrayList(); for (Map.Entry entry : param.entrySet()) { wfparam = wfparam.setPname(ConvertUtil.obj2Str(entry.getKey())) .setPvalue(ConvertUtil.obj2Str(entry.getValue())) .setWorkflowid(curWfId); workflowParameters.add(wfparam); } //调用当前节点结束时接口 this.callInterfaceForNodeEnd(nodeTemplate.getNode_end_interface(), wfInstance, nodeInstance, workflowParameters); //逻辑删除流程 wfInstance.setWfstate(Constants.WORKFLOW_BASE_WFSTATE_DELETE) .setCurrent_dealer_id(deal.getUserId()) .setCurrent_dealer_name(deal.getUserName()) .setEndtime(DateUtil.getCurrentDate14()) .update(); } @Override public boolean isCanToNextNode(WORKFLOW_BASE base, WORKFLOW_NODE node) { //检查有没有同环节的节点还没有结束 //如果没有同环节的节点,那么该环节可以结束 //如果有同环节的节点,其他所有节点都已经结束,那么该节点也可以结束 // 其他有节点没有结束,则检查该环节是否为主要负责人,如果不是主要负责人,那么该环节可以结束,如果为主要负责人,该环节不可以结束 List nodeList = baseDao.queryForList("select * from WORKFLOW_NODE where FLOWID=:FLOWID and NODE_TEMPLATE_ID=:NODE_TEMPLATE_ID and FLOWSTATE <> 3 and ID <> :NODEID", new SqlParameter("FLOWID", base.getId()).addValue("NODEID", node.getId()).addValue("NODE_TEMPLATE_ID", node.getNode_template_id())); //如果存在其他环节,且当前环节是主负责人,不可以关闭 if (nodeList.size() > 0 && "1".equals(ConvertUtil.obj2Str(node.getIs_admin()))) { return false; } return true; } }