FlowService.Actions1.Add.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. using System.Linq;
  2. using System.Threading.Tasks;
  3. using Datory;
  4. using GxPress.Common.Tools;
  5. using GxPress.Entity.WorkFlow;
  6. using GxPress.Entity.WorkFlowDto;
  7. using GxPress.EnumConst;
  8. using GxPress.Request.Notice;
  9. namespace GxPress.Service.Implement
  10. {
  11. public partial class FlowService
  12. {
  13. /// <summary>
  14. /// 添加工作流
  15. /// </summary>
  16. /// <param name="flow"></param>
  17. /// <returns></returns>
  18. public async Task<int> AddAsync(FlowDto flow)
  19. {
  20. //获取用户
  21. var user = await _userRepository.GetAsync(flow.UserId);
  22. //获取
  23. var process = await _processRepository.GetAsync(flow.ProcessId);
  24. flow.Id = await _flowRepository.InsertAsync(new Entity.WorkFlow.Flow
  25. {
  26. State = FlowState.Checking,
  27. ProcessId = flow.ProcessId,
  28. UserId = flow.UserId,
  29. IsRead = true
  30. });
  31. await _noticeService.AddNoticeFlowAsync(new NoticeInRequest
  32. {
  33. NoticeType = NoticeTypeConst.Send,
  34. Title = $"{user.Name}的{process.Name}流程",
  35. UserId = flow.UserId,
  36. SoureId = flow.Id,
  37. TypeValue = AllTypeConst.MySubmitted.GetHashCode(),
  38. SendUserId = user.Id,
  39. SendUserName = user.Name
  40. });
  41. foreach (var flowField in flow.Fields)
  42. {
  43. await _flowFieldValueRepository.InsertAsync(new FlowFieldValue
  44. {
  45. ProcessId = flow.ProcessId,
  46. FlowId = flow.Id,
  47. FieldId = flowField.Id,
  48. UserId = flow.UserId,
  49. FieldType = flowField.Type,
  50. StringValue = flowField.Value,
  51. StringValues = flowField.Value,
  52. IntValue = StringUtils.ToInt(flowField.Value)
  53. });
  54. }
  55. //添加审核人
  56. if (flow.ApproverCheckUserIds != null)
  57. {
  58. for (int i = 0; i < flow.ApproverCheckUserIds.Count(); i++)
  59. {
  60. var todo = new FlowTodo
  61. {
  62. ProcessId = flow.ProcessId,
  63. FlowId = flow.Id,
  64. UserId = flow.ApproverCheckUserIds[i],
  65. Type = nameof(TodoTypeConst.ApproverCheck),
  66. IsDone = false,
  67. IsOperate = i == 0,
  68. };
  69. var flowTodoId = await _flowTodoRepository.InsertAsync(todo);
  70. //添加工作收件箱
  71. if (todo.IsOperate)
  72. await _noticeService.AddNoticeFlowAsync(new NoticeInRequest
  73. {
  74. NoticeType = NoticeTypeConst.Send,
  75. Title = $"{user.Name}的{process.Name}流程",
  76. UserId = todo.UserId,
  77. SoureId = flow.Id,
  78. SonId = flowTodoId,
  79. TypeValue = AllTypeConst.MyChecked.GetHashCode(),
  80. SendUserId = user.Id,
  81. SendUserName = user.Name
  82. });
  83. }
  84. }
  85. if (flow.CarbonCopyUserIds != null)
  86. {
  87. foreach (var userId in flow.CarbonCopyUserIds)
  88. {
  89. var todo = new FlowTodo
  90. {
  91. ProcessId = flow.ProcessId,
  92. FlowId = flow.Id,
  93. UserId = userId,
  94. Type = nameof(TodoTypeConst.CarbonCopy),
  95. IsDone = false,
  96. IsOperate = false
  97. };
  98. var flowTodoId = await _flowTodoRepository.InsertAsync(todo);
  99. await _noticeService.AddNoticeFlowAsync(new NoticeInRequest
  100. {
  101. NoticeType = NoticeTypeConst.Send,
  102. Title = $"{user.Name}的{process.Name}流程",
  103. UserId = todo.UserId,
  104. SoureId = flow.Id,
  105. SonId = flowTodoId,
  106. TypeValue = AllTypeConst.MyCc.GetHashCode(),
  107. SendUserId = user.Id,
  108. SendUserName = user.Name
  109. });
  110. }
  111. }
  112. var nodes = await _processService.GetAllAsync(flow.ProcessId);
  113. foreach (var processNodeDto in nodes.Where(n => n.ParentId == 0))
  114. {
  115. if (processNodeDto.Type == nameof(ProcessNodeTypeConst.Start))
  116. {
  117. await NodeExecuteAsync(flow, processNodeDto);
  118. }
  119. //插入审核人
  120. if (processNodeDto.Type == nameof(ProcessNodeTypeConst.Approver) && processNodeDto.ParentId == 0)
  121. {
  122. await NodeExecuteAsync(flow, processNodeDto);
  123. //break;
  124. }
  125. if (processNodeDto.Type == nameof(ProcessNodeTypeConst.Switch))
  126. {
  127. //工作流条件
  128. await NodeExecuteSwitchAsync(flow, processNodeDto);
  129. }
  130. if (processNodeDto.Type == nameof(ProcessNodeTypeConst.End))
  131. {
  132. await NodeExecuteAsync(flow, processNodeDto);
  133. break;
  134. }
  135. }
  136. //创建工作流
  137. foreach (var item in flow.flowAttachments)
  138. {
  139. item.FlowId = flow.Id;
  140. item.TypeId = 1;
  141. }
  142. await flowAttachmentRepository.InsertsAsync(flow.flowAttachments);
  143. return flow.Id;
  144. }
  145. public async Task<int> ReAddAsync(int flowId)
  146. {
  147. var flow = await GetAsync(flowId);
  148. if (flow == null) return 0;
  149. flow.Id = await _flowRepository.InsertAsync(new Entity.WorkFlow.Flow
  150. {
  151. ProcessId = flow.ProcessId,
  152. State = FlowState.Checking,
  153. UserId = flow.UserId
  154. });
  155. //获取上一个的文件
  156. var flowAttachments = (await flowAttachmentRepository.GetAllAsync(flowId)).ToList();
  157. foreach (var item in flowAttachments)
  158. {
  159. item.FlowId = flow.Id;
  160. item.TypeId = 1;
  161. }
  162. await flowAttachmentRepository.InsertsAsync(flowAttachments);
  163. if (flow.Fields != null)
  164. {
  165. foreach (var flowField in flow.Fields)
  166. {
  167. await _flowFieldValueRepository.InsertAsync(new FlowFieldValue
  168. {
  169. ProcessId = flow.ProcessId,
  170. FlowId = flow.Id,
  171. FieldId = flowField.Id,
  172. UserId = flow.UserId,
  173. FieldType = flowField.Type,
  174. StringValue = flowField.Value,
  175. StringValues = flowField.Value,
  176. IntValue = StringUtils.ToInt(flowField.Value)
  177. });
  178. }
  179. }
  180. for (int i = 0; i < flow.ApproverCheckUserIds.Count(); i++)
  181. {
  182. var todo = new FlowTodo
  183. {
  184. ProcessId = flow.ProcessId,
  185. FlowId = flow.Id,
  186. UserId = flow.ApproverCheckUserIds[i],
  187. Type = nameof(TodoTypeConst.ApproverCheck),
  188. IsDone = false,
  189. IsOperate = i == 0,
  190. };
  191. await _flowTodoRepository.InsertAsync(todo);
  192. }
  193. if (flow.ApproverCheckUserIds != null)
  194. {
  195. foreach (var userId in flow.ApproverCheckUserIds)
  196. {
  197. var todo = new FlowTodo
  198. {
  199. ProcessId = flow.ProcessId,
  200. FlowId = flow.Id,
  201. UserId = userId,
  202. Type = nameof(TodoTypeConst.CarbonCopy),
  203. IsDone = false
  204. };
  205. await _flowTodoRepository.InsertAsync(todo);
  206. }
  207. }
  208. var nodes = await GetNodesAsync(flow, await _processService.GetNodesAsync(flow.ProcessId, 0));
  209. if (nodes != null)
  210. {
  211. foreach (var processNodeDto in nodes)
  212. {
  213. if (processNodeDto.Type == nameof(ProcessNodeTypeConst.Start) ||
  214. processNodeDto.Type == nameof(ProcessNodeTypeConst.End))
  215. {
  216. await NodeExecuteAsync(flow, processNodeDto);
  217. }
  218. else if (processNodeDto.Type == nameof(ProcessNodeTypeConst.Approver))
  219. {
  220. await NodeExecuteAsync(flow, processNodeDto);
  221. }
  222. }
  223. }
  224. await DeleteAsync(flow.Id);
  225. return flow.Id;
  226. }
  227. /// <summary>
  228. /// 上会待定
  229. /// </summary>
  230. /// <param name="flowId"></param>
  231. /// <param name="userId"></param>
  232. /// <returns></returns>
  233. public async Task<bool> ActionsWait(int flowId, int userId)
  234. {
  235. var flow = await GetAsync(flowId);
  236. if (flow == null) return false;
  237. var flowTode = await _flowTodoRepository.GetAsync(Q.Where(nameof(Entity.WorkFlow.FlowTodo.FlowId), flowId).Where(nameof(Entity.WorkFlow.FlowTodo.UserId), userId));
  238. if (flowTode == null)
  239. return false;
  240. flowTode.IsDone = true;
  241. flowTode.DoneType = 2;
  242. flowTode.IsChecked = false;
  243. return await _flowTodoRepository.UpdateAsync(flowTode);
  244. }
  245. }
  246. }