using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using GxPress.Common.Exceptions;
using GxPress.Common.Tools;
using GxPress.Entity.WorkProcess;
using GxPress.Entity.WorkProcessDto;
namespace GxPress.Service.Implement
{
public partial class ProcessService
{
///
/// 添加
///
///
///
public async Task AddAsync(ProcessDto request)
{
request.IconUrl = StringUtils.RemoveDomain(request.IconUrl);
//1.保存基本信息
var group = await _processGroupRepository.GetAsync(request.GroupId);
if (group == null) throw new BusinessException("流程分组不存在");
var process = _mapper.Map(request);
process.IsDisabled = false;//创建的时候默认启用
process.Id = await _processRepository.InsertAsync(process);
//2.保存发起限制
foreach (var limit in request.RequestLimits)
{
await _processRequestLimitRepository.InsertAsync(new ProcessRequestLimit
{
ProcessId = process.Id,
DepartmentId = limit.DepartmentId,
RoleId = limit.RoleId,
UserId = limit.UserId
});
}
var fieldDict = new Dictionary();
//3.保存表单定义
if (request.FormFields != null)
{
foreach (var field in request.FormFields)
{
//保存字段
var fieldId = await _processFieldRepository.InsertAsync(new ProcessField
{
ProcessId = process.Id,
Label = field.Label,
Placeholder = field.Placeholder,
Required = field.Required,
Sort = field.Sort,
Type = field.Type,
Unit = field.Unit,
Options = StringUtils.ObjectCollectionToString(field.Options)
});
//保存选项信息
fieldDict.Add(field.Id, fieldId);
}
}
//4.保存节点定义
if (request.ProcessNodes != null)
{
foreach (var node in request.ProcessNodes)
{
await AddNodeAsync(node, 0, process.Id, fieldDict);
}
}
return process;
}
///
/// 插入流程节点树
///
///
///
///
///
///
private async Task AddNodeAsync(ProcessNodeDto node, int parentId, int processId, Dictionary fieldDict)
{
//插入节点
var readOnlyFields = new List();
if (node.ReadOnlyFields != null)
{
foreach (var readOnlyField in node.ReadOnlyFields)
{
if (fieldDict.ContainsKey(readOnlyField))
{
readOnlyFields.Add(fieldDict[readOnlyField]);
}
}
}
var hiddenFields = new List();
if (node.HiddenFields != null)
{
foreach (var hiddenField in node.HiddenFields)
{
if (fieldDict.ContainsKey(hiddenField))
{
hiddenFields.Add(fieldDict[hiddenField]);
}
}
}
var nodeId = await _processNodeRepository.InsertAsync(new Entity.WorkProcess.ProcessNode
{
Name = node.Name,
ParentId = parentId,//调用方法是传入的开始节点父节点id为
ProcessId = processId,
Type = node.Type,
ReadOnlyFields = string.Join(',', readOnlyFields),
HiddenFields = string.Join(',', hiddenFields),
AllowMeeting = node.AllowMeeting,
ApprovalType = node.ApprovalType,
DefaultApprovalUserId = node.DefaultApprovalUserId,
CaseLevel = node.CaseLevel
});
//设置抄送人
foreach (var cc in node.CarbonCopies)
{
await _ruleCarbonCopyRepository.InsertAsync(new RuleCarbonCopy
{
NodeId = nodeId,
UserId = cc.UserId,
RoleId = cc.RoleId,
DepartmentId = cc.DepartmentId
});
}
//根据节点类型插入扩展信息
//添加审批人设置
if (node.ApproverChecks != null)
{
foreach (var approverChecks in node.ApproverChecks)
{
await _ruleApproverCheckRepository.InsertAsync(new RuleApproverCheck
{
NodeId = nodeId,
UserId = approverChecks.UserId,
RoleId = approverChecks.RoleId,
DepartmentId = approverChecks.DepartmentId
});
}
}
if (node.Conditions != null)
{
foreach (var condition in node.Conditions)
{
if (!fieldDict.ContainsKey(condition.FieldId)) continue;
await _ruleConditionRepository.InsertAsync(new RuleCondition
{
NodeId = nodeId,
FieldId = fieldDict[condition.FieldId],
Operator = condition.Operator,
StringValue = condition.StringValue,
StringValues = StringUtils.ObjectCollectionToString(condition.StringValues),
IntValue = condition.IntValue,
Sort = condition.Sort
});
}
}
//是否有下级节点,递归插入下级节点
if (node.Children.Any())
{
foreach (var child in node.Children)
{
await AddNodeAsync(child, nodeId, processId, fieldDict);
}
}
}
}
}