You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

3952 lines
189 KiB

  1. using Learun.Application.Base.AuthorizeModule;
  2. using Learun.Application.Base.SystemModule;
  3. using Learun.Application.Message;
  4. using Learun.Application.Organization;
  5. using Learun.Ioc;
  6. using Learun.Util;
  7. using Learun.Workflow.Engine;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Data;
  11. using Learun.Application.TwoDevelopment.LogisticsManagement;
  12. using Learun.Application.TwoDevelopment.LR_LGManager;
  13. using Newtonsoft.Json;
  14. using System.Linq;
  15. using Learun.Application.TwoDevelopment.EducationalAdministration;
  16. namespace Learun.Application.WorkFlow
  17. {
  18. /// <summary>
  19. /// 版 本 Learun-ADMS V7.0.3 力软敏捷开发框架
  20. /// Copyright (c) 2013-2018 上海力软信息技术有限公司
  21. /// 创建人:力软-框架开发组
  22. /// 日 期:2018.12.09
  23. /// 描 述:流程进程
  24. /// </summary>
  25. public class NWFProcessBLL : NWFProcessIBLL
  26. {
  27. private NWFProcessSericve nWFProcessSerive = new NWFProcessSericve();
  28. private NWFSchemeIBLL nWFSchemeIBLL = new NWFSchemeBLL();
  29. private NWFTaskIBLL nWFTaskIBLL = new NWFTaskBLL();
  30. private NWFConfluenceIBLL nWFConfluenceIBLL = new NWFConfluenceBLL();
  31. // 基础信息
  32. private UserRelationIBLL userRelationIBLL = new UserRelationBLL();
  33. private UserIBLL userIBLL = new UserBLL();
  34. private PostIBLL postIBLL = new PostBLL();
  35. // 消息模块
  36. private LR_StrategyInfoIBLL lR_StrategyInfoIBLL = new LR_StrategyInfoBLL();
  37. // 数据库操作
  38. private DatabaseLinkIBLL databaseLinkIBLL = new DatabaseLinkBLL();
  39. private DepartmentIBLL departmentIBLL = new DepartmentBLL();
  40. private ImgIBLL imgIBLL = new ImgBLL();
  41. private StuInfoBasicIBLL stuInfoBasicIBLL = new StuInfoBasicBLL();
  42. private ClassInfoIBLL classInfoIBLL = new ClassInfoBLL();
  43. #region 获取数据
  44. /// <summary>
  45. /// 获取流程进程实体
  46. /// </summary>
  47. /// <param name="keyValue">主键</param>
  48. /// <returns></returns>
  49. public NWFProcessEntity GetEntity(string keyValue)
  50. {
  51. return nWFProcessSerive.GetEntity(keyValue);
  52. }
  53. /// <summary>
  54. /// 获取流程信息列表
  55. /// </summary>
  56. /// <param name="pagination">分页参数</param>
  57. /// <param name="queryJson">查询条件</param>
  58. /// <returns></returns>
  59. public IEnumerable<NWFProcessEntity> GetPageList(Pagination pagination, string queryJson)
  60. {
  61. return nWFProcessSerive.GetPageList(pagination, queryJson);
  62. }
  63. public IEnumerable<LC_gcsqEntity> GetUseCar(Pagination pagination, string queryJson)
  64. {
  65. return nWFProcessSerive.GetUseCar(pagination, queryJson);
  66. }
  67. public IEnumerable<cs_qjEntity> GetLeaveStatistics(Pagination pagination, string queryJson)
  68. {
  69. return nWFProcessSerive.GetLeaveStatistics(pagination, queryJson);
  70. }
  71. public IEnumerable<LC_docx2Entity> GetTransceiver(Pagination pagination, string queryJson)
  72. {
  73. return nWFProcessSerive.GetTransceiver(pagination, queryJson);
  74. }
  75. public string GetFirstTaskByProcessId(string processId)
  76. {
  77. return nWFProcessSerive.GetFirstTaskByProcessId(processId);
  78. }
  79. /// <summary>
  80. /// 获取流程信息列表
  81. /// </summary>
  82. /// <param name="pagination">分页参数</param>
  83. /// <param name="queryJson">查询条件</param>
  84. /// <returns></returns>
  85. public IEnumerable<NWFProcessEntity> GetAllList()
  86. {
  87. return nWFProcessSerive.GetAllList();
  88. }
  89. public LC_hetongEntity GetHTInfo(string keyValue)
  90. {
  91. return nWFProcessSerive.GetHTInfo(keyValue);
  92. }
  93. /// <summary>
  94. /// 获取我的流程信息列表
  95. /// </summary>
  96. /// <param name="userId">用户主键</param>
  97. /// <param name="pagination">分页参数</param>
  98. /// <param name="queryJson">查询条件</param>
  99. /// <param name="schemeCode">流程模板编码</param>
  100. /// <returns></returns>
  101. public IEnumerable<NWFProcessEntity> GetMyPageList(string userId, Pagination pagination, string queryJson, string schemeCode = null)
  102. {
  103. return nWFProcessSerive.GetMyPageList(userId, pagination, queryJson, schemeCode);
  104. }
  105. /// <summary>
  106. /// 获取我的流程信息列表
  107. /// </summary>
  108. /// <param name="userId">用户主键</param>
  109. /// <param name="queryJson">查询条件</param>
  110. /// <param name="schemeCode">流程模板编码</param>
  111. /// <returns></returns>
  112. public IEnumerable<NWFProcessEntity> GetMyPageList(string userId, string queryJson, string schemeCode = null)
  113. {
  114. return nWFProcessSerive.GetMyPageList(userId, queryJson, schemeCode);
  115. }
  116. /// <summary>
  117. /// 获取未处理任务列表
  118. /// </summary>
  119. /// <param name="userInfo">用户信息</param>
  120. /// <param name="pagination">分页参数</param>
  121. /// <param name="queryJson">查询条件</param>
  122. /// <param name="schemeCode">流程模板编码</param>
  123. /// <returns></returns>
  124. public IEnumerable<NWFProcessEntity> GetMyTaskPageList(UserInfo userInfo, Pagination pagination, string queryJson, string schemeCode = null)
  125. {
  126. return nWFProcessSerive.GetMyTaskPageList(userInfo, pagination, queryJson, schemeCode);
  127. }
  128. /// <summary>
  129. /// 获取未处理任务列表
  130. /// </summary>
  131. /// <param name="userInfo">用户信息</param>
  132. /// <param name="queryJson">查询条件</param>
  133. /// <param name="schemeCode">流程模板编码</param>
  134. /// <returns></returns>
  135. public IEnumerable<NWFProcessEntity> GetMyTaskPageList(UserInfo userInfo, string queryJson, string schemeCode = null)
  136. {
  137. return nWFProcessSerive.GetMyTaskPageList(userInfo, queryJson, schemeCode);
  138. }
  139. /// <summary>
  140. /// 获取未处理任务列表
  141. /// </summary>
  142. /// <param name="userInfo">用户信息</param>
  143. /// <param name="pagination">分页参数</param>
  144. /// <param name="queryJson">查询条件</param>
  145. /// <param name="schemeCode">流程模板编码</param>
  146. /// <param name="isBatchAudit">true获取批量审核任务</param>
  147. /// <returns></returns>
  148. public IEnumerable<NWFProcessEntity> GetMyTaskPageList(UserInfo userInfo, Pagination pagination, string queryJson, bool isBatchAudit, string schemeCode = null)
  149. {
  150. return nWFProcessSerive.GetMyTaskPageList(userInfo, pagination, queryJson, schemeCode, isBatchAudit);
  151. }
  152. /// <summary>
  153. /// 获取未处理任务列表
  154. /// </summary>
  155. /// <param name="userInfo">用户信息</param>
  156. /// <param name="queryJson">查询条件</param>
  157. /// <param name="schemeCode">流程模板编码</param>
  158. /// <param name="isBatchAudit">true获取批量审核任务</param>
  159. /// <returns></returns>
  160. public IEnumerable<NWFProcessEntity> GetMyTaskPageList(UserInfo userInfo, string queryJson, bool isBatchAudit, string schemeCode = null)
  161. {
  162. return nWFProcessSerive.GetMyTaskPageList(userInfo, queryJson, schemeCode, isBatchAudit);
  163. }
  164. /// <summary>
  165. /// 获取已处理任务列表
  166. /// </summary>
  167. /// <param name="userInfo">用户信息</param>
  168. /// <param name="pagination">翻页信息</param>
  169. /// <param name="queryJson">查询条件</param>
  170. /// <param name="schemeCode">流程模板编码</param>
  171. /// <returns></returns>
  172. public IEnumerable<NWFProcessEntity> GetMyFinishTaskPageList(UserInfo userInfo, Pagination pagination, string queryJson, string schemeCode = null)
  173. {
  174. return nWFProcessSerive.GetMyFinishTaskPageList(userInfo, pagination, queryJson, schemeCode);
  175. }
  176. /// <summary>
  177. /// 获取已处理任务列表
  178. /// </summary>
  179. /// <param name="userInfo">用户信息</param>
  180. /// <param name="queryJson">查询条件</param>
  181. /// <param name="schemeCode">流程模板编码</param>
  182. /// <returns></returns>
  183. public IEnumerable<NWFProcessEntity> GetMyFinishTaskPageList(UserInfo userInfo, string queryJson, string schemeCode = null)
  184. {
  185. return nWFProcessSerive.GetMyFinishTaskPageList(userInfo, queryJson, schemeCode);
  186. }
  187. public List<UserInfo> GetDelegateProcess(string UserId)
  188. {
  189. return nWFProcessSerive.GetDelegateProcess(UserId);
  190. }
  191. #endregion
  192. #region 保存更新删除
  193. /// <summary>
  194. /// 删除流程进程实体
  195. /// </summary>
  196. /// <param name="processId">流程进程主键</param>
  197. public void DeleteEntity(string processId)
  198. {
  199. nWFProcessSerive.DeleteEntity(processId);
  200. }
  201. #endregion
  202. #region 流程表单数据统计
  203. /// <summary>
  204. /// 用印申请流程表单统计
  205. /// </summary>
  206. /// <param name="pagination">分页参数</param>
  207. /// <param name="queryJson">查询条件</param>
  208. /// <returns></returns>
  209. public IEnumerable<LC_yyspdEntity> GetPageListOfyyspd(Pagination pagination, string queryJson)
  210. {
  211. try
  212. {
  213. return nWFProcessSerive.GetPageListOfyyspd(pagination,queryJson);
  214. }
  215. catch (Exception ex)
  216. {
  217. if (ex is ExceptionEx)
  218. {
  219. throw;
  220. }
  221. else
  222. {
  223. throw ExceptionEx.ThrowBusinessException(ex);
  224. }
  225. }
  226. }
  227. /// <summary>
  228. /// 会议室申请流程表单统计
  229. /// </summary>
  230. /// <param name="pagination">分页参数</param>
  231. /// <param name="queryJson">查询条件</param>
  232. /// <returns></returns>
  233. public IEnumerable<LC_meetingEntity> GetPageListOfmeeting(Pagination pagination, string queryJson)
  234. {
  235. try
  236. {
  237. return nWFProcessSerive.GetPageListOfmeeting(pagination, queryJson);
  238. }
  239. catch (Exception ex)
  240. {
  241. if (ex is ExceptionEx)
  242. {
  243. throw;
  244. }
  245. else
  246. {
  247. throw ExceptionEx.ThrowBusinessException(ex);
  248. }
  249. }
  250. }
  251. /// <summary>
  252. /// 党委会党委专题会申请流程表单统计
  253. /// </summary>
  254. /// <param name="pagination">分页参数</param>
  255. /// <param name="queryJson">查询条件</param>
  256. /// <returns></returns>
  257. public IEnumerable<LC_dwhsqEntity> GetPageListOfdwhsq(Pagination pagination, string queryJson)
  258. {
  259. try
  260. {
  261. return nWFProcessSerive.GetPageListOfdwhsq(pagination, queryJson);
  262. }
  263. catch (Exception ex)
  264. {
  265. if (ex is ExceptionEx)
  266. {
  267. throw;
  268. }
  269. else
  270. {
  271. throw ExceptionEx.ThrowBusinessException(ex);
  272. }
  273. }
  274. }
  275. #endregion
  276. #region 流程API
  277. #region 委托方法
  278. /// <summary>
  279. /// 获取审核通过数
  280. /// </summary>
  281. /// <param name="processId">流程实例主键</param>
  282. /// <param name="nodeId">节点主键</param>
  283. /// <returns></returns>
  284. public int GetAgreeNum(string processId, string nodeId)
  285. {
  286. List<NWFConfluenceEntity> list = (List<NWFConfluenceEntity>)nWFConfluenceIBLL.GetList(processId, nodeId);
  287. return list.FindAll(t => t.F_State == 1).Count;
  288. }
  289. /// <summary>
  290. /// 获取审核不通过数
  291. /// </summary>
  292. /// <param name="processId">流程实例主键</param>
  293. /// <param name="nodeId">节点主键</param>
  294. /// <returns></returns>
  295. public int GetDisAgreeNum(string processId, string nodeId)
  296. {
  297. List<NWFConfluenceEntity> list = (List<NWFConfluenceEntity>)nWFConfluenceIBLL.GetList(processId, nodeId);
  298. return list.FindAll(t => t.F_State == 0).Count;
  299. }
  300. #endregion
  301. #region 私有方法
  302. /// <summary>
  303. /// 流程模板初始化
  304. /// </summary>
  305. /// <param name="parameter">参数</param>
  306. /// <returns></returns>
  307. private NWFIEngine _Bootstraper(string code, string processId, string taskId, UserInfo userInfo)
  308. {
  309. NWFIEngine wfIEngine = null;
  310. NWFEngineConfig nWFEngineConfig = new NWFEngineConfig();
  311. NWFEngineParamConfig nWFEngineParamConfig = new NWFEngineParamConfig();
  312. nWFEngineConfig.ParamConfig = nWFEngineParamConfig;
  313. if (userInfo != null)
  314. {
  315. nWFEngineParamConfig.CurrentUser = new NWFUserInfo()
  316. {
  317. Id = userInfo.userId,
  318. Account = userInfo.account,
  319. Name = userInfo.realName,
  320. CompanyId = userInfo.companyId,
  321. DepartmentId = userInfo.departmentId
  322. };
  323. }
  324. if (!string.IsNullOrEmpty(code))
  325. {
  326. var schemeInfo = nWFSchemeIBLL.GetInfoEntityByCode(code);
  327. if (schemeInfo != null)
  328. {
  329. var data = nWFSchemeIBLL.GetSchemeEntity(schemeInfo.F_SchemeId);
  330. if (data != null)
  331. {
  332. nWFEngineParamConfig.Scheme = data.F_Content;
  333. nWFEngineParamConfig.SchemeCode = code;
  334. nWFEngineParamConfig.SchemeId = schemeInfo.F_SchemeId;
  335. nWFEngineParamConfig.SchemeName = schemeInfo.F_Name;
  336. nWFEngineParamConfig.ProcessId = processId;
  337. nWFEngineParamConfig.HasInstance = false;
  338. nWFEngineParamConfig.CreateUser = nWFEngineParamConfig.CurrentUser;
  339. }
  340. }
  341. }
  342. else if (!string.IsNullOrEmpty(processId))
  343. {
  344. var processEntity = GetEntity(processId);
  345. if (processEntity != null)
  346. {
  347. if (string.IsNullOrEmpty(processEntity.F_SchemeId))// 这种情况出现在草稿下
  348. {
  349. var schemeInfo = nWFSchemeIBLL.GetInfoEntityByCode(processEntity.F_SchemeCode);
  350. if (schemeInfo != null)
  351. {
  352. var data = nWFSchemeIBLL.GetSchemeEntity(schemeInfo.F_SchemeId);
  353. if (data != null)
  354. {
  355. nWFEngineParamConfig.Scheme = data.F_Content;
  356. nWFEngineParamConfig.SchemeCode = processEntity.F_SchemeCode;
  357. nWFEngineParamConfig.SchemeId = schemeInfo.F_SchemeId;
  358. nWFEngineParamConfig.SchemeName = schemeInfo.F_Name;
  359. nWFEngineParamConfig.ProcessId = processId;
  360. nWFEngineParamConfig.HasInstance = true;
  361. nWFEngineParamConfig.CreateUser = nWFEngineParamConfig.CurrentUser;
  362. }
  363. }
  364. }
  365. else
  366. {
  367. var data = nWFSchemeIBLL.GetSchemeEntity(processEntity.F_SchemeId);
  368. if (data != null)
  369. {
  370. nWFEngineParamConfig.Scheme = data.F_Content;
  371. nWFEngineParamConfig.SchemeCode = processEntity.F_SchemeCode;
  372. nWFEngineParamConfig.SchemeId = processEntity.F_SchemeId;
  373. nWFEngineParamConfig.SchemeName = processEntity.F_SchemeName;
  374. nWFEngineParamConfig.IsChild = (int)processEntity.F_IsChild;
  375. nWFEngineParamConfig.ParentProcessId = processEntity.F_ParentProcessId;
  376. nWFEngineParamConfig.ParentTaskId = processEntity.F_ParentTaskId;
  377. nWFEngineParamConfig.ProcessId = processId;
  378. nWFEngineParamConfig.HasInstance = true;
  379. UserEntity userEntity = userIBLL.GetEntityByUserId(processEntity.F_CreateUserId);
  380. nWFEngineParamConfig.CreateUser = new NWFUserInfo()
  381. {
  382. Id = processEntity.F_CreateUserId,
  383. Account = userEntity.F_Account,
  384. Name = userEntity.F_RealName,
  385. CompanyId = userEntity.F_CompanyId,
  386. DepartmentId = userEntity.F_DepartmentId
  387. };
  388. }
  389. }
  390. }
  391. }
  392. else if (!string.IsNullOrEmpty(taskId))
  393. {
  394. var taskEntiy = nWFTaskIBLL.GetEntity(taskId);
  395. if (taskEntiy != null)
  396. {
  397. var processEntity = GetEntity(taskEntiy.F_ProcessId);
  398. if (processEntity != null)
  399. {
  400. var data = nWFSchemeIBLL.GetSchemeEntity(processEntity.F_SchemeId);
  401. if (data != null)
  402. {
  403. nWFEngineParamConfig.Scheme = data.F_Content;
  404. nWFEngineParamConfig.SchemeCode = processEntity.F_SchemeCode;
  405. nWFEngineParamConfig.SchemeId = processEntity.F_SchemeId;
  406. nWFEngineParamConfig.SchemeName = processEntity.F_SchemeName;
  407. nWFEngineParamConfig.IsChild = (int)processEntity.F_IsChild;
  408. nWFEngineParamConfig.ParentProcessId = processEntity.F_ParentProcessId;
  409. nWFEngineParamConfig.ParentTaskId = processEntity.F_ParentTaskId;
  410. nWFEngineParamConfig.ProcessId = processEntity.F_Id;
  411. nWFEngineParamConfig.HasInstance = true;
  412. UserEntity userEntity = userIBLL.GetEntityByUserId(processEntity.F_CreateUserId);
  413. nWFEngineParamConfig.CreateUser = new NWFUserInfo()
  414. {
  415. Id = processEntity.F_CreateUserId,
  416. Account = userEntity.F_Account,
  417. Name = userEntity.F_RealName,
  418. CompanyId = userEntity.F_CompanyId,
  419. DepartmentId = userEntity.F_DepartmentId
  420. };
  421. }
  422. }
  423. }
  424. }
  425. // 注册委托方法
  426. nWFEngineConfig.DbFindTable = databaseLinkIBLL.FindTable;
  427. nWFEngineConfig.GetAgreeNum = GetAgreeNum;
  428. nWFEngineConfig.GetDisAgreeNum = GetDisAgreeNum;
  429. wfIEngine = new NWFEngine(nWFEngineConfig);
  430. return wfIEngine;
  431. }
  432. /// <summary>
  433. /// 获取节点处理人列表
  434. /// </summary>
  435. /// <param name="nodeAuditorList">节点审核人设置信息</param>
  436. /// <param name="nodeId">流程id</param>
  437. /// <param name="paramConfig">流程配置信息</param>
  438. private List<NWFUserInfo> _GetNodeAuditors(List<NWFAuditor> nodeAuditorList, NWFNodeInfo nodeInfo, NWFEngineParamConfig paramConfig)
  439. {
  440. List<NWFUserInfo> list = new List<NWFUserInfo>();
  441. List<NWFUserInfo> list2 = _GetNodeAuditors2(nodeAuditorList, nodeInfo, paramConfig);
  442. // 判断当前节点之前是否有过审核,如果有就用之前的审核人
  443. NWFTaskEntity taskEntiy = null;
  444. if (!string.IsNullOrEmpty(paramConfig.ProcessId))
  445. {
  446. taskEntiy = nWFTaskIBLL.GetEntityByNodeId(nodeInfo.id, paramConfig.ProcessId);
  447. if (taskEntiy != null)
  448. {
  449. if (taskEntiy.F_IsFinished == 0)
  450. {
  451. return list;
  452. }
  453. List<NWFTaskRelationEntity> taskUserList = (List<NWFTaskRelationEntity>)nWFTaskIBLL.GetTaskUserList(taskEntiy.F_Id);
  454. if (nodeInfo.type == "stepnode" && nodeInfo.isAllAuditor == "2")
  455. {
  456. List<NWFTaskRelationEntity> taskUserList2;
  457. // 如果普通节点设置了所有人都需要审核的情况
  458. if (nodeInfo.auditorAgainType == "1")
  459. {
  460. //审核通过的人不需要再审核:获取未审核通过的人。但是在大家都通过的情况下就获取所有人
  461. taskUserList2 = taskUserList.FindAll(t => t.F_Result != 1);
  462. if (taskUserList2.Count == 0)
  463. {
  464. taskUserList2 = taskUserList;
  465. }
  466. }
  467. else
  468. {
  469. taskUserList2 = taskUserList;
  470. }
  471. if (taskUserList2.Count > 0)
  472. {
  473. foreach (var item in taskUserList2)
  474. {
  475. UserEntity taskUserEntity = userIBLL.GetEntityByUserId(item.F_UserId);
  476. if (taskUserEntity != null)
  477. {
  478. list.Add(new NWFUserInfo()
  479. {
  480. Id = taskUserEntity.F_UserId,
  481. Account = taskUserEntity.F_Account,
  482. Name = taskUserEntity.F_RealName
  483. });
  484. }
  485. }
  486. return list;
  487. }
  488. }
  489. else
  490. {
  491. NWFTaskRelationEntity taskUser = taskUserList.Find(t => t.F_Result != 0 && t.F_Result != 3);
  492. if (taskUser != null)
  493. {
  494. UserEntity taskUserEntity = userIBLL.GetEntityByUserId(taskUser.F_UserId);
  495. if (taskUserEntity != null)
  496. {
  497. list.Add(new NWFUserInfo()
  498. {
  499. Id = taskUserEntity.F_UserId,
  500. Account = taskUserEntity.F_Account,
  501. Name = taskUserEntity.F_RealName
  502. });
  503. string _userId = taskUserEntity.F_UserId;
  504. if (list2.Find(t => t.Id == _userId) == null)
  505. {
  506. if (list2.Count == 0)
  507. {// 未找到审核人,默认成系统管理员
  508. if (nodeInfo.noPeopleGz == 3)
  509. {
  510. throw (new Exception("下一节点没有审核人,无法提交!"));
  511. }
  512. // 如果找不到审核人就默认超级管理员才能审核
  513. var adminEntityList = userIBLL.GetAdminList();
  514. foreach (var item in adminEntityList)
  515. {
  516. list2.Add(new NWFUserInfo()
  517. {
  518. Id = item.F_UserId,
  519. Account = item.F_Account,
  520. Name = item.F_RealName,
  521. noPeople = true
  522. });
  523. }
  524. }
  525. return list2;
  526. }
  527. return list;
  528. }
  529. }
  530. }
  531. }
  532. }
  533. list.AddRange(list2);
  534. if (list.Count == 0)
  535. {// 未找到审核人,默认成系统管理员
  536. if (nodeInfo.noPeopleGz == 3)
  537. {
  538. throw (new Exception("下一节点没有审核人,无法提交!"));
  539. }
  540. // 如果找不到审核人就默认超级管理员才能审核
  541. var adminEntityList = userIBLL.GetAdminList();
  542. foreach (var item in adminEntityList)
  543. {
  544. list.Add(new NWFUserInfo()
  545. {
  546. Id = item.F_UserId,
  547. Account = item.F_Account,
  548. Name = item.F_RealName,
  549. noPeople = true
  550. });
  551. }
  552. }
  553. return list;
  554. }
  555. private List<NWFUserInfo> _GetNodeAuditors2(List<NWFAuditor> nodeAuditorList, NWFNodeInfo nodeInfo, NWFEngineParamConfig paramConfig)
  556. {
  557. List<NWFUserInfo> list = new List<NWFUserInfo>();
  558. if (nodeAuditorList == null)
  559. {
  560. // 开始节点的情况
  561. list.Add(new NWFUserInfo()
  562. {
  563. Id = paramConfig.CreateUser.Id,
  564. Account = paramConfig.CreateUser.Account,
  565. Name = paramConfig.CreateUser.Name
  566. });
  567. return list;
  568. }
  569. if (nodeAuditorList.Count == 0)
  570. {
  571. // 如果找不到审核人就默认超级管理员才能审核
  572. var adminEntityList = userIBLL.GetAdminList();
  573. foreach (var item in adminEntityList)
  574. {
  575. list.Add(new NWFUserInfo()
  576. {
  577. Id = item.F_UserId,
  578. Account = item.F_Account,
  579. Name = item.F_RealName
  580. });
  581. }
  582. }
  583. else
  584. {
  585. foreach (var item in nodeAuditorList)
  586. {
  587. switch (item.type)//1.岗位2.角色3.用户4.上下级5.表单指定字段6.某一个节点执行人
  588. //liang 20200813 新增type=7 分管校长
  589. //dyy 20220715 新增type=9 班主任/辅导员
  590. {
  591. case 1:// 岗位
  592. var userRelationList = userRelationIBLL.GetUserIdList(item.auditorId);
  593. foreach (var userRelation in userRelationList)
  594. {
  595. var userEntity = userIBLL.GetEntityByUserId(userRelation.F_UserId);
  596. if (userEntity != null)
  597. {
  598. if (item.condition == 1)
  599. {
  600. if (userEntity.F_DepartmentId == paramConfig.CreateUser.DepartmentId)
  601. {
  602. list.Add(new NWFUserInfo()
  603. {
  604. Id = userEntity.F_UserId,
  605. Account = userEntity.F_Account,
  606. Name = userEntity.F_RealName
  607. });
  608. }
  609. }
  610. else if (item.condition == 2)
  611. {
  612. if (userEntity.F_CompanyId == paramConfig.CreateUser.CompanyId)
  613. {
  614. list.Add(new NWFUserInfo()
  615. {
  616. Id = userEntity.F_UserId,
  617. Account = userEntity.F_Account,
  618. Name = userEntity.F_RealName
  619. });
  620. }
  621. }
  622. else
  623. {
  624. list.Add(new NWFUserInfo()
  625. {
  626. Id = userEntity.F_UserId,
  627. Account = userEntity.F_Account,
  628. Name = userEntity.F_RealName
  629. });
  630. }
  631. }
  632. }
  633. break;
  634. case 2:// 角色
  635. var userRelationList2 = userRelationIBLL.GetUserIdList(item.auditorId);
  636. foreach (var userRelation in userRelationList2)
  637. {
  638. WfAuditor wfAuditor = new WfAuditor();
  639. var userEntity = userIBLL.GetEntityByUserId(userRelation.F_UserId);
  640. if (userEntity != null)
  641. {
  642. if (item.condition == 1)
  643. {
  644. if (userEntity.F_DepartmentId == paramConfig.CreateUser.DepartmentId)
  645. {
  646. list.Add(new NWFUserInfo()
  647. {
  648. Id = userEntity.F_UserId,
  649. Account = userEntity.F_Account,
  650. Name = userEntity.F_RealName
  651. });
  652. }
  653. }
  654. else if (item.condition == 2)
  655. {
  656. if (userEntity.F_CompanyId == paramConfig.CreateUser.CompanyId)
  657. {
  658. list.Add(new NWFUserInfo()
  659. {
  660. Id = userEntity.F_UserId,
  661. Account = userEntity.F_Account,
  662. Name = userEntity.F_RealName
  663. });
  664. }
  665. }
  666. else if (item.condition == 3) // 需要存在上级关系
  667. {
  668. // 获取当前用户的岗位
  669. var postList1 = userRelationIBLL.GetObjectIds(paramConfig.CreateUser.Id, 2);// 发起人岗位
  670. var postList2 = userRelationIBLL.GetObjectIds(userEntity.F_UserId, 2);// 节点审核人岗位
  671. if (postIBLL.IsUp(postList1, postList2))
  672. {
  673. list.Add(new NWFUserInfo()
  674. {
  675. Id = userEntity.F_UserId,
  676. Account = userEntity.F_Account,
  677. Name = userEntity.F_RealName
  678. });
  679. }
  680. }
  681. else if (item.condition == 4) // 需要存在下级关系
  682. {
  683. // 获取当前用户的岗位
  684. var postList1 = userRelationIBLL.GetObjectIds(paramConfig.CreateUser.Id, 2);// 发起人岗位
  685. var postList2 = userRelationIBLL.GetObjectIds(userEntity.F_UserId, 2);// 节点审核人岗位
  686. if (postIBLL.IsDown(postList1, postList2))
  687. {
  688. list.Add(new NWFUserInfo()
  689. {
  690. Id = userEntity.F_UserId,
  691. Account = userEntity.F_Account,
  692. Name = userEntity.F_RealName
  693. });
  694. }
  695. }
  696. else
  697. {
  698. list.Add(new NWFUserInfo()
  699. {
  700. Id = userEntity.F_UserId,
  701. Account = userEntity.F_Account,
  702. Name = userEntity.F_RealName
  703. });
  704. }
  705. }
  706. }
  707. break;
  708. case 3:// 用户
  709. if (!string.IsNullOrEmpty(item.auditorId))
  710. {
  711. string[] userList = item.auditorId.Split(',');
  712. foreach (var userItem in userList)
  713. {
  714. var userEntity3 = userIBLL.GetEntityByUserId(userItem);
  715. if (userEntity3 != null)
  716. {
  717. list.Add(new NWFUserInfo()
  718. {
  719. Id = userEntity3.F_UserId,
  720. Account = userEntity3.F_Account,
  721. Name = userEntity3.F_RealName
  722. });
  723. }
  724. }
  725. }
  726. break;
  727. case 4:// 上下级 上1-5;下6-10
  728. var postId = userRelationIBLL.GetObjectIds(paramConfig.CreateUser.Id, 2);// 发起人岗位
  729. int level = Convert.ToInt32(item.auditorId);
  730. List<string> postList;
  731. if (level < 6)
  732. {
  733. postList = postIBLL.GetUpIdList(postId, level);
  734. }
  735. else
  736. {
  737. level = level - 5;
  738. postList = postIBLL.GetDownIdList(postId, level);
  739. }
  740. var userRelationList4 = userRelationIBLL.GetUserIdList(postList);
  741. foreach (var userRelationItem in userRelationList4)
  742. {
  743. WfAuditor wfAuditor = new WfAuditor();
  744. var userEntity = userIBLL.GetEntityByUserId(userRelationItem.F_UserId);
  745. if (userEntity != null)
  746. {
  747. list.Add(new NWFUserInfo()
  748. {
  749. Id = userEntity.F_UserId,
  750. Account = userEntity.F_Account,
  751. Name = userEntity.F_RealName
  752. });
  753. }
  754. }
  755. break;
  756. case 5:// 表单指定字段
  757. // 获取对应的表单数据dbId,table,relationId,id 数据库主键/表/关联字段/审核人字段
  758. if (!string.IsNullOrEmpty(item.auditorId))
  759. {
  760. string[] idList = item.auditorId.Split('|');
  761. if (idList.Length == 4)
  762. {
  763. string dbId = idList[0];
  764. string table = idList[1];
  765. string relationId = idList[2];
  766. string id = idList[3];
  767. string sql = "select " + id + " from " + table + " where " + relationId + " ='" + paramConfig.ProcessId + "'";
  768. DataTable dt = databaseLinkIBLL.FindTable(dbId, sql);
  769. foreach (DataRow row in dt.Rows)
  770. {
  771. var userEntity5 = userIBLL.GetEntityByUserId(row[0].ToString());
  772. if (userEntity5 != null)
  773. {
  774. list.Add(new NWFUserInfo()
  775. {
  776. Id = userEntity5.F_UserId,
  777. Account = userEntity5.F_Account,
  778. Name = userEntity5.F_RealName
  779. });
  780. }
  781. }
  782. }
  783. }
  784. break;
  785. case 6:// 某一个节点执行人
  786. var task = nWFTaskIBLL.GetLogEntityByNodeId(item.auditorId, paramConfig.ProcessId);
  787. if (task != null && !string.IsNullOrEmpty(task.F_CreateUserId))
  788. {
  789. var userEntity6 = userIBLL.GetEntityByUserId(task.F_CreateUserId);
  790. if (userEntity6 != null)
  791. {
  792. list.Add(new NWFUserInfo()
  793. {
  794. Id = userEntity6.F_UserId,
  795. Account = userEntity6.F_Account,
  796. Name = userEntity6.F_RealName
  797. });
  798. }
  799. }
  800. break;
  801. case 7://liang 20200813新增分管校长判断
  802. //获取流程创建用户的分管领导
  803. //判断用户所在部门是否有上级部门:如果有,找到上级部门的负责人;如果没有,找本部门的分管校长;
  804. string schoolMasterId = "";
  805. var selfDepart = departmentIBLL.GetEntity(paramConfig.CreateUser.DepartmentId);
  806. if (selfDepart != null)
  807. {
  808. //本部门存在分管校长
  809. if (!string.IsNullOrEmpty(selfDepart.F_SchoolMasterId))
  810. {
  811. schoolMasterId = selfDepart.F_SchoolMasterId;
  812. }
  813. else
  814. {
  815. //本部门不存在就找上级部门
  816. var parentDepart = departmentIBLL.GetEntity(selfDepart.F_ParentId);
  817. if (parentDepart != null)
  818. {
  819. if (!string.IsNullOrEmpty(selfDepart.F_SchoolMasterId))
  820. {
  821. schoolMasterId = parentDepart.F_SchoolMasterId;
  822. }
  823. }
  824. }
  825. }
  826. //找到分管校长就增加审批人
  827. if (!string.IsNullOrEmpty(schoolMasterId))
  828. {
  829. var userEntity7 = userIBLL.GetEntityByUserId(schoolMasterId);
  830. if (null != userEntity7)
  831. {
  832. list.Add(new NWFUserInfo()
  833. {
  834. Id = userEntity7.F_UserId,
  835. Account = userEntity7.F_Account,
  836. Name = userEntity7.F_RealName
  837. });
  838. }
  839. }
  840. break;
  841. case 8://liang 20210706新增部门负责人判断
  842. //获取流程创建用户的分管领导
  843. //判断用户所在部门是否有上级部门:如果有,找到上级部门的负责人;如果没有,找本部门的分管校长;
  844. string deptMasterId = "";
  845. var selfDepart2 = departmentIBLL.GetEntity(paramConfig.CreateUser.DepartmentId);
  846. if (selfDepart2 != null)
  847. {
  848. //本部门存在部门负责人
  849. if (!string.IsNullOrEmpty(selfDepart2.F_Manager))
  850. {
  851. deptMasterId = selfDepart2.F_Manager;
  852. }
  853. else
  854. {
  855. //本部门不存在就找上级部门
  856. var parentDepart = departmentIBLL.GetEntity(selfDepart2.F_ParentId);
  857. if (parentDepart != null)
  858. {
  859. if (!string.IsNullOrEmpty(selfDepart2.F_Manager))
  860. {
  861. deptMasterId = parentDepart.F_Manager;
  862. }
  863. }
  864. }
  865. }
  866. //找到部门负责人就增加审批人
  867. if (!string.IsNullOrEmpty(deptMasterId))
  868. {
  869. var userEntity7 = userIBLL.GetEntityByUserId(deptMasterId);
  870. if (null != userEntity7)
  871. {
  872. if (!list.Exists(m => m.Id == userEntity7.F_UserId))
  873. {
  874. list.Add(new NWFUserInfo()
  875. {
  876. Id = userEntity7.F_UserId,
  877. Account = userEntity7.F_Account,
  878. Name = userEntity7.F_RealName
  879. });
  880. }
  881. }
  882. }
  883. break;
  884. case 9://dyy 20220715新增班主任/辅导员判断
  885. //获取流程创建用户的班主任/辅导员
  886. //判断用户所在班级是否有班主任/辅导员:如果有,找到班主任/辅导员;如果没有,不发;
  887. string diredctorId = "";//班主任
  888. string tutorId = "";//辅导员
  889. var stuInfoBasicEntity = stuInfoBasicIBLL.GetStuNoByAccount(paramConfig.CurrentUser.Account);
  890. if (stuInfoBasicEntity != null)
  891. {
  892. var classInfoEntity = classInfoIBLL.GetClassInfoEntityByClassNo(stuInfoBasicEntity.ClassNo);
  893. if (classInfoEntity != null)
  894. {
  895. var directorEntity = userIBLL.GetEntityByAccount(classInfoEntity.ClassDiredctorNo);
  896. if (directorEntity != null)
  897. {
  898. diredctorId = directorEntity.F_UserId;
  899. //找到班主任就增加审批人
  900. if (!list.Exists(m => m.Id == directorEntity.F_UserId))
  901. {
  902. list.Add(new NWFUserInfo()
  903. {
  904. Id = directorEntity.F_UserId,
  905. Account = directorEntity.F_Account,
  906. Name = directorEntity.F_RealName
  907. });
  908. }
  909. }
  910. var tutorEntity = userIBLL.GetEntityByAccount(classInfoEntity.ClassTutorNo);
  911. if (tutorEntity != null)
  912. {
  913. tutorId = tutorEntity.F_UserId;
  914. //找到辅导员就增加审批人
  915. if (!list.Exists(m => m.Id == tutorEntity.F_UserId))
  916. {
  917. list.Add(new NWFUserInfo()
  918. {
  919. Id = tutorEntity.F_UserId,
  920. Account = tutorEntity.F_Account,
  921. Name = tutorEntity.F_RealName
  922. });
  923. }
  924. }
  925. }
  926. }
  927. break;
  928. }
  929. }
  930. }
  931. return list;
  932. }
  933. /// <summary>
  934. /// 创建流程任务
  935. /// </summary>
  936. /// <param name="nodeList">节点信息</param>
  937. /// <param name="paramConfig">流程配置信息</param>
  938. /// <returns></returns>
  939. private List<NWFTaskEntity> _CreateTask(List<NWFNodeInfo> nodeList, NWFNodeInfo currentNodeInfo, NWFEngineParamConfig paramConfig)
  940. {
  941. List<NWFTaskEntity> list = new List<NWFTaskEntity>();
  942. foreach (var node in nodeList)
  943. {
  944. NWFTaskEntity nWFTaskEntity = new NWFTaskEntity();
  945. nWFTaskEntity.Create();
  946. nWFTaskEntity.F_ProcessId = paramConfig.ProcessId;
  947. nWFTaskEntity.F_NodeId = node.id;
  948. nWFTaskEntity.F_NodeName = node.name;
  949. nWFTaskEntity.F_PrevNodeId = currentNodeInfo.id;
  950. nWFTaskEntity.F_PrevNodeName = currentNodeInfo.name;
  951. nWFTaskEntity.F_CreateUserId = paramConfig.CurrentUser.Id;
  952. nWFTaskEntity.F_CreateUserName = paramConfig.CurrentUser.Name;
  953. if (!string.IsNullOrEmpty(node.timeoutAction))
  954. {
  955. nWFTaskEntity.F_TimeoutAction = Convert.ToInt32(node.timeoutAction);
  956. }
  957. if (!string.IsNullOrEmpty(node.timeoutInterval))
  958. {
  959. nWFTaskEntity.F_TimeoutInterval = Convert.ToInt32(node.timeoutInterval);
  960. }
  961. if (!string.IsNullOrEmpty(node.timeoutNotice))
  962. {
  963. nWFTaskEntity.F_TimeoutNotice = Convert.ToInt32(node.timeoutNotice);
  964. }
  965. if (!string.IsNullOrEmpty(node.timeoutStrategy))
  966. {
  967. nWFTaskEntity.F_TimeoutStrategy = node.timeoutStrategy;
  968. }
  969. nWFTaskEntity.nWFUserInfoList = _GetNodeAuditors(node.auditors, node, paramConfig);
  970. switch (node.type)
  971. {
  972. case "stepnode":// 审核节点
  973. nWFTaskEntity.F_Type = 1;
  974. nWFTaskEntity.F_IsBatchAudit = node.isBatchAudit;
  975. if (node.isAllAuditor == "2" && node.auditorType == "2")
  976. {// 当前节点人员需要都审核
  977. foreach (var item in nWFTaskEntity.nWFUserInfoList)
  978. {
  979. item.Mark = 1;
  980. }
  981. nWFTaskEntity.nWFUserInfoList[0].Mark = 0;
  982. }
  983. break;
  984. case "auditornode":// 查阅节点
  985. nWFTaskEntity.F_Type = 2;
  986. nWFTaskEntity.F_IsBatchAudit = node.isBatchAudit;
  987. break;
  988. case "childwfnode":// 子流程节点
  989. NWFTaskEntity taskEntiy = nWFTaskIBLL.GetEntityByNodeId(node.id, paramConfig.ProcessId);
  990. if (taskEntiy == null)
  991. {
  992. nWFTaskEntity.F_ChildProcessId = Guid.NewGuid().ToString();
  993. nWFTaskEntity.F_Type = 4;
  994. }
  995. else
  996. {
  997. NWFProcessEntity cNWFProcessEntity = nWFProcessSerive.GetEntity(taskEntiy.F_ChildProcessId);
  998. if (cNWFProcessEntity.F_IsFinished == 1)
  999. {// 如果子流程已经结束
  1000. nWFTaskEntity.F_ChildProcessId = taskEntiy.F_ChildProcessId;
  1001. nWFTaskEntity.F_Type = 6;
  1002. NWFIEngine nWFIEngine = _Bootstraper("", taskEntiy.F_ChildProcessId, "", null);
  1003. NWFTaskEntity nWFTaskEntity2 = new NWFTaskEntity();
  1004. nWFTaskEntity2.Create();
  1005. nWFTaskEntity2.F_ProcessId = cNWFProcessEntity.F_Id;
  1006. nWFTaskEntity2.F_NodeId = nWFIEngine.GetStartNode().id;
  1007. nWFTaskEntity2.F_NodeName = nWFIEngine.GetStartNode().name;
  1008. nWFTaskEntity2.F_PrevNodeId = currentNodeInfo.id;
  1009. nWFTaskEntity2.F_PrevNodeName = currentNodeInfo.name;
  1010. nWFTaskEntity2.F_CreateUserId = paramConfig.CurrentUser.Id;
  1011. nWFTaskEntity2.F_CreateUserName = paramConfig.CurrentUser.Name;
  1012. nWFTaskEntity2.F_Type = 5;
  1013. list.Add(nWFTaskEntity2);
  1014. }
  1015. else
  1016. {
  1017. nWFTaskEntity.F_Type = null;
  1018. }
  1019. }
  1020. break;
  1021. case "startround":// 开始节点
  1022. if (paramConfig.IsChild == 1)
  1023. {
  1024. NWFTaskEntity pNWFTaskEntity = nWFTaskIBLL.GetEntity(paramConfig.ParentTaskId);
  1025. nWFTaskEntity.F_ProcessId = paramConfig.ParentProcessId;
  1026. nWFTaskEntity.F_NodeId = pNWFTaskEntity.F_NodeId;
  1027. nWFTaskEntity.F_NodeName = pNWFTaskEntity.F_NodeName;
  1028. nWFTaskEntity.F_PrevNodeId = pNWFTaskEntity.F_NodeId;
  1029. nWFTaskEntity.F_PrevNodeName = pNWFTaskEntity.F_NodeName;
  1030. nWFTaskEntity.F_Type = 6;
  1031. nWFTaskEntity.F_ChildProcessId = paramConfig.ProcessId;
  1032. NWFTaskEntity nWFTaskEntity2 = new NWFTaskEntity();
  1033. nWFTaskEntity2.Create();
  1034. nWFTaskEntity2.F_ProcessId = paramConfig.ProcessId;
  1035. nWFTaskEntity2.F_NodeId = node.id;
  1036. nWFTaskEntity2.F_NodeName = node.name;
  1037. nWFTaskEntity2.F_PrevNodeId = currentNodeInfo.id;
  1038. nWFTaskEntity2.F_PrevNodeName = currentNodeInfo.name;
  1039. nWFTaskEntity2.F_CreateUserId = paramConfig.CurrentUser.Id;
  1040. nWFTaskEntity2.F_CreateUserName = paramConfig.CurrentUser.Name;
  1041. nWFTaskEntity2.F_Type = 5;
  1042. list.Add(nWFTaskEntity2);
  1043. }
  1044. else
  1045. {
  1046. nWFTaskEntity.F_Type = 5;
  1047. }
  1048. break;
  1049. }
  1050. if (nWFTaskEntity.nWFUserInfoList.Count > 0 && nWFTaskEntity.F_Type != null)
  1051. {
  1052. list.Add(nWFTaskEntity);
  1053. }
  1054. }
  1055. return list;
  1056. }
  1057. /// <summary>
  1058. /// 创建流程任务
  1059. /// </summary>
  1060. /// <param name="nodeList">节点信息</param>
  1061. /// <param name="paramConfig">流程配置信息</param>
  1062. /// <returns></returns>
  1063. private List<NWFTaskMsgEntity> _CreateTaskMsg(List<NWFTaskEntity> taskList, NWFEngineParamConfig paramConfig)
  1064. {
  1065. List<NWFTaskMsgEntity> list = new List<NWFTaskMsgEntity>();
  1066. foreach (var task in taskList)
  1067. {
  1068. if (task.nWFUserInfoList != null)
  1069. {
  1070. foreach (var item in task.nWFUserInfoList)
  1071. {
  1072. NWFTaskMsgEntity nWFTaskMsgEntity = new NWFTaskMsgEntity();
  1073. nWFTaskMsgEntity.Create();
  1074. nWFTaskMsgEntity.F_ProcessId = task.F_ProcessId;
  1075. nWFTaskMsgEntity.F_TaskId = task.F_Id;
  1076. nWFTaskMsgEntity.F_FromUserId = paramConfig.CurrentUser.Id;
  1077. nWFTaskMsgEntity.F_FromUserName = paramConfig.CreateUser.Name;
  1078. nWFTaskMsgEntity.F_FromUserAccount = paramConfig.CreateUser.Account;
  1079. nWFTaskMsgEntity.F_ToUserId = item.Id;
  1080. nWFTaskMsgEntity.F_ToName = item.Name;
  1081. nWFTaskMsgEntity.F_ToAccount = item.Account;
  1082. nWFTaskMsgEntity.F_Title = paramConfig.SchemeName;
  1083. nWFTaskMsgEntity.F_Content = "你有新的" + paramConfig.SchemeName + "";
  1084. nWFTaskMsgEntity.NodeId = task.F_NodeId;
  1085. nWFTaskMsgEntity.F_NodeName = task.F_NodeName;
  1086. switch (task.F_Type)
  1087. {
  1088. case 1:// 审核节点
  1089. nWFTaskMsgEntity.F_Content += "需要审核,发起人" + paramConfig.CreateUser.Name + "。";
  1090. break;
  1091. case 2:// 查阅节点
  1092. nWFTaskMsgEntity.F_Content += "需要查阅,发起人" + paramConfig.CreateUser.Name + "。";
  1093. break;
  1094. case 3:// 加签
  1095. nWFTaskMsgEntity.F_Content += "需要审核,来自加签,发起人" + paramConfig.CreateUser.Name + "。";
  1096. break;
  1097. case 4:// 子流程节点
  1098. nWFTaskMsgEntity.F_Content += "的" + task.F_NodeName + "需要创建,发起人" + paramConfig.CreateUser.Name + "。";
  1099. break;
  1100. case 5:// 开始节点
  1101. nWFTaskMsgEntity.F_Content += "需要重新创建。";
  1102. break;
  1103. case 6:// 子流程重新创建
  1104. nWFTaskMsgEntity.F_Content += "需要重新创建。";
  1105. break;
  1106. }
  1107. list.Add(nWFTaskMsgEntity);
  1108. }
  1109. }
  1110. }
  1111. return list;
  1112. }
  1113. /// <summary>
  1114. /// 触发流程绑定的方法
  1115. /// </summary>
  1116. /// <param name="line">线条信息</param>
  1117. /// <param name="taskId">任务主键</param>
  1118. /// <param name="nodeName">节点名称</param>
  1119. /// <param name="code">操作码</param>
  1120. /// <param name="paramConfig">配置方法</param>
  1121. private void _TriggerMethod(NWFLineInfo line, string taskId, string nodeName, string code, NWFEngineParamConfig paramConfig)
  1122. {
  1123. switch (line.operationType)
  1124. {
  1125. case "sql":
  1126. if (!string.IsNullOrEmpty(line.dbId) && !string.IsNullOrEmpty(line.strSql))
  1127. {
  1128. string strSql = line.strSql.Replace("{processId}", "@processId");
  1129. // 流程当前执行人
  1130. strSql = strSql.Replace("{userId}", "@userId");
  1131. strSql = strSql.Replace("{userAccount}", "@userAccount");
  1132. strSql = strSql.Replace("{companyId}", "@companyId");
  1133. strSql = strSql.Replace("{departmentId}", "@departmentId");
  1134. strSql = strSql.Replace("{code}", "@code");
  1135. var param = new
  1136. {
  1137. processId = paramConfig.ProcessId,
  1138. userId = paramConfig.CurrentUser.Id,
  1139. userAccount = paramConfig.CurrentUser.Account,
  1140. companyId = paramConfig.CurrentUser.CompanyId,
  1141. departmentId = paramConfig.CurrentUser.DepartmentId,
  1142. code = code
  1143. };
  1144. databaseLinkIBLL.ExecuteBySql(line.dbId, strSql, param);
  1145. }
  1146. break;
  1147. case "interface":
  1148. if (!string.IsNullOrEmpty(line.strInterface))
  1149. {
  1150. var postData = new
  1151. {
  1152. processId = paramConfig.ProcessId,
  1153. userId = paramConfig.CurrentUser.Id,
  1154. userAccount = paramConfig.CurrentUser.Account,
  1155. companyId = paramConfig.CurrentUser.CompanyId,
  1156. departmentId = paramConfig.CurrentUser.DepartmentId,
  1157. code = code
  1158. };
  1159. HttpMethods.Post(line.strInterface, postData.ToJson());
  1160. }
  1161. break;
  1162. case "ioc":
  1163. if (!string.IsNullOrEmpty(line.iocName) && UnityIocHelper.WfInstance.IsResolve<IWorkFlowMethod>(line.iocName))
  1164. {
  1165. IWorkFlowMethod iWorkFlowMethod = UnityIocHelper.WfInstance.GetService<IWorkFlowMethod>(line.iocName);
  1166. WfMethodParameter wfMethodParameter = new WfMethodParameter()
  1167. {
  1168. processId = paramConfig.ProcessId,
  1169. taskId = taskId,
  1170. nodeName = nodeName,
  1171. code = code,
  1172. userId = paramConfig.CurrentUser.Id,
  1173. userAccount = paramConfig.CurrentUser.Account,
  1174. companyId = paramConfig.CurrentUser.CompanyId,
  1175. departmentId = paramConfig.CurrentUser.DepartmentId
  1176. };
  1177. iWorkFlowMethod.Execute(wfMethodParameter);
  1178. }
  1179. break;
  1180. }
  1181. }
  1182. /// <summary>
  1183. /// 触发流程绑定的方法
  1184. /// </summary>
  1185. /// <param name="line">线条信息</param>
  1186. /// <param name="taskId">任务主键</param>
  1187. /// <param name="nodeName">节点名称</param>
  1188. /// <param name="childProcessId">子流程进程主键</param>
  1189. /// <param name="paramConfig">配置方法</param>
  1190. private void _TriggerMethod(NWFNodeInfo node, string taskId, string nodeName, string childProcessId, NWFEngineParamConfig paramConfig)
  1191. {
  1192. switch (node.operationType)
  1193. {
  1194. case "sql":
  1195. if (!string.IsNullOrEmpty(node.dbId) && !string.IsNullOrEmpty(node.strSql))
  1196. {
  1197. string strSql = node.strSql.Replace("{processId}", "@processId");
  1198. // 流程当前执行人
  1199. strSql = strSql.Replace("{userId}", "@userId");
  1200. strSql = strSql.Replace("{userAccount}", "@userAccount");
  1201. strSql = strSql.Replace("{companyId}", "@companyId");
  1202. strSql = strSql.Replace("{departmentId}", "@departmentId");
  1203. strSql = strSql.Replace("{childProcessId}", "@childProcessId");
  1204. var param = new
  1205. {
  1206. processId = paramConfig.ProcessId,
  1207. userId = paramConfig.CurrentUser.Id,
  1208. userAccount = paramConfig.CurrentUser.Account,
  1209. companyId = paramConfig.CurrentUser.CompanyId,
  1210. departmentId = paramConfig.CurrentUser.DepartmentId,
  1211. childProcessId = childProcessId
  1212. };
  1213. databaseLinkIBLL.ExecuteBySql(node.dbId, strSql, param);
  1214. }
  1215. break;
  1216. case "interface":
  1217. if (!string.IsNullOrEmpty(node.strInterface))
  1218. {
  1219. var postData = new
  1220. {
  1221. processId = paramConfig.ProcessId,
  1222. userId = paramConfig.CurrentUser.Id,
  1223. userAccount = paramConfig.CurrentUser.Account,
  1224. companyId = paramConfig.CurrentUser.CompanyId,
  1225. departmentId = paramConfig.CurrentUser.DepartmentId,
  1226. childProcessId = childProcessId
  1227. };
  1228. HttpMethods.Post(node.strInterface, postData.ToJson());
  1229. }
  1230. break;
  1231. case "ioc":
  1232. if (!string.IsNullOrEmpty(node.iocName) && UnityIocHelper.WfInstance.IsResolve<IWorkFlowMethod>(node.iocName))
  1233. {
  1234. IWorkFlowMethod iWorkFlowMethod = UnityIocHelper.WfInstance.GetService<IWorkFlowMethod>(node.iocName);
  1235. WfMethodParameter wfMethodParameter = new WfMethodParameter()
  1236. {
  1237. processId = paramConfig.ProcessId,
  1238. taskId = taskId,
  1239. nodeName = nodeName,
  1240. childProcessId = childProcessId,
  1241. userId = paramConfig.CurrentUser.Id,
  1242. userAccount = paramConfig.CurrentUser.Account,
  1243. companyId = paramConfig.CurrentUser.CompanyId,
  1244. departmentId = paramConfig.CurrentUser.DepartmentId
  1245. };
  1246. iWorkFlowMethod.Execute(wfMethodParameter);
  1247. }
  1248. break;
  1249. }
  1250. }
  1251. /// <summary>
  1252. /// 触发流程绑定的方法
  1253. /// </summary>
  1254. /// <param name="closeDo">撤销,作废,删除</param>
  1255. /// <param name="code">1撤销,2作废,3删除草稿</param>
  1256. /// <param name="paramConfig">配置方法</param>
  1257. private void _TriggerMethod(NWFCloseDo closeDo, string code, NWFEngineParamConfig paramConfig)
  1258. {
  1259. switch (closeDo.F_CloseDoType)
  1260. {
  1261. case "sql":
  1262. if (!string.IsNullOrEmpty(closeDo.F_CloseDoDbId) && !string.IsNullOrEmpty(closeDo.F_CloseDoSql))
  1263. {
  1264. string strSql = closeDo.F_CloseDoSql.Replace("{processId}", "@processId");
  1265. // 流程当前执行人
  1266. strSql = strSql.Replace("{userId}", "@userId");
  1267. strSql = strSql.Replace("{userAccount}", "@userAccount");
  1268. strSql = strSql.Replace("{companyId}", "@companyId");
  1269. strSql = strSql.Replace("{departmentId}", "@departmentId");
  1270. strSql = strSql.Replace("{code}", "@code");
  1271. var param = new
  1272. {
  1273. processId = paramConfig.ProcessId,
  1274. userId = paramConfig.CurrentUser.Id,
  1275. userAccount = paramConfig.CurrentUser.Account,
  1276. companyId = paramConfig.CurrentUser.CompanyId,
  1277. departmentId = paramConfig.CurrentUser.DepartmentId,
  1278. code = code
  1279. };
  1280. databaseLinkIBLL.ExecuteBySql(closeDo.F_CloseDoDbId, strSql, param);
  1281. }
  1282. break;
  1283. case "ioc":
  1284. if (!string.IsNullOrEmpty(closeDo.F_CloseDoIocName) && UnityIocHelper.WfInstance.IsResolve<IWorkFlowMethod>(closeDo.F_CloseDoIocName))
  1285. {
  1286. IWorkFlowMethod iWorkFlowMethod = UnityIocHelper.WfInstance.GetService<IWorkFlowMethod>(closeDo.F_CloseDoIocName);
  1287. WfMethodParameter wfMethodParameter = new WfMethodParameter()
  1288. {
  1289. processId = paramConfig.ProcessId,
  1290. code = code,
  1291. userId = paramConfig.CurrentUser.Id,
  1292. userAccount = paramConfig.CurrentUser.Account,
  1293. companyId = paramConfig.CurrentUser.CompanyId,
  1294. departmentId = paramConfig.CurrentUser.DepartmentId
  1295. };
  1296. iWorkFlowMethod.Execute(wfMethodParameter);
  1297. }
  1298. break;
  1299. case "interface":
  1300. if (!string.IsNullOrEmpty(closeDo.F_CloseDoInterface))
  1301. {
  1302. var postData = new
  1303. {
  1304. processId = paramConfig.ProcessId,
  1305. userId = paramConfig.CurrentUser.Id,
  1306. userAccount = paramConfig.CurrentUser.Account,
  1307. companyId = paramConfig.CurrentUser.CompanyId,
  1308. departmentId = paramConfig.CurrentUser.DepartmentId,
  1309. code = code
  1310. };
  1311. HttpMethods.Post(closeDo.F_CloseDoInterface, postData.ToJson());
  1312. }
  1313. break;
  1314. }
  1315. }
  1316. /// <summary>
  1317. /// 触发流程绑定的方法
  1318. /// </summary>
  1319. /// <param name="line">线条信息</param>
  1320. /// <param name="taskId">任务主键</param>
  1321. /// <param name="nodeName">节点名称</param>
  1322. /// <param name="paramConfig">配置方法</param>
  1323. private void _TriggerMethodR(NWFLineInfo line, string taskId, string nodeName, NWFEngineParamConfig paramConfig)
  1324. {
  1325. switch (line.operationType)
  1326. {
  1327. case "sql":
  1328. if (!string.IsNullOrEmpty(line.dbId) && !string.IsNullOrEmpty(line.strSqlR))
  1329. {
  1330. string strSql = line.strSqlR.Replace("{processId}", "@processId");
  1331. // 流程当前执行人
  1332. strSql = strSql.Replace("{userId}", "@userId");
  1333. strSql = strSql.Replace("{userAccount}", "@userAccount");
  1334. strSql = strSql.Replace("{companyId}", "@companyId");
  1335. strSql = strSql.Replace("{departmentId}", "@departmentId");
  1336. strSql = strSql.Replace("{code}", "@code");
  1337. var param = new
  1338. {
  1339. processId = paramConfig.ProcessId,
  1340. userId = paramConfig.CurrentUser.Id,
  1341. userAccount = paramConfig.CurrentUser.Account,
  1342. companyId = paramConfig.CurrentUser.CompanyId,
  1343. departmentId = paramConfig.CurrentUser.DepartmentId,
  1344. code = "RevokeAudit"
  1345. };
  1346. databaseLinkIBLL.ExecuteBySql(line.dbId, strSql, param);
  1347. }
  1348. break;
  1349. case "interface":
  1350. if (!string.IsNullOrEmpty(line.strInterfaceR))
  1351. {
  1352. var postData = new
  1353. {
  1354. processId = paramConfig.ProcessId,
  1355. userId = paramConfig.CurrentUser.Id,
  1356. userAccount = paramConfig.CurrentUser.Account,
  1357. companyId = paramConfig.CurrentUser.CompanyId,
  1358. departmentId = paramConfig.CurrentUser.DepartmentId,
  1359. code = "RevokeAudit"
  1360. };
  1361. HttpMethods.Post(line.strInterfaceR, postData.ToJson());
  1362. }
  1363. break;
  1364. case "ioc":
  1365. if (!string.IsNullOrEmpty(line.iocNameR) && UnityIocHelper.WfInstance.IsResolve<IWorkFlowMethod>(line.iocNameR))
  1366. {
  1367. IWorkFlowMethod iWorkFlowMethod = UnityIocHelper.WfInstance.GetService<IWorkFlowMethod>(line.iocNameR);
  1368. WfMethodParameter wfMethodParameter = new WfMethodParameter()
  1369. {
  1370. processId = paramConfig.ProcessId,
  1371. taskId = taskId,
  1372. nodeName = nodeName,
  1373. code = "RevokeAudit",
  1374. userId = paramConfig.CurrentUser.Id,
  1375. userAccount = paramConfig.CurrentUser.Account,
  1376. companyId = paramConfig.CurrentUser.CompanyId,
  1377. departmentId = paramConfig.CurrentUser.DepartmentId
  1378. };
  1379. iWorkFlowMethod.Execute(wfMethodParameter);
  1380. }
  1381. break;
  1382. }
  1383. }
  1384. /// <summary>
  1385. /// 会签节点处理
  1386. /// </summary>
  1387. /// <param name="nodeList">下一节点信息</param>
  1388. /// <param name="nodeId">当前节点id</param>
  1389. /// <param name="processId">当前流程进程主键</param>
  1390. /// <param name="state">审批状态</param>
  1391. /// <returns></returns>
  1392. private List<NWFConfluenceEntity> _ClearConfluence(List<NWFNodeInfo> nodeList, List<NWFTaskEntity> closeTaskList, string nodeId, string processId, int state, NWFIEngine nWFIEngine)
  1393. {
  1394. List<NWFConfluenceEntity> list = new List<NWFConfluenceEntity>();
  1395. foreach (var node in nodeList)
  1396. {
  1397. if (node.type == "confluencenode")
  1398. {
  1399. NWFConfluenceEntity entity = new NWFConfluenceEntity()
  1400. {
  1401. F_FormNodeId = nodeId,
  1402. F_ProcessId = processId,
  1403. F_NodeId = node.id,
  1404. F_State = state,
  1405. isClear = false
  1406. };
  1407. if (node.confluenceRes != 0)
  1408. {
  1409. entity.confluenceRes = node.confluenceRes;
  1410. entity.isClear = true;
  1411. // 需要关闭还没处理任务的节点
  1412. Dictionary<string, string> hasMap = new Dictionary<string, string>();// 记录已经处理的节点ID
  1413. var taskList = nWFTaskIBLL.GetUnFinishTaskList(processId);
  1414. foreach (var task in taskList)
  1415. {
  1416. if (task.F_NodeId != nodeId)
  1417. {
  1418. if (hasMap.ContainsKey(task.F_NodeId))
  1419. {
  1420. task.F_IsFinished = 2;
  1421. closeTaskList.Add(task);
  1422. }
  1423. else
  1424. {
  1425. if (nWFIEngine.IsToNode(task.F_NodeId, node.id))
  1426. {
  1427. task.F_IsFinished = 2;
  1428. closeTaskList.Add(task);
  1429. }
  1430. }
  1431. }
  1432. }
  1433. }
  1434. entity.Create();
  1435. list.Add(entity);
  1436. }
  1437. }
  1438. return list;
  1439. }
  1440. /// <summary>
  1441. /// 发送消息
  1442. /// </summary>
  1443. /// <param name="taskMsgList">消息列表</param>
  1444. /// <param name="nWFIEngine">流程引擎</param>
  1445. private void _SendMsg(List<NWFTaskMsgEntity> taskMsgList, NWFIEngine nWFIEngine)
  1446. {
  1447. try
  1448. {
  1449. if (nWFIEngine != null)
  1450. {
  1451. foreach (var taskMsg in taskMsgList)
  1452. {
  1453. NWFNodeInfo nodeInfo = nWFIEngine.GetNode(taskMsg.NodeId);
  1454. if (!string.IsNullOrEmpty(nodeInfo.notice))
  1455. {
  1456. UserEntity userEntity = userIBLL.GetEntityByUserId(taskMsg.F_ToUserId);
  1457. List<UserEntity> msgUserList = new List<UserEntity>();
  1458. msgUserList.Add(userEntity);
  1459. lR_StrategyInfoIBLL.SendMessage(nodeInfo.notice, taskMsg.F_Content, msgUserList.ToJson(), JsonConvert.SerializeObject(taskMsg));
  1460. }
  1461. }
  1462. }
  1463. }
  1464. catch
  1465. {
  1466. }
  1467. }
  1468. private void _AutoAuditFlow(List<NWFTaskEntity> taskList, NWFIEngine nWFIEngine, UserInfo userInfo)
  1469. {
  1470. foreach (var task in taskList)
  1471. {
  1472. var node = nWFIEngine.GetNode(task.F_NodeId);
  1473. NWFUserInfo user = null;
  1474. if (task.nWFUserInfoList.FindAll(t => t.noPeople == true).Count > 0 && node.noPeopleGz == 2)
  1475. {
  1476. AuditFlow("agree", "同意", nWFIEngine.GetConfig().ProcessId, task.F_Id, "无审核人跳过", null, "", "", userInfo);
  1477. }
  1478. else if (node.type == "stepnode" && !string.IsNullOrEmpty(node.agreeGz))
  1479. { // 普通审核节点
  1480. string[] agreeGzList = node.agreeGz.Split(',');
  1481. bool flag = false;
  1482. foreach (var item in agreeGzList)
  1483. {
  1484. switch (item)
  1485. {
  1486. case "1":// 处理人就是提交人
  1487. string createUserId = nWFIEngine.GetConfig().CreateUser.Id;
  1488. user = task.nWFUserInfoList.Find(t => t.Id == createUserId && t.Mark == 0);
  1489. if (user != null)
  1490. {
  1491. flag = true;
  1492. }
  1493. break;
  1494. case "2":// 处理人和上一步处理人相同
  1495. user = task.nWFUserInfoList.Find(t => t.Id == userInfo.userId && t.Mark == 0);
  1496. if (user != null)
  1497. {
  1498. flag = true;
  1499. }
  1500. break;
  1501. case "3":// 处理人审批过(同意)
  1502. var logList = (List<NWFTaskLogEntity>)nWFTaskIBLL.GetLogList(nWFIEngine.GetConfig().ProcessId);
  1503. if (logList.Count > 0)
  1504. {
  1505. foreach (var taskUserItem in task.nWFUserInfoList)
  1506. {
  1507. var logItem = logList.Find(t => t.F_CreateUserId == taskUserItem.Id && t.F_OperationCode == "agree");
  1508. if (logItem != null)
  1509. {
  1510. UserEntity taskUserEntity = userIBLL.GetEntityByUserId(taskUserItem.Id);
  1511. user = new NWFUserInfo
  1512. {
  1513. Id = taskUserEntity.F_UserId,
  1514. Account = taskUserEntity.F_Account,
  1515. Name = taskUserEntity.F_RealName
  1516. };
  1517. flag = true;
  1518. break;
  1519. }
  1520. }
  1521. }
  1522. break;
  1523. }
  1524. if (flag)
  1525. {
  1526. UserInfo _userInfo = new UserInfo
  1527. {
  1528. userId = user.Id,
  1529. account = user.Account,
  1530. realName = user.Name
  1531. };
  1532. AuditFlow("agree", "同意", nWFIEngine.GetConfig().ProcessId, task.F_Id, "系统自动审核", null, "", "", _userInfo);
  1533. break;
  1534. }
  1535. }
  1536. user = null;
  1537. }
  1538. }
  1539. }
  1540. #endregion
  1541. /// <summary>
  1542. /// 获取下一节点审核人
  1543. /// </summary>
  1544. /// <param name="code">流程模板code</param>
  1545. /// <param name="processId">流程进程主键</param>
  1546. /// <param name="taskId">流程任务主键</param>
  1547. /// <param name="nodeId">流程节点Id</param>
  1548. /// <param name="operationCode">流程操作代码</param>
  1549. /// <param name="userInfo">用户信息</param>
  1550. /// <returns></returns>
  1551. public Dictionary<string, List<NWFUserInfo>> GetNextAuditors(string code, string processId, string taskId, string nodeId, string operationCode, UserInfo userInfo)
  1552. {
  1553. Dictionary<string, List<NWFUserInfo>> res = new Dictionary<string, List<NWFUserInfo>>();
  1554. NWFIEngine nWFIEngine = _Bootstraper(code, processId, taskId, userInfo);
  1555. NWFNodeInfo nodeInfo = nWFIEngine.GetNode(nodeId);
  1556. List<NWFNodeInfo> list = nWFIEngine.GetNextTaskNode(nodeInfo, operationCode, true, new List<NWFLineInfo>());
  1557. foreach (var item in list)
  1558. {
  1559. if (item.type == "stepnode" || item.type == "auditornode" || item.type == "childwfnode")//&& item.isAllAuditor == "1"暂时去掉多人审核的限制
  1560. {
  1561. if (!res.ContainsKey(item.id))
  1562. {
  1563. res.Add(item.id, _GetNodeAuditors(item.auditors, item, nWFIEngine.GetConfig()));
  1564. }
  1565. }
  1566. }
  1567. return res;
  1568. }
  1569. /// <summary>
  1570. /// 获取流程进程信息
  1571. /// </summary>
  1572. /// <param name="processId">进程主键</param>
  1573. /// <param name="taskId">任务主键</param>
  1574. /// <param name="userInfo">当前人员信息</param>
  1575. /// <returns></returns>
  1576. public NWFProcessDetailsModel GetProcessDetails(string processId, string taskId, UserInfo userInfo)
  1577. {
  1578. NWFIEngine nWFIEngine = _Bootstraper("", processId, taskId, userInfo);
  1579. NWFProcessDetailsModel nWFProcessDetailsModel = new NWFProcessDetailsModel();
  1580. nWFProcessDetailsModel.Scheme = nWFIEngine.GetScheme();
  1581. nWFProcessDetailsModel.CurrentNodeIds = nWFTaskIBLL.GetCurrentNodeIds(processId);
  1582. nWFProcessDetailsModel.TaskLogList = (List<NWFTaskLogEntity>)nWFTaskIBLL.GetLogList(processId);
  1583. nWFProcessDetailsModel.parentProcessId = nWFIEngine.GetConfig().ParentProcessId;
  1584. if (string.IsNullOrEmpty(taskId))
  1585. {
  1586. nWFProcessDetailsModel.CurrentNodeId = nWFIEngine.GetStartNode().id;
  1587. }
  1588. else
  1589. {
  1590. NWFTaskEntity nWFTaskEntity = nWFTaskIBLL.GetEntity(taskId);
  1591. if (nWFTaskEntity != null)
  1592. {
  1593. if (!string.IsNullOrEmpty(nWFTaskEntity.F_ChildProcessId))
  1594. {
  1595. nWFProcessDetailsModel.childProcessId = nWFTaskEntity.F_ChildProcessId;
  1596. nWFProcessDetailsModel.CurrentNodeIds = nWFTaskIBLL.GetCurrentNodeIds(nWFTaskEntity.F_ChildProcessId);
  1597. nWFProcessDetailsModel.TaskLogList = (List<NWFTaskLogEntity>)nWFTaskIBLL.GetLogList(nWFTaskEntity.F_ChildProcessId);
  1598. }
  1599. nWFProcessDetailsModel.CurrentNodeId = nWFTaskEntity.F_NodeId;
  1600. }
  1601. }
  1602. return nWFProcessDetailsModel;
  1603. }
  1604. /// <summary>
  1605. /// 获取子流程详细信息
  1606. /// </summary>
  1607. /// <param name="processId">父流程进程主键</param>
  1608. /// <param name="taskId">父流程子流程发起主键</param>
  1609. /// <param name="schemeCode">子流程流程模板编码</param>
  1610. /// <param name="nodeId">父流程发起子流程节点Id</param>
  1611. /// <param name="userInfo">当前用户操作信息</param>
  1612. /// <returns></returns>
  1613. public NWFProcessDetailsModel GetChildProcessDetails(string processId, string taskId, string schemeCode, string nodeId, UserInfo userInfo)
  1614. {
  1615. NWFProcessEntity entity = nWFProcessSerive.GetEntityByProcessId(processId, nodeId);
  1616. NWFProcessDetailsModel nWFProcessDetailsModel = new NWFProcessDetailsModel();
  1617. if (entity == null)
  1618. {
  1619. NWFIEngine nWFIEngine = _Bootstraper(schemeCode, "", "", userInfo);
  1620. nWFProcessDetailsModel.Scheme = nWFIEngine.GetScheme();
  1621. }
  1622. else
  1623. {
  1624. NWFIEngine nWFIEngine = _Bootstraper("", entity.F_Id, "", userInfo);
  1625. nWFProcessDetailsModel.Scheme = nWFIEngine.GetScheme();
  1626. nWFProcessDetailsModel.CurrentNodeIds = nWFTaskIBLL.GetCurrentNodeIds(entity.F_Id);
  1627. nWFProcessDetailsModel.TaskLogList = (List<NWFTaskLogEntity>)nWFTaskIBLL.GetLogList(entity.F_Id);
  1628. nWFProcessDetailsModel.childProcessId = entity.F_Id;
  1629. }
  1630. return nWFProcessDetailsModel;
  1631. }
  1632. /// <summary>
  1633. /// 保存草稿
  1634. /// </summary>
  1635. /// <param name="processId">流程进程主键</param>
  1636. /// <param name="schemeCode">流程模板编码</param>
  1637. /// <param name="userInfo">当前用户操作信息</param>
  1638. public void SaveDraft(string processId, string schemeCode, UserInfo userInfo)
  1639. {
  1640. // 判断当前流程进程是否有保存过
  1641. var processEntity = GetEntity(processId);
  1642. if (processEntity == null)
  1643. {// 创建草稿,已经存在不做处理
  1644. var schemeInfo = nWFSchemeIBLL.GetInfoEntityByCode(schemeCode);
  1645. NWFProcessEntity nWFProcessEntity = new NWFProcessEntity()
  1646. {
  1647. F_Id = processId,
  1648. F_SchemeCode = schemeCode,
  1649. F_SchemeName = schemeInfo.F_Name,
  1650. F_EnabledMark = 2,
  1651. F_IsAgain = 0,
  1652. F_IsFinished = 0,
  1653. F_IsChild = 0,
  1654. F_IsStart = 0,
  1655. F_CreateUserId = userInfo.userId,
  1656. F_CreateUserName = userInfo.realName
  1657. };
  1658. nWFProcessEntity.Create();
  1659. nWFProcessSerive.Save(nWFProcessEntity);
  1660. }
  1661. }
  1662. /// <summary>
  1663. /// 删除草稿
  1664. /// </summary>
  1665. /// <param name="processId">流程进程主键</param>
  1666. /// <param name="userInfo">当前用户操作信息</param>
  1667. public void DeleteDraft(string processId, UserInfo userInfo)
  1668. {
  1669. // 执行
  1670. NWFIEngine nWFIEngine = _Bootstraper("", processId, "", userInfo);
  1671. NWFEngineParamConfig nWFEngineParamConfig = nWFIEngine.GetConfig();
  1672. var scheme = nWFIEngine.GetSchemeObj();
  1673. DeleteEntity(processId);
  1674. _TriggerMethod(scheme.closeDo, "3", nWFEngineParamConfig);
  1675. }
  1676. /// <summary>
  1677. /// 创建流程
  1678. /// </summary>
  1679. /// <param name="schemeCode">流程模板编码</param>
  1680. /// <param name="processId">流程进程主键</param>
  1681. /// <param name="title">标题</param>
  1682. /// <param name="level">流程等级</param>
  1683. /// <param name="auditors">下一节点审核人</param>
  1684. /// <param name="userInfo">当前操作人信息</param>
  1685. public void CreateFlow(string schemeCode, string processId, string title, int level, string auditors, UserInfo userInfo)
  1686. {
  1687. // 初始化流程引擎
  1688. NWFIEngine nWFIEngine = _Bootstraper(schemeCode, processId, "", userInfo);
  1689. NWFEngineParamConfig nWFEngineParamConfig = nWFIEngine.GetConfig();
  1690. nWFEngineParamConfig.Auditers = auditors;
  1691. NWFNodeInfo nodeInfo = nWFIEngine.GetStartNode();
  1692. // 获取下一节点信息
  1693. List<NWFLineInfo> lineList = new List<NWFLineInfo>();
  1694. List<NWFNodeInfo> list = nWFIEngine.GetNextTaskNode(nodeInfo, "agree", false, lineList);
  1695. // 创建任务
  1696. List<NWFTaskEntity> taskList = _CreateTask(list, nodeInfo, nWFEngineParamConfig);
  1697. // 创建任务消息
  1698. List<NWFTaskMsgEntity> taskMsgList = _CreateTaskMsg(taskList, nWFEngineParamConfig);
  1699. // 保存流程进程信息
  1700. NWFProcessEntity nWFProcessEntity = new NWFProcessEntity()
  1701. {
  1702. F_Id = nWFEngineParamConfig.ProcessId,
  1703. F_SchemeId = nWFEngineParamConfig.SchemeId,
  1704. F_SchemeCode = nWFEngineParamConfig.SchemeCode,
  1705. F_SchemeName = nWFEngineParamConfig.SchemeName,
  1706. F_Level = level,
  1707. F_EnabledMark = 1,
  1708. F_IsAgain = 0,
  1709. F_IsFinished = 0,
  1710. F_IsChild = 0,
  1711. F_IsStart = 0,
  1712. F_CreateUserId = nWFEngineParamConfig.CurrentUser.Id,
  1713. F_CreateUserName = nWFEngineParamConfig.CurrentUser.Name
  1714. };
  1715. if (!string.IsNullOrEmpty(title))
  1716. {
  1717. nWFProcessEntity.F_Title = title;
  1718. }
  1719. else
  1720. {
  1721. nWFProcessEntity.F_Title = nWFEngineParamConfig.SchemeName;
  1722. }
  1723. if (nWFEngineParamConfig.State == 1)
  1724. {
  1725. nWFProcessEntity.F_IsAgain = 1;
  1726. }
  1727. else if (nWFEngineParamConfig.State == 2)
  1728. {
  1729. nWFProcessEntity.F_IsFinished = 1;
  1730. }
  1731. nWFProcessEntity.Create();
  1732. // 创建任务日志信息
  1733. NWFTaskLogEntity nWFTaskLogEntity = new NWFTaskLogEntity()
  1734. {
  1735. F_ProcessId = processId,
  1736. F_OperationCode = "create",
  1737. F_OperationName = "创建流程",
  1738. F_NodeId = nodeInfo.id,
  1739. F_NodeName = nodeInfo.name,
  1740. F_TaskType = 0,
  1741. F_CreateUserId = userInfo.userId,
  1742. F_CreateUserName = userInfo.realName
  1743. };
  1744. nWFTaskLogEntity.Create();
  1745. // 保存信息
  1746. nWFProcessSerive.Save(nWFProcessEntity, taskList, taskMsgList, nWFTaskLogEntity);
  1747. // 触发流程绑定方法
  1748. foreach (var line in lineList)
  1749. {
  1750. _TriggerMethod(line, "", nodeInfo.name, "create", nWFEngineParamConfig);
  1751. }
  1752. // 触发消息
  1753. _SendMsg(taskMsgList, nWFIEngine);
  1754. // 触发子流程节点方法
  1755. foreach (var taskItem in taskList)
  1756. {
  1757. if (taskItem.F_Type == 4)
  1758. {
  1759. NWFNodeInfo cNodeInfo = nWFIEngine.GetNode(taskItem.F_NodeId);
  1760. _TriggerMethod(cNodeInfo, taskItem.F_Id, cNodeInfo.name, taskItem.F_ChildProcessId, nWFEngineParamConfig);
  1761. }
  1762. }
  1763. // 触发自动跳过规则
  1764. _AutoAuditFlow(taskList, nWFIEngine, userInfo);
  1765. }
  1766. /// <summary>
  1767. /// 创建流程(子流程)
  1768. /// </summary>
  1769. /// <param name="schemeCode">流程模板编码</param>
  1770. /// <param name="processId">流程进程主键</param>
  1771. /// <param name="userInfo">当前操作人信息</param>
  1772. public void CreateChildFlow(string schemeCode, string processId, string parentProcessId, string parentTaskId, UserInfo userInfo)
  1773. {
  1774. // 父节点信息
  1775. NWFTaskEntity pTaskEntity = nWFTaskIBLL.GetEntity(parentTaskId);
  1776. NWFIEngine pNWFIEngine = _Bootstraper("", parentProcessId, parentTaskId, userInfo);
  1777. NWFEngineParamConfig pNWFEngineParamConfig = pNWFIEngine.GetConfig();
  1778. NWFNodeInfo pNodeInfo = pNWFIEngine.GetNode(pTaskEntity.F_NodeId);
  1779. // 初始化流程引擎
  1780. NWFProcessEntity cNWFProcessEntity = nWFProcessSerive.GetEntity(processId);
  1781. if (cNWFProcessEntity != null)
  1782. {
  1783. schemeCode = null;
  1784. }
  1785. NWFIEngine nWFIEngine = _Bootstraper(schemeCode, processId, "", userInfo);
  1786. NWFEngineParamConfig nWFEngineParamConfig = nWFIEngine.GetConfig();
  1787. NWFNodeInfo nodeInfo = nWFIEngine.GetStartNode();
  1788. // 获取下一节点信息
  1789. List<NWFLineInfo> lineList = new List<NWFLineInfo>();
  1790. List<NWFNodeInfo> list = nWFIEngine.GetNextTaskNode(nodeInfo, "agree", false, lineList);
  1791. // 创建任务
  1792. List<NWFTaskEntity> taskList = _CreateTask(list, nodeInfo, nWFEngineParamConfig);
  1793. // 创建任务消息
  1794. List<NWFTaskMsgEntity> taskMsgList = _CreateTaskMsg(taskList, nWFEngineParamConfig);
  1795. // 保存流程进程信息
  1796. NWFProcessEntity nWFProcessEntity = new NWFProcessEntity()
  1797. {
  1798. F_Id = nWFEngineParamConfig.ProcessId,
  1799. F_SchemeId = nWFEngineParamConfig.SchemeId,
  1800. F_SchemeCode = nWFEngineParamConfig.SchemeCode,
  1801. F_SchemeName = nWFEngineParamConfig.SchemeName,
  1802. F_Title = pNWFEngineParamConfig.SchemeName + "【子流程】",
  1803. F_EnabledMark = 1,
  1804. F_IsAgain = 0,
  1805. F_IsFinished = 0,
  1806. F_IsChild = 1,
  1807. F_IsAsyn = pNodeInfo.childType == "1" ? 0 : 1,
  1808. F_IsStart = 0,
  1809. F_CreateUserId = nWFEngineParamConfig.CurrentUser.Id,
  1810. F_CreateUserName = nWFEngineParamConfig.CurrentUser.Name,
  1811. F_ParentProcessId = parentProcessId,
  1812. F_ParentTaskId = parentTaskId,
  1813. F_ParentNodeId = pTaskEntity.F_NodeId
  1814. };
  1815. if (nWFEngineParamConfig.State == 1)
  1816. {
  1817. nWFProcessEntity.F_IsAgain = 1;
  1818. }
  1819. else if (nWFEngineParamConfig.State == 2)
  1820. {
  1821. nWFProcessEntity.F_IsFinished = 1;
  1822. }
  1823. nWFProcessEntity.Create();
  1824. // 创建任务日志信息
  1825. NWFTaskLogEntity nWFTaskLogEntity = new NWFTaskLogEntity()
  1826. {
  1827. F_ProcessId = processId,
  1828. F_OperationCode = "create",
  1829. F_OperationName = "创建流程",
  1830. F_NodeId = nodeInfo.id,
  1831. F_NodeName = nodeInfo.name,
  1832. F_TaskType = 0,
  1833. F_CreateUserId = userInfo.userId,
  1834. F_CreateUserName = userInfo.realName
  1835. };
  1836. nWFTaskLogEntity.Create();
  1837. #region 对父流程的操作
  1838. // 获取当前任务的执行人列表
  1839. List<NWFTaskRelationEntity> pTaskUserList = (List<NWFTaskRelationEntity>)nWFTaskIBLL.GetTaskUserList(parentTaskId);
  1840. bool isMyPTask = false;
  1841. string pTaskUserId = userInfo.userId;
  1842. Dictionary<string, string> pTaskUserMap = new Dictionary<string, string>();
  1843. foreach (var item in pTaskUserList)
  1844. {
  1845. if (item.F_UserId == userInfo.userId)
  1846. {
  1847. isMyPTask = true;
  1848. }
  1849. if (!pTaskUserMap.ContainsKey(userInfo.userId))
  1850. {
  1851. pTaskUserMap.Add(userInfo.userId, "1");
  1852. }
  1853. }
  1854. if (!isMyPTask)
  1855. {
  1856. // 如果是委托任务
  1857. List<UserInfo> delegateList = nWFProcessSerive.GetDelegateProcess(userInfo.userId);
  1858. foreach (var item in delegateList)
  1859. {
  1860. if (pTaskUserMap.ContainsKey(item.userId))
  1861. {
  1862. pTaskUserId = item.userId;
  1863. }
  1864. }
  1865. }
  1866. // 创建任务日志信息
  1867. NWFTaskLogEntity pNWFTaskLogEntity = new NWFTaskLogEntity()
  1868. {
  1869. F_ProcessId = parentProcessId,
  1870. F_OperationCode = schemeCode == null ? "againCreateChild" : "createChild",
  1871. F_OperationName = schemeCode == null ? "重新创建" : "创建子流程",
  1872. F_NodeId = pTaskEntity.F_NodeId,
  1873. F_NodeName = pTaskEntity.F_NodeName,
  1874. F_PrevNodeId = pTaskEntity.F_PrevNodeId,
  1875. F_PrevNodeName = pTaskEntity.F_PrevNodeName,
  1876. F_TaskId = parentTaskId,
  1877. F_TaskType = 4,
  1878. F_CreateUserId = userInfo.userId,
  1879. F_CreateUserName = userInfo.realName,
  1880. };
  1881. if (userInfo.userId != pTaskUserId)
  1882. {
  1883. // 说明是委托任务
  1884. nWFTaskLogEntity.F_TaskUserId = pTaskUserId;
  1885. nWFTaskLogEntity.F_TaskUserName = userIBLL.GetEntityByUserId(pTaskUserId).F_RealName;
  1886. }
  1887. pNWFTaskLogEntity.Create();
  1888. NWFTaskRelationEntity nWFTaskRelationEntity = pTaskUserList.Find(t => t.F_UserId == pTaskUserId);
  1889. nWFTaskRelationEntity.F_Time = DateTime.Now;
  1890. nWFTaskRelationEntity.F_Result = 4;
  1891. NWFProcessEntity pNWFProcessEntity = new NWFProcessEntity()
  1892. {
  1893. F_Id = pNWFEngineParamConfig.ProcessId,
  1894. F_IsStart = 1
  1895. };
  1896. List<NWFLineInfo> pLineList = new List<NWFLineInfo>();
  1897. List<NWFTaskEntity> pTaskList = new List<NWFTaskEntity>();
  1898. List<NWFTaskMsgEntity> pTaskMsgList = new List<NWFTaskMsgEntity>();
  1899. if (pNodeInfo.childType == "1")
  1900. {
  1901. if (nWFProcessEntity.F_IsFinished == 1)
  1902. {
  1903. // 如果是同步需要推动父流程运行
  1904. // 获取下一节点信息
  1905. List<NWFNodeInfo> pList = pNWFIEngine.GetNextTaskNode(pNodeInfo, "agree", false, pLineList);
  1906. // 创建任务
  1907. pTaskList = _CreateTask(pList, pNodeInfo, pNWFEngineParamConfig);
  1908. // 创建任务消息
  1909. pTaskMsgList = _CreateTaskMsg(pTaskList, pNWFEngineParamConfig);
  1910. // 给流程发起者一条通知信息
  1911. NWFTaskMsgEntity pNWFTaskMsgEntity = new NWFTaskMsgEntity()
  1912. {
  1913. F_ProcessId = pNWFEngineParamConfig.ProcessId,
  1914. F_FromUserId = pNWFEngineParamConfig.CurrentUser.Id,
  1915. F_FromUserAccount = pNWFEngineParamConfig.CurrentUser.Account,
  1916. F_FromUserName = pNWFEngineParamConfig.CurrentUser.Name,
  1917. F_ToUserId = pNWFEngineParamConfig.CreateUser.Id,
  1918. F_ToAccount = pNWFEngineParamConfig.CreateUser.Account,
  1919. F_ToName = pNWFEngineParamConfig.CreateUser.Name,
  1920. F_Title = pNWFEngineParamConfig.SchemeName,
  1921. F_Content = "你的流程有状态的更新:" + pNWFEngineParamConfig.CurrentUser.Name + "发起子流程【" + nWFEngineParamConfig.SchemeName + "】",
  1922. NodeId = pNWFIEngine.GetStartNode().id
  1923. };
  1924. pNWFTaskMsgEntity.Create();
  1925. pTaskMsgList.Add(pNWFTaskMsgEntity);
  1926. }
  1927. }
  1928. // 保存信息 // 父流程 任务日志 任务更新 任务执行人 父流程进程 任务 任务消息
  1929. pTaskEntity.F_IsFinished = 1;
  1930. pTaskEntity.F_ModifyDate = DateTime.Now;
  1931. pTaskEntity.F_CreateUserId = userInfo.userId;
  1932. pTaskEntity.F_CreateUserName = userInfo.realName;
  1933. nWFProcessSerive.Save(pNWFTaskLogEntity, nWFTaskRelationEntity, pTaskEntity, pNWFProcessEntity, pTaskList, pTaskMsgList, nWFProcessEntity, taskList, taskMsgList, nWFTaskLogEntity);
  1934. // 触发流程绑定方法
  1935. foreach (var line in pLineList)
  1936. {
  1937. _TriggerMethod(line, "", pNodeInfo.name, "create", pNWFEngineParamConfig);
  1938. }
  1939. // 触发消息
  1940. _SendMsg(pTaskMsgList, pNWFIEngine);
  1941. #endregion
  1942. // 触发流程绑定方法
  1943. foreach (var line in lineList)
  1944. {
  1945. _TriggerMethod(line, "", nodeInfo.name, "create", nWFEngineParamConfig);
  1946. }
  1947. // 触发消息
  1948. _SendMsg(taskMsgList, nWFIEngine);
  1949. }
  1950. /// <summary>
  1951. /// 重新创建流程
  1952. /// </summary>
  1953. /// <param name="processId">流程进程主键</param>
  1954. /// <param name="userInfo">当前操作人信息</param>
  1955. public void AgainCreateFlow(string processId, UserInfo userInfo)
  1956. {
  1957. // 初始化流程引擎
  1958. NWFIEngine nWFIEngine = _Bootstraper("", processId, "", userInfo);
  1959. NWFEngineParamConfig nWFEngineParamConfig = nWFIEngine.GetConfig();
  1960. // 获取开始节点
  1961. NWFNodeInfo nodeInfo = nWFIEngine.GetStartNode();
  1962. // 获取任务实体
  1963. var taskEntiy = nWFTaskIBLL.GetEntityByNodeId(nodeInfo.id, processId);
  1964. if (taskEntiy == null)
  1965. {
  1966. throw (new Exception("找不到对应流程任务!"));
  1967. }
  1968. if (taskEntiy.F_IsFinished != 0)
  1969. {
  1970. throw (new Exception("该任务已经结束!"));
  1971. }
  1972. taskEntiy.F_ModifyDate = DateTime.Now;
  1973. taskEntiy.F_ModifyUserId = userInfo.userId;
  1974. taskEntiy.F_ModifyUserName = userInfo.realName;
  1975. taskEntiy.F_IsFinished = 1;
  1976. string taskUserId = userInfo.userId;
  1977. // 获取当前任务的执行人列表
  1978. List<NWFTaskRelationEntity> taskUserList = (List<NWFTaskRelationEntity>)nWFTaskIBLL.GetTaskUserList(taskEntiy.F_Id);
  1979. bool isMyTask = false;
  1980. Dictionary<string, string> taskUserMap = new Dictionary<string, string>();
  1981. foreach (var item in taskUserList)
  1982. {
  1983. if (item.F_UserId == userInfo.userId)
  1984. {
  1985. isMyTask = true;
  1986. }
  1987. if (!taskUserMap.ContainsKey(userInfo.userId))
  1988. {
  1989. taskUserMap.Add(userInfo.userId, "1");
  1990. }
  1991. }
  1992. if (!isMyTask)
  1993. {
  1994. // 如果是委托任务
  1995. List<UserInfo> delegateList = nWFProcessSerive.GetDelegateProcess(userInfo.userId);
  1996. foreach (var item in delegateList)
  1997. {
  1998. if (taskUserMap.ContainsKey(item.userId))
  1999. {
  2000. taskUserId = item.userId;
  2001. }
  2002. }
  2003. }
  2004. // 创建任务日志信息
  2005. NWFTaskLogEntity nWFTaskLogEntity = new NWFTaskLogEntity()
  2006. {
  2007. F_ProcessId = processId,
  2008. F_OperationCode = "create",
  2009. F_OperationName = "重新发起",
  2010. F_NodeId = nodeInfo.id,
  2011. F_NodeName = nodeInfo.name,
  2012. F_PrevNodeId = taskEntiy.F_PrevNodeId,
  2013. F_PrevNodeName = taskEntiy.F_PrevNodeName,
  2014. F_TaskId = taskEntiy.F_Id,
  2015. F_TaskType = 5,
  2016. F_CreateUserId = userInfo.userId,
  2017. F_CreateUserName = userInfo.realName,
  2018. F_TaskUserId = userInfo.userId,
  2019. F_TaskUserName = userInfo.realName
  2020. };
  2021. if (userInfo.userId != taskUserId)
  2022. {
  2023. // 说明是委托任务
  2024. nWFTaskLogEntity.F_TaskUserId = taskUserId;
  2025. nWFTaskLogEntity.F_TaskUserName = userIBLL.GetEntityByUserId(taskUserId).F_RealName;
  2026. }
  2027. nWFTaskLogEntity.Create();
  2028. NWFTaskRelationEntity nWFTaskRelationEntity = taskUserList.Find(t => t.F_UserId == taskUserId);
  2029. nWFTaskRelationEntity.F_Result = 1;
  2030. // 获取下一节点信息
  2031. List<NWFLineInfo> lineList = new List<NWFLineInfo>();
  2032. List<NWFNodeInfo> list = nWFIEngine.GetNextTaskNode(nodeInfo, "agree", false, lineList);
  2033. // 创建任务
  2034. List<NWFTaskEntity> taskList = _CreateTask(list, nodeInfo, nWFEngineParamConfig);
  2035. // 创建任务消息
  2036. List<NWFTaskMsgEntity> taskMsgList = _CreateTaskMsg(taskList, nWFEngineParamConfig);
  2037. // 保存流程进程信息
  2038. NWFProcessEntity nWFProcessEntity = new NWFProcessEntity()
  2039. {
  2040. F_Id = nWFEngineParamConfig.ProcessId
  2041. };
  2042. nWFProcessEntity.F_IsAgain = 0;
  2043. if (nWFEngineParamConfig.State == 1)
  2044. {
  2045. nWFProcessEntity.F_IsAgain = 1;
  2046. }
  2047. else if (nWFEngineParamConfig.State == 2)
  2048. {
  2049. nWFProcessEntity.F_IsFinished = 1;
  2050. }
  2051. // 保存信息 任务日志 任务执行人状态更新 任务状态更新 流程进程状态更新 会签信息更新 新的任务列表 新的任务消息列表
  2052. nWFProcessSerive.Save(nWFTaskLogEntity, nWFTaskRelationEntity, taskEntiy, nWFProcessEntity, null, null, taskList, taskMsgList);
  2053. // 触发流程绑定方法
  2054. foreach (var line in lineList)
  2055. {
  2056. _TriggerMethod(line, taskEntiy.F_Id, nodeInfo.name, "", nWFEngineParamConfig);
  2057. }
  2058. // 触发消息
  2059. _SendMsg(taskMsgList, nWFIEngine);
  2060. // 触发子流程节点方法
  2061. foreach (var taskItem in taskList)
  2062. {
  2063. if (taskItem.F_Type == 4)
  2064. {
  2065. NWFNodeInfo cNodeInfo = nWFIEngine.GetNode(taskItem.F_NodeId);
  2066. _TriggerMethod(cNodeInfo, taskItem.F_Id, cNodeInfo.name, taskItem.F_ChildProcessId, nWFEngineParamConfig);
  2067. }
  2068. }
  2069. // 触发自动跳过规则
  2070. _AutoAuditFlow(taskList, nWFIEngine, userInfo);
  2071. }
  2072. /// <summary>
  2073. /// 审批流程
  2074. /// </summary>
  2075. /// <param name="operationCode">流程审批操作码agree 同意 disagree 不同意 lrtimeout 超时</param>
  2076. /// <param name="operationName">流程审批操名称</param>
  2077. /// <param name="processId">流程进程主键</param>
  2078. /// <param name="taskId">流程任务主键</param>
  2079. /// <param name="des">审批意见</param>
  2080. /// <param name="auditors">下一节点指定审核人</param>
  2081. /// <param name="userInfo">当前操作人信息</param>
  2082. public void AuditFlow(string operationCode, string operationName, string processId, string taskId, string des, string auditors, string stamp, string signUrl, UserInfo userInfo)
  2083. {
  2084. // 初始化流程引擎
  2085. NWFIEngine nWFIEngine = _Bootstraper("", processId, taskId, userInfo);
  2086. NWFEngineParamConfig nWFEngineParamConfig = nWFIEngine.GetConfig();
  2087. nWFEngineParamConfig.Auditers = auditors;
  2088. //overFW 任一审核者不同意 即流程任务结束
  2089. bool overFW = false;
  2090. // 获取任务实体
  2091. var taskEntiy = nWFTaskIBLL.GetEntity(taskId);
  2092. if (taskEntiy == null)
  2093. {
  2094. throw (new Exception("找不到对应流程任务!"));
  2095. }
  2096. if (taskEntiy.F_IsFinished != 0)
  2097. {
  2098. throw (new Exception("该任务已经结束!"));
  2099. }
  2100. taskEntiy.F_ModifyDate = DateTime.Now;
  2101. taskEntiy.F_ModifyUserId = userInfo.userId;
  2102. taskEntiy.F_ModifyUserName = userInfo.realName;
  2103. taskEntiy.F_IsFinished = 1;
  2104. NWFNodeInfo nodeInfo = nWFIEngine.GetNode(taskEntiy.F_NodeId);
  2105. string taskUserId = userInfo.userId;
  2106. // 获取当前任务的执行人列表
  2107. List<NWFTaskRelationEntity> taskUserList = (List<NWFTaskRelationEntity>)nWFTaskIBLL.GetTaskUserList(taskId);
  2108. bool isMyTask = false;
  2109. Dictionary<string, string> taskUserMap = new Dictionary<string, string>();
  2110. foreach (var item in taskUserList)
  2111. {
  2112. if (item.F_UserId == userInfo.userId)
  2113. {
  2114. isMyTask = true;
  2115. }
  2116. if (!taskUserMap.ContainsKey(userInfo.userId))
  2117. {
  2118. taskUserMap.Add(userInfo.userId, "1");
  2119. }
  2120. }
  2121. if (!isMyTask)
  2122. {
  2123. // 如果是委托任务
  2124. List<UserInfo> delegateList = nWFProcessSerive.GetDelegateProcess(userInfo.userId);
  2125. foreach (var item in delegateList)
  2126. {
  2127. //如果当前用户是处理委托任务时,找到原本任务处理人
  2128. if (!taskUserMap.ContainsKey(item.userId))
  2129. {
  2130. taskUserId = item.userId;
  2131. }
  2132. }
  2133. }
  2134. // 创建任务日志信息
  2135. NWFTaskLogEntity nWFTaskLogEntity = new NWFTaskLogEntity()
  2136. {
  2137. F_ProcessId = processId,
  2138. F_OperationCode = operationCode,
  2139. F_OperationName = operationName,
  2140. F_NodeId = nodeInfo.id,
  2141. F_NodeName = nodeInfo.name,
  2142. F_PrevNodeId = taskEntiy.F_PrevNodeId,
  2143. F_PrevNodeName = taskEntiy.F_PrevNodeName,
  2144. F_Des = des,
  2145. F_TaskId = taskId,
  2146. F_TaskType = 1,
  2147. F_CreateUserId = userInfo.userId,
  2148. F_CreateUserName = userInfo.realName,
  2149. F_TaskUserId = userInfo.userId,
  2150. F_TaskUserName = userInfo.realName,
  2151. F_StampImg = stamp
  2152. };
  2153. // 保存签字图片
  2154. if (!string.IsNullOrEmpty(signUrl))
  2155. {
  2156. ImgEntity imgEntity = new ImgEntity();
  2157. imgEntity.F_Name = "sign";
  2158. imgEntity.F_ExName = ".png";
  2159. imgEntity.F_Content = signUrl;
  2160. imgIBLL.SaveEntity("", imgEntity);
  2161. nWFTaskLogEntity.F_SignImg = imgEntity.F_Id;
  2162. }
  2163. if (userInfo.userId != taskUserId)
  2164. {
  2165. // 说明是委托任务
  2166. nWFTaskLogEntity.F_TaskUserId = taskUserId;
  2167. nWFTaskLogEntity.F_TaskUserName = userIBLL.GetEntityByUserId(taskUserId).F_RealName;
  2168. }
  2169. nWFTaskLogEntity.Create();
  2170. // 给流程发起者一条通知信息
  2171. NWFTaskMsgEntity nWFTaskMsgEntity = new NWFTaskMsgEntity()
  2172. {
  2173. F_ProcessId = nWFEngineParamConfig.ProcessId,
  2174. F_FromUserId = nWFEngineParamConfig.CurrentUser.Id,
  2175. F_FromUserAccount = nWFEngineParamConfig.CurrentUser.Account,
  2176. F_FromUserName = nWFEngineParamConfig.CurrentUser.Name,
  2177. F_ToUserId = nWFEngineParamConfig.CreateUser.Id,
  2178. F_ToAccount = nWFEngineParamConfig.CreateUser.Account,
  2179. F_ToName = nWFEngineParamConfig.CreateUser.Name,
  2180. F_Title = nWFEngineParamConfig.SchemeName,
  2181. F_Content = "你的流程有状态的更新:" + nWFEngineParamConfig.CurrentUser.Name + operationName,
  2182. NodeId = nWFIEngine.GetStartNode().id,
  2183. F_NodeName = nWFIEngine.GetStartNode().name
  2184. };
  2185. nWFTaskMsgEntity.Create();
  2186. NWFTaskRelationEntity nWFTaskRelationEntity = taskUserList.Find(t => t.F_UserId == taskUserId);
  2187. nWFTaskRelationEntity.F_Time = DateTime.Now;
  2188. // 如果是一般审核节点
  2189. if (nodeInfo.isAllAuditor == "2")
  2190. {
  2191. // 需要所有人都审核,有一人不同意或者所有人都同意
  2192. if (operationCode == "agree")
  2193. {
  2194. nWFTaskRelationEntity.F_Result = 1;
  2195. if (taskUserList.FindAll(t => t.F_Result == 0).Count > 0)
  2196. {
  2197. List<NWFTaskRelationEntity> taskUserUpdateList = new List<NWFTaskRelationEntity>();
  2198. taskUserUpdateList.Add(nWFTaskRelationEntity);
  2199. if (nodeInfo.auditorType == "2")
  2200. {
  2201. // 串行
  2202. NWFTaskRelationEntity nWFTaskRelationEntity2 = taskUserList[(int)nWFTaskRelationEntity.F_Sort];
  2203. nWFTaskRelationEntity2.F_Mark = 0;
  2204. taskUserUpdateList.Add(nWFTaskRelationEntity2);
  2205. }
  2206. nWFProcessSerive.Save(nWFTaskLogEntity, taskUserUpdateList, nWFTaskMsgEntity);
  2207. return;
  2208. }
  2209. }
  2210. else if (nodeInfo.auditExecutType == "2")
  2211. {// 需要所有人执行完才往下走
  2212. if (operationCode == "disagree")
  2213. {
  2214. nWFTaskRelationEntity.F_Result = 2;
  2215. }
  2216. else
  2217. {
  2218. nWFTaskRelationEntity.F_Result = 4;
  2219. }
  2220. if (taskUserList.FindAll(t => t.F_Result == 0).Count > 0)
  2221. {
  2222. List<NWFTaskRelationEntity> taskUserUpdateList = new List<NWFTaskRelationEntity>();
  2223. taskUserUpdateList.Add(nWFTaskRelationEntity);
  2224. if (nodeInfo.auditorType == "2")
  2225. {
  2226. // 串行
  2227. NWFTaskRelationEntity nWFTaskRelationEntity2 = taskUserList[(int)nWFTaskRelationEntity.F_Sort];
  2228. nWFTaskRelationEntity2.F_Mark = 0;
  2229. taskUserUpdateList.Add(nWFTaskRelationEntity2);
  2230. }
  2231. nWFProcessSerive.Save(nWFTaskLogEntity, taskUserUpdateList, nWFTaskMsgEntity);
  2232. return;
  2233. }
  2234. }
  2235. else
  2236. {
  2237. operationCode = "disagree";
  2238. nWFTaskRelationEntity.F_Result = 2;
  2239. }
  2240. }
  2241. else
  2242. {
  2243. if (operationCode == "agree")
  2244. {
  2245. nWFTaskRelationEntity.F_Result = 1;
  2246. }
  2247. else if (operationCode == "disagree")
  2248. {
  2249. nWFTaskRelationEntity.F_Result = 2;
  2250. overFW = true;
  2251. }
  2252. else
  2253. {
  2254. nWFTaskRelationEntity.F_Result = 4;
  2255. }
  2256. }
  2257. // 获取下一节点信息
  2258. List<NWFLineInfo> lineList = new List<NWFLineInfo>();
  2259. List<NWFNodeInfo> list = nWFIEngine.GetNextTaskNode(nodeInfo, operationCode, false, lineList, overFW);
  2260. // 会签处理
  2261. int state = 0;
  2262. if (operationCode == "agree")
  2263. {
  2264. state = 1;
  2265. }
  2266. List<NWFTaskEntity> closeTaskList = new List<NWFTaskEntity>();
  2267. List<NWFConfluenceEntity> confluenceList = _ClearConfluence(list, closeTaskList, nodeInfo.id, nWFEngineParamConfig.ProcessId, state, nWFIEngine);
  2268. // 创建任务
  2269. List<NWFTaskEntity> taskList = _CreateTask(list, nodeInfo, nWFEngineParamConfig);
  2270. // 创建任务消息
  2271. List<NWFTaskMsgEntity> taskMsgList = _CreateTaskMsg(taskList, nWFEngineParamConfig);
  2272. // 保存流程进程信息
  2273. NWFProcessEntity nWFProcessEntity = new NWFProcessEntity()
  2274. {
  2275. F_Id = nWFEngineParamConfig.ProcessId,
  2276. F_IsStart = 1
  2277. };
  2278. if (nWFEngineParamConfig.State == 1)
  2279. {
  2280. nWFProcessEntity.F_IsAgain = 1;
  2281. }
  2282. else if (nWFEngineParamConfig.State == 2)
  2283. {
  2284. nWFProcessEntity.F_IsFinished = 1;
  2285. }
  2286. // 如果任一审核者不同意,即流程结束(终止)
  2287. if (overFW)
  2288. {
  2289. nWFProcessEntity.F_EnabledMark = 4;//终止
  2290. }
  2291. List<NWFLineInfo> pLineList = new List<NWFLineInfo>();
  2292. List<NWFTaskEntity> pTaskList = new List<NWFTaskEntity>();
  2293. List<NWFTaskMsgEntity> pTaskMsgList = new List<NWFTaskMsgEntity>();
  2294. NWFEngineParamConfig pNWFEngineParamConfig = null;
  2295. NWFNodeInfo pNodeInfo = null;
  2296. NWFIEngine pNWFIEngine = null;
  2297. NWFProcessEntity pNWFProcessEntity = null;
  2298. if (nWFEngineParamConfig.IsChild == 1)
  2299. {
  2300. pNWFIEngine = _Bootstraper("", nWFEngineParamConfig.ParentProcessId, nWFEngineParamConfig.ParentTaskId, userInfo);
  2301. pNWFEngineParamConfig = pNWFIEngine.GetConfig();
  2302. // 获取父级流程
  2303. nWFTaskMsgEntity.F_ToUserId = pNWFEngineParamConfig.CreateUser.Id;
  2304. nWFTaskMsgEntity.F_ToName = pNWFEngineParamConfig.CreateUser.Name;
  2305. nWFTaskMsgEntity.F_ToAccount = pNWFEngineParamConfig.CreateUser.Account;
  2306. nWFTaskMsgEntity.F_Title = pNWFEngineParamConfig.SchemeName;
  2307. nWFTaskMsgEntity.F_Content = "你的流程【子流程:" + nWFEngineParamConfig.SchemeName + "】有状态的更新:" + nWFEngineParamConfig.CurrentUser.Name + operationName;
  2308. nWFTaskMsgEntity.NodeId = pNWFIEngine.GetStartNode().id;
  2309. nWFTaskMsgEntity.F_NodeName = pNWFIEngine.GetStartNode().name;
  2310. // 获取子流程
  2311. NWFProcessEntity cNWFProcessEntity = nWFProcessSerive.GetEntity(nWFEngineParamConfig.ProcessId);
  2312. if (cNWFProcessEntity.F_IsAsyn == 0)
  2313. {
  2314. if (nWFEngineParamConfig.State == 2)
  2315. {
  2316. // 父节点信息
  2317. NWFTaskEntity pTaskEntity = nWFTaskIBLL.GetEntity(nWFEngineParamConfig.ParentTaskId);
  2318. pNodeInfo = pNWFIEngine.GetNode(pTaskEntity.F_NodeId);
  2319. // 获取下一节点信息
  2320. List<NWFNodeInfo> pList = pNWFIEngine.GetNextTaskNode(pNodeInfo, "agree", false, pLineList);
  2321. // 创建任务
  2322. pTaskList = _CreateTask(pList, pNodeInfo, pNWFEngineParamConfig);
  2323. // 创建任务消息
  2324. pTaskMsgList = _CreateTaskMsg(pTaskList, pNWFEngineParamConfig);
  2325. if (pNWFEngineParamConfig.State == 1)
  2326. {
  2327. pNWFProcessEntity = new NWFProcessEntity();
  2328. pNWFProcessEntity.F_Id = pNWFEngineParamConfig.ProcessId;
  2329. pNWFProcessEntity.F_IsAgain = 1;
  2330. }
  2331. else if (pNWFEngineParamConfig.State == 2)
  2332. {
  2333. pNWFProcessEntity = new NWFProcessEntity();
  2334. pNWFProcessEntity.F_Id = pNWFEngineParamConfig.ProcessId;
  2335. pNWFProcessEntity.F_IsFinished = 1;
  2336. }
  2337. }
  2338. }
  2339. pTaskMsgList.Add(nWFTaskMsgEntity);
  2340. }
  2341. else
  2342. {
  2343. taskMsgList.Add(nWFTaskMsgEntity);
  2344. }
  2345. // 触发消息
  2346. _SendMsg(pTaskMsgList, pNWFIEngine);
  2347. // 触发消息
  2348. _SendMsg(taskMsgList, nWFIEngine);
  2349. List<NWFTaskEntity> nTaskList = new List<NWFTaskEntity>();
  2350. nTaskList.AddRange(taskList);
  2351. taskList.AddRange(pTaskList);
  2352. taskMsgList.AddRange(pTaskMsgList);
  2353. // 保存信息 任务日志 任务执行人状态更新 任务状态更新 流程进程状态更新 会签信息更新 新的任务列表 新的任务消息列表
  2354. nWFProcessSerive.Save(nWFTaskLogEntity, nWFTaskRelationEntity, taskEntiy, nWFProcessEntity, confluenceList, closeTaskList, taskList, taskMsgList, pNWFProcessEntity);
  2355. // 触发流程绑定方法(父级点事件)
  2356. foreach (var line in pLineList)
  2357. {
  2358. _TriggerMethod(line, "", pNodeInfo.name, "create", pNWFEngineParamConfig);
  2359. }
  2360. // 触发流程绑定方法
  2361. foreach (var line in lineList)
  2362. {
  2363. _TriggerMethod(line, taskId, nodeInfo.name, operationCode, nWFEngineParamConfig);
  2364. }
  2365. // 触发子流程节点方法
  2366. foreach (var taskItem in taskList)
  2367. {
  2368. if (taskItem.F_Type == 4)
  2369. {
  2370. NWFNodeInfo cNodeInfo = nWFIEngine.GetNode(taskItem.F_NodeId);
  2371. if (cNodeInfo == null)
  2372. {
  2373. cNodeInfo = pNWFIEngine.GetNode(taskItem.F_NodeId);
  2374. _TriggerMethod(cNodeInfo, taskItem.F_Id, cNodeInfo.name, taskItem.F_ChildProcessId, pNWFEngineParamConfig);
  2375. }
  2376. else
  2377. {
  2378. _TriggerMethod(cNodeInfo, taskItem.F_Id, cNodeInfo.name, taskItem.F_ChildProcessId, nWFEngineParamConfig);
  2379. }
  2380. }
  2381. }
  2382. // 触发自动跳过规则
  2383. _AutoAuditFlow(nTaskList, nWFIEngine, userInfo);
  2384. _AutoAuditFlow(pTaskList, pNWFIEngine, userInfo);
  2385. }
  2386. /// <summary>
  2387. /// 批量审核(只有同意和不同意)
  2388. /// </summary>
  2389. /// <param name="operationCode">操作码</param>
  2390. /// <param name="taskIds">任务id串</param>
  2391. /// <param name="userInfo">当前操作人信息</param>
  2392. public void AuditFlows(string operationCode, string taskIds, UserInfo userInfo)
  2393. {
  2394. string[] taskIdList = taskIds.Split(',');
  2395. foreach (var taskId in taskIdList)
  2396. {
  2397. string operationName = operationCode == "agree" ? "同意" : "不同意";
  2398. NWFTaskEntity taskEntity = nWFTaskIBLL.GetEntity(taskId);
  2399. if (taskEntity != null && taskEntity.F_IsFinished == 0 && taskEntity.F_IsBatchAudit == 1)
  2400. {
  2401. AuditFlow(operationCode, operationName, taskEntity.F_ProcessId, taskId, "批量审核", "{}", "", "", userInfo);
  2402. }
  2403. }
  2404. }
  2405. /// <summary>
  2406. /// 流程加签
  2407. /// </summary>
  2408. /// <param name="processId">流程进程主键</param>
  2409. /// <param name="taskId">流程任务主键</param>
  2410. /// <param name="userId">加签人员</param>
  2411. /// <param name="des">加签说明</param>
  2412. /// <param name="userInfo">当前操作人信息</param>
  2413. public void SignFlow(string processId, string taskId, string userId, string des, UserInfo userInfo)
  2414. {
  2415. // 初始化流程引擎
  2416. NWFIEngine nWFIEngine = _Bootstraper("", processId, taskId, userInfo);
  2417. NWFEngineParamConfig nWFEngineParamConfig = nWFIEngine.GetConfig();
  2418. // 获取任务实体
  2419. var taskEntiy = nWFTaskIBLL.GetEntity(taskId);
  2420. if (taskEntiy == null)
  2421. {
  2422. throw (new Exception("找不到对应流程任务!"));
  2423. }
  2424. if (taskEntiy.F_IsFinished != 0)
  2425. {
  2426. throw (new Exception("该任务已经结束!"));
  2427. }
  2428. taskEntiy.F_ModifyDate = DateTime.Now;
  2429. taskEntiy.F_ModifyUserId = userInfo.userId;
  2430. taskEntiy.F_ModifyUserName = userInfo.realName;
  2431. taskEntiy.F_IsFinished = 1;
  2432. string taskUserId = userInfo.userId;
  2433. // 获取当前任务的执行人列表
  2434. List<NWFTaskRelationEntity> taskUserList = (List<NWFTaskRelationEntity>)nWFTaskIBLL.GetTaskUserList(taskId);
  2435. bool isMyTask = false;
  2436. Dictionary<string, string> taskUserMap = new Dictionary<string, string>();
  2437. foreach (var item in taskUserList)
  2438. {
  2439. if (item.F_UserId == userInfo.userId)
  2440. {
  2441. isMyTask = true;
  2442. }
  2443. if (!taskUserMap.ContainsKey(userInfo.userId))
  2444. {
  2445. taskUserMap.Add(userInfo.userId, "1");
  2446. }
  2447. }
  2448. if (!isMyTask)
  2449. {
  2450. // 如果是委托任务
  2451. List<UserInfo> delegateList = nWFProcessSerive.GetDelegateProcess(userInfo.userId);
  2452. foreach (var item in delegateList)
  2453. {
  2454. if (taskUserMap.ContainsKey(item.userId))
  2455. {
  2456. taskUserId = item.userId;
  2457. }
  2458. }
  2459. }
  2460. UserEntity userEntity = userIBLL.GetEntityByUserId(userId);
  2461. // 创建任务日志信息
  2462. NWFTaskLogEntity nWFTaskLogEntity = new NWFTaskLogEntity()
  2463. {
  2464. F_ProcessId = processId,
  2465. F_OperationCode = "sign",
  2466. F_OperationName = "请求【" + userEntity.F_RealName + "】加签",
  2467. F_NodeId = taskEntiy.F_NodeId,
  2468. F_NodeName = taskEntiy.F_NodeName,
  2469. F_PrevNodeId = taskEntiy.F_PrevNodeId,
  2470. F_PrevNodeName = taskEntiy.F_PrevNodeName,
  2471. F_Des = des,
  2472. F_TaskId = taskId,
  2473. F_TaskType = 8,
  2474. F_CreateUserId = userInfo.userId,
  2475. F_CreateUserName = userInfo.realName,
  2476. F_TaskUserId = userInfo.userId,
  2477. F_TaskUserName = userInfo.realName
  2478. };
  2479. if (userInfo.userId != taskUserId)
  2480. {
  2481. // 说明是委托任务
  2482. nWFTaskLogEntity.F_TaskUserId = taskUserId;
  2483. nWFTaskLogEntity.F_TaskUserName = userIBLL.GetEntityByUserId(taskUserId).F_RealName;
  2484. }
  2485. nWFTaskLogEntity.Create();
  2486. // 给流程发起者一条通知信息
  2487. NWFTaskMsgEntity nWFTaskMsgEntity = new NWFTaskMsgEntity()
  2488. {
  2489. F_ProcessId = nWFEngineParamConfig.ProcessId,
  2490. F_FromUserId = nWFEngineParamConfig.CurrentUser.Id,
  2491. F_FromUserAccount = nWFEngineParamConfig.CurrentUser.Account,
  2492. F_FromUserName = nWFEngineParamConfig.CurrentUser.Name,
  2493. F_ToUserId = nWFEngineParamConfig.CreateUser.Id,
  2494. F_ToAccount = nWFEngineParamConfig.CreateUser.Account,
  2495. F_ToName = nWFEngineParamConfig.CreateUser.Name,
  2496. F_Title = nWFEngineParamConfig.SchemeName,
  2497. F_Content = "你的流程有状态的更新:" + nWFEngineParamConfig.CurrentUser.Name + "加签",
  2498. NodeId = nWFIEngine.GetStartNode().id,
  2499. F_NodeName = nWFIEngine.GetStartNode().name
  2500. };
  2501. nWFTaskMsgEntity.Create();
  2502. NWFTaskRelationEntity nWFTaskRelationEntity = taskUserList.Find(t => t.F_UserId == taskUserId);
  2503. nWFTaskRelationEntity.F_Time = DateTime.Now;
  2504. nWFTaskRelationEntity.F_Result = 4;
  2505. // 创建任务
  2506. List<NWFTaskEntity> taskList = new List<NWFTaskEntity>();
  2507. NWFNodeInfo nodeInfo = nWFIEngine.GetNode(taskEntiy.F_NodeId);
  2508. NWFTaskEntity nWFTaskEntity = new NWFTaskEntity();
  2509. nWFTaskEntity.Create();
  2510. nWFTaskEntity.F_ProcessId = nWFEngineParamConfig.ProcessId;
  2511. nWFTaskEntity.F_NodeId = taskEntiy.F_NodeId;
  2512. nWFTaskEntity.F_NodeName = taskEntiy.F_NodeName;
  2513. nWFTaskEntity.F_PrevNodeId = taskEntiy.F_NodeId;
  2514. nWFTaskEntity.F_PrevNodeName = taskEntiy.F_NodeName;
  2515. nWFTaskEntity.F_CreateUserId = userInfo.userId;
  2516. nWFTaskEntity.F_CreateUserName = userInfo.realName;
  2517. nWFTaskEntity.F_TimeoutAction = taskEntiy.F_TimeoutAction;
  2518. nWFTaskEntity.F_TimeoutInterval = taskEntiy.F_TimeoutInterval;
  2519. nWFTaskEntity.F_TimeoutNotice = taskEntiy.F_TimeoutNotice;
  2520. nWFTaskEntity.F_TimeoutStrategy = taskEntiy.F_TimeoutStrategy;
  2521. nWFTaskEntity.nWFUserInfoList = new List<NWFUserInfo>();
  2522. nWFTaskEntity.nWFUserInfoList.Add(new NWFUserInfo()
  2523. {
  2524. Id = userId,
  2525. Account = userEntity.F_Account,
  2526. Name = userEntity.F_RealName
  2527. });
  2528. nWFTaskEntity.F_Type = 3;
  2529. if (string.IsNullOrEmpty(taskEntiy.F_FirstUserId))
  2530. {
  2531. nWFTaskEntity.F_FirstUserId = taskUserId;
  2532. }
  2533. else
  2534. {
  2535. nWFTaskEntity.F_FirstUserId = taskEntiy.F_FirstUserId;
  2536. }
  2537. taskList.Add(nWFTaskEntity);
  2538. // 创建任务消息
  2539. List<NWFTaskMsgEntity> taskMsgList = _CreateTaskMsg(taskList, nWFEngineParamConfig);
  2540. List<NWFTaskMsgEntity> pTaskMsgList = new List<NWFTaskMsgEntity>();
  2541. NWFEngineParamConfig pNWFEngineParamConfig = null;
  2542. NWFIEngine pNWFIEngine = null;
  2543. if (nWFEngineParamConfig.IsChild == 1)
  2544. {
  2545. pNWFIEngine = _Bootstraper("", nWFEngineParamConfig.ParentProcessId, nWFEngineParamConfig.ParentTaskId, userInfo);
  2546. pNWFEngineParamConfig = pNWFIEngine.GetConfig();
  2547. // 获取父级流程
  2548. nWFTaskMsgEntity.F_ToUserId = pNWFEngineParamConfig.CreateUser.Id;
  2549. nWFTaskMsgEntity.F_ToName = pNWFEngineParamConfig.CreateUser.Name;
  2550. nWFTaskMsgEntity.F_ToAccount = pNWFEngineParamConfig.CreateUser.Account;
  2551. nWFTaskMsgEntity.F_Title = pNWFEngineParamConfig.SchemeName;
  2552. nWFTaskMsgEntity.F_Content = "你的流程【子流程:" + nWFEngineParamConfig.SchemeName + "】有状态的更新:" + nWFEngineParamConfig.CurrentUser.Name + "加签";
  2553. nWFTaskMsgEntity.NodeId = pNWFIEngine.GetStartNode().id;
  2554. nWFTaskMsgEntity.F_NodeName = pNWFIEngine.GetStartNode().name;
  2555. pTaskMsgList.Add(nWFTaskMsgEntity);
  2556. }
  2557. else
  2558. {
  2559. taskMsgList.Add(nWFTaskMsgEntity);
  2560. }
  2561. // 保存流程进程信息
  2562. NWFProcessEntity nWFProcessEntity = new NWFProcessEntity()
  2563. {
  2564. F_Id = nWFEngineParamConfig.ProcessId,
  2565. F_IsStart = 1
  2566. };
  2567. nWFProcessSerive.Save(nWFTaskLogEntity, nWFTaskRelationEntity, taskEntiy, nWFProcessEntity, null, null, taskList, taskMsgList);
  2568. // 触发消息
  2569. _SendMsg(pTaskMsgList, pNWFIEngine);
  2570. _SendMsg(taskMsgList, nWFIEngine);
  2571. }
  2572. /// <summary>
  2573. /// 流程加签
  2574. /// </summary>
  2575. /// <param name="processId">流程进程主键</param>
  2576. /// <param name="taskId">流程任务主键</param>
  2577. /// <param name="userId">加签人员(可多人)</param>
  2578. /// <param name="des">加签说明</param>
  2579. /// <param name="userInfo">当前操作人信息</param>
  2580. public void SignFlowTwo(string processId, string taskId, string userId, string des, UserInfo userInfo)
  2581. {
  2582. // 初始化流程引擎
  2583. NWFIEngine nWFIEngine = _Bootstraper("", processId, taskId, userInfo);
  2584. NWFEngineParamConfig nWFEngineParamConfig = nWFIEngine.GetConfig();
  2585. // 获取任务实体
  2586. var taskEntiy = nWFTaskIBLL.GetEntity(taskId);
  2587. if (taskEntiy == null)
  2588. {
  2589. throw (new Exception("找不到对应流程任务!"));
  2590. }
  2591. if (taskEntiy.F_IsFinished != 0)
  2592. {
  2593. throw (new Exception("该任务已经结束!"));
  2594. }
  2595. taskEntiy.F_ModifyDate = DateTime.Now;
  2596. taskEntiy.F_ModifyUserId = userInfo.userId;
  2597. taskEntiy.F_ModifyUserName = userInfo.realName;
  2598. taskEntiy.F_IsFinished = 1;
  2599. string taskUserId = userInfo.userId;
  2600. // 获取当前任务的执行人列表
  2601. List<NWFTaskRelationEntity> taskUserList = (List<NWFTaskRelationEntity>)nWFTaskIBLL.GetTaskUserList(taskId);
  2602. bool isMyTask = false;
  2603. Dictionary<string, string> taskUserMap = new Dictionary<string, string>();
  2604. foreach (var item in taskUserList)
  2605. {
  2606. if (item.F_UserId == userInfo.userId)
  2607. {
  2608. isMyTask = true;
  2609. }
  2610. if (!taskUserMap.ContainsKey(userInfo.userId))
  2611. {
  2612. taskUserMap.Add(userInfo.userId, "1");
  2613. }
  2614. }
  2615. if (!isMyTask)
  2616. {
  2617. // 如果是委托任务
  2618. List<UserInfo> delegateList = nWFProcessSerive.GetDelegateProcess(userInfo.userId);
  2619. foreach (var item in delegateList)
  2620. {
  2621. if (taskUserMap.ContainsKey(item.userId))
  2622. {
  2623. taskUserId = item.userId;
  2624. }
  2625. }
  2626. }
  2627. //UserEntity userEntity = userIBLL.GetEntityByUserId(userId);
  2628. //todo:
  2629. List<UserEntity> userEntities = userIBLL.GetListByUserIds(userId);
  2630. // 创建任务日志信息
  2631. NWFTaskLogEntity nWFTaskLogEntity = new NWFTaskLogEntity()
  2632. {
  2633. F_ProcessId = processId,
  2634. F_OperationCode = "sign",
  2635. //F_OperationName = "请求【" + userEntity.F_RealName + "】加签",
  2636. //todo:
  2637. F_OperationName = "请求【" + string.Join(",", userEntities.Select(x => x.F_RealName).ToArray()) + "】加签",
  2638. F_NodeId = taskEntiy.F_NodeId,
  2639. F_NodeName = taskEntiy.F_NodeName,
  2640. F_PrevNodeId = taskEntiy.F_PrevNodeId,
  2641. F_PrevNodeName = taskEntiy.F_PrevNodeName,
  2642. F_Des = des,
  2643. F_TaskId = taskId,
  2644. F_TaskType = 8,
  2645. F_CreateUserId = userInfo.userId,
  2646. F_CreateUserName = userInfo.realName,
  2647. F_TaskUserId = userInfo.userId,
  2648. F_TaskUserName = userInfo.realName
  2649. };
  2650. if (userInfo.userId != taskUserId)
  2651. {
  2652. // 说明是委托任务
  2653. nWFTaskLogEntity.F_TaskUserId = taskUserId;
  2654. nWFTaskLogEntity.F_TaskUserName = userIBLL.GetEntityByUserId(taskUserId).F_RealName;
  2655. }
  2656. nWFTaskLogEntity.Create();
  2657. // 给流程发起者一条通知信息
  2658. NWFTaskMsgEntity nWFTaskMsgEntity = new NWFTaskMsgEntity()
  2659. {
  2660. F_ProcessId = nWFEngineParamConfig.ProcessId,
  2661. F_FromUserId = nWFEngineParamConfig.CurrentUser.Id,
  2662. F_FromUserAccount = nWFEngineParamConfig.CurrentUser.Account,
  2663. F_FromUserName = nWFEngineParamConfig.CurrentUser.Name,
  2664. F_ToUserId = nWFEngineParamConfig.CreateUser.Id,
  2665. F_ToAccount = nWFEngineParamConfig.CreateUser.Account,
  2666. F_ToName = nWFEngineParamConfig.CreateUser.Name,
  2667. F_Title = nWFEngineParamConfig.SchemeName,
  2668. F_Content = "你的流程有状态的更新:" + nWFEngineParamConfig.CurrentUser.Name + "加签",
  2669. NodeId = nWFIEngine.GetStartNode().id,
  2670. F_NodeName = nWFIEngine.GetStartNode().name
  2671. };
  2672. nWFTaskMsgEntity.Create();
  2673. NWFTaskRelationEntity nWFTaskRelationEntity = taskUserList.Find(t => t.F_UserId == taskUserId);
  2674. nWFTaskRelationEntity.F_Time = DateTime.Now;
  2675. nWFTaskRelationEntity.F_Result = 4;
  2676. // 创建任务
  2677. List<NWFTaskEntity> taskList = new List<NWFTaskEntity>();
  2678. NWFNodeInfo nodeInfo = nWFIEngine.GetNode(taskEntiy.F_NodeId);
  2679. NWFTaskEntity nWFTaskEntity = new NWFTaskEntity();
  2680. nWFTaskEntity.Create();
  2681. nWFTaskEntity.F_ProcessId = nWFEngineParamConfig.ProcessId;
  2682. nWFTaskEntity.F_NodeId = taskEntiy.F_NodeId;
  2683. nWFTaskEntity.F_NodeName = taskEntiy.F_NodeName;
  2684. nWFTaskEntity.F_PrevNodeId = taskEntiy.F_NodeId;
  2685. nWFTaskEntity.F_PrevNodeName = taskEntiy.F_NodeName;
  2686. nWFTaskEntity.F_CreateUserId = userInfo.userId;
  2687. nWFTaskEntity.F_CreateUserName = userInfo.realName;
  2688. nWFTaskEntity.F_TimeoutAction = taskEntiy.F_TimeoutAction;
  2689. nWFTaskEntity.F_TimeoutInterval = taskEntiy.F_TimeoutInterval;
  2690. nWFTaskEntity.F_TimeoutNotice = taskEntiy.F_TimeoutNotice;
  2691. nWFTaskEntity.F_TimeoutStrategy = taskEntiy.F_TimeoutStrategy;
  2692. nWFTaskEntity.nWFUserInfoList = new List<NWFUserInfo>();
  2693. //nWFTaskEntity.nWFUserInfoList.Add(new NWFUserInfo()
  2694. //{
  2695. // Id = userId,
  2696. // Account = userEntity.F_Account,
  2697. // Name = userEntity.F_RealName
  2698. //});
  2699. //todo:
  2700. foreach (var userItem in userEntities)
  2701. {
  2702. nWFTaskEntity.nWFUserInfoList.Add(new NWFUserInfo()
  2703. {
  2704. Id = userItem.F_UserId,
  2705. Account = userItem.F_Account,
  2706. Name = userItem.F_RealName
  2707. });
  2708. }
  2709. nWFTaskEntity.F_Type = 3;
  2710. if (string.IsNullOrEmpty(taskEntiy.F_FirstUserId))
  2711. {
  2712. nWFTaskEntity.F_FirstUserId = taskUserId;
  2713. }
  2714. else
  2715. {
  2716. nWFTaskEntity.F_FirstUserId = taskEntiy.F_FirstUserId;
  2717. }
  2718. taskList.Add(nWFTaskEntity);
  2719. // 创建任务消息
  2720. List<NWFTaskMsgEntity> taskMsgList = _CreateTaskMsg(taskList, nWFEngineParamConfig);
  2721. List<NWFTaskMsgEntity> pTaskMsgList = new List<NWFTaskMsgEntity>();
  2722. NWFEngineParamConfig pNWFEngineParamConfig = null;
  2723. NWFIEngine pNWFIEngine = null;
  2724. if (nWFEngineParamConfig.IsChild == 1)
  2725. {
  2726. pNWFIEngine = _Bootstraper("", nWFEngineParamConfig.ParentProcessId, nWFEngineParamConfig.ParentTaskId, userInfo);
  2727. pNWFEngineParamConfig = pNWFIEngine.GetConfig();
  2728. // 获取父级流程
  2729. nWFTaskMsgEntity.F_ToUserId = pNWFEngineParamConfig.CreateUser.Id;
  2730. nWFTaskMsgEntity.F_ToName = pNWFEngineParamConfig.CreateUser.Name;
  2731. nWFTaskMsgEntity.F_ToAccount = pNWFEngineParamConfig.CreateUser.Account;
  2732. nWFTaskMsgEntity.F_Title = pNWFEngineParamConfig.SchemeName;
  2733. nWFTaskMsgEntity.F_Content = "你的流程【子流程:" + nWFEngineParamConfig.SchemeName + "】有状态的更新:" + nWFEngineParamConfig.CurrentUser.Name + "加签";
  2734. nWFTaskMsgEntity.NodeId = pNWFIEngine.GetStartNode().id;
  2735. nWFTaskMsgEntity.F_NodeName = pNWFIEngine.GetStartNode().name;
  2736. pTaskMsgList.Add(nWFTaskMsgEntity);
  2737. }
  2738. else
  2739. {
  2740. taskMsgList.Add(nWFTaskMsgEntity);
  2741. }
  2742. // 保存流程进程信息
  2743. NWFProcessEntity nWFProcessEntity = new NWFProcessEntity()
  2744. {
  2745. F_Id = nWFEngineParamConfig.ProcessId,
  2746. F_IsStart = 1
  2747. };
  2748. nWFProcessSerive.Save(nWFTaskLogEntity, nWFTaskRelationEntity, taskEntiy, nWFProcessEntity, null, null, taskList, taskMsgList);
  2749. // 触发消息
  2750. _SendMsg(pTaskMsgList, pNWFIEngine);
  2751. _SendMsg(taskMsgList, nWFIEngine);
  2752. }
  2753. /// <summary>
  2754. /// 流程加签审核
  2755. /// </summary>
  2756. /// <param name="operationCode">审核操作码</param>
  2757. /// <param name="processId">流程进程主键</param>
  2758. /// <param name="taskId">流程任务主键</param>
  2759. /// <param name="des">加签说明</param>
  2760. /// <param name="userInfo">当前操作人信息</param>
  2761. public void SignAuditFlow(string operationCode, string processId, string taskId, string des, UserInfo userInfo)
  2762. {
  2763. // 初始化流程引擎
  2764. NWFIEngine nWFIEngine = _Bootstraper("", processId, taskId, userInfo);
  2765. NWFEngineParamConfig nWFEngineParamConfig = nWFIEngine.GetConfig();
  2766. // 获取任务实体
  2767. var taskEntiy = nWFTaskIBLL.GetEntity(taskId);
  2768. if (taskEntiy == null)
  2769. {
  2770. throw (new Exception("找不到对应流程任务!"));
  2771. }
  2772. if (taskEntiy.F_IsFinished != 0)
  2773. {
  2774. throw (new Exception("该任务已经结束!"));
  2775. }
  2776. taskEntiy.F_ModifyDate = DateTime.Now;
  2777. taskEntiy.F_ModifyUserId = userInfo.userId;
  2778. taskEntiy.F_ModifyUserName = userInfo.realName;
  2779. taskEntiy.F_IsFinished = 1;
  2780. string taskUserId = userInfo.userId;
  2781. // 获取当前任务的执行人列表
  2782. List<NWFTaskRelationEntity> taskUserList = (List<NWFTaskRelationEntity>)nWFTaskIBLL.GetTaskUserList(taskId);
  2783. bool isMyTask = false;
  2784. Dictionary<string, string> taskUserMap = new Dictionary<string, string>();
  2785. foreach (var item in taskUserList)
  2786. {
  2787. if (item.F_UserId == userInfo.userId)
  2788. {
  2789. isMyTask = true;
  2790. }
  2791. if (!taskUserMap.ContainsKey(userInfo.userId))
  2792. {
  2793. taskUserMap.Add(userInfo.userId, "1");
  2794. }
  2795. }
  2796. if (!isMyTask)
  2797. {
  2798. // 如果是委托任务
  2799. List<UserInfo> delegateList = nWFProcessSerive.GetDelegateProcess(userInfo.userId);
  2800. foreach (var item in delegateList)
  2801. {
  2802. if (taskUserMap.ContainsKey(item.userId))
  2803. {
  2804. taskUserId = item.userId;
  2805. }
  2806. }
  2807. }
  2808. UserEntity userEntity = userIBLL.GetEntityByUserId(taskEntiy.F_FirstUserId);
  2809. // 创建任务日志信息
  2810. NWFTaskLogEntity nWFTaskLogEntity = new NWFTaskLogEntity()
  2811. {
  2812. F_ProcessId = processId,
  2813. F_OperationCode = operationCode,
  2814. F_OperationName = "【加签】" + (operationCode == "agree" ? "同意" : "不同意"),
  2815. F_NodeId = taskEntiy.F_NodeId,
  2816. F_NodeName = taskEntiy.F_NodeName,
  2817. F_PrevNodeId = taskEntiy.F_PrevNodeId,
  2818. F_PrevNodeName = taskEntiy.F_PrevNodeName,
  2819. F_Des = des,
  2820. F_TaskId = taskId,
  2821. F_TaskType = 3,
  2822. F_CreateUserId = userInfo.userId,
  2823. F_CreateUserName = userInfo.realName,
  2824. F_TaskUserId = userInfo.userId,
  2825. F_TaskUserName = userInfo.realName
  2826. };
  2827. if (userInfo.userId != taskUserId)
  2828. {
  2829. // 说明是委托任务
  2830. nWFTaskLogEntity.F_TaskUserId = taskUserId;
  2831. nWFTaskLogEntity.F_TaskUserName = userIBLL.GetEntityByUserId(taskUserId).F_RealName;
  2832. }
  2833. nWFTaskLogEntity.Create();
  2834. // 给流程发起者一条通知信息
  2835. NWFTaskMsgEntity nWFTaskMsgEntity = new NWFTaskMsgEntity()
  2836. {
  2837. F_ProcessId = nWFEngineParamConfig.ProcessId,
  2838. F_FromUserId = nWFEngineParamConfig.CurrentUser.Id,
  2839. F_FromUserAccount = nWFEngineParamConfig.CurrentUser.Account,
  2840. F_FromUserName = nWFEngineParamConfig.CurrentUser.Name,
  2841. F_ToUserId = nWFEngineParamConfig.CreateUser.Id,
  2842. F_ToAccount = nWFEngineParamConfig.CreateUser.Account,
  2843. F_ToName = nWFEngineParamConfig.CreateUser.Name,
  2844. F_Title = nWFEngineParamConfig.SchemeName,
  2845. F_Content = "你的流程有状态的更新:" + nWFEngineParamConfig.CurrentUser.Name + "【加签】" + (operationCode == "agree" ? "同意" : "不同意"),
  2846. NodeId = nWFIEngine.GetStartNode().id,
  2847. F_NodeName = nWFIEngine.GetStartNode().name
  2848. };
  2849. nWFTaskMsgEntity.Create();
  2850. NWFTaskRelationEntity nWFTaskRelationEntity = taskUserList.Find(t => t.F_UserId == taskUserId);
  2851. nWFTaskRelationEntity.F_Time = DateTime.Now;
  2852. if (operationCode == "agree")
  2853. {
  2854. nWFTaskRelationEntity.F_Result = 1;
  2855. }
  2856. else
  2857. {
  2858. nWFTaskRelationEntity.F_Result = 2;
  2859. }
  2860. // 创建任务
  2861. List<NWFTaskEntity> taskList = new List<NWFTaskEntity>();
  2862. NWFNodeInfo nodeInfo = nWFIEngine.GetNode(taskEntiy.F_NodeId);
  2863. NWFTaskEntity nWFTaskEntity = new NWFTaskEntity();
  2864. nWFTaskEntity.Create();
  2865. nWFTaskEntity.F_ProcessId = nWFEngineParamConfig.ProcessId;
  2866. nWFTaskEntity.F_NodeId = taskEntiy.F_NodeId;
  2867. nWFTaskEntity.F_NodeName = taskEntiy.F_NodeName;
  2868. nWFTaskEntity.F_PrevNodeId = taskEntiy.F_NodeId;
  2869. nWFTaskEntity.F_PrevNodeName = taskEntiy.F_NodeName;
  2870. nWFTaskEntity.F_CreateUserId = userInfo.userId;
  2871. nWFTaskEntity.F_CreateUserName = userInfo.realName;
  2872. nWFTaskEntity.F_TimeoutAction = taskEntiy.F_TimeoutAction;
  2873. nWFTaskEntity.F_TimeoutInterval = taskEntiy.F_TimeoutInterval;
  2874. nWFTaskEntity.F_TimeoutNotice = taskEntiy.F_TimeoutNotice;
  2875. nWFTaskEntity.F_TimeoutStrategy = taskEntiy.F_TimeoutStrategy;
  2876. nWFTaskEntity.nWFUserInfoList = new List<NWFUserInfo>();
  2877. nWFTaskEntity.nWFUserInfoList.Add(new NWFUserInfo()
  2878. {
  2879. Id = taskEntiy.F_FirstUserId,
  2880. Account = userEntity.F_Account,
  2881. Name = userEntity.F_RealName
  2882. });
  2883. nWFTaskEntity.F_Type = 1;
  2884. taskList.Add(nWFTaskEntity);
  2885. // 创建任务消息
  2886. List<NWFTaskMsgEntity> taskMsgList = _CreateTaskMsg(taskList, nWFEngineParamConfig);
  2887. List<NWFTaskMsgEntity> pTaskMsgList = new List<NWFTaskMsgEntity>();
  2888. NWFEngineParamConfig pNWFEngineParamConfig = null;
  2889. NWFIEngine pNWFIEngine = null;
  2890. if (nWFEngineParamConfig.IsChild == 1)
  2891. {
  2892. pNWFIEngine = _Bootstraper("", nWFEngineParamConfig.ParentProcessId, nWFEngineParamConfig.ParentTaskId, userInfo);
  2893. pNWFEngineParamConfig = pNWFIEngine.GetConfig();
  2894. // 获取父级流程
  2895. nWFTaskMsgEntity.F_ToUserId = pNWFEngineParamConfig.CreateUser.Id;
  2896. nWFTaskMsgEntity.F_ToName = pNWFEngineParamConfig.CreateUser.Name;
  2897. nWFTaskMsgEntity.F_ToAccount = pNWFEngineParamConfig.CreateUser.Account;
  2898. nWFTaskMsgEntity.F_Title = pNWFEngineParamConfig.SchemeName;
  2899. nWFTaskMsgEntity.F_Content = "你的流程【子流程:" + nWFEngineParamConfig.SchemeName + "】有状态的更新:" + nWFEngineParamConfig.CurrentUser.Name + "加签" + (operationCode == "agree" ? "同意" : "不同意");
  2900. nWFTaskMsgEntity.NodeId = pNWFIEngine.GetStartNode().id;
  2901. nWFTaskMsgEntity.F_NodeName = pNWFIEngine.GetStartNode().name;
  2902. pTaskMsgList.Add(nWFTaskMsgEntity);
  2903. }
  2904. else
  2905. {
  2906. taskMsgList.Add(nWFTaskMsgEntity);
  2907. }
  2908. nWFProcessSerive.Save(nWFTaskLogEntity, nWFTaskRelationEntity, taskEntiy, null, null, null, taskList, taskMsgList);
  2909. // 触发消息
  2910. _SendMsg(pTaskMsgList, pNWFIEngine);
  2911. _SendMsg(taskMsgList, nWFIEngine);
  2912. }
  2913. /// <summary>
  2914. /// 确认阅读
  2915. /// </summary>
  2916. /// <param name="processId">流程进程主键</param>
  2917. /// <param name="taskId">流程任务主键</param>
  2918. /// <param name="userInfo">当前操作人信息</param>
  2919. public void ReferFlow(string processId, string taskId, UserInfo userInfo)
  2920. {
  2921. // 获取任务实体
  2922. var taskEntiy = nWFTaskIBLL.GetEntity(taskId);
  2923. if (taskEntiy == null)
  2924. {
  2925. throw (new Exception("找不到对应流程任务!"));
  2926. }
  2927. if (taskEntiy.F_IsFinished != 0)
  2928. {
  2929. throw (new Exception("该任务已经结束!"));
  2930. }
  2931. // 创建任务日志信息
  2932. NWFTaskLogEntity nWFTaskLogEntity = new NWFTaskLogEntity()
  2933. {
  2934. F_ProcessId = processId,
  2935. F_OperationCode = "agreeRefer",
  2936. F_OperationName = "查阅流程",
  2937. F_NodeId = taskEntiy.F_NodeId,
  2938. F_NodeName = taskEntiy.F_NodeName,
  2939. F_PrevNodeId = taskEntiy.F_PrevNodeId,
  2940. F_PrevNodeName = taskEntiy.F_PrevNodeName,
  2941. F_TaskId = taskId,
  2942. F_TaskType = 2,
  2943. F_CreateUserId = userInfo.userId,
  2944. F_CreateUserName = userInfo.realName,
  2945. F_TaskUserId = userInfo.userId,
  2946. F_TaskUserName = userInfo.realName
  2947. };
  2948. nWFTaskLogEntity.Create();
  2949. List<NWFTaskRelationEntity> taskUserList = (List<NWFTaskRelationEntity>)nWFTaskIBLL.GetTaskUserList(taskId);
  2950. NWFTaskRelationEntity nWFTaskRelationEntity = taskUserList.Find(t => t.F_UserId == userInfo.userId);
  2951. nWFTaskRelationEntity.F_Time = DateTime.Now;
  2952. nWFTaskRelationEntity.F_Result = 1;
  2953. if (taskUserList.FindAll(t => t.F_Result == 0).Count == 0)
  2954. {
  2955. taskEntiy.F_ModifyDate = DateTime.Now;
  2956. taskEntiy.F_ModifyUserId = userInfo.userId;
  2957. taskEntiy.F_ModifyUserName = userInfo.realName;
  2958. taskEntiy.F_IsFinished = 1;
  2959. }
  2960. else
  2961. {
  2962. taskEntiy = null;
  2963. }
  2964. nWFProcessSerive.Save(nWFTaskLogEntity, nWFTaskRelationEntity, taskEntiy);
  2965. }
  2966. /// <summary>
  2967. /// 催办流程
  2968. /// </summary>
  2969. /// <param name="processId">流程进程主键</param>
  2970. /// <param name="userInfo">当前操作人信息</param>
  2971. public void UrgeFlow(string processId, UserInfo userInfo)
  2972. {
  2973. NWFIEngine nWFIEngine = _Bootstraper("", processId, "", userInfo);
  2974. NWFEngineParamConfig nWFEngineParamConfig = nWFIEngine.GetConfig();
  2975. // 获取未完成的任务
  2976. IEnumerable<NWFTaskEntity> taskList = nWFTaskIBLL.GetUnFinishTaskList(processId);
  2977. List<NWFTaskEntity> updateTaskList = new List<NWFTaskEntity>();
  2978. List<NWFTaskMsgEntity> taskMsgList = new List<NWFTaskMsgEntity>();
  2979. foreach (var item in taskList)
  2980. {
  2981. if (item.F_Type != 2 && item.F_Type != 5)
  2982. {// 审批 加签 子流程
  2983. item.F_IsUrge = 1;
  2984. updateTaskList.Add(item);
  2985. // 获取当前任务执行人
  2986. List<NWFTaskRelationEntity> taskUserList = (List<NWFTaskRelationEntity>)nWFTaskIBLL.GetTaskUserList(item.F_Id);
  2987. NWFNodeInfo nodeInfo = nWFIEngine.GetNode(item.F_NodeId);
  2988. foreach (var user in taskUserList)
  2989. {
  2990. if (user.F_Result == 0 && user.F_Mark == 0 && user.F_UserId != userInfo.userId)
  2991. {
  2992. // 创建一条任务消息
  2993. UserEntity userEntity = userIBLL.GetEntityByUserId(user.F_UserId);
  2994. NWFTaskMsgEntity nWFTaskMsgEntity = new NWFTaskMsgEntity()
  2995. {
  2996. F_ProcessId = processId,
  2997. F_FromUserId = userInfo.userId,
  2998. F_FromUserAccount = userInfo.account,
  2999. F_FromUserName = userInfo.realName,
  3000. F_ToUserId = userEntity.F_UserId,
  3001. F_ToAccount = userEntity.F_Account,
  3002. F_ToName = userEntity.F_RealName,
  3003. F_Title = nWFEngineParamConfig.SchemeName,
  3004. F_Content = nWFEngineParamConfig.SchemeName + ":【" + nodeInfo.name + "】请尽快审核,来自【" + userInfo.realName + "】",
  3005. NodeId = item.F_NodeId,
  3006. F_NodeName = item.F_NodeName
  3007. };
  3008. nWFTaskMsgEntity.Create();
  3009. taskMsgList.Add(nWFTaskMsgEntity);
  3010. }
  3011. }
  3012. if (taskMsgList.Count > 0)
  3013. {
  3014. // 触发消息
  3015. _SendMsg(taskMsgList, nWFIEngine);
  3016. }
  3017. }
  3018. }
  3019. // 创建任务日志信息
  3020. NWFNodeInfo startNodeInfo = nWFIEngine.GetStartNode();
  3021. NWFTaskLogEntity nWFTaskLogEntity = new NWFTaskLogEntity()
  3022. {
  3023. F_ProcessId = processId,
  3024. F_OperationCode = "urgeFlow",
  3025. F_OperationName = "催办审核",
  3026. F_NodeId = startNodeInfo.id,
  3027. F_NodeName = startNodeInfo.name,
  3028. F_PrevNodeId = startNodeInfo.id,
  3029. F_PrevNodeName = startNodeInfo.id,
  3030. F_TaskType = 9,
  3031. F_CreateUserId = userInfo.userId,
  3032. F_CreateUserName = userInfo.realName,
  3033. F_TaskUserId = userInfo.userId,
  3034. F_TaskUserName = userInfo.realName
  3035. };
  3036. nWFTaskLogEntity.Create();
  3037. // 查看是否有子流程
  3038. IEnumerable<NWFProcessEntity> cProcessList = nWFProcessSerive.GetChildProcessList(processId);
  3039. foreach (var processEntity in cProcessList)
  3040. {
  3041. List<NWFTaskMsgEntity> pTaskMsgList = new List<NWFTaskMsgEntity>();
  3042. IEnumerable<NWFTaskEntity> cTaskList = nWFTaskIBLL.GetUnFinishTaskList(processEntity.F_Id);
  3043. NWFIEngine pNWFIEngine = _Bootstraper("", processEntity.F_Id, "", userInfo);
  3044. NWFEngineParamConfig pNWFEngineParamConfig = pNWFIEngine.GetConfig();
  3045. foreach (var item in cTaskList)
  3046. {
  3047. if (item.F_Type != 2 && item.F_Type != 5)
  3048. {// 审批 加签 子流程
  3049. item.F_IsUrge = 1;
  3050. updateTaskList.Add(item);
  3051. // 获取当前任务执行人
  3052. List<NWFTaskRelationEntity> taskUserList = (List<NWFTaskRelationEntity>)nWFTaskIBLL.GetTaskUserList(item.F_Id);
  3053. NWFNodeInfo nodeInfo = pNWFIEngine.GetNode(item.F_NodeId);
  3054. foreach (var user in taskUserList)
  3055. {
  3056. if (user.F_Result == 0 && user.F_Mark == 0 && user.F_UserId != userInfo.userId)
  3057. {
  3058. // 创建一条任务消息
  3059. UserEntity userEntity = userIBLL.GetEntityByUserId(user.F_UserId);
  3060. NWFTaskMsgEntity nWFTaskMsgEntity = new NWFTaskMsgEntity()
  3061. {
  3062. F_ProcessId = processEntity.F_Id,
  3063. F_FromUserId = userInfo.userId,
  3064. F_FromUserAccount = userInfo.account,
  3065. F_FromUserName = userInfo.realName,
  3066. F_ToUserId = userEntity.F_UserId,
  3067. F_ToAccount = userEntity.F_Account,
  3068. F_ToName = userEntity.F_RealName,
  3069. F_Title = nWFEngineParamConfig.SchemeName + "的子流程-" + pNWFEngineParamConfig.SchemeName,
  3070. F_Content = pNWFEngineParamConfig.SchemeName + ":【" + nodeInfo.name + "】请尽快审核,来自【" + userInfo.realName + "】",
  3071. NodeId = item.F_NodeId,
  3072. F_NodeName = item.F_NodeName
  3073. };
  3074. nWFTaskMsgEntity.Create();
  3075. pTaskMsgList.Add(nWFTaskMsgEntity);
  3076. taskMsgList.AddRange(pTaskMsgList);
  3077. }
  3078. }
  3079. if (pTaskMsgList.Count > 0)
  3080. {
  3081. // 触发消息
  3082. _SendMsg(pTaskMsgList, pNWFIEngine);
  3083. }
  3084. }
  3085. }
  3086. }
  3087. nWFProcessSerive.Save(nWFTaskLogEntity, updateTaskList, taskMsgList);
  3088. }
  3089. /// <summary>
  3090. /// 撤销流程(只有在该流程未被处理的情况下)
  3091. /// </summary>
  3092. /// <param name="processId">流程进程主键</param>
  3093. /// <param name="userInfo">当前操作人信息</param>
  3094. public void RevokeFlow(string processId, UserInfo userInfo)
  3095. {
  3096. NWFProcessEntity processEntity = nWFProcessSerive.GetEntity(processId);
  3097. if (processEntity.F_IsStart != 1)
  3098. {
  3099. // 执行
  3100. NWFIEngine nWFIEngine = _Bootstraper("", processId, "", userInfo);
  3101. NWFEngineParamConfig nWFEngineParamConfig = nWFIEngine.GetConfig();
  3102. var scheme = nWFIEngine.GetSchemeObj();
  3103. // 删除任务
  3104. var taskList = nWFTaskIBLL.GetALLTaskList(processId);
  3105. nWFProcessSerive.Save(processId, taskList, 2);
  3106. _TriggerMethod(scheme.closeDo, "1", nWFEngineParamConfig);
  3107. }
  3108. }
  3109. /// <summary>
  3110. /// 撤销审核(只有在下一个节点未被处理的情况下才能执行)
  3111. /// </summary>
  3112. /// <param name="processId">流程进程主键</param>
  3113. /// <param name="taskId">任务主键</param>
  3114. /// <param name="userInfo">当前操作人信息</param>
  3115. public bool RevokeAudit(string processId, string taskId, UserInfo userInfo)
  3116. {
  3117. bool res = false;
  3118. NWFIEngine nWFIEngine = _Bootstraper("", processId, taskId, userInfo);
  3119. // 获取任务,获取任务节点
  3120. var taskEntity = nWFTaskIBLL.GetEntity(taskId);
  3121. var nodeEntity = nWFIEngine.GetNode(taskEntity.F_NodeId);
  3122. var taskLogEntity = nWFTaskIBLL.GetLogEntity(taskId, userInfo.userId);
  3123. if (string.IsNullOrEmpty(processId))
  3124. {
  3125. processId = taskEntity.F_ProcessId;
  3126. }
  3127. if (!nWFTaskIBLL.IsRevokeTask(processId, taskEntity.F_NodeId))
  3128. {
  3129. return false;
  3130. }
  3131. if (taskLogEntity.F_TaskType == 1)
  3132. {// 普通审核才允许撤销审核
  3133. if (taskEntity.F_IsFinished == 0 && nodeEntity.isAllAuditor == "2")
  3134. {
  3135. var taskUserList3 = (List<NWFTaskRelationEntity>)nWFTaskIBLL.GetTaskUserList(taskEntity.F_Id);
  3136. var taskUserEntity3 = taskUserList3.Find(t => t.F_UserId == userInfo.userId);
  3137. if (nodeEntity.auditorType == "1")// 并行
  3138. {
  3139. // 创建任务日志信息
  3140. NWFTaskLogEntity nWFTaskLogEntity1 = new NWFTaskLogEntity()
  3141. {
  3142. F_ProcessId = processId,
  3143. F_OperationCode = "revokeAudit",
  3144. F_OperationName = "撤销审核",
  3145. F_NodeId = taskEntity.F_NodeId,
  3146. F_NodeName = taskEntity.F_NodeName,
  3147. F_PrevNodeId = taskEntity.F_PrevNodeId,
  3148. F_PrevNodeName = taskEntity.F_PrevNodeName,
  3149. F_TaskId = taskId,
  3150. F_TaskType = 100,
  3151. F_CreateUserId = userInfo.userId,
  3152. F_CreateUserName = userInfo.realName,
  3153. F_TaskUserId = userInfo.userId,
  3154. F_TaskUserName = userInfo.realName
  3155. };
  3156. nWFTaskLogEntity1.Create();
  3157. nWFProcessSerive.RevokeAudit(null, taskUserEntity3, null, nWFTaskLogEntity1);
  3158. return true;
  3159. }
  3160. else
  3161. {
  3162. int sort = (int)taskUserEntity3.F_Sort + 1;
  3163. var taskUserEntity4 = taskUserList3.Find(t => t.F_Sort == sort);
  3164. if (taskUserEntity4 != null && taskUserEntity4.F_Result == 0)
  3165. {
  3166. // 创建任务日志信息
  3167. NWFTaskLogEntity nWFTaskLogEntity2 = new NWFTaskLogEntity()
  3168. {
  3169. F_ProcessId = processId,
  3170. F_OperationCode = "revokeAudit",
  3171. F_OperationName = "撤销审核",
  3172. F_NodeId = taskEntity.F_NodeId,
  3173. F_NodeName = taskEntity.F_NodeName,
  3174. F_PrevNodeId = taskEntity.F_PrevNodeId,
  3175. F_PrevNodeName = taskEntity.F_PrevNodeName,
  3176. F_TaskId = taskId,
  3177. F_TaskType = 100,
  3178. F_CreateUserId = userInfo.userId,
  3179. F_CreateUserName = userInfo.realName,
  3180. F_TaskUserId = userInfo.userId,
  3181. F_TaskUserName = userInfo.realName
  3182. };
  3183. nWFTaskLogEntity2.Create();
  3184. nWFProcessSerive.RevokeAudit(null, taskUserEntity3, null, nWFTaskLogEntity2, taskUserEntity4);
  3185. return true;
  3186. }
  3187. }
  3188. }
  3189. else
  3190. {
  3191. var taskList = nWFTaskIBLL.GetUnFinishTaskList(processId);
  3192. List<string> deleteTaskList = new List<string>();
  3193. // 撤销流程执行线段上绑定的相应方法
  3194. List<NWFLineInfo> lines = new List<NWFLineInfo>();
  3195. foreach (var taskItem in taskList)
  3196. {
  3197. if (taskItem.F_PrevNodeId == taskEntity.F_NodeId && taskItem.F_IsFinished == 0)
  3198. {
  3199. var taskUserList = (List<NWFTaskRelationEntity>)nWFTaskIBLL.GetTaskUserList(taskItem.F_Id);
  3200. if (taskUserList.FindAll(t => t.F_Result != 0).Count == 0)
  3201. {
  3202. deleteTaskList.Add(taskItem.F_Id);
  3203. }
  3204. }
  3205. }
  3206. if (deleteTaskList.Count > 0)
  3207. {
  3208. taskEntity.F_IsFinished = 0;
  3209. var taskUserList2 = (List<NWFTaskRelationEntity>)nWFTaskIBLL.GetTaskUserList(taskEntity.F_Id);
  3210. var taskUserEntity = taskUserList2.Find(t => t.F_UserId == userInfo.userId);
  3211. // 创建任务日志信息
  3212. NWFTaskLogEntity nWFTaskLogEntity = new NWFTaskLogEntity()
  3213. {
  3214. F_ProcessId = processId,
  3215. F_OperationCode = "revokeAudit",
  3216. F_OperationName = "撤销审核",
  3217. F_NodeId = taskEntity.F_NodeId,
  3218. F_NodeName = taskEntity.F_NodeName,
  3219. F_PrevNodeId = taskEntity.F_PrevNodeId,
  3220. F_PrevNodeName = taskEntity.F_PrevNodeName,
  3221. F_TaskId = taskId,
  3222. F_TaskType = 100,
  3223. F_CreateUserId = userInfo.userId,
  3224. F_CreateUserName = userInfo.realName,
  3225. F_TaskUserId = userInfo.userId,
  3226. F_TaskUserName = userInfo.realName
  3227. };
  3228. nWFTaskLogEntity.Create();
  3229. nWFProcessSerive.RevokeAudit(deleteTaskList, taskUserEntity, taskEntity, nWFTaskLogEntity);
  3230. nWFIEngine.GetNextTaskNode(nodeEntity, taskLogEntity.F_OperationCode, false, lines);
  3231. foreach (var line in lines)
  3232. {
  3233. _TriggerMethodR(line, taskEntity.F_Id, taskEntity.F_NodeName, nWFIEngine.GetConfig());
  3234. }
  3235. return true;
  3236. }
  3237. }
  3238. }
  3239. return res;
  3240. }
  3241. /// <summary>
  3242. /// 流程任务超时处理
  3243. /// </summary>
  3244. public void MakeTaskTimeout()
  3245. {
  3246. try
  3247. {
  3248. // 获取所有未完成的任务
  3249. var taskList = nWFTaskIBLL.GetUnFinishTaskList();
  3250. foreach (var task in taskList)
  3251. {
  3252. try
  3253. {
  3254. if (task.F_CreateDate != null)
  3255. {
  3256. DateTime time = (DateTime)task.F_CreateDate;
  3257. bool isNext = false;
  3258. #region 流转到下一节点
  3259. // 是否需要流转到下一节点
  3260. if (task.F_TimeoutAction > 0)
  3261. {
  3262. DateTime actionTime = time.AddHours((int)task.F_TimeoutAction);// 获取需要流转到下一节点的时间
  3263. //超时时间已过执行流转
  3264. if (actionTime <= DateTime.Now)
  3265. {
  3266. NWFIEngine nWFIEngine = _Bootstraper("", task.F_ProcessId, task.F_Id, null);
  3267. NWFEngineParamConfig nWFEngineParamConfig = nWFIEngine.GetConfig();
  3268. nWFEngineParamConfig.CurrentUser = new NWFUserInfo();
  3269. NWFNodeInfo nodeInfo = nWFIEngine.GetNode(task.F_NodeId);
  3270. // 任务
  3271. task.F_ModifyDate = DateTime.Now;
  3272. task.F_IsFinished = 2;
  3273. // 获取当前任务的执行人列表
  3274. List<NWFTaskRelationEntity> taskUserList = (List<NWFTaskRelationEntity>)nWFTaskIBLL.GetTaskUserList(task.F_Id);
  3275. // 创建任务日志信息
  3276. NWFTaskLogEntity nWFTaskLogEntity = new NWFTaskLogEntity()
  3277. {
  3278. F_ProcessId = task.F_ProcessId,
  3279. F_OperationCode = "lrtimeout",
  3280. F_OperationName = "超时",
  3281. F_NodeId = task.F_NodeId,
  3282. F_NodeName = task.F_NodeName,
  3283. F_PrevNodeId = task.F_PrevNodeId,
  3284. F_PrevNodeName = task.F_PrevNodeName,
  3285. F_TaskId = task.F_Id,
  3286. F_TaskType = 6
  3287. };
  3288. nWFTaskLogEntity.Create();
  3289. // 给流程发起者一条通知信息
  3290. NWFTaskMsgEntity nWFTaskMsgEntity = new NWFTaskMsgEntity()
  3291. {
  3292. F_ProcessId = nWFEngineParamConfig.ProcessId,
  3293. F_ToUserId = nWFEngineParamConfig.CreateUser.Id,
  3294. F_ToAccount = nWFEngineParamConfig.CreateUser.Account,
  3295. F_ToName = nWFEngineParamConfig.CreateUser.Name,
  3296. F_Title = nWFEngineParamConfig.SchemeName,
  3297. F_Content = "你的流程有状态的更新:【" + task.F_NodeName + "】超时流转",
  3298. NodeId = nWFIEngine.GetStartNode().id
  3299. };
  3300. nWFTaskMsgEntity.Create();
  3301. foreach (var taskuseRelationEntity in taskUserList)
  3302. {
  3303. NWFTaskRelationEntity nWFTaskRelationEntity = taskuseRelationEntity;
  3304. nWFTaskRelationEntity.F_Time = DateTime.Now;
  3305. // 如果是一般审核节点
  3306. if (nodeInfo.isAllAuditor == "2")
  3307. {
  3308. // 需要所有人都审核,有一人不同意或者所有人都同意
  3309. if (true)//自动流转都是同意
  3310. {
  3311. nWFTaskRelationEntity.F_Result = 1;
  3312. if (taskUserList.FindAll(t => t.F_Result == 0).Count > 0)
  3313. {
  3314. List<NWFTaskRelationEntity> taskUserUpdateList = new List<NWFTaskRelationEntity>();
  3315. taskUserUpdateList.Add(nWFTaskRelationEntity);
  3316. if (nodeInfo.auditorType == "2")
  3317. {
  3318. // 串行
  3319. NWFTaskRelationEntity nWFTaskRelationEntity2 = taskUserList[(int)nWFTaskRelationEntity.F_Sort];
  3320. nWFTaskRelationEntity2.F_Mark = 0;
  3321. taskUserUpdateList.Add(nWFTaskRelationEntity2);
  3322. }
  3323. nWFProcessSerive.Save(nWFTaskLogEntity, taskUserUpdateList, nWFTaskMsgEntity);
  3324. return;
  3325. }
  3326. }
  3327. }
  3328. else
  3329. {
  3330. if (true)//自动流转都是同意
  3331. {
  3332. nWFTaskRelationEntity.F_Result = 1;
  3333. }
  3334. }
  3335. }
  3336. // 获取下一节点信息
  3337. List<NWFLineInfo> lineList = new List<NWFLineInfo>();
  3338. List<NWFNodeInfo> list = nWFIEngine.GetNextTaskNode(nodeInfo, "lrtimeout", false, lineList);
  3339. // 会签处理
  3340. int state = 0;
  3341. if (true)//自动流转都是同意
  3342. {
  3343. state = 1;
  3344. }
  3345. List<NWFTaskEntity> closeTaskList = new List<NWFTaskEntity>();
  3346. List<NWFConfluenceEntity> confluenceList = _ClearConfluence(list, closeTaskList, nodeInfo.id, nWFEngineParamConfig.ProcessId, state, nWFIEngine);
  3347. // 创建任务
  3348. List<NWFTaskEntity> nTaskList = _CreateTask(list, nodeInfo, nWFEngineParamConfig);
  3349. // 创建任务消息
  3350. List<NWFTaskMsgEntity> taskMsgList = _CreateTaskMsg(nTaskList, nWFEngineParamConfig);
  3351. // 保存流程进程信息
  3352. NWFProcessEntity nWFProcessEntity = new NWFProcessEntity()
  3353. {
  3354. F_Id = nWFEngineParamConfig.ProcessId,
  3355. F_IsStart = 1
  3356. };
  3357. if (nWFEngineParamConfig.State == 1)
  3358. {
  3359. nWFProcessEntity.F_IsAgain = 1;
  3360. }
  3361. else if (nWFEngineParamConfig.State == 2)
  3362. {
  3363. nWFProcessEntity.F_IsFinished = 1;
  3364. }
  3365. #region 子流程处理
  3366. List<NWFLineInfo> pLineList = new List<NWFLineInfo>();
  3367. List<NWFTaskEntity> pTaskList = new List<NWFTaskEntity>();
  3368. List<NWFTaskMsgEntity> pTaskMsgList = new List<NWFTaskMsgEntity>();
  3369. NWFEngineParamConfig pNWFEngineParamConfig = null;
  3370. NWFNodeInfo pNodeInfo = null;
  3371. NWFIEngine pNWFIEngine = null;
  3372. NWFProcessEntity pNWFProcessEntity = null;
  3373. if (nWFEngineParamConfig.IsChild == 1)
  3374. {
  3375. pNWFIEngine = _Bootstraper("", nWFEngineParamConfig.ParentProcessId, nWFEngineParamConfig.ParentTaskId, null);
  3376. pNWFEngineParamConfig = pNWFIEngine.GetConfig();
  3377. pNWFEngineParamConfig.CurrentUser = new NWFUserInfo();
  3378. // 获取父级流程
  3379. nWFTaskMsgEntity.F_ToUserId = pNWFEngineParamConfig.CreateUser.Id;
  3380. nWFTaskMsgEntity.F_ToName = pNWFEngineParamConfig.CreateUser.Name;
  3381. nWFTaskMsgEntity.F_ToAccount = pNWFEngineParamConfig.CreateUser.Account;
  3382. nWFTaskMsgEntity.F_Title = pNWFEngineParamConfig.SchemeName;
  3383. nWFTaskMsgEntity.F_Content = "你的流程【子流程:" + nWFEngineParamConfig.SchemeName + "】有状态的更新:【" + task.F_NodeName + "】超时流转";
  3384. nWFTaskMsgEntity.NodeId = pNWFIEngine.GetStartNode().id;
  3385. nWFTaskMsgEntity.F_NodeName = pNWFIEngine.GetStartNode().name;
  3386. // 获取子流程
  3387. NWFProcessEntity cNWFProcessEntity = nWFProcessSerive.GetEntity(nWFEngineParamConfig.ProcessId);
  3388. if (cNWFProcessEntity.F_IsAsyn == 0)
  3389. {
  3390. if (nWFEngineParamConfig.State == 2)
  3391. {
  3392. // 父节点信息
  3393. NWFTaskEntity pTaskEntity = nWFTaskIBLL.GetEntity(nWFEngineParamConfig.ParentTaskId);
  3394. pNodeInfo = pNWFIEngine.GetNode(pTaskEntity.F_NodeId);
  3395. // 获取下一节点信息
  3396. List<NWFNodeInfo> pList = pNWFIEngine.GetNextTaskNode(pNodeInfo, "agree", false, pLineList);
  3397. // 创建任务
  3398. pTaskList = _CreateTask(pList, pNodeInfo, pNWFEngineParamConfig);
  3399. // 创建任务消息
  3400. pTaskMsgList = _CreateTaskMsg(pTaskList, pNWFEngineParamConfig);
  3401. if (pNWFEngineParamConfig.State == 1)
  3402. {
  3403. pNWFProcessEntity = new NWFProcessEntity();
  3404. pNWFProcessEntity.F_IsAgain = 1;
  3405. }
  3406. else if (pNWFEngineParamConfig.State == 2)
  3407. {
  3408. pNWFProcessEntity = new NWFProcessEntity();
  3409. pNWFProcessEntity.F_IsFinished = 1;
  3410. }
  3411. }
  3412. }
  3413. pTaskMsgList.Add(nWFTaskMsgEntity);
  3414. }
  3415. else
  3416. {
  3417. taskMsgList.Add(nWFTaskMsgEntity);
  3418. }
  3419. #endregion
  3420. // 触发消息
  3421. _SendMsg(pTaskMsgList, pNWFIEngine);
  3422. // 触发消息
  3423. _SendMsg(taskMsgList, nWFIEngine);
  3424. nTaskList.AddRange(pTaskList);
  3425. taskMsgList.AddRange(pTaskMsgList);
  3426. // 保存信息 任务日志 任务执行人状态更新 任务状态更新 流程进程状态更新 会签信息更新 新的任务列表 新的任务消息列表
  3427. nWFProcessSerive.Save(nWFTaskLogEntity, null, task, nWFProcessEntity, null, null, nTaskList, taskMsgList, pNWFProcessEntity);
  3428. // 触发流程绑定方法(父级点事件)
  3429. foreach (var line in pLineList)
  3430. {
  3431. _TriggerMethod(line, "", pNodeInfo.name, "create", pNWFEngineParamConfig);
  3432. }
  3433. // 触发流程绑定方法
  3434. foreach (var line in lineList)
  3435. {
  3436. _TriggerMethod(line, task.F_Id, nodeInfo.name, "lrtimeout", nWFEngineParamConfig);
  3437. }
  3438. // 触发子流程节点方法
  3439. foreach (var taskItem in taskList)
  3440. {
  3441. if (taskItem.F_Type == 4)
  3442. {
  3443. NWFNodeInfo cNodeInfo = nWFIEngine.GetNode(taskItem.F_NodeId);
  3444. if (cNodeInfo == null)
  3445. {
  3446. cNodeInfo = pNWFIEngine.GetNode(taskItem.F_NodeId);
  3447. _TriggerMethod(cNodeInfo, taskItem.F_Id, cNodeInfo.name, taskItem.F_ChildProcessId, pNWFEngineParamConfig);
  3448. }
  3449. else
  3450. {
  3451. _TriggerMethod(cNodeInfo, taskItem.F_Id, cNodeInfo.name, taskItem.F_ChildProcessId, nWFEngineParamConfig);
  3452. }
  3453. }
  3454. }
  3455. isNext = true;
  3456. }
  3457. }
  3458. #endregion
  3459. #region 消息提醒
  3460. // 消息
  3461. if (!isNext && !string.IsNullOrEmpty(task.F_TimeoutStrategy) && task.F_TimeoutNotice > 0)
  3462. {
  3463. DateTime noticeTime = time.AddHours((int)task.F_TimeoutNotice);// 获取下一次发送消息时间
  3464. if (noticeTime <= DateTime.Now)
  3465. {
  3466. NWFProcessEntity nWFProcessEntity = nWFProcessSerive.GetEntity(task.F_ProcessId);
  3467. // 获取当前任务执行人
  3468. List<NWFTaskRelationEntity> taskUserList = (List<NWFTaskRelationEntity>)nWFTaskIBLL.GetTaskUserList(task.F_Id);
  3469. // 创建任务消息
  3470. List<NWFTaskMsgEntity> taskMsgList = new List<NWFTaskMsgEntity>();
  3471. List<UserEntity> msgUserList = new List<UserEntity>();
  3472. string content = nWFProcessEntity.F_SchemeName + ":【" + task.F_NodeName + "】请尽快审核,来自【系统提醒】";
  3473. foreach (var taskUser in taskUserList)
  3474. {
  3475. // 创建一条任务消息
  3476. UserEntity userEntity = userIBLL.GetEntityByUserId(taskUser.F_UserId);
  3477. NWFTaskMsgEntity nWFTaskMsgEntity = new NWFTaskMsgEntity()
  3478. {
  3479. F_ProcessId = task.F_ProcessId,
  3480. F_ToUserId = userEntity.F_UserId,
  3481. F_ToAccount = userEntity.F_Account,
  3482. F_ToName = userEntity.F_RealName,
  3483. F_Title = nWFProcessEntity.F_SchemeName,
  3484. F_NodeName = task.F_NodeName,
  3485. F_Content = content
  3486. };
  3487. nWFTaskMsgEntity.Create();
  3488. taskMsgList.Add(nWFTaskMsgEntity);
  3489. msgUserList.Add(userEntity);
  3490. }
  3491. if (taskMsgList.Count > 0)
  3492. {
  3493. string jsonobject = JsonConvert.SerializeObject(taskMsgList[0]);
  3494. lR_StrategyInfoIBLL.SendMessage(task.F_TimeoutStrategy, content, msgUserList.ToJson(), jsonobject);
  3495. }
  3496. NWFTaskLogEntity nWFTaskLogEntity = new NWFTaskLogEntity()
  3497. {
  3498. F_ProcessId = task.F_ProcessId,
  3499. F_OperationCode = "timeoutFlow",
  3500. F_OperationName = "超时提醒",
  3501. F_NodeId = task.F_NodeId,
  3502. F_NodeName = task.F_NodeName,
  3503. F_PrevNodeId = task.F_NodeId,
  3504. F_PrevNodeName = task.F_NodeName,
  3505. F_TaskType = 10
  3506. };
  3507. nWFTaskLogEntity.Create();
  3508. // 保存消息和任务状态
  3509. task.F_IsUrge = 1;
  3510. if (task.F_TimeoutInterval > 0)
  3511. {
  3512. task.F_TimeoutNotice += task.F_TimeoutInterval;
  3513. }
  3514. else
  3515. {
  3516. task.F_TimeoutNotice = 0;
  3517. }
  3518. nWFProcessSerive.Save(nWFTaskLogEntity, task, taskMsgList);
  3519. }
  3520. }
  3521. #endregion
  3522. }
  3523. }
  3524. catch (Exception)
  3525. {
  3526. }
  3527. }
  3528. }
  3529. catch (Exception)
  3530. {
  3531. }
  3532. }
  3533. /// <summary>
  3534. /// 获取流程当前任务需要处理的人
  3535. /// </summary>
  3536. /// <param name="processId">流程进程主键</param>
  3537. /// <returns></returns>
  3538. public IEnumerable<NWFTaskEntity> GetTaskUserList(string processId)
  3539. {
  3540. if (string.IsNullOrEmpty(processId))
  3541. {
  3542. return new List<NWFTaskEntity>();
  3543. }
  3544. var taskList = nWFTaskIBLL.GetUnFinishTaskList(processId);
  3545. foreach (var item in taskList)
  3546. {
  3547. item.nWFUserInfoList = new List<NWFUserInfo>();
  3548. // 获取当前任务执行人
  3549. List<NWFTaskRelationEntity> taskUserList = (List<NWFTaskRelationEntity>)nWFTaskIBLL.GetTaskUserList(item.F_Id);
  3550. foreach (var user in taskUserList)
  3551. {
  3552. if (user.F_Result == 0 && user.F_Mark == 0)
  3553. {
  3554. item.nWFUserInfoList.Add(new NWFUserInfo()
  3555. {
  3556. Id = user.F_UserId
  3557. });
  3558. }
  3559. }
  3560. }
  3561. return taskList;
  3562. }
  3563. /// <summary>
  3564. /// 指派流程审核人
  3565. /// </summary>
  3566. /// <param name="list">任务列表</param>
  3567. /// <param name="userInfo">当前操作人信息</param>
  3568. public void AppointUser(IEnumerable<NWFTaskEntity> list, UserInfo userInfo)
  3569. {
  3570. // 更新任务执行人
  3571. List<NWFTaskRelationEntity> nWFTaskRelationlist = new List<NWFTaskRelationEntity>();
  3572. List<string> taskList = new List<string>();
  3573. string processId = "";
  3574. string content = "";
  3575. foreach (var task in list)
  3576. {
  3577. processId = task.F_ProcessId;
  3578. taskList.Add(task.F_Id);
  3579. content += "【" + task.F_NodeName + "】审核人更新为:";
  3580. foreach (var taskUser in task.nWFUserInfoList)
  3581. {
  3582. content += taskUser.Name + ",";
  3583. nWFTaskRelationlist.Add(new NWFTaskRelationEntity()
  3584. {
  3585. F_Id = Guid.NewGuid().ToString(),
  3586. F_Mark = 0,
  3587. F_TaskId = task.F_Id,
  3588. F_Result = 0,
  3589. F_UserId = taskUser.Id,
  3590. F_Time = DateTime.Now
  3591. });
  3592. }
  3593. content = content.Remove(content.Length - 1, 1);
  3594. content += ";";
  3595. }
  3596. // 操作日志
  3597. NWFTaskLogEntity nWFTaskLogEntity = new NWFTaskLogEntity()
  3598. {
  3599. F_ProcessId = processId,
  3600. F_OperationCode = "appoint",
  3601. F_OperationName = content,
  3602. F_TaskType = 100,
  3603. F_CreateUserId = userInfo.userId,
  3604. F_CreateUserName = userInfo.realName
  3605. };
  3606. nWFTaskLogEntity.Create();
  3607. nWFTaskIBLL.Save(nWFTaskRelationlist, taskList, nWFTaskLogEntity);
  3608. }
  3609. /// <summary>
  3610. /// 作废流程
  3611. /// </summary>
  3612. /// <param name="processId">流程进程主键</param>
  3613. /// <param name="userInfo">当前操作人信息</param>
  3614. public void DeleteFlow(string processId, UserInfo userInfo)
  3615. {
  3616. // 执行
  3617. NWFIEngine nWFIEngine = _Bootstraper("", processId, "", userInfo);
  3618. NWFEngineParamConfig nWFEngineParamConfig = nWFIEngine.GetConfig();
  3619. var scheme = nWFIEngine.GetSchemeObj();
  3620. // 删除任务
  3621. var taskList = nWFTaskIBLL.GetALLTaskList(processId);
  3622. // 操作日志
  3623. NWFTaskLogEntity nWFTaskLogEntity = new NWFTaskLogEntity()
  3624. {
  3625. F_ProcessId = processId,
  3626. F_OperationCode = "deleteFlow",
  3627. F_OperationName = "作废流程",
  3628. F_TaskType = 100,
  3629. F_CreateUserId = userInfo.userId,
  3630. F_CreateUserName = userInfo.realName
  3631. };
  3632. nWFTaskLogEntity.Create();
  3633. nWFProcessSerive.Save(processId, taskList, 3, nWFTaskLogEntity);
  3634. // 处理其子流程
  3635. IEnumerable<NWFProcessEntity> cProcessList = nWFProcessSerive.GetChildProcessList(processId);
  3636. foreach (var processEntity in cProcessList)
  3637. {
  3638. NWFIEngine cNWFIEngine = _Bootstraper("", processEntity.F_Id, "", userInfo);
  3639. NWFEngineParamConfig cNWFEngineParamConfig = cNWFIEngine.GetConfig();
  3640. var cScheme = nWFIEngine.GetSchemeObj();
  3641. var cTaskList = nWFTaskIBLL.GetALLTaskList(processEntity.F_Id);
  3642. nWFProcessSerive.Save(processEntity.F_Id, cTaskList, 3);
  3643. _TriggerMethod(cScheme.closeDo, "2", cNWFEngineParamConfig);
  3644. }
  3645. _TriggerMethod(scheme.closeDo, "2", nWFEngineParamConfig);
  3646. }
  3647. /// <summary>
  3648. /// 给指定的流程添加审核节点
  3649. /// </summary>
  3650. /// <param name="processId">流程实例ID</param>
  3651. /// <param name="bNodeId">开始节点</param>
  3652. /// <param name="eNodeId">结束节点(审核任务的节点)</param>
  3653. public void AddTask(string processId, string bNodeId, string eNodeId, UserInfo userInfo)
  3654. {
  3655. NWFIEngine nWFIEngine = _Bootstraper("", processId, "", userInfo);
  3656. NWFNodeInfo bNodeInfo = nWFIEngine.GetNode(bNodeId);
  3657. NWFNodeInfo eNodeInfo = nWFIEngine.GetNode(eNodeId);
  3658. List<NWFNodeInfo> list = new List<NWFNodeInfo>();
  3659. list.Add(eNodeInfo);
  3660. List<NWFTaskEntity> taskList = _CreateTask(list, bNodeInfo, nWFIEngine.GetConfig());
  3661. nWFProcessSerive.SaveTask(taskList);
  3662. }
  3663. #endregion
  3664. #region 获取sql语句
  3665. /// <summary>
  3666. /// 获取我的流程信息列表SQL语句
  3667. /// </summary>
  3668. /// <returns></returns>
  3669. public string GetMySql()
  3670. {
  3671. return nWFProcessSerive.GetMySql();
  3672. }
  3673. /// <summary>
  3674. /// 获取我的代办任务列表SQL语句
  3675. /// </summary>
  3676. /// <param name="userInfo">用户信息</param>
  3677. /// <param name="isBatchAudit">true获取批量审核任务</param>
  3678. /// <returns></returns>
  3679. public string GetMyTaskSql(UserInfo userInfo, bool isBatchAudit = false)
  3680. {
  3681. return nWFProcessSerive.GetMyTaskSql(userInfo, isBatchAudit);
  3682. }
  3683. /// <summary>
  3684. /// 获取我的已办任务列表SQL语句
  3685. /// </summary>
  3686. /// <returns></returns>
  3687. public string GetMyFinishTaskSql()
  3688. {
  3689. return nWFProcessSerive.GetMyFinishTaskSql();
  3690. }
  3691. #endregion
  3692. }
  3693. }