package cn.ksource.web.service.workFlowSupport; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import cn.ksource.beans.GG_MESSAGE; import cn.ksource.beans.WORKFLOW_BASE; import cn.ksource.beans.WORKFLOW_NODE; 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.web.SysInfoMsg; import cn.ksource.core.web.WebUtil; import cn.ksource.core.workflow.NodeAnswerEntity; import cn.ksource.core.workflow.NodeDealEntity; import cn.ksource.core.workflow.NodeFinishEntity; import cn.ksource.core.workflow.WorkflowBusinessService; import cn.ksource.core.workflow.WorkflowCoreService; import cn.ksource.web.Constants; import cn.ksource.web.controller.wechat.util.WechatConstants; import cn.ksource.web.entity.WorkFlowSupportEntity; import cn.ksource.web.facade.message.MessageFacade; @SuppressWarnings("unchecked") @Service public class WorkFlowSupportServiceImpl implements WorkFlowSupportService{ @Resource private WorkflowBusinessService workflowBusinessService; @Resource private WorkflowCoreService workflowCoreService; @Resource private BaseDao baseDao; @Autowired private MessageFacade messageFacade; @Override public SysInfoMsg doOrderFlow(WorkFlowSupportEntity support) { boolean nodeAdmin = true; SysInfoMsg msg = new SysInfoMsg(); WORKFLOW_BASE base = new WORKFLOW_BASE(); if(StringUtil.isBlank(support.getNodeId())){//若流程未启动,则启动流程 if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_CI_REMIND)){ base = workflowBusinessService.startCIRemindWorkflow(support.getOrderId()); }else if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_CI_HEALTH)){ base = workflowBusinessService.startCIHealthWorkflow(support.getOrderId()); }else if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_RELEASE)){ base = workflowBusinessService.startReleaseWorkflow(support.getOrderId(),support.getNote()); }else if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_STOCK)){ base = workflowBusinessService.startStockWorkflow(support.getOrderId(),support.getNote()); }else if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_SPARE)){ base = workflowBusinessService.startSpareWorkflow(support.getOrderId(),support.getNote()); }else if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_CKLC)){ base = workflowBusinessService.startDeliveryWorkflow(support.getOrderId(),support.getNote()); }else if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_KCPD)){//库存盘点 base = workflowBusinessService.startInventoryWorkflow(support.getOrderId(),support.getNote()); }else if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_BSBY)){//报损报溢 base = workflowBusinessService.startOverageLossWorkflow(support.getOrderId(),support.getNote()); } }else{//若流程已启动,则结束当前环节 base = new WORKFLOW_BASE(support.getFlowId()).getInstanceById(); NodeFinishEntity finishEntity = new NodeFinishEntity(); finishEntity.setDeal_result(1); finishEntity.setDeal_note_title(support.getUserName()+"完成了节点"); finishEntity.setDeal_note(support.getNote()); WORKFLOW_NODE node = new WORKFLOW_NODE(support.getNodeId()).getInstanceById(); workflowCoreService.finishNode(base, node, finishEntity); } if(support.isFlowEndflag()){//结束环节 workflowCoreService.finishWorkFlow(base); return msg; }else{//非结束环节 if(StringUtil.isNotBlank(support.getNextNodeTemplateId())){//下一节点不为空 NodeDealEntity entity = new NodeDealEntity(); if(support.getDealer_type()!=null&&support.getDealer_type().equals("1")){//发送到组 entity.setDealer_type(1); entity.setRoleID(support.getRoleId()); entity.setRoleName(support.getRoleName()); }else{//发送到人 //若下环节执行人为空,从配置文件读取执行人列表 if(support.getNextUserList()==null||support.getNextUserList().size()==0){ if(!support.isEverDealflag()){ support.setNextUserList(getNodeExecutor(support.getNextNodeTemplateId())); }else{ //根据环节模板id 获取曾经处理人 support.setNextUserList(getEverNodeExecutor(support.getFlowId(),support.getEverNodeTemplateId())); } } entity.setDealer_type(2); entity.setDealerList(support.getNextUserList()); } if(StringUtil.isNotBlank(support.getNodeId())){ WORKFLOW_NODE node = new WORKFLOW_NODE(support.getNodeId()).getInstanceById(); Integer is_admin = node.getIs_admin(); if(is_admin!=null&&is_admin==1){ workflowCoreService.toNode(base, support.getNextNodeTemplateId(), entity); }else{ nodeAdmin = false; } }else{ workflowCoreService.toNode(base, support.getNextNodeTemplateId(), entity); } //发送消息 sendMessage(base,support); } } //提醒信息 if(StringUtil.isNotBlank(support.getNextNodeTemplateId())){ //设置环节名称 msg.setNodeName(base.getCurrent_node_name()); String dealers = ""; if(nodeAdmin){ if(support.getDealer_type()!=null&&support.getDealer_type().equals("1")){ msg.setDealUserType("1"); msg.setDealUserName(support.getRoleName()); }else{ for(Map map:support.getNextUserList()){ if(dealers.equals("")){ dealers = dealers + map.get("USER_NAME").toString(); }else{ dealers = dealers + " , " + map.get("USER_NAME").toString(); } if(map.get("IS_ADMIN")!=null&&map.get("IS_ADMIN").toString().equals("1")){ dealers = dealers + "(主负责人)"; } } msg.setDealUserType("2"); msg.setDealUserName(dealers); } }else{ //发多人环节 非主负责人提交 String text = "任务已完成,请等待主负责人【" + base.getCurrent_dealer_name() + "】提交工单"; msg.setText(text); } } return msg; } @Override public SysInfoMsg doOrderSendback(WorkFlowSupportEntity support) { SysInfoMsg msg = new SysInfoMsg(); //关闭当前节点 WORKFLOW_BASE base = new WORKFLOW_BASE(support.getFlowId()).getInstanceById(); NodeFinishEntity finishEntity = new NodeFinishEntity(); finishEntity.setDeal_result(3); finishEntity.setDeal_note_title(support.getUserName()+"回退了节点"); finishEntity.setDeal_note(support.getNote()); WORKFLOW_NODE node = new WORKFLOW_NODE(support.getNodeId()).getInstanceById(); workflowCoreService.finishNode(base, node, finishEntity); //回退到上一节点 NodeDealEntity entity = new NodeDealEntity(); List nextUserList = getEverNodeExecutor(support.getFlowId(),support.getEverNodeTemplateId()); support.setNextUserList(nextUserList); entity.setBefore_Dealer_type(2); entity.setDealer_type(2); entity.setDealerList(nextUserList); entity.setFlow_type(2); entity.setSource_node_instance_id(node.getId()); workflowCoreService.toNode(base, support.getEverNodeTemplateId(), entity); //发送消息 msg.setNodeName(base.getCurrent_node_name()); String dealers = ""; for(Map map:support.getNextUserList()){ if(dealers.equals("")){ dealers = dealers + map.get("USER_NAME").toString(); }else{ dealers = dealers + " , " + map.get("USER_NAME").toString(); } if(map.get("IS_ADMIN")!=null&&map.get("IS_ADMIN").toString().equals("1")){ dealers = dealers + "(主负责人)"; } } msg.setDealUserType("2"); msg.setDealUserName(dealers); sendMessage(base,support); return msg; } public void sendMessage(WORKFLOW_BASE base,WorkFlowSupportEntity support){ //发送消息 GG_MESSAGE message = new GG_MESSAGE(); message.setTitle(base.getWfname()) .setContent(base.getWfname()) .setSender_id(support.getUserId()) .setSender_name(support.getUserName()) .setSend_time(DateUtil.getCurrentDate14()) .setBusiness_id(base.getBusiness_id()); if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_CI_REMIND)){ //例行巡检 message.setWeb_url(Constants.REMIND_WEB_MSG_URL+"?flowId="+base.getId()+"&orderId="+base.getBusiness_id()) .setWx_url(WechatConstants.ORDER_INCIDENT_DETAIL_ADDRESS+"?orderId="+base.getBusiness_id()+"&orderType="+Constants.WORKFLOW_BASE_BUSINESS_TYPE_CI_REMIND) .setType(Constants.GG_MESSAGE_TYPE_LXXJ) .setOrder_code(base.getOrder_code()); }else if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_CI_HEALTH)){ //健康检查 message.setWeb_url(Constants.HEALTH_WEB_MSG_URL+"?flowId="+base.getId()+"&orderId="+base.getBusiness_id()) .setWx_url(WechatConstants.ORDER_INCIDENT_DETAIL_ADDRESS+"?orderId="+base.getBusiness_id()+"&orderType="+Constants.WORKFLOW_BASE_BUSINESS_TYPE_CI_HEALTH) .setType(Constants.GG_MESSAGE_TYPE_JKJC) .setOrder_code(base.getOrder_code()); } //messageFacade.doSendMessage(message, support.getNextUserList()); } /** * 根据节点模板Id 获取执行人 * @param nodeTemplateId * @return */ public List getNodeExecutor(String nodeTemplateId){ String sql = "select u.* from " + "workflow_template_node n inner join WORKFLOW_TEMPLATE_NODE_PARTNER p " + "on n.ID = p.NODE_ID " + "inner join WORKFLOW_TEMPLATE_NODE_USER u " + "on p.ID = u.PARTNER_NODE_ID " + "where n.ID=:nodeTemplateId LIMIT 1 "; Map map = baseDao.queryForMap(sql,new SqlParameter().addValue("nodeTemplateId", nodeTemplateId)); map.put("IS_ADMIN", "1"); List list = new ArrayList(); list.add(map); return list; } /** * 获取执行过的节点的执行人 * @param flowId * @param nodeTemplateId * @return */ public List getEverNodeExecutor(String flowId,String nodeTemplateId){ String sql = "select current_dealer_id USER_ID,current_dealer_name USER_NAME,1 as IS_ADMIN from workflow_node " + "where IS_ADMIN = 1 and flowid = :flowId and node_template_id=:nodeTemplateId order by createtime desc limit 1"; Map map = baseDao.queryForMap(sql,new SqlParameter().addValue("nodeTemplateId", nodeTemplateId) .addValue("flowId", flowId)); List list = new ArrayList(); list.add(map); return list; } @Override public List getNotDealList(String flowId) { StringBuilder sql = new StringBuilder(); Map param = new HashMap(); param.put("flowId",flowId); sql.append(" select CURRENT_DEALER_NAME name from workflow_node where FLOWID = :flowId and FLOWSTATE!=3 "); sql.append(" and (IS_ADMIN<>1 or IS_ADMIN is null) "); return baseDao.queryForList(sql.toString(),param); } @Override public Map getOrderFlowInfo(String flowId) { Map param = new HashMap(); param.put("flowId", flowId); String sql = " select b.ORDER_CODE,b.BUSINESSTYPE,b.PROJECT_ID,b.WFNAME,b.CUSTOMER_NAME,b.SUB_CUSTOMER_NAME,b.PROJECT_NAME,n.CURRENT_DEAL_ROLENAME roleName,n.deal_type dealType,g.SJHM telphone,n.FLOWSTATE nodeState,b.WFSTATE flowState,b.CURRENT_NODE_NAME nodeName,b.CURRENT_DEALER_NAME userName "+ " from workflow_base b inner join workflow_node n on "+ " b.CURRENT_NODE_ID = n.id "+ " left join gg_user g on g.ID = b.CURRENT_DEALER_ID "+ " where FLOWID = :flowId "; return baseDao.queryForMap(sql,param); } public List getProjectManager(String projectId){ String sql = "SELECT A.PROJECT_MANAGER_ID USER_ID,A.PROJECT_MANAGER_NAME USER_NAME,1 as IS_ADMIN FROM SC_PARTNER_CUSTOMER_PROJECT A WHERE A.PROJECT_STATE != 2 " + " and id=:projectId "; SqlParameter parameter = new SqlParameter(); parameter.addValue("projectId", projectId); return baseDao.queryForList(sql,parameter); } public List getAllExecutors() { SqlParameter param = new SqlParameter(); Map rset = new HashMap(); List rlist = new ArrayList(); List ulist = new ArrayList(); StringBuilder sql = new StringBuilder(); sql.setLength(0); sql.append("SELECT * FROM AC_ROLE WHERE STATE=1 ORDER BY SXH ASC "); rlist=baseDao.queryForList(sql.toString(), param); sql.setLength(0); sql.append("SELECT A.ID USER_ID,A.ZSXM USER_NAME,B.JSBH ROLEID FROM GG_USER A, AC_USER_REF_ROLE B WHERE A.ID = B.YHBH AND A.ZT = 1 "); ulist=baseDao.queryForList(sql.toString(), param); if(rlist!=null&&rlist.size()>0){ for(Map map:rlist ){ rset.put(map.get("ID").toString(), map); } if(ulist!=null&&ulist.size()>0){ for(Map map:ulist){ String key = map.get("ROLEID").toString(); Map roleMap = rset.get(key); if(roleMap!=null){ if(roleMap.get("children")==null){ roleMap.put("children", new ArrayList()); } ((List)roleMap.get("children")).add(map); } } } } return rlist; } /** * 关闭工单(orderId,closeNote,nodeId) * @param request */ @Override public void doCloseWrokFlow(HttpServletRequest request){ String orderId = request.getParameter("orderId"); String closeNote = request.getParameter("closeNote"); String nodeId = request.getParameter("nodeId"); String flowId = request.getParameter("flowId"); String userName = WebUtil.getLoginUser(request).getLoginUser().get("ZSXM").toString(); WORKFLOW_BASE base = new WORKFLOW_BASE(flowId).getInstanceById(); NodeFinishEntity finishEntity = new NodeFinishEntity(); finishEntity.setDeal_result(1); finishEntity.setDeal_note_title(userName+"关闭了工单"); finishEntity.setDeal_note(closeNote); WORKFLOW_NODE node = new WORKFLOW_NODE(nodeId).getInstanceById(); workflowCoreService.finishNode(base, node, finishEntity); workflowCoreService.closeWorkFlow(base); } @Override public boolean nodeAnswer(HttpServletRequest request) { String flowId = request.getParameter("flowId"); String nodeId = request.getParameter("nodeId"); WORKFLOW_BASE base = new WORKFLOW_BASE(flowId).getInstanceById(); WORKFLOW_NODE node = new WORKFLOW_NODE(nodeId).getInstanceById(); NodeAnswerEntity entity = new NodeAnswerEntity(); Map user = WebUtil.getLoginUser(request).getLoginUser(); entity.setUser_id(user.get("ID").toString()); entity.setUser_name(user.get("ZSXM").toString()); boolean flag = workflowCoreService.answerNode(base, node, entity); return flag; } @Override public boolean saveLinkOrders(String flowId, String[] linkOrderIds) { baseDao.execute("DELETE FROM ORDER_REF_ORDER WHERE BUSINESS_ID = :flowId ", new SqlParameter("flowId",flowId)); if(null!=linkOrderIds && linkOrderIds.length>0) { List paramList = new ArrayList(); for(String linkOrderId : linkOrderIds) { SqlParameter sqlParameter = new SqlParameter(); sqlParameter.put("id", StringUtil.getUUID()); sqlParameter.put("businessId", flowId); sqlParameter.put("relateFlowId", linkOrderId); paramList.add(sqlParameter); } String insertSql = "INSERT INTO ORDER_REF_ORDER(ID,BUSINESS_ID,RELATE_FLOW_ID) VALUES (:id,:businessId,:relateFlowId)"; baseDao.executeBatch(insertSql, paramList); return true; } return false; } @Override public boolean saveLinkDevices(String flowId, String[] linkDeviceIds) { baseDao.execute("DELETE FROM CMDB_CI_REF_ORDER WHERE FLOW_ID = :flowId ", new SqlParameter("flowId",flowId)); if(null!=linkDeviceIds && linkDeviceIds.length!=0) { List list = new ArrayList(); for(String linkDeviceId : linkDeviceIds) { SqlParameter sqlParameter = new SqlParameter(); sqlParameter.put("id", StringUtil.getUUID()); sqlParameter.put("ciId", linkDeviceId); sqlParameter.put("flow_id", flowId); list.add(sqlParameter); } String insertCmdb_ci_ref_orderSql = "INSERT CMDB_CI_REF_ORDER(ID,FLOW_ID,CI_ID) VALUES (:id,:flow_id,:ciId)"; baseDao.executeBatch(insertCmdb_ci_ref_orderSql,list); return true; } return false; } @Override public List getLinkConfigure(String flowId) { String sql = " SELECT B.ID,B.LV3_ID THIRD_CATE_ID,B.CINAME FROM CMDB_CI_REF_ORDER R,CMDB_CI_BASE B " + " WHERE R.CI_ID = B.ID AND R.FLOW_ID = :flowId AND B.STATE = 1 "; return baseDao.queryForList(sql,new SqlParameter("flowId",flowId)); } @Override public void getMyOrderDateSql(StringBuilder builder, Map paramMap) { builder.append(" select DATE_FORMAT(b.CREATETIME,'%Y-%m-%d') m_date "); builder.append(" from WORKFLOW_BASE B "); builder.append(" inner join "); builder.append(" ( "); builder.append(" select * from ( "); builder.append(" select ID NODEID, CREATETIME NODETIME,FLOWSTATE NODESTATE,FLOWID from WORKFLOW_NODE "); builder.append(" where CURRENT_DEALER_ID = :userId "); builder.append(" order by FLOWSTATE asc "); builder.append(" ) t "); builder.append(" group by FLOWID "); builder.append(" ) n "); builder.append(" on b.ID = n.FLOWID "); //builder.append(" where b.PARTNER_ID =:partnerId "); //工单类型 builder.append(" where b.BUSINESSTYPE = :bustype "); //是否选择月份 String selMonth = ConvertUtil.obj2StrBlank(paramMap.get("selMonth")); if(StringUtil.isNotBlank(selMonth)){ builder.append(" AND DATE_FORMAT(b.CREATETIME,'%Y%m') = :selMonth "); } builder.append(" group by DATE_FORMAT(b.CREATETIME,'%Y-%m-%d') "); builder.append(" order by b.CREATETIME asc "); } @Override public void getAllOrderDateSql(StringBuilder builder, Map paramMap) { builder.append(" select DATE_FORMAT(b.CREATETIME,'%Y-%m-%d') m_date "); builder.append(" from WORKFLOW_BASE b "); //builder.append(" where b.PARTNER_ID =:partnerId "); builder.append(" where b.BUSINESSTYPE = :bustype"); String customer_id = ConvertUtil.obj2StrBlank(paramMap.get("customer_id")); if(StringUtil.notEmpty(customer_id)) { builder.append(" AND b.CUSTOMER_ID = :customer_id"); } //builder = getProjectSql(builder,projects); //是否选择月份 String selMonth = ConvertUtil.obj2StrBlank(paramMap.get("selMonth")); if(StringUtil.isNotBlank(selMonth)){ builder.append(" AND DATE_FORMAT(b.CREATETIME,'%Y%m') = :selMonth "); } builder.append(" group by DATE_FORMAT(b.CREATETIME,'%Y-%m-%d') "); builder.append(" order by b.CREATETIME asc "); } private StringBuilder getProjectSql(StringBuilder buffer, List projects) { if(null != projects && projects.size()>0) { buffer.append(" AND b.PROJECT_ID IN ( "); for(Map project : projects) { String projectId = ConvertUtil.obj2StrBlank(project.get("PROJECT_ID")); buffer.append("'"); buffer.append(projectId); buffer.append("',"); } buffer.deleteCharAt(buffer.length()-1); buffer.append(")"); } else { buffer.append(" AND b.PROJECT_ID = '' "); } return buffer; } @Override public Map getNodeInfoByFlowId(String flowId, String userId) { SqlParameter param = new SqlParameter(); param.addValue("flowId", flowId) .addValue("userId", userId); String sql = " select n.* from workflow_base b,workflow_node n where b.id = n.flowid " + "and b.id = :flowId and n.current_dealer_id = :userId and (n.flowstate = 1 or n.flowstate=2 ) "; return baseDao.queryForMap(sql, param); } }