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<Map> 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<Map> 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<Map> ryList = new ArrayList<Map>();
|
for (Map map : list) {
|
ryList.add(map);
|
}
|
entity.setDealerList(ryList);
|
}
|
} else if (entity.getDealer_type() == 4) {
|
List<Map> list = new ArrayList<Map>();
|
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<Map> 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<Map> 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<String, Object> 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<String, Object> 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<WORKFLOW_PARAMETER> workflowParameters = new ArrayList<WORKFLOW_PARAMETER>();
|
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<String, Object> 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<WorkflowDutyerEntity> 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<WORKFLOW_PARAMETER> workflowParameters = new ArrayList<WORKFLOW_PARAMETER>();
|
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<String, Object> 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<WORKFLOW_PARAMETER> workflowParameters = new ArrayList<WORKFLOW_PARAMETER>();
|
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<WorkflowDutyerEntity> dutyers, Map<String, Object> 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<String, Object> 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<WORKFLOW_PARAMETER> workflowParameters = new ArrayList<WORKFLOW_PARAMETER>();
|
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<WORKFLOW_NODE> 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<String, Object> param) {
|
//当前流程实例编号
|
String curWfId = wfInstance.getId();
|
|
//流程参数
|
WORKFLOW_PARAMETER wfparam = new WORKFLOW_PARAMETER();
|
List<WORKFLOW_PARAMETER> workflowParameters = new ArrayList<WORKFLOW_PARAMETER>();
|
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<WorkflowDutyerEntity> 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<WORKFLOW_TEMPLATE_NODE> 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<WORKFLOW_PARAMETER> 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<Map> list = baseDao.queryForList(sql, new SqlParameter("partner_id",wfInstance.getPartner_id()));
|
List<SqlParameter> paramList = new ArrayList<SqlParameter>();
|
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<WORKFLOW_PARAMETER> 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<WorkflowDutyerEntity> dutyerList) {
|
|
if (dutyerList == null || dutyerList.size() <= 0) {
|
return null;
|
}
|
|
List<WORKFLOW_NODE> resultList = new ArrayList<WORKFLOW_NODE>();
|
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<WORKFLOW_TEMPLATE_NODE> 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<WORKFLOW_TEMPLATE_NODE_USER> 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<WORKFLOW_TEMPLATE_NODE_USER> 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<WORKFLOW_TEMPLATE_NODE_DEALRORE> 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<WorkflowDutyerEntity> getNodeDutyer(String temNodeId, Integer dealerType, String createrId, String createrName, String workflowInstanceId) {
|
List<WorkflowDutyerEntity> dutyerList = null;
|
if (Constants.WORKFLOW_TEMPLATE_NODE_DEALER_TYPE_USER - dealerType == 0) {
|
List<WORKFLOW_TEMPLATE_NODE_USER> userList = this.getNodeTemplateUser(temNodeId);
|
|
if (userList == null || userList.size() <= 0) {
|
return null;
|
}
|
dutyerList = new ArrayList<WorkflowDutyerEntity>();
|
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<WORKFLOW_TEMPLATE_NODE_USER> userList = this.getNodeTemplateUser(temNodeId, workflowInstanceId);
|
|
if (userList == null || userList.size() <= 0) {
|
return null;
|
}
|
dutyerList = new ArrayList<WorkflowDutyerEntity>();
|
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<WORKFLOW_TEMPLATE_NODE_DEALRORE> roleList = this.getNodeTemplateRole(temNodeId);
|
|
if (roleList == null || roleList.size() <= 0) {
|
return null;
|
}
|
dutyerList = new ArrayList<WorkflowDutyerEntity>();
|
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>();
|
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<WORKFLOW_PARAMETER> 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<WORKFLOW_PARAMETER> 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<WORKFLOW_PARAMETER> 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<WORKFLOW_PARAMETER> 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<Map> 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<String, Object> 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<WORKFLOW_PARAMETER> workflowParameters = new ArrayList<WORKFLOW_PARAMETER>();
|
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<String, Object> 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<WORKFLOW_PARAMETER> workflowParameters = new ArrayList<WORKFLOW_PARAMETER>();
|
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<String, Object> 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<WORKFLOW_PARAMETER> workflowParameters = new ArrayList<WORKFLOW_PARAMETER>();
|
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<WorkflowDutyerEntity> 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<WorkflowDutyerEntity> dutyers, Map<String, Object> 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<WORKFLOW_PARAMETER> workflowParameters = new ArrayList<WORKFLOW_PARAMETER>();
|
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<WorkflowDutyerEntity> 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<String, Object> 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<WORKFLOW_PARAMETER> workflowParameters = new ArrayList<WORKFLOW_PARAMETER>();
|
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<Map> 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;
|
}
|
|
|
}
|