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.
 
 
 
 
 
 

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