ProcessService.Add.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using GxPress.Common.Exceptions;
  5. using GxPress.Common.Tools;
  6. using GxPress.Entity.WorkProcess;
  7. using GxPress.Entity.WorkProcessDto;
  8. namespace GxPress.Service.Implement
  9. {
  10. public partial class ProcessService
  11. {
  12. /// <summary>
  13. /// 添加
  14. /// </summary>
  15. /// <param name="request"></param>
  16. /// <returns></returns>
  17. public async Task<Process> AddAsync(ProcessDto request)
  18. {
  19. request.IconUrl = StringUtils.RemoveDomain(request.IconUrl);
  20. //1.保存基本信息
  21. var group = await _processGroupRepository.GetAsync(request.GroupId);
  22. if (group == null) throw new BusinessException("流程分组不存在");
  23. var process = _mapper.Map<Entity.WorkProcess.Process>(request);
  24. process.IsDisabled = false;//创建的时候默认启用
  25. process.Id = await _processRepository.InsertAsync(process);
  26. //2.保存发起限制
  27. foreach (var limit in request.RequestLimits)
  28. {
  29. await _processRequestLimitRepository.InsertAsync(new ProcessRequestLimit
  30. {
  31. ProcessId = process.Id,
  32. DepartmentId = limit.DepartmentId,
  33. RoleId = limit.RoleId,
  34. UserId = limit.UserId
  35. });
  36. }
  37. var fieldDict = new Dictionary<int, int>();
  38. //3.保存表单定义
  39. if (request.FormFields != null)
  40. {
  41. foreach (var field in request.FormFields)
  42. {
  43. //保存字段
  44. var fieldId = await _processFieldRepository.InsertAsync(new ProcessField
  45. {
  46. ProcessId = process.Id,
  47. Label = field.Label,
  48. Placeholder = field.Placeholder,
  49. Required = field.Required,
  50. Sort = field.Sort,
  51. Type = field.Type,
  52. Unit = field.Unit,
  53. Options = StringUtils.ObjectCollectionToString(field.Options)
  54. });
  55. //保存选项信息
  56. fieldDict.Add(field.Id, fieldId);
  57. }
  58. }
  59. //4.保存节点定义
  60. if (request.ProcessNodes != null)
  61. {
  62. foreach (var node in request.ProcessNodes)
  63. {
  64. await AddNodeAsync(node, 0, process.Id, fieldDict);
  65. }
  66. }
  67. return process;
  68. }
  69. /// <summary>
  70. /// 插入流程节点树
  71. /// </summary>
  72. /// <param name="node"></param>
  73. /// <param name="parentId"></param>
  74. /// <param name="processId"></param>
  75. /// <param name="fieldDict"></param>
  76. /// <returns></returns>
  77. private async Task AddNodeAsync(ProcessNodeDto node, int parentId, int processId, Dictionary<int, int> fieldDict)
  78. {
  79. //插入节点
  80. var readOnlyFields = new List<int>();
  81. if (node.ReadOnlyFields != null)
  82. {
  83. foreach (var readOnlyField in node.ReadOnlyFields)
  84. {
  85. if (fieldDict.ContainsKey(readOnlyField))
  86. {
  87. readOnlyFields.Add(fieldDict[readOnlyField]);
  88. }
  89. }
  90. }
  91. var hiddenFields = new List<int>();
  92. if (node.HiddenFields != null)
  93. {
  94. foreach (var hiddenField in node.HiddenFields)
  95. {
  96. if (fieldDict.ContainsKey(hiddenField))
  97. {
  98. hiddenFields.Add(fieldDict[hiddenField]);
  99. }
  100. }
  101. }
  102. var nodeId = await _processNodeRepository.InsertAsync(new Entity.WorkProcess.ProcessNode
  103. {
  104. Name = node.Name,
  105. ParentId = parentId,//调用方法是传入的开始节点父节点id为
  106. ProcessId = processId,
  107. Type = node.Type,
  108. ReadOnlyFields = string.Join(',', readOnlyFields),
  109. HiddenFields = string.Join(',', hiddenFields),
  110. AllowMeeting = node.AllowMeeting,
  111. ApprovalType = node.ApprovalType,
  112. DefaultApprovalUserId = node.DefaultApprovalUserId,
  113. CaseLevel = node.CaseLevel
  114. });
  115. //设置抄送人
  116. foreach (var cc in node.CarbonCopies)
  117. {
  118. await _ruleCarbonCopyRepository.InsertAsync(new RuleCarbonCopy
  119. {
  120. NodeId = nodeId,
  121. UserId = cc.UserId,
  122. RoleId = cc.RoleId,
  123. DepartmentId = cc.DepartmentId
  124. });
  125. }
  126. //根据节点类型插入扩展信息
  127. //添加审批人设置
  128. if (node.ApproverChecks != null)
  129. {
  130. foreach (var approverChecks in node.ApproverChecks)
  131. {
  132. await _ruleApproverCheckRepository.InsertAsync(new RuleApproverCheck
  133. {
  134. NodeId = nodeId,
  135. UserId = approverChecks.UserId,
  136. RoleId = approverChecks.RoleId,
  137. DepartmentId = approverChecks.DepartmentId
  138. });
  139. }
  140. }
  141. if (node.Conditions != null)
  142. {
  143. foreach (var condition in node.Conditions)
  144. {
  145. if (!fieldDict.ContainsKey(condition.FieldId)) continue;
  146. await _ruleConditionRepository.InsertAsync(new RuleCondition
  147. {
  148. NodeId = nodeId,
  149. FieldId = fieldDict[condition.FieldId],
  150. Operator = condition.Operator,
  151. StringValue = condition.StringValue,
  152. StringValues = StringUtils.ObjectCollectionToString(condition.StringValues),
  153. IntValue = condition.IntValue,
  154. Sort = condition.Sort
  155. });
  156. }
  157. }
  158. //是否有下级节点,递归插入下级节点
  159. if (node.Children.Any())
  160. {
  161. foreach (var child in node.Children)
  162. {
  163. await AddNodeAsync(child, nodeId, processId, fieldDict);
  164. }
  165. }
  166. }
  167. }
  168. }