From e0737e143dadb193d4f5dcc5e587fde3c3b4e460 Mon Sep 17 00:00:00 2001 From: wcf Date: Tue, 21 Nov 2023 17:22:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=90=86=E7=BC=96=E8=BE=91=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E4=BB=A3=E7=90=86=E4=BA=BA=E9=80=BB=E8=BE=91=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BF=AE=E6=94=B91121?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/weaver/workflow/agent/AgentManager.java | 1834 +++++++++++++++++++ 1 file changed, 1834 insertions(+) create mode 100644 src/weaver/workflow/agent/AgentManager.java diff --git a/src/weaver/workflow/agent/AgentManager.java b/src/weaver/workflow/agent/AgentManager.java new file mode 100644 index 00000000..954d09cf --- /dev/null +++ b/src/weaver/workflow/agent/AgentManager.java @@ -0,0 +1,1834 @@ +package weaver.workflow.agent; + +import com.api.workflow.util.ServiceUtil; +import com.engine.hrm.biz.HrmClassifiedProtectionBiz; +import com.engine.integration.util.StringUtils; +import com.engine.workflow.biz.AgentBiz; +import com.engine.workflow.biz.requestForm.RequestSecLevelBiz; +import com.engine.workflow.biz.requestList.RequestAttentionBiz; +import com.google.common.base.Strings; +import weaver.conn.ConnStatement; +import weaver.conn.RecordSet; +import weaver.conn.RecordSetTrans; +import weaver.dateformat.DateTransformer; +import weaver.docs.share.DocShareUtil; +import weaver.general.BaseBean; +import weaver.general.TimeUtil; +import weaver.general.Util; +import weaver.hrm.User; +import weaver.systeminfo.SystemEnv; +import weaver.workflow.msg.MsgPushUtil; +import weaver.workflow.msg.entity.MsgEntity; +import weaver.workflow.request.RequestAddShareInfo; +import weaver.workflow.request.RequestOperationMsgManager; +import weaver.workflow.ruleDesign.RuleInterface; +import weaver.workflow.workflow.WorkflowComInfo; +import weaver.workflow.workflow.WorkflowVersion; + +import java.lang.reflect.Method; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 代理操作类 + * @author liuzy 2017-11-21 + */ +public class AgentManager extends BaseBean{ + + private User user; + + /** + * 记录流程代理出去时,被代理的记录和新增的代理记录id对应关系 + */ + private Map workflowCurrentOperatorIdMap = new HashMap<>(); + + public Map getWorkflowCurrentOperatorIdMap() { + return workflowCurrentOperatorIdMap; + } + + public void setWorkflowCurrentOperatorIdMap(Map workflowCurrentOperatorIdMap) { + this.workflowCurrentOperatorIdMap = workflowCurrentOperatorIdMap; + } + + public AgentManager(){ + } + public AgentManager(User user){ + this.user = user; + } + + /** + * 新建代理设置 + */ + private synchronized boolean insertAgent(AgentBean bean){ + + DateTransformer dft = new DateTransformer(); + String timeZoneConversion = Util.null2String(getPropValue("weaver_timezone_conversion","timeZoneConversion")).trim(); + + ConnStatement statement = null; + statement = new ConnStatement(); + try { + if(bean.getAgentid() <= 0 || bean.getWorkflowid() <= 0 || bean.getAgentuid() <= 0 || bean.getBagentuid()<= 0) + throw new Exception("InsertAgent Exception"); + String sql = "insert into workflow_agent(agentid,workflowid,agenterid,beagenterid,agenttype," + + "beginDate,beginTime,endDate,endTime,iseditstartdate,iseditstarttime,iseditenddate,iseditendtime," + + "iscreateagenter,ispending,isproxydeal,operatorid,operatordate,operatortime,issyscreateagenter)"; + sql += "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + statement.setStatementSql(sql); + statement.setString(1, bean.getAgentid()+""); + statement.setString(2, bean.getWorkflowid()+""); + statement.setString(3, bean.getAgentuid()+""); + statement.setString(4, bean.getBagentuid()+""); + statement.setString(5, bean.getAgenttype()+""); + + String begindate = bean.getBegindate(); + String begintime = bean.getBegintime(); + String enddate = bean.getEnddate(); + String endtime = bean.getEndtime(); + //多时区处理 + if("1".equals(timeZoneConversion)){ + String serverdatetime_b = dft.getServerDateTime(begindate,begintime+":00"); + String serverdatetime_e = dft.getServerDateTime(enddate,endtime+":59"); + begindate = serverdatetime_b.substring(0,serverdatetime_b.indexOf(" ")); + begintime = serverdatetime_b.substring(serverdatetime_b.indexOf(" ")+1,serverdatetime_b.length()-3); + enddate = serverdatetime_e.substring(0,serverdatetime_e.indexOf(" ")); + endtime = serverdatetime_e.substring(serverdatetime_e.indexOf(" ")+1,serverdatetime_e.length()-3); + } + + statement.setString(6, begindate); + statement.setString(7, begintime); + statement.setString(8, enddate); + statement.setString(9, endtime); + statement.setString(10, bean.judgeBeginDateEmpty()); + statement.setString(11, bean.judgeBeginTimeEmpty()); + statement.setString(12, bean.judgeEndDateEmpty()); + statement.setString(13, bean.judgeEndTimeEmpty()); + statement.setString(14, bean.getIscreateagenter()+""); + statement.setString(15, bean.getIspendthing()+""); + statement.setString(16, bean.getIsproxydeal()+""); + statement.setString(17, user.getUID()+""); + statement.setString(18, TimeUtil.getCurrentDateString()); + statement.setString(19, TimeUtil.getCurrentTimeString().substring(11,19)); + statement.setString(20, bean.getIsSysCreateAgenter()); + statement.executeUpdate(); + } catch (Exception e) { + e.printStackTrace(); + return false; + } finally { + statement.close(); + } + return true; + } + + /** + * 批量新建代理设置 + */ + private synchronized boolean batchInsertAgent(AgentBean bean,List wfActiveIds,List sequenceAgentIdList){ + List> agentBeans = new ArrayList<>(); + List> agentDetailBeans = new ArrayList<>(); + DateTransformer dft = new DateTransformer(); + String timeZoneConversion = Util.null2String(getPropValue("weaver_timezone_conversion","timeZoneConversion")).trim(); + RecordSetTrans rst = new RecordSetTrans(); + RecordSetTrans rst1 = new RecordSetTrans(); + try { + if(bean.getAgentuid() <= 0 || bean.getBagentuid()<= 0 || wfActiveIds.size()<=0 || sequenceAgentIdList.size()<=0) + throw new Exception("InsertAgent Exception"); + String sql = "insert into workflow_agent(agentid,workflowid,agenterid,beagenterid,agenttype," + + "beginDate,beginTime,endDate,endTime,iseditstartdate,iseditstarttime,iseditenddate,iseditendtime," + + "iscreateagenter,ispending,isproxydeal,operatorid,operatordate,operatortime,issyscreateagenter)"; + sql += "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + + + String sql1 = "insert into workflow_agentConditionSet(agentid,bagentuid,agentuid,conditionss,conditioncn," + + "conditionkeyid,beginDate,beginTime,endDate,endTime,isCreateAgenter,isPendThing,isProxyDeal,agentbatch," + + "workflowid,operatorid,operatordate,operatortime,agenttype,ruleRelationship,isSysCreateAgenter)"; + sql1 += "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + + String begindate = bean.getBegindate(); + String begintime = bean.getBegintime(); + String enddate = bean.getEnddate(); + String endtime = bean.getEndtime(); + //多时区处理 + if("1".equals(timeZoneConversion)){ + String serverdatetime_b = dft.getServerDateTime(begindate,begintime+":00"); + String serverdatetime_e = dft.getServerDateTime(enddate,endtime+":59"); + begindate = serverdatetime_b.substring(0,serverdatetime_b.indexOf(" ")); + begintime = serverdatetime_b.substring(serverdatetime_b.indexOf(" ")+1,serverdatetime_b.length()-3); + enddate = serverdatetime_e.substring(0,serverdatetime_e.indexOf(" ")); + endtime = serverdatetime_e.substring(serverdatetime_e.indexOf(" ")+1,serverdatetime_e.length()-3); + } + for (int i = 0; i < wfActiveIds.size(); i++) { + List agentBean = new ArrayList<>(); + List agentDetailBean = new ArrayList<>(); + int agentId = sequenceAgentIdList.get(i); + String wfId = wfActiveIds.get(i); + agentBean.add(agentId); + agentBean.add(wfId); + agentBean.add(bean.getAgentuid()); + agentBean.add(bean.getBagentuid()); + agentBean.add(bean.getAgenttype()); + agentBean.add(begindate); + agentBean.add(begintime); + agentBean.add(enddate); + agentBean.add(endtime); + agentBean.add(bean.judgeBeginDateEmpty()); + agentBean.add(bean.judgeBeginTimeEmpty()); + agentBean.add(bean.judgeEndDateEmpty()); + agentBean.add(bean.judgeEndTimeEmpty()); + agentBean.add(bean.getIscreateagenter()); + agentBean.add(bean.getIspendthing()); + agentBean.add(bean.getIsproxydeal()); + agentBean.add(user.getUID()); + agentBean.add(TimeUtil.getCurrentDateString()); + agentBean.add(TimeUtil.getCurrentTimeString().substring(11,19)); + agentBean.add(bean.getIsSysCreateAgenter()); + agentBeans.add(agentBean); + + agentDetailBean.add(agentId); + agentDetailBean.add(bean.getBagentuid()); + agentDetailBean.add(bean.getAgentuid()+""); + agentDetailBean.add(bean.getConditionss()); + agentDetailBean.add(Util.toScreenToEdit(bean.getConditioncn(), 7)); + agentDetailBean.add(bean.getConditionkeyid()); + agentDetailBean.add(begindate); + agentDetailBean.add(begintime); + agentDetailBean.add(enddate); + agentDetailBean.add(endtime); + agentDetailBean.add(bean.getIscreateagenter()+""); + agentDetailBean.add(bean.getIspendthing()+""); + agentDetailBean.add(bean.getIsproxydeal()+""); + agentDetailBean.add(bean.getAgentbatch()); + agentDetailBean.add(wfId); + agentDetailBean.add(user.getUID()+""); + agentDetailBean.add(TimeUtil.getCurrentDateString()); + agentDetailBean.add(TimeUtil.getCurrentTimeString().substring(11,19)); + agentDetailBean.add(bean.getAgenttype()); + agentDetailBean.add(bean.getRulerelationship()); + agentDetailBean.add(bean.getIsSysCreateAgenter()); + agentDetailBeans.add(agentDetailBean); + } + rst.executeBatchSql(sql,agentBeans); + rst1.executeBatchSql(sql1,agentDetailBeans); + rst.commit(); + rst1.commit(); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + + /** + * 新建代理明细设置 + */ + private synchronized boolean insertAgentDetail(AgentBean bean){ + ConnStatement statement = null; + statement = new ConnStatement(); + try { + int workflowid = 0, bagentuid = 0, agenttype = 0; + String beginDate = "", beginTime = "", endDate = "", endTime = ""; + RecordSet rs = new RecordSet(); + rs.executeQuery("select * from workflow_agent where agentid=?", bean.getAgentid()); + if(rs.next()){ //子项值从父项取,保持数据一致性 + workflowid = Util.getIntValue(rs.getString("workflowid"), 0); + bagentuid = Util.getIntValue(rs.getString("beagenterid"), 0); + agenttype = Util.getIntValue(rs.getString("agenttype"), 0); + beginDate = rs.getString("beginDate"); + beginTime = rs.getString("beginTime"); + endDate = rs.getString("endDate"); + endTime = rs.getString("endTime"); + } + if(bean.getAgentid() <= 0 || workflowid <= 0 || bean.getAgentuid() <= 0 || bagentuid<= 0) + throw new Exception("InsertAgentDetail Exception"); + String sql = "insert into workflow_agentConditionSet(agentid,bagentuid,agentuid,conditionss,conditioncn," + + "conditionkeyid,beginDate,beginTime,endDate,endTime,isCreateAgenter,isPendThing,isProxyDeal,agentbatch," + + "workflowid,operatorid,operatordate,operatortime,agenttype,ruleRelationship,isSysCreateAgenter)"; + sql += "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + statement.setStatementSql(sql); + statement.setString(1, bean.getAgentid()+""); + statement.setString(2, bagentuid+""); + statement.setString(3, bean.getAgentuid()+""); + statement.setString(4, bean.getConditionss()); + statement.setString(5, Util.toScreenToEdit(bean.getConditioncn(), 7)); + statement.setString(6, bean.getConditionkeyid()); + statement.setString(7, beginDate); + statement.setString(8, beginTime); + statement.setString(9, endDate); + statement.setString(10, endTime); + statement.setString(11, bean.getIscreateagenter()+""); + statement.setString(12, bean.getIspendthing()+""); + statement.setString(13, bean.getIsproxydeal()+""); + statement.setString(14, bean.getAgentbatch()); + statement.setString(15, workflowid+""); + statement.setString(16, user.getUID()+""); + statement.setString(17, TimeUtil.getCurrentDateString()); + statement.setString(18, TimeUtil.getCurrentTimeString().substring(11,19)); + statement.setString(19, agenttype+""); + statement.setString(20, bean.getRulerelationship()); + statement.setString(21, bean.getIsSysCreateAgenter()); + statement.executeUpdate(); + } catch (Exception e) { + e.printStackTrace(); + return false; + } finally { + statement.close(); + } + return true; + } + private void batchUpdateAgentSetById(String agentStr){ + RecordSet rs = new RecordSet(); + String currentDate = TimeUtil.getCurrentDateString(); + String currentTime = (TimeUtil.getCurrentTimeString()).substring(11, 19); + rs.executeUpdate("update workflow_agent set agenttype='0',backDate=?,backTime=? where " + Util.getSubINClause(agentStr,"agentid","in"), currentDate, currentTime); + rs.executeUpdate("update workflow_agentconditionset set agenttype='0',backDate=?,backTime=? where "+ Util.getSubINClause(agentStr,"agentid","in"), currentDate, currentTime); + } + /** + * 所有修改操作都通过此方法完成,便于主、明细数据的一致性 + */ + private boolean updateAgentSetById(AgentBean bean, String type){ + boolean flag = false; + if(bean.getAgentid() <= 0) + return flag; + RecordSet rs = new RecordSet(); + String sql = ""; + if("updateDate".equals(type)){ + DateTransformer dft = new DateTransformer(); + String timeZoneConversion = Util.null2String(getPropValue("weaver_timezone_conversion","timeZoneConversion")).trim(); + String begindate = bean.getBegindate(); + String begintime = bean.getBegintime(); + String enddate = bean.getEnddate(); + String endtime = bean.getEndtime(); + //多时区处理 + if("1".equals(timeZoneConversion)){ + String serverdatetime_b = dft.getServerDateTime(begindate,begintime+":00"); + String serverdatetime_e = dft.getServerDateTime(enddate,endtime+":59"); + begindate = serverdatetime_b.substring(0,serverdatetime_b.indexOf(" ")); + begintime = serverdatetime_b.substring(serverdatetime_b.indexOf(" ")+1,serverdatetime_b.length()-3); + enddate = serverdatetime_e.substring(0,serverdatetime_e.indexOf(" ")); + endtime = serverdatetime_e.substring(serverdatetime_e.indexOf(" ")+1,serverdatetime_e.length()-3); + } + + sql = "update workflow_agent set isset='0',agenttype=?,begindate=?,begintime=?,enddate=?,endtime=?," + + "iseditstartdate=?,iseditstarttime=?,iseditenddate=?,iseditendtime=? where agentid=?"; + rs.executeUpdate(sql, bean.getAgenttype()+"", begindate, begintime, enddate, endtime, + bean.judgeBeginDateEmpty(), bean.judgeBeginTimeEmpty(), bean.judgeEndDateEmpty(), bean.judgeEndTimeEmpty(), bean.getAgentid()); + sql = "update workflow_agentconditionset set isset='0',agenttype=?,begindate=?,begintime=?,enddate=?,endtime=? where agentid=?"; + rs.executeUpdate(sql, bean.getAgenttype()+"", bean.getBegindate(), bean.getBegintime(), bean.getEnddate(), bean.getEndtime(), bean.getAgentid()); + }else if("updateIsSet".equals(type)){ + rs.executeUpdate("update workflow_agent set isset='1' where agentid=?", bean.getAgentid()); + //更新workflow_agent一张表即可,循环代理只取主表设置,更新workflow_agentconditionset循环代理时产生了死锁 + //rs.executeUpdate("update workflow_agentconditionset set isset='1' where agentid=?", bean.getAgentid()); + }else if("takeBackAgent".equals(type)){ + String currentDate = TimeUtil.getCurrentDateString(); + String currentTime = (TimeUtil.getCurrentTimeString()).substring(11, 19); + rs.executeUpdate("update workflow_agent set agenttype='0',backDate=?,backTime=? where agentid=?", currentDate, currentTime, bean.getAgentid()); + rs.executeUpdate("update workflow_agentconditionset set agenttype='0',backDate=?,backTime=? where agentid=?", currentDate, currentTime, bean.getAgentid()); + } + return flag; + } + + public String batchAddAgent(String wfids, AgentBean bean, int overlapMethod) throws Exception{ + String agentstate = this.calculateAgentState(bean); + int agenttype = "2".equals(agentstate) ? 0 : 1; + bean.setAgenttype(agenttype); + String agentWfids = ""; //可代理的流程范围 + List wfActiveIds = new ArrayList<>(); + List wfAllIds = new ArrayList<>(); + for (String wfid : wfids.split(",")) { + if(Strings.isNullOrEmpty(wfid)) + continue; + String workflowid = WorkflowVersion.getActiveVersionWFID(wfid); + wfActiveIds.add(workflowid); + wfAllIds.add(WorkflowVersion.getAllVersionStringByWFIDs(workflowid+"")); + } + if(bean.getIsproxydeal() == 1){ + Map overlapMap = this.batchVerifyOverlapInfo(bean.getBagentuid(), wfAllIds, bean, -1); + if(overlapMap.size() > 0){ + Iterator it = overlapMap.keySet().iterator(); + String agentuids = ""; + RecordSet rs = new RecordSet(); + while (it.hasNext()){ + String agentid = it.next(); + rs.executeQuery("select agentuid from workflow_agentconditionset where agentid = ?",agentid); + if(rs.next()){ + agentuids += "," + Util.getIntValue(rs.getString("agentuid"),-1); + } + } + if(overlapMethod == 1){ + // 从可代理流程中剔除 + for (String s : overlapMap.keySet()) { + String fwd = overlapMap.get(s); + wfActiveIds.remove(fwd); + } + if(wfActiveIds.size()==0){ + return "success"; + } + }else { + List agentWfList = new ArrayList<>(); + if(agentuids.startsWith(",")){ + agentuids = agentuids.substring(1); + agentWfList = this.getAgentWfListTemp(agentuids,bean.getBagentuid()); + }else{ + agentWfList = this.getAgentWfList(bean); + } + // 默认收回 + this.batchTakeBackAgent(overlapMap, true,true,agentWfList); + } + } + } + // 插入代理数据 + LinkedList sequenceAgentId = this.getSequenceAgentId(wfActiveIds.size()); + if(!this.batchInsertAgent(bean,wfActiveIds,sequenceAgentId)) + throw new Exception("InsertAgent Exception"); + + agentWfids = StringUtils.join(wfActiveIds,","); + //代理已有待办数据(代理中状态) + if(!"".equals(agentWfids) && bean.getIspendthing() == 1 && "1".equals(agentstate)){ + this.agentOutRequest(bean.getAgentuid(), bean.getBagentuid(), agentWfids); + } + return "success"; + } + + private List getAgentWfListTemp(String agentuids,int bagentuid){ + List agentWfList = new ArrayList<>(); + RecordSet rs = new RecordSet(); + rs.executeQuery("select distinct workflowid " + + " from workflow_currentoperator " + + " where (isremark in ('0', '1', '5', '7', '8', '9', '11') or (isremark = 2 and takisremark = 2 and istakout = 1)) " + + " and userid in (" + agentuids +") "+ + " and usertype = 0" + + " and agentorbyagentid = ? and agenttype = '2'",bagentuid); + while(rs.next()){ + agentWfList.add(rs.getString(1)); + } + return agentWfList; + } + + private List getAgentWfList(AgentBean bean){ + List agentWfList = new ArrayList<>(); + RecordSet rs = new RecordSet(); + rs.executeQuery("select distinct workflowid\n" + + "from workflow_currentoperator\n" + + "where (isremark in ('0', '1', '5', '7', '8', '9', '11') or (isremark = 2 and takisremark = 2 and istakout = 1))\n" + + " and userid = ?\n" + + " and usertype = 0\n" + + " and agentorbyagentid = ? and agenttype = '2'",bean.getAgentuid(),bean.getBagentuid()); + while(rs.next()){ + agentWfList.add(rs.getString(1)); + } + return agentWfList; + } + + /** + * 新建代理设置 + * @param wfids 流程id集合 + * @param overlapMethod 1:从新保存的代理设置中去除重复设置内容 2:以新保存的代理设置替换已有重复的代理设置 3:无重复 + */ + public String addAgent(String wfids, AgentBean bean, int overlapMethod) throws Exception{ + String agentstate = this.calculateAgentState(bean); + int agenttype = "2".equals(agentstate) ? 0 : 1; + bean.setAgenttype(agenttype); + String agentWfids = ""; //可代理的流程范围 + LinkedList linkedList = this.getSequenceAgentId(wfids.split(",").length); + for(String wfid : wfids.split(",")){ + int workflowid = Util.getIntValue(WorkflowVersion.getActiveVersionWFID(wfid), 0); + if(workflowid <= 0) + continue; + bean.setWorkflowid(workflowid); + //代理重复处理 + if(bean.getIsproxydeal() == 1){ + List overlapList = this.verifyOverlapInfo(bean.getBagentuid(), workflowid+"", bean, -1); + if(overlapList.size() > 0){ + if(overlapMethod == 1){ //从新保存的代理设置中去除重复设置内容 + continue; + }else{ //默认以新保存设置覆盖原设置,即收回被覆盖的代理设置 + this.takeBackAgent(overlapList, true); + } + } + } + //保存代理设置 + Integer agentid = linkedList.removeFirst(); + bean.setAgentid(agentid); + if(!this.insertAgent(bean)) + throw new Exception("InsertAgent Exception"); + if(!this.insertAgentDetail(bean)) + throw new Exception("InsertAgentDetail Exception"); + agentWfids += workflowid + ","; + } + //代理已有待办数据(代理中状态) + if(!"".equals(agentWfids) && bean.getIspendthing() == 1 && "1".equals(agentstate)){ + this.agentOutRequest(bean.getAgentuid(), bean.getBagentuid(), agentWfids); + } + return "success"; + } + + /** + * 已结束代理另存为新建新代理 + * @param overlapMethod 1:从新保存的代理设置中去除重复设置内容 2:以新保存的代理设置替换已有重复的代理设置 3:无重复 + */ + public String saveAsNewAgent(int oldAgentid, AgentDateBean datebean, List datas, int overlapMethod) throws Exception{ + RecordSet rs = new RecordSet(); + int bagentuid = 0, workflowid = 0; + rs.executeQuery("select * from workflow_agent where agentid=?", oldAgentid); + if(rs.next()){ + bagentuid = Util.getIntValue(rs.getString("beagenterid"), 0); + workflowid = Util.getIntValue(rs.getString("workflowid"), 0); + } + workflowid = Util.getIntValue(WorkflowVersion.getActiveVersionWFID(workflowid+""), 0); + if(bagentuid <= 0 || workflowid <= 0 || datas.size() == 0) + throw new Exception("BaseInfo Exception"); + //代理重复处理 + if(this.judgeExistAgentDeal(datas)){ + List overlapList = this.verifyOverlapInfo(bagentuid, workflowid+"", datebean, -1); + if(overlapList.size() > 0){ + if(overlapMethod == 1){ //从新保存的代理设置中去除重复设置内容 + return "ignore"; + }else{ //默认以新保存设置覆盖原设置,即收回被覆盖的代理设置 + this.takeBackAgent(overlapList, true); + } + } + } + //保存代理设置 + int newAgentid = this.getSequenceAgentId(); + String newAgentstate = this.calculateAgentState(datebean); + int newAgenttype = "2".equals(newAgentstate) ? 0 : 1; + for(int i=0; i getSequenceAgentId(int step) { + int agentIdBefore = 0; + int agentIdAfter = 0; + LinkedList arrayList = new LinkedList(); + RecordSet rs = new RecordSet(); + rs.executeQuery("select * from SequenceIndex where indexdesc ='workflowagentid'"); + if (rs.next()) { + agentIdBefore = Util.getIntValue("" + rs.getInt("currentid"), 0); + } + rs.executeUpdate("update SequenceIndex set currentid =" + (agentIdBefore + step) + " where indexdesc= 'workflowagentid' "); + rs.executeQuery("select * from SequenceIndex where indexdesc ='workflowagentid'"); + if (rs.next()) { + agentIdAfter = Util.getIntValue("" + rs.getInt("currentid"), 0); + } + + if ((agentIdBefore + step) == agentIdAfter) { + for (int i = 1; i <= step; i++) { + arrayList.add(agentIdBefore + i); + } + } + return arrayList; + } + + /** + * 仅保存代理条件设置信息 + */ + private String saveAgentConditonSet(int agentid, List datas) throws Exception{ + if(datas.size() == 0) + throw new Exception("Empty ConditionSet"); + RecordSet rs = new RecordSet(); + rs.executeQuery("select * from workflow_agent where agentid=?", agentid+""); + if(rs.next()){ + int workflowid = Util.getIntValue(rs.getString("workflowid")); + int bagentuid = Util.getIntValue(rs.getString("beagenterid"), 0); + String begindate = rs.getString("begindate"); + String begintime = rs.getString("begintime"); + String enddate = rs.getString("enddate"); + String endtime = rs.getString("endtime"); + int agenttype = Util.getIntValue(rs.getString("agenttype"), 0); + //先删后加代理明细 + rs.executeUpdate("delete from workflow_agentconditionset where agentid=?", agentid); + for(AgentBean bean : datas){ + bean.setAgentid(agentid); + bean.setWorkflowid(workflowid); + bean.setAgenttype(agenttype); + bean.setBagentuid(bagentuid); + bean.setBegindate(begindate); + bean.setBegintime(begintime); + bean.setEnddate(enddate); + bean.setEndtime(endtime); + if(!this.insertAgentDetail(bean)) + throw new Exception("InsertAgentDetail Exception"); + } + } + return "success"; + } + + /** + * 批量修改代理时间 + */ + public String batchChangeAgentDate(String agentids, AgentDateBean bean) throws Exception{ + String result = ""; + for(String id : agentids.split(",")){ + result = this.changeAgentSet(Util.getIntValue(id, 0), bean, 2, false, null); + } + return result; + } + + /** + * 修改单条代理设置(日期或代理条件等) + * 需与修改前时间比较判断,如果是代理中->代理中情况不应做收回再重新代理逻辑,优化性能 + * @param overlapMethod 1:从新保存的代理设置中去除重复设置内容 2:以新保存的代理设置替换已有重复的代理设置 3:无重复 + * @param ismodifyCondition 是否修改了代理条件信息 + * @param datas 代理条件明细信息 + */ + public String changeAgentSet(int agentid, AgentDateBean bean, int overlapMethod, boolean ismodifyCondition, List datas) throws Exception{ + boolean haveAgentAllRight = AgentBiz.judgeHaveAgentAllRight(user); + String allUserid = ServiceUtil.getAllUserid(user); + RecordSet rs = new RecordSet(); + rs.executeQuery("select * from workflow_agent where agentid=? and agenttype='1' ", agentid); + if(rs.next()){ + int bagentuid = Util.getIntValue(rs.getString("beagenterid")); + if(!((","+allUserid+",").indexOf(","+bagentuid+",") > -1 || haveAgentAllRight)) { + return "noRight"; + } + String oldAgentstate = this.calculateAgentState(rs.getString("begindate"), rs.getString("begintime"), rs.getString("enddate"), rs.getString("endtime")); + String newAgentstate = this.calculateAgentState(bean); + int workflowid = Util.getIntValue(rs.getString("workflowid")); + //代理处理情况需判断重复,如存在则覆盖原记录 + if(this.judgeExistAgentDeal(agentid)){ + List overlapList = this.verifyOverlapInfo(bagentuid, workflowid+"", bean, agentid); + if(overlapList.size() > 0){ + if(overlapMethod == 1){ //从新保存的代理设置中去除重复设置内容 + return "ignore"; + }else{ //默认以新保存设置覆盖原设置,即收回被覆盖的代理设置 + this.takeBackAgent(overlapList, true); + } + } + } + //原代理为代理中状态,修改后为非代理中状态,需收回原代理 + if(ismodifyCondition || ("1".equals(oldAgentstate) && !"1".equals(newAgentstate))){ + boolean needUpdateState = !"1".equals(newAgentstate); //保存后仍为代理中情况不更新收回设置 + this.takeBackAgent(agentid, true, needUpdateState); + } + //更新代理条件信息(必须在收回代理之后) + if(ismodifyCondition && datas != null && datas.size() > 0){ + this.saveAgentConditonSet(agentid, datas); + } + //修改代理时间及代理状态 + int newagenttype = "2".equals(newAgentstate) ? 0 : 1; + AgentBean updatebean = new AgentBean(); + updatebean.setAgentid(agentid); + updatebean.setAgenttype(newagenttype); + updatebean.setBegindate("1".equals(bean.judgeBeginDateEmpty()) ? "" : bean.getBegindate()); + updatebean.setBegintime("1".equals(bean.judgeBeginTimeEmpty()) ? "" : bean.getBegintime()); + updatebean.setEnddate("1".equals(bean.judgeEndDateEmpty()) ? "" : bean.getEnddate()); + updatebean.setEndtime("1".equals(bean.judgeEndTimeEmpty()) ? "" : bean.getEndtime()); + this.updateAgentSetById(updatebean, "updateDate"); + //原代理为非代理中状态,新代理为代理中状态,需重新代理(代理已有待办,必须要要修改后的代理是生效中才能代理出去,并不能只要发生修改就代理出去) + if("1".equals(newAgentstate)) + this.agentOutRequest(agentid); + } + return "success"; + } + + /** + * 根据即将保存的代理条件信息判断是否存在代理流程处理 + */ + public boolean judgeExistAgentDeal(List datas){ + boolean exist = false; + for(AgentBean bean : datas){ + if(bean.getIsproxydeal() == 1){ + exist = true; + break; + } + } + return exist; + } + + /** + * 根据agentid取数据库配置判断是否存在代理流程处理 + */ + private boolean judgeExistAgentDeal(int agentid){ + boolean exist = false; + if(agentid > 0){ + RecordSet rs = new RecordSet(); + rs.executeQuery("select agentid from workflow_agentconditionset where agentid=? and isproxydeal='1'", agentid+""); + exist = rs.next(); + } + return exist; + } + + + /** + * 代理日期与当前日期比较,计算代理状态 + */ + private String calculateAgentState(AgentDateBean bean){ + return this.calculateAgentState(bean.getBegindate(), bean.getBegintime(), bean.getEnddate(), bean.getEndtime()); + } + private String calculateAgentState(String beginDate, String beginTime, String endDate, String endTime) { + String restr = "0"; + Date curDateTime = StringToDate(TimeUtil.getCurrentTimeString()); + Date begDateTime = StringToDate(beginDate + " " + beginTime); + Date endDateTime = StringToDate(endDate + " " + endTime); + if (begDateTime.before(curDateTime) && endDateTime.after(curDateTime)) { + restr = "1"; // 代理中 + } else if (endDateTime.before(curDateTime)) { + restr = "2"; // 已结束 + } else if (begDateTime.after(curDateTime)) { + restr = "3"; // 未开始 + } + return restr; + } + + /** + * 字符串转日期 + */ + private Date StringToDate(String s) { + Date time = new Date(); + SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + try { + time = sd.parse(s); + } catch (Exception e) { + // System.out.println("输入的日期格式有误!"); + } + return time; + } + + /** + * 代理范围选择全部时,全部的流程id串 + */ + public String getAgentWorkflowRange(String agentrange, String rangetype, int usertype){ + String workflowids = ""; + if (agentrange.equals("2")) { //代理全部流程 + RecordSet rs = new RecordSet(); + String sql = "select id from workflow_base where isvalid='1' "; + if (usertype == 1) //客户用户只能代理“外部访问者支持”类型的流程 + sql = " and workflowtype=29 "; + sql += " order by workflowname"; + rs.executeQuery(sql); + StringBuffer sb = new StringBuffer(); + while (rs.next()) { + sb.append(Util.getIntValue(rs.getString("id")) + ","); + } + workflowids = sb.toString(); + if (workflowids.endsWith(",")) + workflowids = workflowids.substring(0, workflowids.length() - 1); + } else if (agentrange.equals("1")) { + if (!rangetype.equals("") && !rangetype.startsWith(",")) + workflowids = rangetype; + } + return workflowids; + } + + /** + * 保存前校验代理是否存在重复设置(只针对代理处理情况校验) + * 调用从方法前应已判断是否存在代理处理情况,存在才走此验证方法 + */ + public List verifyOverlapInfo(int bagentuid, String workflowid, AgentDateBean bean, int currentagentid) { + List overlapList = new ArrayList(); + if(bagentuid <= 0 || "".equals(workflowid)) + return overlapList; + RecordSet rs = new RecordSet(); + String begindate = bean.getBegindate() + " " + bean.getBegintime(); + String enddate = bean.getEnddate() + " " + bean.getEndtime(); + /* + * 检查当前新建的代理时间范围是否在之前设置的代理时间范围内有重叠 + * 原开始日期大于新开始日期 且 新开始日期小于原结束日期 且 原结束日期小于新结束日期 新开始日期小于原开始日期 且 结束日期大于原结束日期 + * 新开启日期小于原开始日期 且 原开始日期小于结束日期 且 新结束日期小于原结束日期 原开始日期小于新开始日期 且 新结束日期小于原结束日期 + */ + String versionsIds = WorkflowVersion.getAllVersionStringByWFIDs(workflowid); + StringBuffer agentsql = new StringBuffer(); + agentsql.append("select agentid from workflow_agentconditionset t ") + .append(" where bagentuid ='" + bagentuid + "'") + .append(" and agenttype='1' and isproxydeal='1'") + .append(" and (" + Util.getSubINClause(versionsIds, "workflowid", "IN") + ") "); + if (currentagentid > 0){ //排除掉当前记录 + agentsql.append(" and agentid<>'"+currentagentid+"' "); + } + agentsql.append(this.getOverlapDateRangeSql(begindate, enddate, rs.getDBType())); + rs.executeQuery(agentsql.toString()); + while (rs.next()) { + String agentid = rs.getString("agentid"); + if(overlapList.indexOf(agentid) == -1) //去重复 + overlapList.add(agentid); + } + return overlapList; + } + public Map batchVerifyOverlapInfo(int bagentuid, List wfAllIds, AgentDateBean bean, int currentagentid) { + Map overlapList = new HashMap<>(); + if(bagentuid <= 0 || wfAllIds.size()<=0) + return overlapList; + RecordSet rs = new RecordSet(); + String begindate = bean.getBegindate() + " " + bean.getBegintime(); + String enddate = bean.getEnddate() + " " + bean.getEndtime(); + /* + * 检查当前新建的代理时间范围是否在之前设置的代理时间范围内有重叠 + * 原开始日期大于新开始日期 且 新开始日期小于原结束日期 且 原结束日期小于新结束日期 新开始日期小于原开始日期 且 结束日期大于原结束日期 + * 新开启日期小于原开始日期 且 原开始日期小于结束日期 且 新结束日期小于原结束日期 原开始日期小于新开始日期 且 新结束日期小于原结束日期 + */ + StringBuffer agentsql = new StringBuffer(); + agentsql.append("select agentid,workflowid from workflow_agentconditionset t ") + .append(" where bagentuid ='" + bagentuid + "'") + .append(" and agenttype='1' and isproxydeal='1'") + .append(" and (" + Util.getSubINClause(StringUtils.join(wfAllIds,","), "workflowid", "IN") + ") "); + if (currentagentid > 0){ //排除掉当前记录 + agentsql.append(" and agentid<>'"+currentagentid+"' "); + } + agentsql.append(this.getOverlapDateRangeSql(begindate, enddate, rs.getDBType())); + rs.executeQuery(agentsql.toString()); + while (rs.next()) { + String agentid = rs.getString("agentid"); + String workflowid = WorkflowVersion.getActiveVersionWFID(rs.getString("workflowid")); + overlapList.put(agentid,workflowid); + } + return overlapList; + } + + private String getOverlapDateRangeSql(String begindate, String enddate, String dbtype){ + StringBuffer datesql = new StringBuffer(); + if ("oracle".equalsIgnoreCase(dbtype)||"postgresql".equalsIgnoreCase(dbtype)) { + datesql.append(" and ((to_date(beginDate || ' ' || beginTime,'yyyy-mm-dd hh24:mi')<= to_date('" + begindate + "','yyyy-mm-dd hh24:mi') and"); + datesql.append(" to_date('"+ begindate + "','yyyy-mm-dd hh24:mi')<= to_date(endDate||' '||endTime,'yyyy-mm-dd hh24:mi') and"); + datesql.append(" to_date(endDate || ' ' || endTime,'yyyy-mm-dd hh24:mi')<=to_date('"+ enddate + "','yyyy-mm-dd hh24:mi') )"); + datesql.append(" or (to_date('"+ begindate + "','yyyy-mm-dd hh24:mi')<= to_date(beginDate||' '|| beginTime,'yyyy-mm-dd hh24:mi') and"); + datesql.append(" to_date(endDate|| ' ' || endTime,'yyyy-mm-dd hh24:mi') <= to_date('"+ enddate + "','yyyy-mm-dd hh24:mi') )"); + datesql.append(" or (to_date('"+ begindate+ "','yyyy-mm-dd hh24:mi') <= to_date(beginDate|| ' ' || beginTime,'yyyy-mm-dd hh24:mi') and"); + datesql.append(" to_date(beginDate|| ' ' || beginTime,'yyyy-mm-dd hh24:mi') <= to_date('"+ enddate + "','yyyy-mm-dd hh24:mi') and"); + datesql.append(" to_date('"+ enddate+ "','yyyy-mm-dd hh24:mi') <=to_date(endDate|| ' ' || endTime,'yyyy-mm-dd hh24:mi') )"); + datesql.append(" or (to_date(beginDate|| ' ' || beginTime,'yyyy-mm-dd hh24:mi') <= to_date('"+ begindate + "','yyyy-mm-dd hh24:mi') and"); + datesql.append(" to_date('"+ enddate+ "','yyyy-mm-dd hh24:mi') <= to_date(endDate|| ' ' || endTime,'yyyy-mm-dd hh24:mi') ))"); + } else if("mysql".equalsIgnoreCase(dbtype)){ + String begColumn = "concat(beginDate,' ',beginTime)"; + String endColumn = "concat(endDate,' ',endTime)"; + datesql.append(" and (("+begColumn+" <= '" + begindate + "' and '" + begindate + "' <= "+endColumn+" and "+endColumn+" <= '" + enddate + "') "); + datesql.append(" or ('" + begindate + "' <= "+begColumn+" and "+endColumn+" <= '" + enddate + "') "); + datesql.append(" or ('" + begindate + "' <= "+begColumn+" and "+begColumn+" <= '" + enddate + "' and '" + enddate + "' <= "+endColumn+") "); + datesql.append(" or ("+begColumn+" <= '" + begindate + "' and '" + enddate + "' <= "+endColumn+"))"); + } else { + datesql.append(" and ((beginDate + ' ' + beginTime <= '" + begindate + "' and '" + begindate + "' <= endDate + ' ' + endTime and endDate + ' ' + endTime <= '" + enddate + "') "); + datesql.append(" or ('" + begindate + "' <= beginDate + ' ' + beginTime and endDate + ' ' + endTime <= '" + enddate + "') "); + datesql.append(" or ('" + begindate + "' <= beginDate + ' ' + beginTime and beginDate + ' ' + beginTime <= '" + enddate + "' and '" + enddate + "' <= endDate + ' ' + endTime) "); + datesql.append(" or (beginDate + ' ' + beginTime <= '" + begindate + "' and '" + enddate + "' <= endDate + ' ' + endTime))"); + } + return datesql.toString(); + } + + /** + * 多流程不带代理条件代理已有待办数据(新建时使用) + */ + private String agentOutRequest(int agentuid, int bagentuid, String wfids) throws Exception{ + return this.agentOutRequest(agentuid, bagentuid, wfids, "", ""); + } + + /** + * 根据workflow_currentoperator的id,单条记录代理出去 + * @param agentuid + * @param bagentuid + * @param wfids + * @param entityId + * @return + * @throws Exception + */ + public String agentOutRequest(int agentuid, int bagentuid, String wfids, int entityId) throws Exception{ + return this.agentOutRequest(agentuid, bagentuid, wfids, "", "", entityId); + } + + /** + * 根据agentid取数据库配置做代理已有待办数据(编辑代理设置时调用) + * 注:调用此方法前代理设置(条件/代理人)等信息需先入库 + */ + public String agentOutRequest(int agentid) throws Exception{ + RecordSet rs = new RecordSet(); + rs.executeQuery("select * from workflow_agentconditionset where agentid=? " + + " and agenttype='1' and isproxydeal='1' order by agentbatch asc,id", agentid+""); + String result = ""; + while(rs.next()){ + int ispendthing = Util.getIntValue(rs.getString("ispendthing"), 0); + String conditionkeyid = Util.null2String(rs.getString("conditionkeyid")); + String conditionss = Util.null2String(rs.getString("conditionss")); + if(ispendthing != 1){ //未开启代理已有待办 + if("".equals(conditionkeyid) && "".equals(conditionss)) + break; //前批次为空情况,后续都不代理已有待办 + else + continue; + } + //对接门户 + //代理已有的待办事宜 + if(ispendthing == 1){ + rs.writeLog("================= AgentManager ready to send portal ==================="); + Class clazz = Class.forName("com.customization.dito.sendtodo.SendPortalAgentCmd"); + if(clazz.getMethod("DealPortalTodoAndDone",new Class[]{int.class,int.class,String.class,User.class}) != null) { + Method method = clazz.getMethod("DealPortalTodoAndDone",new Class[]{int.class,int.class,String.class,User.class}); + Object newInstance = clazz.newInstance(); + method.invoke(newInstance,Util.getIntValue(rs.getString("agentuid")),Util.getIntValue(rs.getString("bagentuid")),rs.getString("workflowid"),user); + } + } + result = this.agentOutRequest(Util.getIntValue(rs.getString("agentuid")), Util.getIntValue(rs.getString("bagentuid")), + rs.getString("workflowid"), conditionkeyid, conditionss); + if(!"success".equals(result)) + break; + } + //成功则isset置为1,定时循环代理即不用扫描到此条设置 + if("success".equals(result) || "".equals(result)){ + AgentBean updatebean = new AgentBean(); + updatebean.setAgentid(agentid); + this.updateAgentSetById(updatebean, "updateIsSet"); + } + return result; + } + + private String agentOutRequest(int agentuid, int bagentuid, String wfids, String conditionkeyid, String conditionss) throws Exception { + return this.agentOutRequest(agentuid, bagentuid, wfids, conditionkeyid, conditionss, 0); + } + + /** + * 根据代理用户及条件,代理已有待办数据 + */ + private String agentOutRequest(int agentuid, int bagentuid, String wfids, String conditionkeyid, String conditionss, int entityId) throws Exception{ + if(agentuid <= 0 || bagentuid <= 0 || "".equals(wfids)) + return "failed"; + //多流程+代理条件当做异常禁止掉 + if(wfids.indexOf(",") > -1 && !"".equals(conditionkeyid)) + return "forbid"; + //单流程才校验代理条件 + boolean needVerifyCondition = Util.getIntValue(wfids)>0 && !"".equals(conditionkeyid) && !"".equals(conditionss); + String versionsIds = WorkflowVersion.getAllVersionStringByWFIDs("" + wfids); + RecordSet rs = new RecordSet(); + RecordSet rs1 = new RecordSet(); + RecordSet rs2 = new RecordSet(); + RecordSet rs3 = new RecordSet(); + //char separ = Util.getSeparator(); + //取数据库服务器的当前时间 + String currentdate = ""; // 当前日期 + String currenttime = ""; // 当前时间 + rs.executeProc("GetDBDateAndTime",""); + if(rs.next()){ + currentdate = rs.getString("dbdate"); + currenttime = rs.getString("dbtime"); + } + String instrAgent = "insert into workflow_currentoperator(requestid,userid,groupid,workflowid,workflowtype,usertype,isremark,nodeid,agentorbyagentid,agenttype,showorder,receivedate,receivetime,viewtype,iscomplete,islasttimes,groupdetailid,preisremark,needwfback) " + + " values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ";//传阅数据无法代理----去存储过程,SqlServer存储过程会截断isremark + String sql = "select a.id,a.requestid,a.groupid,a.workflowid,a.workflowtype,a.usertype,a.nodeid,a.showorder,a.isremark,b.isbill,a.groupdetailid,a.takisremark,a.isbereject,a.takid, a.multitaklevel, a.istakout, a.isInMultiTak " + + " from workflow_currentoperator a,workflow_base b where a.workflowid=b.id and a.userid = " + bagentuid + " and a.usertype=0 " + + " and a.isremark in ('0','1','5','7','8','9',11) " + + " and a.agenttype ='0' and a.agentorbyagentid ='-1' and ("+Util.getSubINClause(versionsIds, "a.workflowid", "IN")+") "; + if(entityId > 0) { + sql += " and a.id = " + entityId + " "; + }else { + sql+=" order by a.id asc"; + } + rs.executeQuery(sql); + List> reqlist = new ArrayList>(); + List requestMsgEntity = null; + //传阅流程要设置到传阅的表中---代理收回暂不删除这些数据 + String cyRequestids = ""; + //新加isbereject字段,用于记录当前记录是不是被退回记录 + String isbereject = ""; + while (rs.next()) { + int usertype = Util.getIntValue(rs.getString("usertype")); + if(usertype != 0) + continue; + String keyid = rs.getString("id"); + String requestid = rs.getString("requestid"); + if(needVerifyCondition && !this.judgeAgentCondition(requestid, conditionkeyid, conditionss)) + continue; //代理条件不满足 + if (!judgeSecLevel(requestid, agentuid)) { + //代理人密级不满足 + continue; + } + String nodeid = rs.getString("nodeid"); + String isremark = rs.getString("isremark"); + isbereject = ""; + isbereject = rs.getString("isbereject"); + String takisremark = rs.getString("takisremark"); + if((","+cyRequestids).indexOf(","+requestid+",") == -1 && "11".equals(isremark)){ + cyRequestids += requestid+","; + } + Map reqmap = new HashMap(); + reqmap.put("id", keyid); + reqmap.put("requestid", requestid); + reqmap.put("workflowid", rs.getString("workflowid")); + reqmap.put("nodeid", nodeid); + reqmap.put("isbill", rs.getString("isbill")); + reqlist.add(reqmap); + + //多级意见征询数据 + String takId = rs.getString("takid"); + String multitaklevel = rs.getString("multitaklevel"); + int istakout = Util.getIntValue(rs.getString("istakout"), 0); + int isInMultiTak = Util.getIntValue(rs.getString("isInMultiTak"), 0); + + String userType = rs.getString("usertype"); + //让代理人获得任务 + String agentSqlwhere = " requestid="+requestid+" and userid="+agentuid+" and usertype=0 "; + /*String params = requestid + separ + "" + agentuid + separ + rs.getString("groupid") + separ + + rs.getString("workflowid") + separ + rs.getString("workflowtype") + separ + + userType + separ + isremark + separ + nodeid + + separ + "" + bagentuid + separ + "2" + separ + rs.getString("showorder") + separ + + rs.getInt("groupdetailid"); + rs1.executeProc("workflow_CurrentOperator_I", params); */ + rs1.executeUpdate("update workflow_currentoperator set islasttimes = 0 where requestid = ? and userid = ? and usertype = ?",requestid,agentuid,userType); + rs1.executeUpdate(instrAgent,requestid,agentuid,Util.getIntValue(rs.getString("groupid"),0),rs.getString("workflowid"),rs.getString("workflowtype"),userType,isremark,nodeid,bagentuid,"2",rs.getString("showorder"),currentdate,currenttime,0,0,1,rs.getInt("groupdetailid"),isremark,'1'); + //查询刚插入的代理人记录 + int insertKeyid = 0; + String insertSql = "select max(id) as id from workflow_currentoperator where "+agentSqlwhere+" and nodeid="+nodeid + + " and agenttype=2 and islasttimes=1 and isremark="+isremark; + rs1.executeQuery(insertSql); + if(rs1.next()) + insertKeyid = Util.getIntValue(rs1.getString("id")); + if(insertKeyid <= 0) { + throw new Exception("Insert agenter record exception"); + }else { + rs3.executeUpdate("update workflow_currentoperator set isbereject=? where id=?",isbereject,insertKeyid); + } + this.workflowCurrentOperatorIdMap.put(Util.getIntValue(keyid), insertKeyid); + //处理意见征询 + if (!"".equals(takisremark)) { + rs1.executeUpdate("update workflow_currentoperator set takisremark=?, takid=?, multitaklevel=?, istakout = ?, isInMultiTak = ? where id=? and requestid=?", + takisremark,"".equals(takId) ? null : takId, "".equals(multitaklevel) ? null : multitaklevel, istakout, isInMultiTak, insertKeyid, requestid); + //将代理前操作者征询出去的记录更新为代理人的记录 + rs1.executeUpdate("update workflow_currentoperator set takid = ? where takid = ? and requestid = ?", insertKeyid, keyid, requestid); + if("-2".equals(takisremark)){ //意见征询人,未回复 + rs1.executeUpdate("update workflow_currentoperator set takisremark=null where id=? and requestid=?", keyid, requestid); + rs1.executeQuery("select id from workflow_currentoperator where isremark = 1 and takisremark = 2 and userid = ? and nodeid = ? and requestid = ? order by id desc", agentuid, nodeid, requestid); + if (rs1.next()) { + //如果代理人有意见征询未回复的记录,更新islasttimes + int beTakId = Util.getIntValue(rs1.getString("id")); + RecordSet recordSet = new RecordSet(); + recordSet.executeUpdate("update workflow_currentoperator set islasttimes = 1 where id = ?", beTakId); + recordSet.executeUpdate("update workflow_currentoperator set islasttimes = 0 where id = ?", insertKeyid); + } + } + } + // 判断当前人是否有转发 且转发记录是否已提交,若未提交则需要把转发人 修改为被代理人 + rs1.executeQuery("select a.isremark,a.id,a.takisremark,a.userid from workflow_currentoperator a,workflow_forward b" + + " where a.id = b.BeForwardid and b.requestid = ? and b.Forwardid = ? ", requestid, keyid); + while (rs1.next()) { + int forwardremark = Util.getIntValue(rs1.getString("isremark"), -1); + if (forwardremark == 1) { + rs2.executeQuery("select * from workflow_currentoperator where "+agentSqlwhere+" and nodeid="+nodeid + " order by id desc"); + + if (rs2.next()){ + String forwardId = rs2.getString("id"); + int forwardTakistemark = rs2.getInt("takisremark"); + + String beForwardId = rs1.getString("id"); + int beForwardTakisremark = rs1.getInt("takisremark"); + int beForwardIsremark = rs1.getInt("isremark"); + int beForwardUserid = rs1.getInt("userid"); + + rs2.executeUpdate("update workflow_forward set Forwardid = "+forwardId+" where requestid="+requestid+" and BeForwardid="+beForwardId); + + if (beForwardTakisremark == 2 && beForwardIsremark == 1 && + forwardTakistemark == -2 && beForwardUserid == agentuid) { + //代理完成之后, 出现自己意见征询给自己的情况 + RecordSet recordSet = new RecordSet(); + recordSet.executeUpdate("update workflow_currentoperator set islasttimes = 1 where id = ?", beForwardId); + recordSet.executeUpdate("update workflow_currentoperator set islasttimes = 0 where id = ?", forwardId); + } + } + } + } + //处理转发 + if("1".equals(isremark)){ + rs2.executeUpdate("update workflow_forward set beforwardid = " + insertKeyid + " where requestid="+ requestid + " and beforwardid=" + keyid); + rs2.executeUpdate("update workflow_forward set forwardid = " + insertKeyid + " where requestid="+ requestid + " and forwardid=" + keyid); + // 将当前节点的签字意见权限也同时给代理人,只处理转发的 + String qsql = " select logid from workflow_logviewusers where userid = " + bagentuid + + " and exists (select 1 from workflow_requestLog where workflow_requestLog.requestid = " + requestid + " and workflow_requestLog.nodeid = " + + nodeid + " and workflow_requestLog.logtype = '7' and workflow_logviewusers.logid = workflow_requestLog.logid)"; + rs1.executeQuery(qsql); + while (rs1.next()) { + String logid = rs1.getString("logid"); + if (!"".equals(logid) && !"-1".equals(logid)) { + String isql = "insert into workflow_logviewusers (logid,userid) values (" + logid + ","+ agentuid + ")"; + rs2.executeUpdate(isql); + } + } + } + // 代理人是流程的未操作者 + if("1".equals(isremark) || "11".equals(isremark) || "8".equals(isremark) || "9".equals(isremark)){ + rs1.executeQuery(ServiceUtil.calculateCurrentNodeSql(requestid,agentuid,0)); + if(rs1.next()){ + RecordSet recordSet = new RecordSet(); + recordSet.executeUpdate("update workflow_currentoperator set islasttimes = 0 where id = ?", insertKeyid); + recordSet.executeUpdate("update workflow_currentoperator set islasttimes = 1 where id = ?", rs1.getString("id")); + } + } + + // 将流程从自己的代办转到已办 + rs1.executeUpdate("update workflow_currentoperator set isremark='2', agenttype='1', agentorbyagentid="+agentuid+" where id=? and requestid=?",keyid,requestid); + //处理islasttime(被代理人同时为另一操作者的代理人情况) + wfCurrentOperatorAgent(rs1, Util.getIntValue(requestid), Util.getIntValue(nodeid), usertype+"", bagentuid, false); + //处理消息 + RequestOperationMsgManager romm = new RequestOperationMsgManager(); + requestMsgEntity = romm.getAgentMsg(requestid,String.valueOf(agentuid),String.valueOf(bagentuid)); + new MsgPushUtil().pushMsg(requestMsgEntity); + } + //统一处理传阅流程 + List> chuanyueItems = new ArrayList(); + if(cyRequestids.length()>1){ + cyRequestids = cyRequestids.substring(0,cyRequestids.length()-1); + rs.executeQuery("select type,isSubmitSign,isChuanyue,isRemind,WORKFLOWID,nodeid,requestid,resourceid,uuid from workflow_chuanyue where requestid in("+cyRequestids+") and userid=?",user.getUID()); + while(rs.next()){ + List chuanyueItem = new ArrayList(); + chuanyueItem.add(agentuid); + chuanyueItem.add("0"); + chuanyueItem.add(Util.null2String(rs.getString("type"))); + chuanyueItem.add(Util.null2String(rs.getString("isSubmitSign"))); + chuanyueItem.add(Util.null2String(rs.getString("isChuanyue"))); + chuanyueItem.add(Util.null2String(rs.getString("isRemind"))); + chuanyueItem.add(Util.null2String(rs.getString("WORKFLOWID"))); + chuanyueItem.add(Util.null2String(rs.getString("nodeid"))); + chuanyueItem.add(Util.null2String(rs.getString("requestid"))); + chuanyueItem.add(Util.null2String(rs.getString("resourceid"))); + chuanyueItem.add(Util.null2String(rs.getString("uuid"))); + chuanyueItems.add(chuanyueItem); + } + } + RecordSetTrans rst = new RecordSetTrans(); + if(chuanyueItems.size() > 0){ + rst.executeBatchSql("insert into WORKFLOW_CHUANYUE(userid,usertype,type,isSubmitSign,isChuanyue,isRemind,WORKFLOWID,nodeid,requestid,resourceid,uuid) values(?,?,?,?,?,?,?,?,?,?,?) ",chuanyueItems); + } + + RequestAddShareInfo shareinfo = new RequestAddShareInfo(); + for(Map reqmap : reqlist){ + int requestid = Util.getIntValue(reqmap.get("requestid")); + int workflowid = Util.getIntValue(reqmap.get("workflowid")); + int nodeid = Util.getIntValue(reqmap.get("nodeid")); + try { + //文档权限 + shareinfo.setRequestid(requestid); + shareinfo.SetWorkFlowID(workflowid); + shareinfo.SetNowNodeID(nodeid); + shareinfo.SetNextNodeID(nodeid); + shareinfo.setIsbill(Util.getIntValue(reqmap.get("isbill"), 0)); + shareinfo.setUser(user); + shareinfo.SetIsWorkFlow(1); + shareinfo.setHaspassnode(true); + shareinfo.addShareInfoFromAgent(agentuid+""); + } catch (Exception e) { + e.printStackTrace(); + } + } + return "success"; + } + + /** + * 判断代理条件是否满足 + */ + private boolean judgeAgentCondition(String requestid, String conditionkeyid, String conditionss){ + if("".equals(conditionkeyid) || "".equals(conditionss)) + return true; + RuleInterface rif = new RuleInterface(); + return rif.compareRuleforWF(conditionss, requestid, conditionkeyid,RuleInterface.RULESRC_AGENT); + } + + /** + * 判断代理人是否满足流程密级 + * @param requestid + * @param agentuid + * @return + */ + private boolean judgeSecLevel(String requestid, int agentuid) { + if (HrmClassifiedProtectionBiz.isOpenClassification() && !new RequestSecLevelBiz().hasWfRight(Util.getIntValue(requestid), new User(agentuid))) { + return false; + } + return true; + } + + /** + * 取代理设置中的全部代理人信息 + */ + public String getAgentuid(int agentid, int bagentuid){ + String agentuid = ""; + RecordSet rs = new RecordSet(); + rs.executeQuery("select agentuid from workflow_agentconditionset where agentid=? and bagentuid=?", agentid, bagentuid); + while(rs.next()){ + agentuid += rs.getString("agentuid") + ","; + } + if(agentuid.endsWith(",")) + agentuid = agentuid.substring(0, agentuid.length()-1); + return agentuid; + } + + + /** + * 根据代理人及被代理人取其所有流程的代理关系 + */ + public List getAgentRangeByUser(int agentuid, int bagentuid){ + List range = new ArrayList(); + if(agentuid <= 0 || bagentuid <= 0) + return range; + String currentDateTime = TimeUtil.getCurrentTimeString().substring(0, 16); + String sql = "select agentid from workflow_agent t1,workflow_base t2 where t1.workflowid = t2.id" + + " and t1.agenttype='1' and (t2.isvalid='1' or t2.isvalid='3') and t1.beagenterid=" + bagentuid + + " and exists (select 1 from workflow_agentconditionset t3 where t1.agentid=t3.agentid and t3.agentuid='"+agentuid+"')"; + RecordSet rs = new RecordSet(); + if("oracle".equals(rs.getDBType())){ + sql += " and to_date(endDate||' '||endTime, 'yyyy-mm-dd hh24:mi') > to_date('"+currentDateTime+"', 'yyyy-mm-dd hh24:mi')"; + } + else if("postgresql".equals(rs.getDBType())) + { + sql += " and endDate||' '||endTime > '"+currentDateTime+"'"; + } + else{ + sql += " and endDate+' '+endTime > '"+currentDateTime+"'"; + } + rs.executeQuery(sql); + while(rs.next()){ + range.add(rs.getString("agentid")); + } + return range; + } + + /** + * 根据agentid做代理收回 + * @param needBackRunning 是否收回流转中数据 + * @param needUpdateState 是否需要更新收回设置信息,默认为true + */ + public boolean takeBackAgent(int agentid, boolean needBackRunning, boolean needUpdateState){ + List range = new ArrayList(); + range.add(agentid+""); + return this.takeBackAgent(range, needBackRunning, needUpdateState); + } + public boolean takeBackAgent(List range, boolean needBackRunning){ + return this.takeBackAgent(range, needBackRunning, true); + } + public boolean takeBackAgent(List range, boolean needBackRunning, boolean needUpdateState){ + String agentids = ""; + for(String agentid : range){ + if(Util.getIntValue(agentid) > 0) + agentids += "'"+agentid+"',"; + } + if(agentids.endsWith(",")) + agentids = agentids.substring(0, agentids.length()-1); + if("".equals(agentids)) + return false; + RecordSet rs = new RecordSet(); + rs.executeQuery("select * from workflow_agentconditionset where ("+Util.getSubINClause(agentids, "agentid", "IN")+") order by agentid"); + int agentid_tmp = 0; + while(rs.next()){ + if(needBackRunning) //收回流转中数据 + this.agentBackRequest(rs.getInt("agentuid"), rs.getInt("bagentuid"), rs.getString("workflowid")); + //前后两条agetnid不一致,表示此条代理明细为最后一条,更新设置表状态 + int agentid = Util.getIntValue(rs.getString("agentid")); + if(needUpdateState && agentid != agentid_tmp){ + AgentBean updatebean = new AgentBean(); + updatebean.setAgentid(agentid); + this.updateAgentSetById(updatebean, "takeBackAgent"); + } + agentid_tmp = agentid; + } + return true; + } + public boolean batchTakeBackAgent(Map overlapMap, boolean needBackRunning, boolean needUpdateState,List agentWfList){ + String agentids = ""; + for(String agentid : overlapMap.keySet()){ + if(Util.getIntValue(agentid) > 0) + agentids += "'"+agentid+"',"; + } + if(agentids.endsWith(",")) + agentids = agentids.substring(0, agentids.length()-1); + if("".equals(agentids)) + return false; + RecordSet rs = new RecordSet(); + rs.executeQuery("select agentid,agentuid,bagentuid,workflowid from workflow_agentconditionset where ("+Util.getSubINClause(agentids, "agentid", "IN")+") order by agentid"); + int agentid_tmp = 0; + String takBackAgentids = ""; + while(rs.next()){ + String workflowid = rs.getString("workflowid"); + if(needBackRunning && agentWfList.contains(workflowid)) //收回流转中数据 + this.agentBackRequest(rs.getInt("agentuid"), rs.getInt("bagentuid"), workflowid); + //前后两条agetnid不一致,表示此条代理明细为最后一条,更新设置表状态 + int agentid = Util.getIntValue(rs.getString("agentid")); + if(needUpdateState && agentid != agentid_tmp){ + takBackAgentids += agentid + ","; + } + agentid_tmp = agentid; + } + this.batchUpdateAgentSetById(takBackAgentids); + return true; + } + + public String agentBackRequest(int agentuid, int bagentuid, String wfids) { + return agentBackRequest(agentuid, bagentuid, wfids, 0); + } + + /** + * 代理收回已代理出去的流程 + * @param agentuid 代理人 + * @param bagentuid 被代理人 + * @param wfids 流程范围 + */ + public String agentBackRequest(int agentuid, int bagentuid, String wfids, int requestId){ + if(agentuid <=0 || bagentuid <=0 || "".equals(wfids)) + return "failed"; + RecordSet rs1 = new RecordSet(); + RecordSet rs2 = new RecordSet(); + RecordSet rs3 = new RecordSet(); + RecordSet rs_update = new RecordSet(); + List> doclist = new ArrayList<>(); + RequestOperationMsgManager romm = new RequestOperationMsgManager(); + try{ + String tempsql = ""; + String versionsIds = WorkflowVersion.getAllVersionStringByWFIDs(wfids); + String sql = "select * from workflow_currentoperator where (isremark in ('0','1','5','7','8','9','11') or (isremark = 2 and takisremark = 2 and istakout = 1)) and userid = ? and usertype=0 " + + " and agentorbyagentid = ? and agenttype = '2' and workflowid in (" + versionsIds + ")"; + if (requestId > 0) { + sql += " and requestid = ? order by id desc "; + rs1.executeQuery(sql, agentuid, bagentuid, requestId); + } else { + sql += " order by id desc "; + rs1.executeQuery(sql, agentuid, bagentuid); + } + + + + while (rs1.next()) { + + int delKeyid = Util.getIntValue(rs1.getString("id")); + String tmprequestid = rs1.getString("requestid"); + + //代理收回消息处理 + //1、代理收回前信息 + Set beagentCID = new HashSet<>(); + int beagentCurrentIsremark = 0; + Set agentCID = new HashSet<>(); + int agentCurrentIsremark = 0; + boolean isAgentBack = false; + + //被代理人 + rs3.executeQuery("select id,isremark,islasttimes from workflow_currentoperator where requestid = ? and userid = ?",tmprequestid,bagentuid); + while (rs3.next()) { + int islasttimes = Util.getIntValue(Util.null2String(rs3.getString("islasttimes"))); + if (islasttimes ==1){ + //记录下isremark + beagentCurrentIsremark = Util.getIntValue(Util.null2String(rs3.getString("isremark"))); + } + beagentCID.add(rs3.getString("id")); + } + //代理人 + rs3.executeQuery("select id,isremark,islasttimes from workflow_currentoperator where requestid = ? and userid = ?",tmprequestid,agentuid); + while (rs3.next()) { + int islasttimes = Util.getIntValue(Util.null2String(rs3.getString("islasttimes"))); + if (islasttimes == 1){ + //记录下isremark + agentCurrentIsremark = Util.getIntValue(Util.null2String(rs3.getString("isremark"))); + } + agentCID.add(rs3.getString("id")); + } + //代理人删除消息 + List agentDelMsg = romm.getAgentBackMsg(Util.getIntValue(tmprequestid), agentuid); + List params = this.saveBackLog(Util.getIntValue(tmprequestid),agentuid); + + String tmpisremark = rs1.getString("isremark"); + String tmptakisremark = rs1.getString("takisremark"); + String isbereject = rs1.getString("isbereject"); + //int tmpgroupid = rs1.getInt("groupid"); //问题列表201,不能以groupid作为查被代理记录 + int currentnodeid = rs1.getInt("nodeid"); //流程当前所在节点 + int tmpuserid = rs1.getInt("userid"); + String tmpusertype = rs1.getString("usertype"); + int tmppreisremark = Util.getIntValue(rs1.getString("preisremark"), 0); + + //多级意见征询数据 + String takid = Util.null2String(rs1.getString("takid")); + String multitaklevel = Util.null2String(rs1.getString("multitaklevel")); + int istakout = Util.getIntValue(rs1.getString("istakout"), 0); + int isInMultiTak = Util.getIntValue(rs1.getString("isInMultiTak"), 0); + + tempsql = "select id from workflow_currentoperator where requestid=? and isremark in('2', '4') and userid=? " + + "and agenttype = '1' and agentorbyagentid=? and usertype=0 and nodeid=? "; + if(!"-2".equals(tmptakisremark) && !"2".equals(tmptakisremark)) { + tempsql += " order by id desc ";//降序排列解决退回再提交再收回问题 + } + rs2.executeQuery(tempsql, tmprequestid, bagentuid, agentuid, currentnodeid); + String agentSqlwhere = " requestid="+tmprequestid+" and userid="+agentuid+" and usertype="+tmpusertype; + String bagentSqlwhere = " requestid="+tmprequestid+" and userid="+bagentuid+" and usertype="+tmpusertype; + if (rs2.next()) { + int upKeyid = Util.getIntValue(rs2.getString("id"), 0); + + //更新当前节点的代理关系,已经经过的节点不处理,被代理人重新获得任务 + tempsql = "update workflow_currentoperator set isremark=?, preisremark=?, agenttype ='0', agentorbyagentid=-1,isbereject=? where id=?"; + rs_update.executeUpdate(tempsql, tmpisremark, tmppreisremark+"",isbereject,upKeyid); + + //修复流程代理收回,代理人为节点操作者,需处理islasttimes + tempsql = "select id from workflow_currentoperator where "+agentSqlwhere+" and islasttimes=0" + + " and id != "+delKeyid+" order by id desc"; + rs2.executeQuery(tempsql); + int realKeyid = 0; //代理人自己作为流程参与者时的操作id + if (rs2.next()) { + realKeyid = rs2.getInt("id"); + rs_update.executeUpdate("update workflow_currentoperator set islasttimes=1 where id=? and "+agentSqlwhere, rs2.getString("id")); + } + + //删除无效的代理人记录 + rs_update.executeUpdate("delete from workflow_currentoperator where id=?", delKeyid); + + + + //QC152344,防止代理抄送引起的问题 + rs2.executeQuery("select id from workflow_currentoperator where "+bagentSqlwhere+" order by id desc "); + if (rs2.next()) { + String agentcurrid = rs2.getString("id"); + rs_update.executeUpdate("update workflow_currentoperator set islasttimes=0 where " + bagentSqlwhere); + rs_update.executeUpdate("update workflow_currentoperator set islasttimes=1 where " + bagentSqlwhere + " and id = " + agentcurrid); + } + rs2.executeUpdate("update workflow_forward set beforwardid = " + upKeyid + " where requestid=" + tmprequestid + " and beforwardid=" + delKeyid); + rs2.executeUpdate("update workflow_forward set forwardid = " + upKeyid + " where requestid=" + tmprequestid + " and forwardid=" + delKeyid); + rs2.executeUpdate("update workflow_currentoperator set takid = ? where requestid = ? and takid = ?", upKeyid, tmprequestid, delKeyid); + //处理意见征询 + if(!"".equals(tmptakisremark)){ + String updatetakisremark = ""; + //意见征询人状态重新计算下 + if("0".equals(tmptakisremark) || "-2".equals(tmptakisremark)){ + rs2.executeQuery("select id from workflow_currentoperator a where requestid=? and nodeid=? and takid = ? and takisremark = '2' and (isremark = '1' or istakout = '1')", tmprequestid, currentnodeid, upKeyid); + if(rs2.next()) //存在被征询人未回复记录 + updatetakisremark = "-2"; + else + updatetakisremark = "0"; + }else{ + updatetakisremark = tmptakisremark; + } + rs_update.executeUpdate("update workflow_currentoperator set takisremark=?, takid = ?, multitaklevel = ?, istakout = ?, isInMultiTak = ? where id=? and requestid=?", + updatetakisremark,"".equals(takid) ? null : takid, "".equals(multitaklevel) ? null : multitaklevel, istakout, isInMultiTak, upKeyid, tmprequestid); + } + isAgentBack = true; + } + //代理收回成功后,处理未操作流程的代理人的意见接收人 + handleLogReceivedPerson(rs2, Integer.valueOf(tmprequestid), currentnodeid, bagentuid); + + // 流程代理收回导致操作人查不到流程 + rs2.executeQuery("select id from workflow_currentoperator where isremark in ('0','1','5','7','8','9') and "+agentSqlwhere+" order by id desc"); + if (rs2.next()) { + rs_update.executeUpdate("update workflow_currentoperator set islasttimes=1 where "+agentSqlwhere+" and id = " + rs2.getString("id")); + } + // 流程代理收回导致操作人查不到代理人转发出去的操作 + rs2.executeUpdate("update workflow_requestoperatelog set reoperatorid = ?,retype = 3 where operatetype = 'forward' and operatorid = ? and requestid = ?",bagentuid,agentuid,tmprequestid); + + // 回收代理人文档权限 + rs2.executeQuery("select distinct docid,sharelevel from Workflow_DocShareInfo where requestid=" + tmprequestid + " and userid=" + agentuid + " and beAgentid=" + bagentuid); + while (rs2.next()) { + Map docinfo = new HashMap<>(); + docinfo.put("docid", rs2.getString("docid")); + docinfo.put("sharelevel", rs2.getString("sharelevel")); + doclist.add(docinfo); + } + if (rs2.getCounts() > 0) { + rs_update.executeUpdate("delete from Workflow_DocShareInfo where requestid=" + tmprequestid + " and userid=" + agentuid + " and beAgentid=" + bagentuid); + } + //自动取消 流程关注 + new RequestAttentionBiz().cancelAttention(Util.getIntValue(tmprequestid),"agentback",null,tmpuserid+""); + + //-------------------------------------------消息处理Start + //收回代理消息 + if (isAgentBack) { + List requestMsgEntity = new ArrayList<>(); + //2、代理收回后信息 + Set beagentCID2 = new HashSet<>(); + int beagentCurrentIsremark2 = 0; + Set agentCID2 = new HashSet<>(); + int agentCurrentIsremark2 = 0; + + //被代理人 + rs3.executeQuery("select id,isremark,islasttimes from workflow_currentoperator where requestid = ? and userid = ?",tmprequestid,bagentuid); + while (rs3.next()) { + int islasttimes = Util.getIntValue(Util.null2String(rs3.getString("islasttimes"))); + if (islasttimes ==1){ + //记录下isremark + beagentCurrentIsremark2 = Util.getIntValue(Util.null2String(rs3.getString("isremark"))); + } + beagentCID2.add(rs3.getString("id")); + } + //代理人 + rs3.executeQuery("select id,isremark,islasttimes from workflow_currentoperator where requestid = ? and userid = ?",tmprequestid,agentuid); + while (rs3.next()) { + int islasttimes = Util.getIntValue(Util.null2String(rs3.getString("islasttimes"))); + if (islasttimes == 1){ + //记录下isremark + agentCurrentIsremark2 = Util.getIntValue(Util.null2String(rs3.getString("isremark"))); + } + agentCID2.add(rs3.getString("id")); + } + + //如果被代理人状态发生了变化 + if (beagentCurrentIsremark != beagentCurrentIsremark2) { + requestMsgEntity.addAll(romm.getBeAgentBackMsg(Util.getIntValue(tmprequestid),bagentuid)); + } + //收回代理后,代理人失去了流程权限 + if (agentCID2.isEmpty()) { + this.saveBackLog(params); + requestMsgEntity.addAll(agentDelMsg); + } else { + if (agentCurrentIsremark != agentCurrentIsremark2){ + requestMsgEntity.addAll(romm.getBeAgentBackMsg(Util.getIntValue(tmprequestid),agentuid)); + } + } + + new MsgPushUtil().pushMsg(requestMsgEntity); + } + //-------------------------------------------消息处理END + } + }catch(Exception e){ + e.printStackTrace(); + }finally{ + try { + //最后将代理人的文档权限转移给被代理人,收回/降级原代理人权限,给被代理人赋权 + for(Map docinfo : doclist){ + rs2.executeQuery("select Max(sharelevel) sharelevel from Workflow_DocShareInfo where docid=? and userid=?", docinfo.get("docid"), agentuid); + boolean deleteSource = true; + if(rs2.next()){ //降级代理人权限 + int sharelevel = Util.getIntValue(rs2.getString("sharelevel"), 0); + if(sharelevel > 0) { + deleteSource = false; + docinfo.put("setSourceLevel", sharelevel + ""); + } + } + docinfo.put("deleteSource", deleteSource ? "1" : "0"); + } + DocShareUtil.addDocShareForInner(user, agentuid, bagentuid, doclist); + } catch (Exception e) { + e.printStackTrace(); + } + } + return "success"; + } + + + /** + * 保存代理收回删除的操作者数据 + * @param requestId + * @param agentUid + * @throws Exception + */ + private List saveBackLog(int requestId, int agentUid) throws Exception{ + RecordSet rs = new RecordSet(); + rs.executeQuery("select * from workflow_currentoperator where requestid =? and userid = ? and islasttimes=1", requestId,agentUid); + List params = new ArrayList<>(); + while(rs.next()) { + + int isremark = Util.getIntValue(rs.getString("isremark"), -1); + int viewtype = Util.getIntValue(rs.getString("viewtype"), -1); + int id = Util.getIntValue(rs.getString("id"), -1); + int iscomplete = Util.getIntValue(rs.getString("iscomplete"), -1); + int nodeid = Util.getIntValue(rs.getString("nodeid"), -1); + String receivedate = rs.getString("receivedate"); + String receivetime = rs.getString("receivetime"); + String operatedate = rs.getString("operatedate"); + String operatetime = rs.getString("operatetime"); + int userid = Util.getIntValue(rs.getString("userid"), -1); + int takisremark = Util.getIntValue(rs.getString("takisremark"), -1); + + List param = new ArrayList(); + param.add(isremark); + param.add(viewtype); + param.add(id); + param.add(iscomplete); + param.add(nodeid); + param.add(receivedate); + param.add(receivetime); + param.add(operatedate); + param.add(operatetime); + param.add(userid); + param.add(takisremark); + param.add(requestId); + params.add(param); + } + return params; + } + + private void saveBackLog(List params) throws Exception{ + RecordSet rs = new RecordSet(); + try { + rs.executeBatchSql("insert into workflow_operator_backlog(isremark,viewtype,id,iscomplete,nodeid,receivedate,receivetime,operatedate,operatetime,userid,takisremark,requestid) values (?,?,?,?,?,?,?,?,?,?,?,?)",params); + } catch (Exception e){ + e.printStackTrace(); + } + } + + private boolean wfCurrentOperatorAgent(RecordSet rs, int requestid, int nodeid, String usertype, int userid, boolean isBack) { + boolean returnFlag = false; + if(requestid<0 || userid<=0) + return false; + String sqlwhere = " requestid="+requestid+" and userid="+userid+" and usertype="+usertype+" and nodeid="+nodeid; + // 判断当前操作者的状态是否为被代理人,是否未操作 + rs.executeQuery("select * from workflow_currentoperator where "+sqlwhere+" and isremark=0 and agenttype=2"); + if (rs.next()) { + if (isBack) { //取消代理情况 + rs.executeUpdate("update workflow_currentoperator set islasttimes = 0 where "+sqlwhere+" and isremark=0 and agenttype=2"); + rs.executeUpdate("update workflow_currentoperator set islasttimes = 1 where "+sqlwhere+" and isremark=2 and agenttype=1"); + } else { //A->B、B操作者情况做B->C时,需将A->B此条记录islasttime置为1,使代理后仍处于B待办中 + rs.executeUpdate("update workflow_currentoperator set islasttimes = 1 where "+sqlwhere+" and isremark=0 and agenttype=2"); + rs.executeUpdate("update workflow_currentoperator set islasttimes = 0 where "+sqlwhere+" and isremark=2 and agenttype=1"); + } + returnFlag = true; + } + return returnFlag; + } + + /** + * 代理收回成功后,处理workflow_requestlog表中被代理人未操作对应的接收人显示名 + */ + public void handleLogReceivedPerson(RecordSet rs, int requestid, int nodeid, int bagentuid) { + String sql = "select logid,receivedpersonids,receivedPersons from workflow_requestlog where requestid=? and destnodeid=? order by logid desc"; + if (rs.getDBType().equals("oracle")) { + sql = "select t.* from(" + sql + + ")t where rownum <= 1"; + } else if (rs.getDBType().equals("mysql")) { + sql = sql + " limit 1"; + } else if (rs.getDBType().equals("postgresql")) { + sql = sql + " limit 1"; + } else { + sql = "select top 1 logid,receivedpersonids,receivedPersons from workflow_requestlog where requestid=? and destnodeid=? order by logid desc"; + } + rs.executeQuery(sql, requestid, nodeid); + if(rs.next()){ + int logid = rs.getInt("logid"); + String[] personidArr = Util.null2String(rs.getString("receivedpersonids")).split(","); + String[] personnameArr = Util.null2String(rs.getString("receivedPersons")).split(","); + for(int i=0; i i ? personnameArr[i] : ""; + if(personidArr[i].equals(bagentuid+"") && personname.indexOf("->") > -1){ + personnameArr[i] = personname.substring(0, personname.indexOf("->")); + } + } + StringBuffer sb = new StringBuffer(); + for(String str : personnameArr){ + sb.append(str).append(","); + } + rs.executeUpdate("update workflow_requestlog set receivedPersons=? where logid=?", sb.toString(), logid); + } + } + + /** + * 列表操作按钮权限 + */ + public String getAgentCheckBoxLimit(String params) { + String hasLimit = "false"; + String[] parArr = Util.splitString(params, "+"); + String agentFlag = parArr[0]; + int agenttype = this.getAgenttypeByid(parArr[1]); + if(agenttype <= 0) //已结束 + return hasLimit; + if("0".equals(agentFlag)){ //我的代理 + hasLimit = "true"; + }else if("1".equals(agentFlag)){ //全部代理设置 + boolean belSelf = (","+parArr[3]+",").indexOf(","+parArr[2]+",") > -1; // 被代理人为当前用户 + boolean haveAgentAllRight = "true".equals(parArr[4]); //具有代理维护权限 + hasLimit = (belSelf || haveAgentAllRight) ? "true" : "false"; + } + return hasLimit; + } + + /** + * 列表操作按钮权限 + */ + public List getAgentOperation(String agentid, String params) { + String[] parArr = Util.splitString(params, "+"); + boolean belSelf = (","+parArr[1]+",").indexOf(","+parArr[0]+",") > -1; // 被代理人为当前用户 + boolean haveAgentAllRight = "true".equals(parArr[2]); //具有代理维护权限 + boolean haveEditRight = belSelf || haveAgentAllRight; + boolean belongOverlap = "true".equals(parArr[3]); //来源代理重复界面 + int agenttype = this.getAgenttypeByid(agentid); //代理状态 + String editBtn = "false"; //编辑权限 + String takeBackCur = "false"; //收回此条代理权限 + String takeBackAll = "false"; //收回全部代理权限 + String saveAsBtn = "false"; //另存为按钮权限 + if(agenttype == 0){ //代理已结束 + if(haveEditRight) + saveAsBtn = "true"; + }else{ + if(belongOverlap){ //来源校验重复界面 + takeBackCur = "true"; + }else{ + if(haveEditRight){ + editBtn = "true"; + takeBackCur = "true"; + RecordSet rs = new RecordSet(); + rs.executeQuery("select * from workflow_agentConditionSet where agentid=? and agenttype='1'", agentid); + takeBackAll = rs.getCounts()>1 ? "false" : "true"; + } + } + } + List result = new ArrayList(); + result.add(editBtn); + result.add(takeBackCur); + result.add(takeBackAll); + result.add(saveAsBtn); + return result; + } + + private int getAgenttypeByid(String agentid){ + RecordSet rs = new RecordSet(); + rs.executeQuery("select agenttype from workflow_agent where agentid=?", agentid); + int agenttype = 0; + if(rs.next()) + agenttype = Util.getIntValue(rs.getString("agenttype"), 0); + return agenttype; + } + + + + /******************** 以下为代理模板相关操作方法 begin *************/ + + /** + * 代理模板保存 + */ + public boolean saveAgentTemplate(int templateid, AgentTempBean bean){ + String sql = ""; + RecordSet rs = new RecordSet(); + boolean exist = false; + if(templateid > 0){ + rs.executeQuery("select 1 from workflow_agenttemplate where id=? and creater=? ", templateid,user.getUID()); + exist = rs.next(); + } + if(exist){ //更新操作 + sql = "update workflow_agenttemplate set name=?,agenterid=?,beagenterid=?,userselect=?,rangeselect=?,workflowrange=?," + + "iscreateagenter=?,isSyscreateagenter=?,isproxydeal=?,ispending=? where id=?"; + rs.executeUpdate(sql, bean.getName(), bean.getAgenterid(), bean.getBeagenterid(), bean.getUserselect(), + bean.getRangeselect(),bean.getWorkflowrange(),bean.getIscreateagenter(),bean.getIsSysCreateAgenter(),bean.getIsproxydeal(),bean.getIspendthing(),templateid); + }else{ //新增操作 + sql = "insert into workflow_agenttemplate(name,agenterid,beagenterid,userselect,rangeselect,workflowrange," + + "iscreateagenter,isproxydeal,ispending,creater,isSyscreateagenter) values(?,?,?,?,?,?,?,?,?,?,?)"; + rs.executeUpdate(sql, bean.getName(), bean.getAgenterid(), bean.getBeagenterid(), bean.getUserselect(), + bean.getRangeselect(),bean.getWorkflowrange(),bean.getIscreateagenter(),bean.getIsproxydeal(),bean.getIspendthing(),user.getUID(),bean.getIsSysCreateAgenter()); + } + return true; + } + + /** + * 代理模板读取 + */ + public AgentTempBean generateAgentTempBean(int templateid){ + if(templateid <= 0) + return null; + AgentTempBean bean = new AgentTempBean(); + RecordSet rs = new RecordSet(); + rs.executeQuery("select * from workflow_agenttemplate where id=? and creater=? ", templateid,user.getUID());//校验创建人 + if(rs.next()){ + bean.setName(rs.getString("name")); + bean.setAgenterid(Util.getIntValue(rs.getString("agenterid"),0)); + bean.setBeagenterid(Util.getIntValue(rs.getString("beagenterid"),0)); + bean.setUserselect(rs.getString("userselect")); + bean.setRangeselect(Util.getIntValue(rs.getString("rangeselect"),0)); + bean.setWorkflowrange(rs.getString("workflowrange")); + bean.setIscreateagenter(Util.getIntValue(rs.getString("iscreateagenter"),0)); + bean.setIsSysCreateAgenter(Util.null2String(rs.getString("isSyscreateagenter"))); + bean.setIsproxydeal(Util.getIntValue(rs.getString("isproxydeal"),0)); + bean.setIspendthing(Util.getIntValue(rs.getString("ispending"),0)); + bean.setCreater(Util.getIntValue(rs.getString("creater"),0)); + } + return bean; + } + + /** + * 删除代理模板 + */ + public boolean deleteAgentTemplate(String ids){ + String idstr = ""; + for(String id: ids.split(",")){ + if(Util.getIntValue(id) > 0) + idstr += ","+id; + } + if(idstr.startsWith(",")) + idstr = idstr.substring(1); + if("".equals(idstr)) + return false; + else{ + RecordSet rs = new RecordSet(); + return rs.executeUpdate("delete from workflow_agenttemplate where id in ("+idstr+")"); + } + } + + /** + * 代理模板-模板名称反射方法 + */ + public String convertTemplateName(String name,String param){ + return ""+name+""; + } + + /** + * 代理模板-路径名称反射方法 + */ + public String convertWorkflowRange(String workflowrange, String params){ + String result = ""; + String[] parArr = Util.splitString(params, "+"); + String rangeselect = parArr[0]; + int languageid = Util.getIntValue(parArr[1], 7); + if("1".equals(rangeselect)){ + WorkflowComInfo wfComInfo = new WorkflowComInfo(); + for(String workflowid: workflowrange.split(",")){ + workflowid = WorkflowVersion.getActiveVersionWFID(workflowid); + if(!"".equals(workflowid)) + result += "," + wfComInfo.getWorkflowname(workflowid); + } + if(result.startsWith(",")) + result = result.substring(1); + }else if("2".equals(rangeselect)){ + result = SystemEnv.getHtmlLabelName(332, languageid); + } + return result; + } + + /** + * 代理模板列表操作按钮权限 + */ + public List getAgentTemplateOperation(String id) { + List result = new ArrayList(); + result.add("true"); + result.add("true"); + return result; + } + + /******************** 以下为代理模板相关操作方法 end** *************/ + + /** + * 获取流程是否可由被代理人办理的sql + * @return + */ + public static String getAgentorSql(int agentorByAgentId, int userId, int requestid) { + return "select * from workflow_currentoperator where (isremark in ('0','5','7') or (isremark = 1 and takisremark = 2)) and (takisremark <> -2 or TAKISREMARK is null) and userid = "+agentorByAgentId+" and usertype=0 " + + " and agentorbyagentid = "+userId+" and agenttype = '2' and requestid = "+requestid+""; + } + + /** + * 代理模板名称是否已存在 + * @param templatename 模板名称 + * @return + */ + public boolean hasExistTemplatename(String templatename, int creater, int templateid){ + RecordSet rs = new RecordSet(); + rs.executeQuery("select 1 from workflow_agenttemplate where name = ? and creater = ? and id <> ? ", templatename, creater,templateid); + return rs.next(); + } +} \ No newline at end of file