/* *接口编写处... *如果接口需要做Action的权限验证,请在Action上使用属性 *如: [ApiActionPermission("Sys_WorkFlow",Enums.ActionPermissionOptions.Search)] */ using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.AspNetCore.Http; using VolPro.Entity.DomainModels; using VolPro.Sys.IServices; using VolPro.Core.WorkFlow; using VolPro.Sys.IRepositories; using System.Linq; using Microsoft.EntityFrameworkCore; using VolPro.Core.ManageUser; using VolPro.Core.Services; using VolPro.Core.Extensions; using VolPro.Core.Infrastructure; using VolPro.Core.UserManager; using VolPro.Core.DbSqlSugar; using System.Linq.Expressions; using VolPro.Core.Configuration; using SqlSugar; using VolPro.Core.Filters; namespace VolPro.Sys.Controllers { public partial class Sys_WorkFlowController { private readonly ISys_WorkFlowService _service;//访问业务代码 private readonly ISys_UserRepository _userRepository; private readonly ISys_RoleRepository _roleRepository; private readonly ISys_DepartmentRepository _departmentRepository; private readonly ISys_WorkFlowRepository _workFlowRepository; private readonly ISys_WorkFlowTableRepository _workFlowTableRepository; private readonly ISys_WorkFlowTableStepRepository _workFlowTableStepRepository; private readonly IHttpContextAccessor _httpContextAccessor; [ActivatorUtilitiesConstructor] public Sys_WorkFlowController( ISys_WorkFlowService service, ISys_UserRepository userRepository, ISys_RoleRepository roleRepository, ISys_WorkFlowRepository workFlowRepository, ISys_WorkFlowTableRepository workFlowTableRepository, IHttpContextAccessor httpContextAccessor, ISys_DepartmentRepository departmentRepository, ISys_WorkFlowTableStepRepository workFlowTableStepRepository ) : base(service) { _service = service; _userRepository = userRepository; _roleRepository = roleRepository; _departmentRepository = departmentRepository; _workFlowRepository = workFlowRepository; _workFlowTableRepository = workFlowTableRepository; _workFlowTableStepRepository = workFlowTableStepRepository; _httpContextAccessor = httpContextAccessor; } /// /// 获取工作流程表数据源 /// /// [HttpGet, Route("getTableInfo")] public IActionResult GetTableInfo() { return Json(WorkFlowContainer.GetDic()); } /// /// 获取流程节点数据源(用户与角色) /// /// [HttpGet, Route("getNodeDic")] public async Task GetNodeDic() { var userQuery = _userRepository.FindAsIQueryable(x => true); var roleQuery = _roleRepository.FindAsIQueryable(x => true); var deptQuery = _departmentRepository.FindAsIQueryable(x => true); //2024.02.05租户数据区分 if (AppSetting.UseDynamicShareDB) { Guid serviceId = UserContext.CurrentServiceId; var roleIds = RoleContext.GetAllRoleId().Where(x => x.DbServiceId == serviceId) .Select(s => s.Id).ToList(); userQuery = userQuery.Where(u => SqlFunc.Subqueryable().Where(c => c.UserId == u.User_Id && c.Enable == 1 && roleIds.Contains(c.RoleId)).Any()); roleQuery = roleQuery.Where(c => c.DbServiceId == serviceId); deptQuery = deptQuery.Where(x => x.DbServiceId == serviceId); } var data = new { users = await userQuery.Select(s => new { key = s.User_Id, value = s.UserTrueName }).Take(5000).ToListAsync(), roles = await roleQuery.Select(s => new { key = s.Role_Id, value = s.RoleName }).ToListAsync(), dept = await deptQuery.Select(s => new { key = s.DepartmentId, value = s.DepartmentName }).ToListAsync(), }; return Json(data); } private async Task> GetLogAsync(Expression> expression) { var logs = await _workFlowTableRepository.DbContext.Set() .Where(expression)//(x => x.WorkFlowTable_Id == flow.WorkFlowTable_Id) .OrderByDescending(x => x.CreateDate) .ToListAsync(); return logs; } /// /// 获取单据的审批流程进度 /// /// /// /// [HttpPost, Route("getSteps")] public async Task GetSteps([FromBody] List ids, string tableName, bool isAnti) { if (ids == null || ids.Count == 0) { return Json(new { status = false, message = "请选择数据" }); } var flows = await _workFlowTableRepository.FindAsIQueryable(x => x.WorkTable == tableName && ids.Contains(x.WorkTableKey)) .WhereIF(WorkFlowContainer.CheckTenancy(), c => c.DbServiceId == UserContext.CurrentServiceId) .Includes(x => x.Sys_WorkFlowTableStep) .ToListAsync(); var auditDic = DictionaryManager.GetDictionary("audit")?.Sys_DictionaryList?.Select(s => new { key = s.DicValue, value = s.DicName }); List logs; //不在审核中的数据 if (flows.Count == 0) { logs = await GetLogAsync(x => x.StepId == ids[0] && x.StepName == tableName); return Json(new { status = true, logs, auditDic }); } if (flows.Count > 1 || flows.Count != ids.Count) { return Json(new { status = false, message = "只能选择一条数据进行审核" }); } if (ids.Count > 1 && isAnti) { return Json(new { status = false, message = "只能选择一行数据反审" }); } var flow = flows[0]; var user = UserContext.Current.UserInfo; Expression> expression; //if (isAnti) //{ // expression = x => x.StepId == ids[0] && x.StepName == tableName; //} //else //{ expression = x => x.WorkFlowTable_Id == flow.WorkFlowTable_Id; //} logs = await GetLogAsync(expression); //var log = await _workFlowTableRepository.DbContext.Set() // .Where(expression)//(x => x.WorkFlowTable_Id == flow.WorkFlowTable_Id) // .OrderBy(x => x.CreateDate) // .ToListAsync(); // 获取按用户审核的id,如果多用户要进行分割 // 转换成int数组 //var auditUsers = flow.Sys_WorkFlowTableStep // .Where(x => x.StepType == (int)AuditType.用户审批 && x.StepValue != null) // .SelectMany(x => x.StepValue.Split(",")).Select(int.Parse).ToArray(); //未审批时的用户信息 var unauditSteps = flow.Sys_WorkFlowTableStep .Where(x => (x.AuditId == null || x.AuditId == 0) && x.StepType == (int)AuditType.用户审批 && x.StepValue != null) .Select(s => new { s.Sys_WorkFlowTableStep_Id, userIds = s.StepValue.Split(",").Select(s => s.GetInt()) } ).ToList(); var unauditUsers = unauditSteps.SelectMany(c => c.userIds).ToList(); List<(int userId, string userName)> userInfo = new List<(int userId, string userName)>(); if (unauditUsers.Count > 0) { userInfo = (await _userRepository.FindAsIQueryable(x => unauditUsers.Contains(x.User_Id)) .Select(u => new { u.User_Id, u.UserTrueName }).ToListAsync()) .Select(c => (c.User_Id, c.UserTrueName)).ToList(); } int currentOrderId = flow.Sys_WorkFlowTableStep.Where(x => x.StepId == flow.CurrentStepId) .Select(s => s.OrderId).FirstOrDefault() ?? 0; string GetAuditUsers(int? StepType, string StepValue, Guid Sys_WorkFlowTableStep_Id) { if (StepType == (int)AuditType.角色审批) { int roleId = StepValue.GetInt(); return RoleContext.GetAllRoleId().Where(c => c.Id == roleId).Select(c => c.RoleName).FirstOrDefault(); } //按部门审批 if (StepType == (int)AuditType.部门审批) { var deptId = StepValue.GetGuid(); return DepartmentContext.GetAllDept().Where(c => c.id == deptId).Select(c => c.value).FirstOrDefault(); } var userIds = unauditSteps.Where(c => c.Sys_WorkFlowTableStep_Id == Sys_WorkFlowTableStep_Id) .Select(c => c.userIds).FirstOrDefault(); if (userIds == null) { return ""; } return string.Join("/", userInfo.Where(c => userIds.Contains(c.userId)).Select(s => s.userName)); } bool CheckCurrentUser(Sys_WorkFlowTableStep c) { bool b = (c.AuditStatus == null || c.AuditStatus == (int)AuditStatus.审核中 || c.AuditStatus == (int)AuditStatus.待审核) && c.StepId == flow.CurrentStepId && GetAuditStepValue(c.StepType, c.StepValue); return b; } string currentUserStepId = null; string currentSetpId = null; object GetStep(string stepId) { var list = flow.Sys_WorkFlowTableStep.Where(x => x.StepId == stepId) .OrderByDescending(x => x.AuditDate) .Select(c => new { c.WorkFlowTable_Id, c.Sys_WorkFlowTableStep_Id, c.AuditId, c.StepType, Auditor = c.Auditor ?? GetAuditUsers(c.StepType, c.StepValue, c.Sys_WorkFlowTableStep_Id), //Auditor = auditor, c.AuditDate, c.AuditStatus, c.Remark, c.StepValue, c.StepName, c.OrderId, c.Enable, c.StepId, c.StepAttrType, c.CreateDate, c.Creator, //判断是按角色审批 还是用户帐号审批 isCurrentUser = CheckCurrentUser(c) && (flow.AuditStatus == null || flow.AuditStatus == (int)AuditStatus.审核中 || flow.AuditStatus == (int)AuditStatus.待审核), isCurrent = c.StepId == flow.CurrentStepId && (flow.AuditStatus == null || flow.AuditStatus == (int)AuditStatus.审核中 || flow.AuditStatus == (int)AuditStatus.待审核) }).ToList(); if (currentSetpId == null) { currentSetpId = list.Where(x => x.isCurrentUser).Select(s => s.StepId).FirstOrDefault(); } if (currentUserStepId == null) { currentUserStepId = list.Where(x => x.isCurrentUser && x.isCurrent).Select(s => s.StepId).FirstOrDefault(); } if (list.Count == 1) { return list[0]; } //这里必须要用isCurrentUser排序,否则多人审批时,看不到当前人的数据 var id = list.OrderByDescending(x => x.isCurrentUser).ThenByDescending(x => x.AuditDate).Select(x => x.Sys_WorkFlowTableStep_Id).FirstOrDefault(); return list.Where(x => x.Sys_WorkFlowTableStep_Id == id) .Select(c => new { c.WorkFlowTable_Id, c.Sys_WorkFlowTableStep_Id, c.AuditId, AuditList = list.OrderByDescending(x => x.AuditDate) .Where(x => x.StepId == c.StepId && (x.StepAttrType == StepType.cc.ToString() || (!string.IsNullOrEmpty(x.Auditor) //如果是审批过的数据,只显示多人审批过的数据 && (x.OrderId >= currentOrderId ? true : x.AuditDate != null))) ).Select(x => new { id = x.Sys_WorkFlowTableStep_Id, x.StepType, x.StepValue, x.Auditor, x.AuditDate, x.AuditStatus }), c.Auditor, c.AuditDate, c.AuditStatus, c.Remark, c.StepValue, c.StepName, c.OrderId, c.Enable, c.StepId, c.StepAttrType, c.StepType, c.CreateDate, c.Creator, //这里还需要处理下 c.isCurrentUser, c.isCurrent }).First(); } var steps = flow.Sys_WorkFlowTableStep .OrderBy(o => o.OrderId) .GroupBy(x => x.StepId) .Select(c => GetStep(c.Key)).ToList(); //.Select(c => new //{ // c.AuditId, // Auditor = c.Auditor ?? GetAuditUsers(c), // //Auditor = auditor, // c.AuditDate, // c.AuditStatus, // c.Remark, // c.StepValue, // c.StepName, // c.OrderId, // c.Enable, // c.StepId, // c.StepAttrType, // c.CreateDate, // c.Creator, // //判断是按角色审批 还是用户帐号审批 // isCurrentUser = (c.AuditStatus == null || c.AuditStatus == (int)AuditStatus.审核中 || c.AuditStatus == (int)AuditStatus.待审核) // && c.StepId == flow.CurrentStepId && GetAuditStepValue(c), // isCurrent = c.StepId == flow.CurrentStepId && c.AuditStatus != (int)AuditStatus.审核通过 //}).ToList();//.OrderBy(o => o.OrderId); object form = await WorkFlowManager.GetAuditFormDataAsync(ids[0], tableName); object attachInfo = null; if (currentSetpId != null) { attachInfo = _workFlowRepository.DbContext.Set() .Where(x => x.WorkFlow_Id == flow.WorkFlow_Id && x.StepId == currentSetpId) .Select(s => new { s.AllowUpload, s.AttachQty, s.AttachType }).FirstOrDefault(); } var data = new { status = true, step = flow.CurrentStepId, flow.AuditStatus, auditDic,// = DictionaryManager.GetDictionary("audit")?.Sys_DictionaryList?.Select(s => new { key = s.DicValue, value = s.DicName }), list = steps,//.OrderBy(x => x.OrderId).ToList(), logs, form, attachInfo, linkMenu = WorkFlowContainer.GetFlowOptions(x => x.WorkTable == tableName&&x.WorkFlow_Id==flow.WorkFlow_Id) ?.FirstOrDefault() ?.Sys_WorkFlowStep ?.Where(x => x.StepId == flow.CurrentStepId) ?.Select(s => s.LinkMenu) ?.FirstOrDefault(), //编辑表单 editForm = string.IsNullOrEmpty(currentUserStepId) ? null : WorkFlowContainer.GetFlowOptions(x => x.WorkTable == tableName && x.WorkFlow_Id == flow.WorkFlow_Id) .FirstOrDefault() ?.Sys_WorkFlowStep ?.Where(x => x.StepId == currentUserStepId) ?.FirstOrDefault()?.Config }; return Json(data); } [HttpPost, Route("getFields")] public async Task GetFields(string table) { var query = _workFlowTableRepository.DbContext.Set().Where(c => c.TableName == table); var fields = WorkFlowContainer.GetFilterFields(table); if (fields != null && fields.Length > 0) { query = query.Where(x => fields.Contains(x.ColumnName)); } else { query = query.Where(x => x.IsDisplay == 1); } var columns = await query.OrderByDescending(c => c.OrderNo) .Select(s => new { field = s.ColumnName, name = s.ColumnCnName, dicNo = s.DropNo, s.ColumnType, s.EditType }).ToListAsync(); var data = columns.Select(s => new { s.field, s.name, s.dicNo, s.EditType, columnType = s.ColumnType, data = string.IsNullOrEmpty(s.dicNo) ? null : DictionaryManager.GetDictionary(s.dicNo)?.Sys_DictionaryList?.Select(c => new { key = c.DicValue, value = c.DicName })?.ToList() }).ToList(); return JsonNormal(data); } private bool GetAuditStepValue(int? stepType, string stepValue) { if (stepType == (int)AuditType.角色审批) { return UserContext.Current.RoleIds.Contains(stepValue.GetInt()); } //按部门审批 if (stepType == (int)AuditType.部门审批) { return UserContext.Current.UserInfo.DeptIds.Select(s => s.ToString()).Contains(stepValue); } //按用户审批 return UserContext.Current.UserId.ToString() == stepValue; } [Route("getOptions"), HttpGet] public async Task GetOptions(Guid id) { var data = await _workFlowRepository.FindAsIQueryable(x => x.WorkFlow_Id == id) .Includes(c => c.Sys_WorkFlowStep) .FirstOrDefaultAsync(); return JsonNormal(data); } /// /// 加签或减签 /// /// /// [Route("sign"), HttpPost] public async Task Sign([FromBody] SignInfo signInfo) { var workflowTable = await _workFlowTableRepository.FindAsIQueryable(c => c.WorkFlowTable_Id == signInfo.WorkFlowTable_Id) .Includes(c => c.Sys_WorkFlowTableStep) .FirstOrDefaultAsync(); //当前节点加签 var currentSteps = workflowTable.Sys_WorkFlowTableStep.Where(c => c.StepId == signInfo.CurrentStepId).ToList(); if (signInfo.SignType == SignType.current.ToString()) { foreach (var item in signInfo.Rows) { item.Sys_WorkFlowTableStep_Id = Guid.NewGuid(); item.NextStepId = currentSteps[0].NextStepId; item.ParentId = currentSteps[0].ParentId; item.StepAttrType = currentSteps[0].StepAttrType; item.StepType = currentSteps[0].StepType; item.WorkFlow_Id = currentSteps[0].WorkFlow_Id; item.StepId = currentSteps[0].StepId; item.SetCreateDefaultVal(); } //找出审批过的不删除 _workFlowTableStepRepository.SqlSugarClient.Deleteable(currentSteps).ExecuteCommand(); _workFlowTableStepRepository.AddRange(signInfo.Rows, true); } else //if (signInfo.SignType == SignType.before.ToString()) //前置加签 { string parentId = workflowTable.Sys_WorkFlowTableStep .Where(c => c.OrderId < currentSteps[0].OrderId) .OrderByDescending(c => c.OrderId).Select(c => c.StepId).FirstOrDefault(); foreach (var item in signInfo.Rows) { item.Sys_WorkFlowTableStep_Id = Guid.NewGuid(); //前置加签 if (signInfo.SignType == SignType.before.ToString()) { item.NextStepId = signInfo.CurrentStepId; item.ParentId = parentId; //前置加签,当前节点; item.OrderId = currentSteps[0].OrderId; } else { //后置加签,当前节点+1; item.OrderId = currentSteps[0].OrderId + 1; } item.StepName = signInfo.StepName ?? "流程节点"; item.AuditMethod = signInfo.AuditMethod; item.SourceType = "sign"; item.StepAttrType = StepType.node.ToString(); //审批类型:用户、角色、部门审批 item.StepType = signInfo.AuditType; item.WorkFlow_Id = currentSteps[0].WorkFlow_Id; item.WorkFlowTable_Id = currentSteps[0].WorkFlowTable_Id; item.SetCreateDefaultVal(); } //前置加签,当前与后面的所有节点排序号+1 if (signInfo.SignType == SignType.before.ToString()) { foreach (var item in workflowTable.Sys_WorkFlowTableStep.Where(c => c.OrderId >= currentSteps[0].OrderId)) { item.OrderId = item.OrderId + 1; } } else { //后置加签,当前后面的所有节点排序号+2 foreach (var item in workflowTable.Sys_WorkFlowTableStep.Where(c => c.OrderId > currentSteps[0].OrderId)) { item.OrderId = item.OrderId + 2; } } if (signInfo.SignType == SignType.before.ToString()) //前置加签.重新设置当前审批的节点 { workflowTable.CurrentOrderId = signInfo.Rows[0].OrderId; workflowTable.CurrentStepId = signInfo.Rows[0].StepId; workflowTable.StepName = signInfo.StepName; _workFlowTableRepository.Update(workflowTable, x => new { x.CurrentStepId, x.CurrentOrderId, x.StepName }); var preSteps = workflowTable.Sys_WorkFlowTableStep.Where(c => c.StepId == currentSteps[0].ParentId).ToList(); //新加的节点前节点 foreach (var step in signInfo.Rows) { step.NextStepId = currentSteps[0].StepId; step.ParentId = preSteps[0].StepId; } //当前节点的前一个节点,设置他的下一个节点 foreach (var step in preSteps) { step.NextStepId = signInfo.Rows[0].StepId; } //当前节点的父节点,新加签的节点 foreach (var step in currentSteps) { step.ParentId = signInfo.Rows[0].StepId; } } else { //后置加签 //后一个节点 var nextSteps = workflowTable.Sys_WorkFlowTableStep.Where(c => c.ParentId == currentSteps[0].StepId).ToList(); //新加的节点前节点 foreach (var step in signInfo.Rows) { step.ParentId = currentSteps[0].StepId; step.NextStepId = nextSteps[0].StepId; } //当前节点的前一个节点,设置他的下一个节点 foreach (var step in nextSteps) { step.ParentId = signInfo.Rows[0].StepId; } //当前节点的父节点,新加签的节点 foreach (var step in currentSteps) { step.NextStepId = signInfo.Rows[0].StepId; } } _workFlowTableStepRepository.AddRange(signInfo.Rows); _workFlowTableStepRepository.UpdateRange(workflowTable.Sys_WorkFlowTableStep, x => new { x.OrderId, x.ParentId, x.NextStepId }); _workFlowTableStepRepository.SaveChanges(); } return Success("加签成功"); } [ApiActionPermission] public override IActionResult Upload(IEnumerable fileInput) { return base.Upload(fileInput); } [Route("getTable"), HttpPost] public async Task GetTable([FromBody] List tables, bool isDetail) { var data = await _workFlowRepository.DbContext.Set().Where(x => tables.Contains(x.TableName) && (x.IsKey == null || x.IsKey == 0)) //明细表只返回显示的数据 .WhereIF(isDetail, x => x.IsDisplay == 1 || x.IsKey == 1) .OrderByDescending(x => x.OrderNo) .Select(s => new { s.TableName, s.IsDisplay, s.ColumnCnName, s.IsImage, s.ColumnName, s.ColumnType, s.IsNull, s.IsReadDataset, s.EditType, s.EditRowNo, s.ColumnWidth, s.DropNo }) .ToListAsync(); if (isDetail) { return Json(data); } var detail = await _workFlowRepository.DbContext.Set().Where(x => x.TableName == tables[0]) .Select(s => new { s.DetailCnName, s.DetailName }) .FirstOrDefaultAsync(); return Json(new { data, detail }); } } public enum SignType { current, before, after } public class SignInfo { public string SignType { get; set; } // signType: null, //加签方式 public int AuditMethod { get; set; } //auditMethod: null, //审批方式 //auditType: null, //审批类型 public int AuditType { get; set; } /// /// 审批流程id /// public Guid WorkFlowTable_Id { get; set; } /// /// 当前审批Sys_WorkFlowTableStep的表主键id /// public Guid? CurrentWorkFlowTableStep_Id { get; set; } /// /// 当前审批的节点编号 /// public string CurrentStepId { get; set; } //rows: [] //审批人数据 public List Rows { get; set; } //前后加签的名字 public string StepName { get; set; } } }