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.
 
 
 
 
 
 

3985 lines
191 KiB

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