using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.DBManager;
using WIDESEA_Core.EFDbContext;
using WIDESEA_Core.Extensions;
using WIDESEA_Core.Infrastructure;
using WIDESEA_Core.ManageUser;
using WIDESEA_Core.Services;
using WIDESEA_Core.Utilities;
using WIDESEA_Entity.DomainModels;
using static Npgsql.PostgresTypes.PostgresCompositeType;
namespace WIDESEA_Core.WorkFlow
{
public static class WorkFlowManager
{
public static bool Exists<T>()
{
return WorkFlowContainer.Exists<T>();
}
public static bool Exists<T>(T entity)
{
return WorkFlowContainer.Exists<T>() && GetAuditFlowTable<T>(typeof(T).GetKeyProperty().GetValue(entity).ToString()) != null;
}
public static bool Exists(string table)
{
return WorkFlowContainer.Exists(table);
}
/// <summary>
/// 获å–审批的数æ®
/// </summary>
public static async Task<object> GetAuditFormDataAsync(string tableKey, string table)
{
Type type = WorkFlowContainer.GetType(table);
if (type == null)
{
return Array.Empty<object>();
}
var obj = typeof(WorkFlowManager).GetMethod("GetFormDataAsync").MakeGenericMethod(new Type[] { type })
.Invoke(null, new object[] { tableKey, table }) as Task<object>;
return await obj;
}
/// <summary>
/// å®¡æ‰¹è¡¨å•æ•°æ®æŸ¥è¯¢ä¸Žæ•°æ®æºè½¬æ¢
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tableKey"></param>
/// <param name="table"></param>
/// <returns></returns>
public static async Task<object> GetFormDataAsync<T>(string tableKey, string table) where T : class
{
string[] fields = WorkFlowContainer.GetFormFields(table);
if (fields == null || fields.Length == 0)
{
return Array.Empty<object>();
}
var tableOptions = await DBServerProvider.DbContext.Set<Sys_TableColumn>().Where(c => c.TableName == table && fields.Contains(c.ColumnName))
.Select(s => new { s.ColumnName, s.ColumnCnName, s.DropNo, isDate = s.IsImage == 4 }).ToListAsync();
var condition = typeof(T).GetKeyName().CreateExpression<T>(tableKey, Enums.LinqExpressionType.Equal);
//动æ€åˆ†åº“应该查询对应的数æ®åº“
var data = await DBServerProvider.DbContext.Set<T>().Where(condition).FirstOrDefaultAsync();
if (data==null)
{
Console.WriteLine($"未查到数æ®,表:{table},id:{tableKey}");
return Array.Empty<object>();
}
List<Sys_Dictionary> dictionaries = new List<Sys_Dictionary>();
var dicNos = tableOptions.Select(s => s.DropNo).ToList();
if (dicNos.Count > 0)
{
dictionaries = DictionaryManager.GetDictionaries(dicNos, true).ToList();
}
List<object> list = new List<object>();
var properties = typeof(T).GetProperties();
foreach (var field in fields)
{
var property = properties.Where(c => c.Name == field).FirstOrDefault();
string value = property.GetValue(data)?.ToString();
var option = tableOptions.Where(c => c.ColumnName == field).FirstOrDefault();
string name = option?.ColumnCnName;
if (string.IsNullOrEmpty(name))
{
name = property.GetDisplayName();
}
if (option == null || string.IsNullOrEmpty(value))
{
list.Add(new
{
name,
value = value ?? ""
});
continue;
}
if (option.isDate)
{
value = value.GetDateTime().Value.ToString("yyyy-MM-dd");
}
else if (!string.IsNullOrEmpty(option.DropNo))
{
string val = dictionaries.Where(c => c.DicNo == option.DropNo).FirstOrDefault()
?.Sys_DictionaryList
//这里多选的暂时没处ç†
?.Where(c => c.DicValue == value)?.Select(s => s.DicName)
.FirstOrDefault();
if (!string.IsNullOrEmpty(val))
{
value = val;
}
}
list.Add(new
{
name,
value
});
}
return list;
}
public static int GetAuditStatus<T>(string value)
{
return GetAuditFlowTable<T>(value)?.AuditStatus ?? 0;
}
public static Sys_WorkFlowTable GetAuditFlowTable<T>(string workTableKey)
{
var table = DBServerProvider.DbContext.Set<Sys_WorkFlowTable>()
.Where(x => x.WorkTable == typeof(T).GetEntityTableName() && x.WorkTableKey == workTableKey)
// .Select(s => new { s.CurrentStepId,s.AuditStatus})
.FirstOrDefault();
return table;
}
private static void Rewrite<T>(T entity, Sys_WorkFlow workFlow, bool changeTableStatus) where T : class
{
var autditProperty = typeof(T).GetProperties().Where(x => x.Name.ToLower() == "auditstatus").FirstOrDefault();
if (autditProperty == null)
{
return;
}
string value = typeof(T).GetKeyProperty().GetValue(entity).ToString();
var dbContext = DBServerProvider.DbContext;
var workTable = dbContext.Set<Sys_WorkFlowTable>().Where(x => x.WorkTableKey == value && x.WorkFlow_Id == workFlow.WorkFlow_Id)
.AsNoTracking()
.Include(x => x.Sys_WorkFlowTableStep).FirstOrDefault();
if (workTable == null || workFlow.Sys_WorkFlowStep == null || workFlow.Sys_WorkFlowStep.Count == 0)
{
Console.WriteLine($"未查到æµç¨‹æ•°æ®ï¼Œid:{workFlow.WorkFlow_Id}");
return;
}
// workTable.CurrentOrderId = 1;
//这里还未处ç†å›žé€€åˆ°ä¸Šä¸€ä¸ªèŠ‚ç‚¹
//釿–°è®¾ç½®ç¬¬ä¸€ä¸ªèŠ‚ç‚¹(有å¯èƒ½æ˜¯è¿”回上一个节点)
string startStepId = workTable.Sys_WorkFlowTableStep.Where(x => x.StepAttrType == StepType.start.ToString())
.Select(s => s.StepId).FirstOrDefault();
workTable.CurrentStepId = workTable.Sys_WorkFlowTableStep.Where(x => x.ParentId == startStepId).Select(s => s.StepId).FirstOrDefault();
workTable.AuditStatus = (int)AuditStatus.å¾…å®¡æ ¸;
workTable.Sys_WorkFlowTableStep.ForEach(item =>
{
item.Enable = 0;
item.AuditId = null;
item.Auditor = null;
item.AuditDate = null;
item.Remark = null;
});
if (changeTableStatus)
{
dbContext.Entry(entity).State = EntityState.Detached;
autditProperty.SetValue(entity, 0);
dbContext.Entry(entity).Property(autditProperty.Name).IsModified = true;
}
dbContext.Entry(workTable).State = EntityState.Detached;
dbContext.Update(workTable);
dbContext.SaveChanges();
}
/// <summary>
/// 新建时写入æµç¨‹
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <param name="rewrite">是å¦é‡æ–°ç”Ÿæˆæµç¨‹</param>
/// <param name="changeTableStatus">是å¦ä¿®æ”¹åŽŸè¡¨çš„å®¡æ‰¹çŠ¶æ€</param>
public static void AddProcese<T>(T entity, bool rewrite = false, bool changeTableStatus = true, Action<T, List<int>> addWorkFlowExecuted = null) where T : class
{
WorkFlowTableOptions workFlow = WorkFlowContainer.GetFlowOptions(entity);
//没有对应的æµç¨‹ä¿¡æ¯
if (workFlow == null || workFlow.FilterList.Count == 0)
{
return;
}
workFlow.WorkTableName = WorkFlowContainer.GetName<T>();
string workTable = typeof(T).GetEntityTableName();
////釿–°ç”Ÿæˆæµç¨‹
if (rewrite)
{
Rewrite(entity, workFlow, changeTableStatus);
return;
}
var userInfo = UserContext.Current.UserInfo;
Guid workFlowTable_Id = Guid.NewGuid();
Sys_WorkFlowTable workFlowTable = new Sys_WorkFlowTable()
{
WorkFlowTable_Id = workFlowTable_Id,
AuditStatus = (int)AuditStatus.å¾…å®¡æ ¸,
Enable = 1,
WorkFlow_Id = workFlow.WorkFlow_Id,
WorkName = workFlow.WorkName,
WorkTable = workTable,
WorkTableKey = typeof(T).GetKeyProperty().GetValue(entity).ToString(),
WorkTableName = workFlow.WorkTableName,
CreateID = userInfo.User_Id,
CreateDate = DateTime.Now,
Creator = userInfo.UserTrueName
};
//ç”Ÿæˆæµç¨‹çš„下一æ¥
var steps = workFlow.FilterList.Where(x => x.StepAttrType == StepType.start.ToString()).Select(s => new Sys_WorkFlowTableStep()
{
Sys_WorkFlowTableStep_Id = Guid.NewGuid(),
WorkFlowTable_Id = workFlowTable_Id,
WorkFlow_Id = workFlow.WorkFlow_Id,
StepId = s.StepId,
StepName = s.StepName ?? "æµç¨‹å¼€å§‹",
StepAttrType = s.StepAttrType,
NextStepId = null,
ParentId = null,
StepType = s.StepType,
StepValue = s.StepValue,
OrderId = 0,
Enable = 1,
CreateDate = DateTime.Now,
Creator = userInfo.UserTrueName,
CreateID = userInfo.User_Id
}).ToList();
var entities = new List<T>() { entity };
for (int i = 0; i < steps.Count; i++)
{
var item = steps[i];
//查找下一个满足æ¡ä»¶çš„节点数æ®
FilterOptions filter = workFlow.FilterList.Where(c => c.ParentIds.Contains(item.StepId)
&& c.Expression != null
&& entities.Any(((Func<T, bool>)c.Expression))
).FirstOrDefault();
//未找到满足æ¡ä»¶çš„æ‰¾æ— æ¡ä»¶çš„节点
if (filter == null)
{
filter = workFlow.FilterList.Where(c => c.ParentIds.Contains(item.StepId) && c.Expression == null).FirstOrDefault();
}
if (filter != null)
{
var setp = workFlow.Sys_WorkFlowStep.Where(x => x.StepId == filter.StepId).Select(s => new Sys_WorkFlowTableStep()
{
Sys_WorkFlowTableStep_Id = Guid.NewGuid(),
WorkFlowTable_Id = workFlowTable_Id,
WorkFlow_Id = s.WorkFlow_Id,
StepId = s.StepId,
StepName = s.StepName,
StepAttrType = s.StepAttrType,
NextStepId = null,
ParentId = item.StepId,
StepType = s.StepType,
StepValue = s.StepValue,
OrderId = i + 1,
Enable = 1,
CreateDate = DateTime.Now,
}).FirstOrDefault();
//显示åŽç»éƒ¨é—¨ä¸Žè§’色审批人待完
//è®¾ç½®ä¸‹ä¸ªå®¡æ ¸èŠ‚ç‚¹
item.NextStepId = setp.StepId;
if (!steps.Any(x => x.StepId == setp.StepId))
{
steps.Add(setp);
}
}
else
{
//找ä¸åˆ°æ»¡è¶³æ¡ä»¶çš„èŠ‚ç‚¹ï¼Œç›´æŽ¥ç»“æŸæµç¨‹
var end = workFlow.Sys_WorkFlowStep.Where(c => c.StepAttrType == StepType.end.ToString()).ToList();
if (end.Count > 0)
{
item.NextStepId = end[0].StepId;
steps.Add(end.Select(s => new Sys_WorkFlowTableStep()
{
Sys_WorkFlowTableStep_Id = Guid.NewGuid(),
WorkFlowTable_Id = workFlowTable_Id,
WorkFlow_Id = s.WorkFlow_Id,
StepId = s.StepId,
StepName = s.StepName,
StepAttrType = s.StepAttrType,
NextStepId = null,
ParentId = item.StepId,
StepType = s.StepType,
StepValue = s.StepValue,
OrderId = i + 1,
Enable = 1,
CreateDate = DateTime.Now,
}).FirstOrDefault());
i = steps.Count + 1;
}
}
}
foreach (var setp in steps)
{
if (setp.StepType == (int)AuditType.用户审批)
{
setp.AuditId = setp.StepValue.GetInt();
}
}
//没有满足æµç¨‹çš„æ•°æ®ä¸èµ°æµç¨‹
int count = steps.Where(x => x.StepAttrType != StepType.start.ToString() && x.StepAttrType != StepType.end.ToString()).Count();
if (count == 0)
{
return;
}
//设置进入æµç¨‹åŽçš„ç¬¬ä¸€ä¸ªå®¡æ ¸èŠ‚ç‚¹,(开始节点的下一个节点)
var nodeInfo = steps.Where(x => x.ParentId == steps[0].StepId).Select(s => new { s.StepId, s.StepName }).FirstOrDefault();
workFlowTable.CurrentStepId = nodeInfo.StepId;
workFlowTable.StepName = nodeInfo.StepName;
workFlowTable.Sys_WorkFlowTableStep = steps;
//写入日志
var log = new Sys_WorkFlowTableAuditLog()
{
Id = Guid.NewGuid(),
WorkFlowTable_Id = workFlowTable.WorkFlowTable_Id,
CreateDate = DateTime.Now,
AuditStatus = (int)AuditStatus.å¾…å®¡æ ¸,
Remark = $"[{userInfo.UserTrueName}]æäº¤äº†æ•°æ®"
};
var dbContext = DBServerProvider.DbContext;
dbContext.Set<Sys_WorkFlowTable>().Add(workFlowTable);
dbContext.Set<Sys_WorkFlowTableAuditLog>().Add(log);
dbContext.SaveChanges();
}
/// <summary>
/// å®¡æ ¸
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <param name="status"></param>
/// <param name="remark"></param>
/// <param name="autditProperty"></param>
/// <param name="workFlowExecuting"></param>
/// <param name="workFlowExecuted"></param>
/// <returns></returns>
public static WebResponseContent Audit<T>(T entity, AuditStatus status, string remark,
PropertyInfo autditProperty,
Func<T, AuditStatus, bool, WebResponseContent> workFlowExecuting,
Func<T, AuditStatus, List<int>, bool, WebResponseContent> workFlowExecuted,
bool init = false,
Action<T, List<int>> initInvoke = null
) where T : class
{
WebResponseContent webResponse = new WebResponseContent(true);
if (init)
{
if (!WorkFlowContainer.Exists<T>())
{
return webResponse;
}
}
var dbContext = DBServerProvider.DbContext;
dbContext.QueryTracking = true; ;
var query = dbContext.Set<T>();
var keyProperty = typeof(T).GetKeyProperty();
string key = keyProperty.GetValue(entity).ToString();
string workTable = typeof(T).GetEntityTableName();
Sys_WorkFlowTable workFlow = dbContext.Set<Sys_WorkFlowTable>()
.Where(x => x.WorkTable == workTable && x.WorkTableKey == key)
.Include(x => x.Sys_WorkFlowTableStep)
.FirstOrDefault();
if (workFlow == null)
{
return webResponse.Error("未查到æµç¨‹ä¿¡æ¯,è¯·æ£€æŸ¥æ•°æ®æ˜¯å¦è¢«åˆ 除");
}
workFlow.AuditStatus = (int)status;
var currentStep = workFlow.Sys_WorkFlowTableStep.Where(x => x.StepId == workFlow.CurrentStepId).FirstOrDefault();
if (currentStep == null)
{
return webResponse.Error($"未查到æµç¨‹é™ˆç‚¹[workFlow.CurrentStepId]ä¿¡æ¯,è¯·æ£€æŸ¥æ•°æ®æ˜¯å¦è¢«åˆ 除");
}
Sys_WorkFlowTableStep nextStep = null;
//获å–下一æ¥å®¡æ ¸id
var nextStepId = currentStep.NextStepId;
nextStep = workFlow.Sys_WorkFlowTableStep.Where(x => x.StepId == nextStepId).FirstOrDefault();
var user = UserContext.Current.UserInfo;
//生æˆå®¡æ ¸è®°å½•
var log = new Sys_WorkFlowTableAuditLog()
{
Id = Guid.NewGuid(),
StepId = currentStep.StepId,
WorkFlowTable_Id = currentStep.WorkFlowTable_Id,
WorkFlowTableStep_Id = currentStep.Sys_WorkFlowTableStep_Id,
AuditDate = DateTime.Now,
AuditId = user.User_Id,
Auditor = user.UserTrueName,
AuditResult = remark,
Remark = remark,
AuditStatus = (int)status,
CreateDate = DateTime.Now,
StepName = currentStep.StepName
};
var filterOptions = WorkFlowContainer.GetFlowOptions(x => x.WorkTable == workTable)
.FirstOrDefault()
?.FilterList
?.Where(x => x.StepId == currentStep.StepId)
?.FirstOrDefault();
if (filterOptions != null)
{
//å®¡æ ¸æœªé€šè¿‡æˆ–è€…é©³å›ž
if (!CheckAuditStatus(workFlow, filterOptions, currentStep, status))
{
//记录日志
dbContext.Set<Sys_WorkFlowTableAuditLog>().Add(log);
string msg = null;
if (AuditStatus.å®¡æ ¸æœªé€šè¿‡ == status)
{
if (filterOptions.AuditRefuse == (int)AuditRefuse.返回上一节点)
{
msg = "审批未通过,返回上一节点";
}
else if (filterOptions.AuditRefuse == (int)AuditRefuse.æµç¨‹é‡æ–°å¼€å§‹)
{
msg = "审批未通过,æµç¨‹é‡æ–°å¼€å§‹";
}
}
else if (AuditStatus.驳回 == status)
{
if (filterOptions.AuditBack == (int)AuditBack.返回上一节点)
{
msg = "审批被驳回,返回上一节点";
}
else if (filterOptions.AuditBack == (int)AuditBack.æµç¨‹é‡æ–°å¼€å§‹)
{
msg = "审批被驳回,æµç¨‹é‡æ–°å¼€å§‹";
}
}
var auditLog = new Sys_WorkFlowTableAuditLog()
{
Id = Guid.NewGuid(),
StepId = currentStep.StepId,
WorkFlowTable_Id = currentStep.WorkFlowTable_Id,
WorkFlowTableStep_Id = currentStep.Sys_WorkFlowTableStep_Id,
AuditDate = DateTime.Now,
AuditId = user.User_Id,
Auditor = user.UserTrueName,
AuditResult = remark,
Remark = msg,
AuditStatus = (int)status,
CreateDate = DateTime.Now,
StepName = currentStep.StepName
};
dbContext.Set<Sys_WorkFlowTableAuditLog>().Add(auditLog);
//autditProperty.SetValue(entity, (int)status);
//query.Update(entity);
//修改状æ€
dbContext.Set<Sys_WorkFlowTable>().Update(workFlow);
dbContext.SaveChanges();
dbContext.Entry(workFlow).State = EntityState.Detached;
//å‘é€é‚®ä»¶(appsettings.jsoné…ç½®æ–‡ä»¶é‡Œæ·»åŠ é‚®ä»¶ä¿¡æ¯)
SendMail(workFlow, filterOptions, nextStep, dbContext);
if (workFlowExecuted != null)
{
webResponse = workFlowExecuted.Invoke(entity, status, GetAuditUserIds(nextStep?.StepType ?? 0, nextStep?.StepValue), false);
}
return webResponse;
}
}
if (autditProperty == null)
{
autditProperty = typeof(T).GetProperties().Where(s => s.Name.ToLower() == "auditstatus").FirstOrDefault();
}
bool isLast = false;
//更新明细记录
workFlow.Sys_WorkFlowTableStep.ForEach(x =>
{
if (workFlow.CurrentStepId == x.StepId)
{
x.AuditId = user.User_Id;
x.Auditor = user.UserTrueName;
x.AuditDate = DateTime.Now;
//å¦‚æžœå®¡æ ¸æ‹’ç»æˆ–驳回并退回上一æ¥ï¼Œå¾…完
x.AuditStatus = (int)status;
x.Remark = remark;
}
});
//没有找到下一æ¥å®¡æ‰¹ï¼Œå®¡æ ¸å®Œæˆ
if ((nextStep == null || nextStep.StepAttrType == StepType.end.ToString()))
{
if (status == AuditStatus.å®¡æ ¸é€šè¿‡)
{
workFlow.CurrentStepId = "å®¡æ ¸å®Œæˆ";
}
else
{
workFlow.CurrentStepId = "æµç¨‹ç»“æŸ";
}
workFlow.AuditStatus = (int)status;
//å‘é€é‚®ä»¶(appsettings.jsoné…ç½®æ–‡ä»¶é‡Œæ·»åŠ é‚®ä»¶ä¿¡æ¯)
SendMail(workFlow, filterOptions, nextStep, dbContext);
autditProperty.SetValue(entity, (int)status);
dbContext.Set<Sys_WorkFlowTable>().Update(workFlow);
query.Update(entity);
dbContext.Set<Sys_WorkFlowTableAuditLog>().Add(log);
dbContext.SaveChanges();
if (workFlowExecuted != null)
{
webResponse = workFlowExecuted.Invoke(entity, status, GetAuditUserIds(nextStep?.StepType ?? 0, nextStep?.StepValue), isLast);
}
return webResponse;
}
//指å‘下一个人审批
if (nextStep != null && status == AuditStatus.å®¡æ ¸é€šè¿‡)
{
workFlow.CurrentStepId = nextStep.StepId;
//åŽŸè¡¨æ˜¾ç¤ºå®¡æ ¸ä¸çжæ€
autditProperty.SetValue(entity, (int)AuditStatus.å®¡æ ¸ä¸);
workFlow.AuditStatus = (int)AuditStatus.å®¡æ ¸ä¸;
}
else
{
autditProperty.SetValue(entity, (int)status);
}
//下一个节点=null或节下一个节点为结æŸèŠ‚ç‚¹ï¼Œæµç¨‹ç»“æŸ
if (nextStep == null || workFlow.Sys_WorkFlowTableStep.Exists(c => c.StepId == nextStep.StepId && c.StepAttrType == StepType.end.ToString()))
{
isLast = true;
}
if (workFlowExecuting != null)
{
webResponse = workFlowExecuting.Invoke(entity, status, isLast);
if (!webResponse.Status)
{
return webResponse;
}
}
query.Update(entity);
dbContext.Set<Sys_WorkFlowTable>().Update(workFlow);
dbContext.Set<Sys_WorkFlowTableAuditLog>().Add(log);
dbContext.SaveChanges();
dbContext.Entry(workFlow).State = EntityState.Detached;
if (workFlowExecuted != null)
{
webResponse = workFlowExecuted.Invoke(entity, status, GetAuditUserIds(nextStep?.StepType ?? 0, nextStep?.StepValue), isLast);
}
return webResponse;
}
private static bool CheckAuditStatus(Sys_WorkFlowTable workFlow, FilterOptions filterOptions, Sys_WorkFlowTableStep currentStep, AuditStatus status)
{
//å¦‚æžœå®¡æ ¸æ‹’ç»æˆ–驳回并退回上一æ¥ï¼Œå¾…完
//釿–°é…ç½®æµç¨‹å¾…完
if (status != AuditStatus.å®¡æ ¸æœªé€šè¿‡ && status != AuditStatus.驳回)
{
return true;
}
if (filterOptions.AuditRefuse == (int)AuditRefuse.返回上一节点 || filterOptions.AuditBack == (int)AuditBack.返回上一节点)
{
var preStep = workFlow.Sys_WorkFlowTableStep.Where(x => x.NextStepId == currentStep.StepId && x.StepAttrType == StepType.node.ToString()).FirstOrDefault();
if (preStep != null)
{
preStep.AuditStatus = null;
preStep.AuditId = null;
preStep.AuditDate = null;
preStep.Auditor = null;
workFlow.CurrentStepId = preStep.StepId;
workFlow.AuditStatus = (int)AuditStatus.å®¡æ ¸ä¸;
DBServerProvider.DbContext.Update(preStep);
}
return false;
}
else if (filterOptions.AuditRefuse == (int)AuditRefuse.æµç¨‹é‡æ–°å¼€å§‹ || filterOptions.AuditBack == (int)AuditBack.æµç¨‹é‡æ–°å¼€å§‹)
{
//釿–°å¼€å§‹
var steps = workFlow.Sys_WorkFlowTableStep.Where(x => x.StepAttrType == StepType.node.ToString() && (x.AuditStatus >= 0)).ToList();
if (steps.Count > 0)
{
foreach (var item in steps)
{
item.AuditStatus = null;
item.AuditId = null;
item.AuditDate = null;
item.Auditor = null;
}
//釿–°æŒ‡å‘第一个节点
workFlow.CurrentStepId = steps.OrderBy(c => c.OrderId).Select(c => c.StepId).FirstOrDefault();
workFlow.AuditStatus = (int)AuditStatus.å®¡æ ¸ä¸;
DBServerProvider.DbContext.UpdateRange(steps);
}
return false;
}
return true;
}
private static void SendMail(Sys_WorkFlowTable workFlow, FilterOptions filterOptions, Sys_WorkFlowTableStep nextStep, VOLContext dbContext)
{
if (filterOptions.SendMail != 1)
{
return;
}
if (nextStep == null)
{
nextStep = new Sys_WorkFlowTableStep() { };
}
//å®¡æ ¸å‘é€é‚®ä»¶é€šçŸ¥å¾…完
var userIds = GetAuditUserIds(nextStep.StepType ?? 0, nextStep.StepValue);
if (userIds.Count == 0)
{
return;
}
var emails = dbContext.Set<Sys_User>()
.Where(x => userIds.Contains(x.User_Id) && x.Email != null & x.Email != "").Select(s => s.Email)
.ToList();
Task.Run(() =>
{
string msg = "";
try
{
string title = $"有新的任务待审批:æµç¨‹ã€{workFlow.WorkName}】,任务ã€{nextStep.StepName}】";
MailHelper.Send(title, title, string.Join(";", emails));
msg = $"审批æµç¨‹å‘é€é‚®ä»¶,æµç¨‹å称:{workFlow.WorkName},æµç¨‹id:{workFlow.WorkFlow_Id},æ¥éª¤:{nextStep.StepName},æ¥éª¤Id:{nextStep.StepId},收件人:{string.Join(";", emails)}";
Logger.AddAsync(msg);
}
catch (Exception ex)
{
msg += "邮件å‘é€å¼‚常:";
Logger.AddAsync(msg, ex.Message + ex.StackTrace);
}
});
}
/// <summary>
/// 获å–审批人的id
/// </summary>
/// <param name="stepType"></param>
/// <returns></returns>
private static List<int> GetAuditUserIds(int stepType, string nextId = null)
{
List<int> userIds = new List<int>();
if (stepType == 0 || string.IsNullOrEmpty(nextId))
{
return userIds;
}
if (stepType == (int)AuditType.角色审批)
{
int roleId = nextId.GetInt();
userIds = DBServerProvider.DbContext.Set<Sys_User>().Where(s => s.Role_Id == roleId).Take(50).Select(s => s.User_Id).ToList();
}
else if (stepType == (int)AuditType.部门审批)
{
Guid departmentId = nextId.GetGuid() ?? Guid.Empty;
userIds = DBServerProvider.DbContext.Set<Sys_UserDepartment>().Where(s => s.DepartmentId == departmentId && s.Enable == 1).Take(50).Select(s => s.UserId).ToList();
}
else
{
return nextId.Split(",").Select(c => c.GetInt()).ToList();
}
return userIds;
}
}
}