PageRenderTime 84ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 1ms

/Components/BP.WFV4/WF/WorkNode.cs

#
C# | 5164 lines | 4430 code | 307 blank | 427 comment | 468 complexity | 20be7b5137a2280d3840c699df9572c0 MD5 | raw file
Possible License(s): AGPL-3.0

Large files files are truncated, but you can click here to view the full file

  1. using System;
  2. using BP.En;
  3. using BP.DA;
  4. using System.Collections;
  5. using System.Data;
  6. using BP.Port;
  7. using BP.Web;
  8. using BP.Sys;
  9. namespace BP.WF
  10. {
  11. /// <summary>
  12. /// WF 的摘要说明。
  13. /// 工作流.
  14. /// 这里包含了两个方面
  15. /// 工作的信息.
  16. /// 流程的信息.
  17. /// </summary>
  18. public class WorkNode
  19. {
  20. #region ToE
  21. public string ToE(string s, string chName)
  22. {
  23. return BP.Sys.Language.GetValByUserLang(s, chName);
  24. }
  25. public string ToEP1(string s, string chName, string v)
  26. {
  27. return string.Format(BP.Sys.Language.GetValByUserLang(s, chName), v);
  28. }
  29. public string ToEP2(string s, string chName, string v, string v1)
  30. {
  31. return string.Format(BP.Sys.Language.GetValByUserLang(s, chName), v, v1);
  32. }
  33. public string ToEP3(string s, string chName, string v, string v1, string v2)
  34. {
  35. return string.Format(BP.Sys.Language.GetValByUserLang(s, chName), v, v1, v2);
  36. }
  37. #endregion
  38. #region 权限判断
  39. /// <summary>
  40. /// 判断一个人能不能对这个工作节点进行操作。
  41. /// </summary>
  42. /// <param name="empId"></param>
  43. /// <returns></returns>
  44. private bool IsCanOpenCurrentWorkNode(string empId)
  45. {
  46. NodeState stat = this.HisWork.NodeState;
  47. if (stat == NodeState.Init)
  48. {
  49. if (this.HisNode.IsStartNode)
  50. {
  51. /*如果是开始工作节点,从工作岗位判断他有没有工作的权限。*/
  52. return WorkFlow.IsCanDoWorkCheckByEmpStation(this.HisNode.NodeID, empId);
  53. }
  54. else
  55. {
  56. /* 如果是初始化阶段,判断他的初始化节点 */
  57. WorkerList wl = new WorkerList();
  58. wl.WorkID = this.HisWork.OID;
  59. wl.FK_Emp = empId;
  60. Emp myEmp = new Emp(empId);
  61. wl.FK_EmpText = myEmp.Name;
  62. wl.FK_Node = this.HisNode.NodeID;
  63. wl.FK_NodeText = this.HisNode.Name;
  64. return wl.IsExits;
  65. }
  66. }
  67. else
  68. {
  69. /* 如果是初始化阶段 */
  70. return false;
  71. }
  72. }
  73. #endregion
  74. //查询出每个节点表里的接收人集合(Emps)。
  75. public string GenerEmps(Node nd)
  76. {
  77. string str = "";
  78. foreach (WorkerList wl in this.HisWorkerLists)
  79. str = wl.FK_Emp + ",";
  80. return str;
  81. }
  82. private string _VirPath = null;
  83. /// <summary>
  84. /// 虚拟目录的路径
  85. /// </summary>
  86. public string VirPath
  87. {
  88. get
  89. {
  90. if (_VirPath == null && BP.SystemConfig.IsBSsystem)
  91. _VirPath = System.Web.HttpContext.Current.Request.ApplicationPath ;
  92. return _VirPath;
  93. }
  94. }
  95. private string _AppType = null;
  96. /// <summary>
  97. /// 虚拟目录的路径
  98. /// </summary>
  99. public string AppType
  100. {
  101. get
  102. {
  103. if (_AppType == null)
  104. {
  105. if (BP.Web.WebUser.IsWap)
  106. _AppType = "/WF/WAP";
  107. else
  108. _AppType = "/WF";
  109. }
  110. return _AppType;
  111. }
  112. }
  113. private string nextStationName = "";
  114. /// <summary>
  115. /// 产生下一步的工作者
  116. /// </summary>
  117. /// <param name="town">WorkNode</param>
  118. /// <returns></returns>
  119. public WorkerLists InitWorkerLists_QingHai(WorkNode town)
  120. {
  121. DataTable dt = new DataTable();
  122. // dt = DBAccess.RunSQLReturnTable("SELECT NO,NAME FROM PUB_EMP WHERE 1=2 ");
  123. dt.Columns.Add("No", typeof(string));
  124. string sql;
  125. string fk_emp;
  126. // 如果执行了两次发送,那前一次的轨迹就需要被删除。这里是为了避免错误。
  127. DBAccess.RunSQL("DELETE FROM WF_GenerWorkerlist WHERE WorkID=" + this.HisWork.OID + " AND FK_Node =" + town.HisNode.NodeID);
  128. // 判断当前节点是否采集了目标人员.(分配责任区)
  129. if (this.HisWork.EnMap.Attrs.Contains("FK_Emp"))
  130. {
  131. //sql="SELECT No,Name FROM PUB_EMP WHERE NO='"+this.HisWork.GetValStringByKey("FK_Emp")+"'";
  132. fk_emp = this.HisWork.GetValStringByKey("FK_Emp");
  133. DataRow dr = dt.NewRow();
  134. dr[0] = fk_emp;
  135. dt.Rows.Add(dr);
  136. //dt=DBAccess.RunSQLReturnTable(sql);
  137. return WorkerListWayOfDept(town, dt);
  138. }
  139. //分配分局(所)长
  140. if (this.HisWork.EnMap.Attrs.Contains("FK_FJZ"))
  141. {
  142. fk_emp = this.HisWork.GetValStringByKey("FK_FJZ");
  143. DataRow dr = dt.NewRow();
  144. dr[0] = fk_emp;
  145. dt.Rows.Add(dr);
  146. //sql = "SELECT No,Name FROM PUB_EMP WHERE NO='" + this.HisWork.GetValStringByKey("FK_FJZ") + "'";
  147. //dt = DBAccess.RunSQLReturnTable(sql);
  148. return WorkerListWayOfDept(town, dt);
  149. }
  150. //从轨迹里面查询.
  151. sql = "SELECT DISTINCT FK_Emp FROM Port_EmpStation WHERE FK_Station IN "
  152. + "(SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ") "
  153. + "AND FK_Emp IN (SELECT FK_Emp FROM WF_GenerWorkerlist WHERE WorkID=" + this.HisWork.OID + ")";
  154. dt = DBAccess.RunSQLReturnTable(sql);
  155. // 如果能够找到.
  156. if (dt.Rows.Count >= 1)
  157. {
  158. return WorkerListWayOfDept(town, dt);
  159. }
  160. // 没有查询到的情况下。
  161. Stations nextStations = town.HisNode.HisStations;
  162. // 找不到, 就要判断流向问题。
  163. Station fromSt = this.HisStationOfUse;
  164. string DeptofUse = this.HisDeptOfUse.No;
  165. if (nextStations.Count == 0)
  166. throw new Exception(this.ToEP1("WF2", "@工作流程{0}已经完成。", town.HisNode.Name)); //管理员维护错误,您没有给节点["+town.HisNode.Name+"]设置工作岗位。
  167. Station toSt = (Station)nextStations[0];
  168. if (fromSt.No == toSt.No)
  169. {
  170. #warning edit 2008 - 05-28 .
  171. // sql = "SELECT No,Name FROM Port_Emp WHERE NO IN (SELECT FK_Dept FROM Port_EmpDept WHERE FK_EMP='" + WebUser.No + "') AND NO IN (SELECT FK_Emp FROM Port_EmpSTATION WHERE FK_Station='" + toSt.No + "')";
  172. sql = "SELECT No,Name FROM Port_Emp WHERE NO='" + WebUser.No + "'"; // IN (SELECT FK_Dept FROM Port_EmpDept WHERE FK_EMP='" + WebUser.No + "') AND NO IN (SELECT FK_Emp FROM Port_EmpSTATION WHERE FK_Station='" + toSt.No + "')";
  173. dt = DBAccess.RunSQLReturnTable(sql);
  174. if (dt.Rows.Count == 0)
  175. {
  176. fk_emp = this.HisWork.GetValStringByKey("FK_FJZ");
  177. DataRow dr = dt.NewRow();
  178. dr[0] = fk_emp;
  179. dt.Rows.Add(dr);
  180. return WorkerListWayOfDept(town, dt);
  181. }
  182. else
  183. {
  184. return WorkerListWayOfDept(town, dt);
  185. }
  186. }
  187. if (fromSt.Grade < toSt.Grade)
  188. {
  189. }
  190. else if (fromSt.Grade == toSt.Grade)
  191. {
  192. }
  193. else
  194. {
  195. }
  196. return WorkerListWayOfDept(town, dt);
  197. }
  198. private WorkNode town = null;
  199. public WorkerLists GenerWorkerLists_WidthFID(WorkNode town)
  200. {
  201. this.town = town;
  202. DataTable dt = new DataTable();
  203. dt.Columns.Add("No", typeof(string));
  204. string sql;
  205. string fk_emp;
  206. // 如果执行了两次发送,那前一次的轨迹就需要被删除。这里是为了避免错误。
  207. DBAccess.RunSQL("DELETE FROM WF_GenerWorkerlist WHERE WorkID=" + this.HisWork.FID + " AND FK_Node=" + town.HisNode.NodeID);
  208. #region 首先判断是否配置了获取下一步接受人员的sql.
  209. if (town.HisNode.HisDeliveryWay == DeliveryWay.BySQL)
  210. {
  211. if (town.HisNode.RecipientSQL.Length < 4)
  212. throw new Exception("@您设置的当前节点按照sql,决定下一步的接受人员,但是你没有设置sql.");
  213. Attrs attrs = this.HisWork.EnMap.Attrs;
  214. sql = this.HisNode.RecipientSQL;
  215. foreach (Attr attr in attrs)
  216. {
  217. if (attr.MyDataType == DataType.AppString)
  218. sql = sql.Replace("@" + attr.Key, "'" + this.HisWork.GetValStrByKey(attr.Key) + "'");
  219. else
  220. sql = sql.Replace("@" + attr.Key, this.HisWork.GetValStrByKey(attr.Key));
  221. }
  222. sql = sql.Replace("~", "'");
  223. dt = DBAccess.RunSQLReturnTable(sql);
  224. if (dt.Rows.Count == 0)
  225. throw new Exception("@没有找到可接受的工作人员。@技术信息:执行的sql没有发现人员:" + sql);
  226. return WorkerListWayOfDept(town, dt);
  227. }
  228. #endregion
  229. // 按上一节点发送人处理。
  230. if (town.HisNode.HisDeliveryWay == DeliveryWay.ByPreviousOper
  231. || town.HisNode.HisDeliveryWay == DeliveryWay.ByPreviousOperSkip)
  232. {
  233. DataRow dr = dt.NewRow();
  234. dr[0] = Web.WebUser.No;
  235. dt.Rows.Add(dr);
  236. return WorkerListWayOfDept(town, dt);
  237. }
  238. // 按照选择的人员处理。
  239. if (town.HisNode.HisDeliveryWay == DeliveryWay.BySelected)
  240. {
  241. sql = "SELECT FK_Emp FROM WF_SelectAccper WHERE FK_Node=" + this.HisNode.NodeID + " AND WorkID=" + this.WorkID;
  242. dt = DBAccess.RunSQLReturnTable(sql);
  243. return WorkerListWayOfDept(town, dt);
  244. }
  245. // 按照节点指定的人员处理。
  246. if (town.HisNode.HisDeliveryWay == DeliveryWay.BySpcEmp)
  247. {
  248. dt = DBAccess.RunSQLReturnTable("SELECT FK_Emp FROM WF_NodeEmp WHERE FK_Node=" + town.HisNode.NodeID);
  249. if (dt.Rows.Count == 0)
  250. throw new Exception("@您设置的当前节点按照节点绑定人员,但是你没有为(" + town.HisNode.NodeID + "," + town.HisNode.Name + ")节点绑定人员。");
  251. return WorkerListWayOfDept(town, dt);
  252. }
  253. // 按照表单字段人员处理。
  254. if (town.HisNode.HisDeliveryWay == DeliveryWay.ByEmp)
  255. {
  256. if (this.HisWork.EnMap.Attrs.Contains("FK_Emp") == false)
  257. throw new Exception("@您设置的当前节点按照指定节点表单字段人员,决定下一步的接受人员,但是你没有在节点(" + town.HisNode.NodeID + "," + town.HisNode.Name + ")表单中设置该表单FK_Emp字段。");
  258. fk_emp = this.HisWork.GetValStringByKey("FK_Emp");
  259. DataRow dr = dt.NewRow();
  260. dr[0] = fk_emp;
  261. dt.Rows.Add(dr);
  262. return WorkerListWayOfDept(town, dt);
  263. }
  264. //// 判断 节点人员里是否有设置? 如果有就不考虑岗位设置了。从节点人员设置里面查询。
  265. //if (town.HisNode.HisEmps.Length > 2)
  266. //{
  267. // string[] emps = town.HisNode.HisEmps.Split('@');
  268. // foreach (string emp in emps)
  269. // {
  270. // if (emp == null || emp == "")
  271. // continue;
  272. // DataRow dr = dt.NewRow();
  273. // dr[0] = emp;
  274. // dt.Rows.Add(dr);
  275. // }
  276. // return WorkerListWayOfDept(town, dt);
  277. //}
  278. // 判断节点部门里面是否设置了部门,如果设置了,就按照它的部门处理。
  279. if (town.HisNode.HisDeliveryWay == DeliveryWay.ByDept)
  280. {
  281. sql = "SELECT FK_Emp FROM Port_EmpDept WHERE FK_Dept IN ( SELECT FK_Dept FROM WF_NodeDept WHERE FK_Node=" + town.HisNode.NodeID + ")";
  282. dt = DBAccess.RunSQLReturnTable(sql);
  283. if (dt.Rows.Count > 0)
  284. return WorkerListWayOfDept(town, dt);
  285. else
  286. throw new Exception("流程设计错误或组织结构维护不完整:没有找到按部门计算访问的节点人员。");
  287. }
  288. if (town.HisNode.HisDeliveryWay == DeliveryWay.ByDeptAndStation)
  289. {
  290. /* 如果还设置了岗位的集合的话,就按两个的交集计算。 */
  291. sql = "SELECT NO FROM Port_Emp WHERE NO IN ";
  292. sql += "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Dept IN ";
  293. sql += "( SELECT FK_Dept FROM WF_NodeDept WHERE FK_Node=" + town.HisNode.NodeID + ")";
  294. sql += ")";
  295. sql += "AND NO IN ";
  296. sql += "(";
  297. sql += "SELECT FK_Emp FROM Port_EmpStation WHERE FK_Station IN ";
  298. sql += "( SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ")";
  299. sql += ")";
  300. dt = DBAccess.RunSQLReturnTable(sql);
  301. if (dt.Rows.Count > 0)
  302. return WorkerListWayOfDept(town, dt);
  303. else
  304. throw new Exception("流程设计错误或组织结构维护不完整:没有找到“按部门与岗位的交集计算”的节点人员。");
  305. }
  306. #region 按指定的节点人员做为下一步骤的流程接受人
  307. string empNo = WebUser.No;
  308. string empDept = WebUser.FK_Dept;
  309. if (town.HisNode.HisDeliveryWay == DeliveryWay.BySpecNodeStation)
  310. {
  311. /* 按指定节点岗位上的人员计算 */
  312. string fk_node = town.HisNode.RecipientSQL;
  313. if (DataType.IsNumStr(fk_node) == false)
  314. throw new Exception("流程设计错误:您设置的节点(" + town.HisNode.Name + ")的接收方式为按指定的节点岗位投递,但是您没有在访问规则设置中设置节点编号。");
  315. dt = DBAccess.RunSQLReturnTable("SELECT Rec FROM ND" + fk_node + " WHERE OID=" + this.WorkID);
  316. if (dt.Rows.Count == 1)
  317. return WorkerListWayOfDept(town, dt);
  318. throw new Exception("@流程设计错误,到达的节点(" + town.HisNode.Name + ")在指定的节点中没有数据,无法找到工作的人员。");
  319. }
  320. #endregion 按指定的节点人员做为下一步骤的流程接受人
  321. #region 最后一定是按照岗位来执行
  322. if (this.HisNode.IsStartNode == false)
  323. {
  324. // 如果当前的节点不是开始节点, 从轨迹里面查询。
  325. sql = "SELECT DISTINCT FK_Emp FROM Port_EmpStation WHERE FK_Station IN "
  326. + "(SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ") "
  327. + "AND FK_Emp IN (SELECT FK_Emp FROM WF_GenerWorkerlist WHERE WorkID=" + this.HisWork.FID + " AND FK_Node IN (" + DataType.PraseAtToInSql(town.HisNode.GroupStaNDs, true) + ") )";
  328. dt = DBAccess.RunSQLReturnTable(sql);
  329. // 如果能够找到.
  330. if (dt.Rows.Count >= 1)
  331. {
  332. if (dt.Rows.Count == 1)
  333. {
  334. /* 如果人员只有一个的情况,说明他可能要 */
  335. }
  336. return WorkerListWayOfDept(town, dt);
  337. }
  338. }
  339. /* 如果执行节点 与 接受节点岗位集合一致 */
  340. if (this.HisNode.GroupStaNDs == town.HisNode.GroupStaNDs)
  341. {
  342. /* 说明,就把当前人员做为下一个节点处理人。*/
  343. DataRow dr = dt.NewRow();
  344. dr[0] = empNo;
  345. dt.Rows.Add(dr);
  346. return WorkerListWayOfDept(town, dt);
  347. }
  348. /* 如果执行节点 与 接受节点岗位集合不一致 */
  349. if (this.HisNode.GroupStaNDs != town.HisNode.GroupStaNDs)
  350. {
  351. /* 没有查询到的情况下, 先按照本部门计算。*/
  352. sql = "SELECT No FROM Port_Emp WHERE NO IN "
  353. + "(SELECT FK_Emp FROM Port_EmpStation WHERE FK_Station IN (SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ") )"
  354. + " AND NO IN "
  355. + "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Dept = '" + empDept + "')";
  356. dt = DBAccess.RunSQLReturnTable(sql);
  357. if (dt.Rows.Count == 0)
  358. {
  359. Stations nextStations = town.HisNode.HisStations;
  360. if (nextStations.Count == 0)
  361. throw new Exception(this.ToE("WN19", "节点没有岗位:") + town.HisNode.NodeID + " " + town.HisNode.Name);
  362. }
  363. else
  364. {
  365. bool isInit = false;
  366. foreach (DataRow dr in dt.Rows)
  367. {
  368. if (dr[0].ToString() == empNo)
  369. {
  370. /* 如果岗位分组不一样,并且结果集合里还有当前的人员,就说明了出现了当前操作员,拥有本节点上的岗位也拥有下一个节点的工作岗位
  371. 导致:节点的分组不同,传递到同一个人身上。 */
  372. isInit = true;
  373. }
  374. }
  375. if (isInit == false)
  376. return WorkerListWayOfDept(town, dt);
  377. }
  378. }
  379. // 没有查询到的情况下, 执行查询隶属本部门的下级部门人员。
  380. sql = "SELECT NO FROM Port_Emp WHERE NO IN "
  381. + "(SELECT FK_Emp FROM Port_EmpStation WHERE FK_Station IN (SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ") )"
  382. + " AND NO IN "
  383. + "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Dept LIKE '" + empDept + "%')"
  384. + " AND No!='" + empNo + "'";
  385. dt = DBAccess.RunSQLReturnTable(sql);
  386. if (dt.Rows.Count == 0)
  387. {
  388. Stations nextStations = town.HisNode.HisStations;
  389. if (nextStations.Count == 0)
  390. throw new Exception(this.ToE("WN19", "节点没有岗位:") + town.HisNode.NodeID + " " + town.HisNode.Name);
  391. }
  392. else
  393. {
  394. return WorkerListWayOfDept(town, dt);
  395. }
  396. // 没有查询到的情况下, 按照最大匹配数 提高一个级别 计算,递归算法未完成,不过现在已经满足大部分需要。
  397. int lengthStep = 0; //增长步骤。
  398. while (true)
  399. {
  400. lengthStep += 2;
  401. int toLen = empDept.Length - lengthStep;
  402. if (toLen <= 0)
  403. throw new Exception("@已经列举到最高部门,仍然没有找到接受人员。");
  404. sql = "SELECT NO FROM Port_Emp WHERE No IN "
  405. + "(SELECT FK_Emp FROM Port_EmpStation WHERE FK_Station IN (SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ") )"
  406. + " AND NO IN "
  407. + "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Dept LIKE '" + empDept.Substring(0, empDept.Length - lengthStep) + "%')"
  408. + " AND No!='" + empNo+ "'";
  409. dt = DBAccess.RunSQLReturnTable(sql);
  410. if (dt.Rows.Count == 0)
  411. {
  412. Stations nextStations = town.HisNode.HisStations;
  413. if (nextStations.Count == 0)
  414. throw new Exception(this.ToE("WN19", "节点没有岗位:") + town.HisNode.NodeID + " " + town.HisNode.Name);
  415. sql = "SELECT No FROM Port_Emp WHERE NO IN ";
  416. sql += "(SELECT FK_Emp FROM Port_EmpStation WHERE FK_Station IN (SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + " ) )";
  417. sql += " AND No IN ";
  418. if (empDept.Length == 2)
  419. sql += "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Emp!='" + empNo + "') ";
  420. else
  421. sql += "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Emp!='" + empNo + "' AND FK_Dept LIKE '" + empDept.Substring(0, empDept.Length - 4) + "%')";
  422. dt = DBAccess.RunSQLReturnTable(sql);
  423. if (dt.Rows.Count == 0)
  424. {
  425. sql = "SELECT No FROM Port_Emp WHERE No!='" + empNo + "' AND No IN ";
  426. sql += "(SELECT FK_Emp FROM Port_EmpStation WHERE FK_Station IN (SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + " ) )";
  427. dt = DBAccess.RunSQLReturnTable(sql);
  428. if (dt.Rows.Count == 0)
  429. {
  430. string msg = town.HisNode.HisStationsStr;
  431. throw new Exception(this.ToE("WF3", "岗位(" + msg + ")下没有人员,对应节点:") + town.HisNode.Name);
  432. //"维护错误,请检查[" + town.HisNode.Name + "]维护的岗位中是否有人员?"
  433. }
  434. }
  435. return WorkerListWayOfDept(town, dt);
  436. }
  437. else
  438. {
  439. return WorkerListWayOfDept(town, dt);
  440. }
  441. }
  442. #endregion 按照岗位来执行
  443. }
  444. public WorkerLists GenerWorkerLists(WorkNode town)
  445. {
  446. this.town = town;
  447. DataTable dt = new DataTable();
  448. dt.Columns.Add("No", typeof(string));
  449. string sql;
  450. string fk_emp;
  451. // 如果执行了两次发送,那前一次的轨迹就需要被删除。这里是为了避免错误。
  452. DBAccess.RunSQL("DELETE FROM WF_GenerWorkerlist WHERE WorkID=" + this.HisWork.OID + " AND FK_Node =" + town.HisNode.NodeID);
  453. // 如果指定特定的人员处理。
  454. if (JumpToEmp != null)
  455. {
  456. DataRow dr = dt.NewRow();
  457. dr[0] = JumpToEmp;
  458. dt.Rows.Add(dr);
  459. return WorkerListWayOfDept(town, dt);
  460. }
  461. // 按上一节点发送人处理。
  462. if (town.HisNode.HisDeliveryWay == DeliveryWay.ByPreviousOper
  463. || town.HisNode.HisDeliveryWay == DeliveryWay.ByPreviousOperSkip)
  464. {
  465. DataRow dr = dt.NewRow();
  466. dr[0] = Web.WebUser.No;
  467. dt.Rows.Add(dr);
  468. return WorkerListWayOfDept(town, dt);
  469. }
  470. //首先判断是否配置了获取下一步接受人员的sql.
  471. if (town.HisNode.HisDeliveryWay == DeliveryWay.BySQL)
  472. {
  473. if (town.HisNode.RecipientSQL.Length < 4)
  474. throw new Exception("@您设置的当前节点按照sql,决定下一步的接受人员,但是你没有设置sql.");
  475. Attrs attrs = this.HisWork.EnMap.Attrs;
  476. sql = town.HisNode.RecipientSQL;
  477. foreach (Attr attr in attrs)
  478. {
  479. if (attr.MyDataType == DataType.AppString)
  480. sql = sql.Replace("@" + attr.Key, "'" + this.HisWork.GetValStrByKey(attr.Key) + "'");
  481. else
  482. sql = sql.Replace("@" + attr.Key, this.HisWork.GetValStrByKey(attr.Key));
  483. }
  484. sql = sql.Replace("~", "'");
  485. sql = sql.Replace("@WebUser.No", "'" + WebUser.No + "'");
  486. sql = sql.Replace("@WebUser.Name", "'" + WebUser.Name + "'");
  487. sql = sql.Replace("@WebUser.FK_Dept", "'" + WebUser.FK_Dept + "'");
  488. dt = DBAccess.RunSQLReturnTable(sql);
  489. if (dt.Rows.Count == 0)
  490. throw new Exception("@没有找到可接受的工作人员。@技术信息:执行的sql没有发现人员:" + sql);
  491. return WorkerListWayOfDept(town, dt);
  492. }
  493. // 按照选择的人员处理。
  494. if (town.HisNode.HisDeliveryWay == DeliveryWay.BySelected)
  495. {
  496. sql = "SELECT FK_Emp FROM WF_SelectAccper WHERE FK_Node=" + this.HisNode.NodeID + " AND WorkID=" + this.WorkID;
  497. dt = DBAccess.RunSQLReturnTable(sql);
  498. if (dt.Rows.Count == 0)
  499. throw new Exception("请选择下一步骤工作(" + town.HisNode.Name + ")接受人员。");
  500. return WorkerListWayOfDept(town, dt);
  501. }
  502. // 按照节点指定的人员处理。
  503. if (town.HisNode.HisDeliveryWay == DeliveryWay.BySpcEmp)
  504. {
  505. dt = DBAccess.RunSQLReturnTable("SELECT FK_Emp FROM WF_NodeEmp WHERE FK_Node=" + town.HisNode.NodeID);
  506. if (dt.Rows.Count == 0)
  507. throw new Exception("@您设置的当前节点按照节点绑定人员,但是你没有为(" + town.HisNode.NodeID + "," + town.HisNode.Name + ")节点绑定人员。");
  508. //fk_emp = this.HisWork.GetValStringByKey("FK_Emp");
  509. //DataRow dr = dt.NewRow();
  510. //dr[0] = fk_emp;
  511. //dt.Rows.Add(dr);
  512. return WorkerListWayOfDept(town, dt);
  513. }
  514. // 按照节点指定的人员处理。
  515. if (town.HisNode.HisDeliveryWay == DeliveryWay.ByEmp)
  516. {
  517. if (this.HisWork.EnMap.Attrs.Contains("FK_Emp") == false)
  518. throw new Exception("@您设置的当前节点按照指定的人员,决定下一步的接受人员,但是你没有在节点表单中设置该表单FK_Emp字段。");
  519. fk_emp = this.HisWork.GetValStringByKey("FK_Emp");
  520. DataRow dr = dt.NewRow();
  521. dr[0] = fk_emp;
  522. dt.Rows.Add(dr);
  523. return WorkerListWayOfDept(town, dt);
  524. }
  525. string prjNo = "";
  526. FlowAppType flowAppType = this.HisNode.HisFlow.HisFlowAppType;
  527. sql = "";
  528. if (this.HisNode.HisFlow.HisFlowAppType == FlowAppType.PRJ)
  529. {
  530. prjNo = "";
  531. try
  532. {
  533. prjNo = this.HisWork.GetValStrByKey("PrjNo");
  534. }
  535. catch (Exception ex)
  536. {
  537. throw new Exception("@当前流程是工程类流程,但是在节点表单中没有PrjNo字段(注意区分大小写),请确认。@异常信息:" + ex.Message);
  538. }
  539. }
  540. #region 按部门与岗位的交集计算.
  541. if (town.HisNode.HisDeliveryWay == DeliveryWay.ByDeptAndStation)
  542. {
  543. sql = "SELECT No FROM Port_Emp WHERE No IN ";
  544. sql += "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Dept IN ";
  545. sql += "( SELECT FK_Dept FROM WF_NodeDept WHERE FK_Node=" + town.HisNode.NodeID + ")";
  546. sql += ")";
  547. sql += "AND No IN ";
  548. sql += "(";
  549. sql += "SELECT FK_Emp FROM Port_EmpStation WHERE FK_Station IN ";
  550. sql += "( SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ")";
  551. sql += ")";
  552. dt = DBAccess.RunSQLReturnTable(sql);
  553. if (dt.Rows.Count > 0)
  554. return WorkerListWayOfDept(town, dt);
  555. else
  556. throw new Exception("@节点访问规则错误:节点(" + town.HisNode.NodeID + "," + town.HisNode.Name + "), 按照岗位与部门的交集确定接受人的范围错误,没有找到人员:SQL=" + sql);
  557. }
  558. #endregion 按部门与岗位的交集计算.
  559. #region 判断节点部门里面是否设置了部门如果设置了就按照它的部门处理
  560. if (town.HisNode.HisDeliveryWay == DeliveryWay.ByDept)
  561. {
  562. if (flowAppType == FlowAppType.Normal)
  563. {
  564. sql = "SELECT DISTINCT FK_Emp FROM Port_EmpDept WHERE FK_Dept IN ( SELECT FK_Dept FROM WF_NodeDept WHERE FK_Node=" + town.HisNode.NodeID + ")";
  565. dt = DBAccess.RunSQLReturnTable(sql);
  566. if (dt.Rows.Count > 0)
  567. return WorkerListWayOfDept(town, dt);
  568. }
  569. if (flowAppType == FlowAppType.PRJ)
  570. {
  571. sql = "SELECT No FROM Port_Emp WHERE No IN ";
  572. sql += "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Dept IN ";
  573. sql += "( SELECT FK_Dept FROM WF_NodeDept WHERE FK_Node=" + town.HisNode.NodeID + ")";
  574. sql += ")";
  575. sql += "AND NO IN ";
  576. sql += "(";
  577. sql += "SELECT FK_Emp FROM Prj_EmpPrjStation WHERE FK_Station IN ";
  578. sql += "( SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ") AND FK_Prj='" + prjNo + "'";
  579. sql += ")";
  580. dt = DBAccess.RunSQLReturnTable(sql);
  581. if (dt.Rows.Count == 0)
  582. {
  583. /* 如果项目组里没有工作人员就提交到公共部门里去找。*/
  584. sql = "SELECT NO FROM Port_Emp WHERE NO IN ";
  585. sql += "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Dept IN ";
  586. sql += "( SELECT FK_Dept FROM WF_NodeDept WHERE FK_Node=" + town.HisNode.NodeID + ")";
  587. sql += ")";
  588. sql += "AND NO IN ";
  589. sql += "(";
  590. sql += "SELECT FK_Emp FROM Port_EmpStation WHERE FK_Station IN ";
  591. sql += "( SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ")";
  592. sql += ")";
  593. }
  594. else
  595. {
  596. return WorkerListWayOfDept(town, dt);
  597. }
  598. dt = DBAccess.RunSQLReturnTable(sql);
  599. if (dt.Rows.Count > 0)
  600. return WorkerListWayOfDept(town, dt);
  601. }
  602. }
  603. #endregion 判断节点部门里面是否设置了部门如果设置了就按照它的部门处理
  604. #region 按指定的节点人员做为下一步骤的流程接受人
  605. string empNo = WebUser.No;
  606. string empDept = WebUser.FK_Dept;
  607. if (town.HisNode.HisDeliveryWay == DeliveryWay.BySpecNodeStation)
  608. {
  609. /* 按指定节点岗位上的人员计算 */
  610. string fk_node = town.HisNode.RecipientSQL;
  611. if (DataType.IsNumStr(fk_node) == false)
  612. throw new Exception("流程设计错误:您设置的节点(" + town.HisNode.Name + ")的接收方式为按指定的节点岗位投递,但是您没有在访问规则设置中设置节点编号。");
  613. dt = DBAccess.RunSQLReturnTable("SELECT Rec FROM ND" + fk_node + " WHERE OID=" + this.WorkID);
  614. if (dt.Rows.Count == 1)
  615. return WorkerListWayOfDept(town, dt);
  616. throw new Exception("@流程设计错误,到达的节点(" + town.HisNode.Name + ")在指定的节点中没有数据,无法找到工作的人员。");
  617. }
  618. #endregion 按指定的节点人员做为下一步骤的流程接受人
  619. #region 按节点岗位与人员部门集合两个纬度计算.
  620. if (town.HisNode.HisDeliveryWay == DeliveryWay.ByStationAndEmpDept)
  621. {
  622. sql = "SELECT No FROM Port_Emp WHERE NO IN "
  623. + "(SELECT FK_Emp FROM Port_EmpStation WHERE FK_Station IN (SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ") )"
  624. + " AND FK_Dept IN "
  625. + "(SELECT FK_Dept FROM Port_EmpDept WHERE FK_Emp = '" + WebUser.No + "')";
  626. //2012.7.16李健修改
  627. //+" AND NO IN "
  628. //+ "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Emp = '" + WebUser.No + "')";
  629. dt = DBAccess.RunSQLReturnTable(sql);
  630. if (dt.Rows.Count > 0)
  631. return WorkerListWayOfDept(town, dt);
  632. else
  633. throw new Exception("@节点访问规则错误:节点(" + town.HisNode.NodeID + "," + town.HisNode.Name + "), 按节点岗位与人员部门集合两个纬度计算,没有找到人员:SQL=" + sql);
  634. }
  635. #endregion
  636. if (town.HisNode.HisDeliveryWay != DeliveryWay.ByStation)
  637. throw new Exception("@没有判断的执行规则:" + town.HisNode.HisDeliveryWay);
  638. #region 最后判断 - 按照岗位来执行
  639. if (this.HisNode.IsStartNode == false)
  640. {
  641. if (flowAppType == FlowAppType.Normal)
  642. {
  643. // 如果当前的节点不是开始节点, 从轨迹里面查询。
  644. sql = "SELECT DISTINCT FK_Emp FROM Port_EmpStation WHERE FK_Station IN "
  645. + "(SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ") "
  646. + "AND FK_Emp IN (SELECT FK_Emp FROM WF_GenerWorkerlist WHERE WorkID=" + this.HisWork.OID + " AND FK_Node IN (" + DataType.PraseAtToInSql(town.HisNode.GroupStaNDs, true) + ") )";
  647. }
  648. if (flowAppType == FlowAppType.PRJ)
  649. {
  650. // 如果当前的节点不是开始节点, 从轨迹里面查询。
  651. sql = "SELECT DISTINCT FK_Emp FROM Prj_EmpPrjStation WHERE FK_Station IN "
  652. + "(SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ") AND FK_Prj='" + prjNo + "' "
  653. + "AND FK_Emp IN (SELECT FK_Emp FROM WF_GenerWorkerlist WHERE WorkID=" + this.HisWork.OID + " AND FK_Node IN (" + DataType.PraseAtToInSql(town.HisNode.GroupStaNDs, true) + ") )";
  654. dt = DBAccess.RunSQLReturnTable(sql);
  655. if (dt.Rows.Count == 0)
  656. {
  657. /* 如果项目组里没有工作人员就提交到公共部门里去找。*/
  658. sql = "SELECT DISTINCT FK_Emp FROM Port_EmpStation WHERE FK_Station IN "
  659. + "(SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ") "
  660. + "AND FK_Emp IN (SELECT FK_Emp FROM WF_GenerWorkerlist WHERE WorkID=" + this.HisWork.OID + " AND FK_Node IN (" + DataType.PraseAtToInSql(town.HisNode.GroupStaNDs, true) + ") )";
  661. }
  662. else
  663. {
  664. return WorkerListWayOfDept(town, dt);
  665. }
  666. }
  667. dt = DBAccess.RunSQLReturnTable(sql);
  668. // 如果能够找到.
  669. if (dt.Rows.Count >= 1)
  670. {
  671. if (dt.Rows.Count == 1)
  672. {
  673. /*如果人员只有一个的情况,说明他可能要 */
  674. }
  675. return WorkerListWayOfDept(town, dt);
  676. }
  677. }
  678. /* 如果执行节点 与 接受节点岗位集合一致 */
  679. if (this.HisNode.GroupStaNDs == town.HisNode.GroupStaNDs)
  680. {
  681. /* 说明,就把当前人员做为下一个节点处理人。*/
  682. DataRow dr = dt.NewRow();
  683. dr[0] = WebUser.No;
  684. dt.Rows.Add(dr);
  685. return WorkerListWayOfDept(town, dt);
  686. }
  687. /* 如果执行节点 与 接受节点岗位集合不一致 */
  688. if (this.HisNode.GroupStaNDs != town.HisNode.GroupStaNDs)
  689. {
  690. /* 没有查询到的情况下, 先按照本部门计算。*/
  691. if (flowAppType == FlowAppType.Normal)
  692. {
  693. sql = "SELECT NO FROM Port_Emp WHERE NO IN "
  694. + "(SELECT FK_Emp FROM Port_EmpStation WHERE FK_Station IN (SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ") )"
  695. + " AND NO IN "
  696. + "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Dept = '" + empDept + "')";
  697. }
  698. if (flowAppType == FlowAppType.PRJ)
  699. {
  700. sql = "SELECT FK_Emp FROM Prj_EmpPrjStation WHERE FK_Prj='" + prjNo + "' AND FK_Station IN (SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ")"
  701. + " AND FK_Prj='" + prjNo + "' ";
  702. dt = DBAccess.RunSQLReturnTable(sql);
  703. if (dt.Rows.Count == 0)
  704. {
  705. /* 如果项目组里没有工作人员就提交到公共部门里去找。 */
  706. sql = "SELECT NO FROM Port_Emp WHERE NO IN "
  707. + "(SELECT FK_Emp FROM Port_EmpStation WHERE FK_Station IN (SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ") )"
  708. + " AND NO IN "
  709. + "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Dept = '" + empDept + "')";
  710. }
  711. else
  712. {
  713. return WorkerListWayOfDept(town, dt);
  714. }
  715. }
  716. dt = DBAccess.RunSQLReturnTable(sql);
  717. if (dt.Rows.Count == 0)
  718. {
  719. Stations nextStations = town.HisNode.HisStations;
  720. if (nextStations.Count == 0)
  721. throw new Exception(this.ToE("WN19", "节点没有岗位:") + town.HisNode.NodeID + " " + town.HisNode.Name);
  722. }
  723. else
  724. {
  725. bool isInit = false;
  726. foreach (DataRow dr in dt.Rows)
  727. {
  728. if (dr[0].ToString() == Web.WebUser.No)
  729. {
  730. /* 如果岗位分组不一样,并且结果集合里还有当前的人员,就说明了出现了当前操作员,拥有本节点上的岗位也拥有下一个节点的工作岗位
  731. 导致:节点的分组不同,传递到同一个人身上。 */
  732. isInit = true;
  733. }
  734. }
  735. #warning edit by peng, 用来确定不同岗位集合的传递包含同一个人的处理方式
  736. if (isInit == false || isInit == true)
  737. return WorkerListWayOfDept(town, dt);
  738. }
  739. }
  740. // 没有查询到的情况下, 执行查询隶属本部门的下级部门人员。
  741. if (flowAppType == FlowAppType.Normal)
  742. {
  743. sql = "SELECT NO FROM Port_Emp WHERE NO IN "
  744. + "(SELECT FK_Emp FROM Port_EmpStation WHERE FK_Station IN (SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ") )"
  745. + " AND NO IN "
  746. + "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Dept LIKE '" + empDept + "%')"
  747. + " AND No!='" + empNo + "'";
  748. }
  749. if (flowAppType == FlowAppType.PRJ)
  750. {
  751. sql = "SELECT FK_Emp FROM Prj_EmpPrjStation WHERE FK_Prj='" + prjNo + "' AND FK_Station IN (SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ")"
  752. + " AND FK_Prj='" + prjNo + "' ";
  753. dt = DBAccess.RunSQLReturnTable(sql);
  754. if (dt.Rows.Count == 0)
  755. {
  756. /* 如果项目组里没有工作人员就提交到公共部门里去找。*/
  757. sql = "SELECT NO FROM Port_Emp WHERE NO IN "
  758. + "(SELECT FK_Emp FROM Port_EmpStation WHERE FK_Station IN (SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ") )"
  759. + " AND NO IN "
  760. + "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Dept LIKE '" + empDept + "%')"
  761. + " AND No!='" + empNo + "'";
  762. }
  763. else
  764. {
  765. return WorkerListWayOfDept(town, dt);
  766. }
  767. }
  768. dt = DBAccess.RunSQLReturnTable(sql);
  769. if (dt.Rows.Count == 0)
  770. {
  771. Stations nextStations = town.HisNode.HisStations;
  772. if (nextStations.Count == 0)
  773. throw new Exception(this.ToE("WN19", "节点没有岗位:") + town.HisNode.NodeID + " " + town.HisNode.Name);
  774. }
  775. else
  776. {
  777. return WorkerListWayOfDept(town, dt);
  778. }
  779. /* 没有查询到的情况下, 按照最大匹配数 提高一个级别 计算,递归算法未完成,不过现在已经满足大部分需要。
  780. *
  781. * 因为:以上已经做的岗位的判断,就没有必要在判断其它类型的流程处理了。
  782. *
  783. * */
  784. int lengthStep = 0; //增长步骤。
  785. while (true)
  786. {
  787. lengthStep += 2;
  788. sql = "SELECT NO FROM Port_Emp WHERE No IN "
  789. + "(SELECT FK_Emp FROM Port_EmpStation WHERE FK_Station IN (SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ") )"
  790. + " AND NO IN "
  791. + "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Dept LIKE '" + empDept.Substring(0, empDept.Length - lengthStep) + "%')"
  792. + " AND No!='" + empNo + "'";
  793. dt = DBAccess.RunSQLReturnTable(sql);
  794. if (dt.Rows.Count == 0)
  795. {
  796. Stations nextStations = town.HisNode.HisStations;
  797. if (nextStations.Count == 0)
  798. throw new Exception(this.ToE("WN19", "节点没有岗位:") + town.HisNode.NodeID + " " + town.HisNode.Name);
  799. sql = "SELECT No FROM Port_Emp WHERE NO IN ";
  800. sql += "(SELECT FK_Emp FROM Port_EmpStation WHERE FK_Station IN (SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + " ) )";
  801. sql += " AND No IN ";
  802. if (empDept.Length == 2)
  803. sql += "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Emp!='" + empNo + "') ";
  804. else
  805. sql += "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Emp!='" + empNo + "' AND FK_Dept LIKE '" + empDept.Substring(0, empDept.Length - 4) + "%')";
  806. dt = DBAccess.RunSQLReturnTable(sql);
  807. if (dt.Rows.Count == 0)
  808. {
  809. sql = "SELECT No FROM Port_Emp WHERE No!='" + empNo + "' AND No IN ";
  810. sql += "(SELECT FK_Emp FROM Port_EmpStation WHERE FK_Station IN (SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + " ) )";
  811. dt = DBAccess.RunSQLReturnTable(sql);
  812. if (dt.Rows.Count == 0)
  813. {
  814. string msg = town.HisNode.HisStationsStr;
  815. throw new Exception(this.ToE("WF3", "岗位(" + msg + ")下没有人员,对应节点:") + town.HisNode.Name);
  816. //"维护错误,请检查[" + town.HisNode.Name + "]维护的岗位中是否有人员?"
  817. }
  818. }
  819. return WorkerListWayOfDept(town, dt);
  820. }
  821. else
  822. {
  823. return WorkerListWayOfDept(town, dt);
  824. }
  825. }
  826. #endregion 按照岗位来执行
  827. }
  828. public WorkerLists GenerWorkerListsV2_del(WorkNode town)
  829. {
  830. DataTable dt = new DataTable();
  831. dt.Columns.Add("No", typeof(string));
  832. string sql;
  833. string fk_emp;
  834. // 如果执行了两次发送,那前一次的轨迹就需要被删除。这里是为了避免错误。
  835. DBAccess.RunSQL("DELETE FROM WF_GenerWorkerlist WHERE WorkID=" + this.HisWork.OID + " AND FK_Node =" + town.HisNode.NodeID);
  836. //首先判断是否配置了获取下一步接受人员的sql.
  837. if (this.HisNode.RecipientSQL.Length > 4)
  838. {
  839. Attrs attrs = this.HisWork.EnMap.Attrs;
  840. sql = this.HisNode.RecipientSQL;
  841. foreach (Attr attr in attrs)
  842. {
  843. if (attr.MyDataType == DataType.AppString)
  844. sql = sql.Replace("@" + attr.Key, "'" + this.HisWork.GetValStrByKey(attr.Key) + "'");
  845. else
  846. sql = sql.Replace("@" + attr.Key, this.HisWork.GetValStrByKey(attr.Key));
  847. }
  848. dt = DBAccess.RunSQLReturnTable(sql);
  849. if (dt.Rows.Count == 0)
  850. {
  851. if (SystemConfig.IsDebug)
  852. throw new Exception("@没有找到可接受的工作人员。@技术信息:执行的sql没有发现人员:" + sql);
  853. else
  854. throw new Exception("@没有找到可接受的工作人员。");
  855. }
  856. return WorkerListWayOfDept(town, dt);
  857. }
  858. if (this.HisNode.HisDeliveryWay == DeliveryWay.BySelected)
  859. {
  860. sql = "SELECT FK_Emp FROM WF_SelectAccper WHERE FK_Node=" + this.HisNode.NodeID + " AND WorkID=" + this.WorkID;
  861. dt = DBAccess.RunSQLReturnTable(sql);
  862. return WorkerListWayOfDept(town, dt);
  863. }
  864. // 判断当前节点是否采集了目标人员
  865. if (this.HisWork.EnMap.Attrs.Contains("FK_Emp"))
  866. {
  867. fk_emp = this.HisWork.GetValStringByKey("FK_Emp");
  868. DataRow dr = dt.NewRow();
  869. dr[0] = fk_emp;
  870. dt.Rows.Add(dr);
  871. return WorkerListWayOfDept(town, dt);
  872. }
  873. // 判断 节点人员里是否有设置? 如果有就不考虑岗位设置了。从节点人员设置里面查询。
  874. if (town.HisNode.HisEmps.Length > 2)
  875. {
  876. string[] emps = town.HisNode.HisEmps.Split('@');
  877. foreach (string emp in emps)
  878. {
  879. if (emp == null || emp == "")
  880. continue;
  881. DataRow dr = dt.NewRow();
  882. dr[0] = emp;
  883. dt.Rows.Add(dr);
  884. }
  885. return WorkerListWayOfDept(town, dt);
  886. }
  887. // 判断节点部门里面是否设置了部门,如果设置了,就按照它的部门处理。
  888. if (town.HisNode.HisDeliveryWay == DeliveryWay.ByDept)
  889. {
  890. if (town.HisNode.HisStations.Count == 0)
  891. {
  892. sql = "SELECT FK_Emp FROM Port_EmpDept WHERE FK_Dept IN ( SELECT FK_Dept FROM WF_NodeDept WHERE FK_Node=" + town.HisNode.NodeID + ")";
  893. dt = DBAccess.RunSQLReturnTable(sql);
  894. if (dt.Rows.Count > 0)
  895. return WorkerListWayOfDept(town, dt);
  896. }
  897. else
  898. {
  899. sql = "SELECT NO FROM Port_Emp WHERE NO IN ";
  900. sql += "(SELECT FK_Emp FROM Port_EmpDept WHERE FK_Dept IN ";
  901. sql += "( SELECT FK_Dept FROM WF_NodeDept WHERE FK_Node=" + town.HisNode.NodeID + ")";
  902. sql += ")";
  903. sql += "AND NO IN ";
  904. sql += "(";
  905. sql += "SELECT FK_Emp FROM Port_EmpStation WHERE FK_Station IN ";
  906. sql += "( SELECT FK_Station FROM WF_NodeStation WHERE FK_Node=" + town.HisNode.NodeID + ")";
  907. sql += ")";
  908. dt = DBAccess.RunSQLReturnTable(sql);
  909. if (dt.Rows.Count

Large files files are truncated, but you can click here to view the full file