using DS.Module.Core; using DS.Module.Core.Extensions; using DS.Module.SqlSugar; using DS.Module.UserModule; using DS.WMS.Core.Code.Entity; using DS.WMS.Core.Fee.Dtos; using DS.WMS.Core.Fee.Entity; using DS.WMS.Core.Fee.Interface; using DS.WMS.Core.Flow.Dtos; using DS.WMS.Core.Flow.Entity; using DS.WMS.Core.Flow.Interface; using DS.WMS.Core.Op.Entity; using DS.WMS.Core.Sys.Entity; using Mapster; using Microsoft.Extensions.DependencyInjection; using SqlSugar; namespace DS.WMS.Core.Fee.Method { /// /// 费用审核 /// public class FeeAuditService : IFeeAuditService { /// /// 待审核的状态值 /// public static readonly FeeStatus[] AuditStatusArray = [FeeStatus.AuditSubmitted, FeeStatus.ApplyDeletion, FeeStatus.ApplyModification]; /// /// 一键审核支持的类型 /// public static readonly string[] AuditTypes = [FeeAuditType.ApplyAudit.ToString(), FeeAuditType.ApplyModification.ToString(), FeeAuditType.ApplyDeletion.ToString()]; /// /// 工作流运行状态值 /// public static readonly int RunningStatus = (int)FlowStatusEnum.Running; readonly IServiceProvider _serviceProvider; readonly ISqlSugarClient db; readonly IUser user; readonly ISaasDbService saasService; readonly IClientFlowInstanceService flowService; public FeeAuditService(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; db = _serviceProvider.GetRequiredService(); user = _serviceProvider.GetRequiredService(); saasService = _serviceProvider.GetRequiredService(); flowService = _serviceProvider.GetRequiredService(); } /// /// 获取费用审核列表 /// /// /// public DataResult> GetList(PageRequest request) { var flowList = db.Queryable().Where(x => x.FlowStatus == RunningStatus && SqlFunc.SplitIn(x.MakerList, user.UserId) && AuditTypes.Contains(x.AuditType)) .Select(x => new FlowInstance { BusinessId = x.BusinessId, BusinessType = x.BusinessType }).ToList(); //没有待审批的列表直接返回不再执行后续查询 if (flowList.Count == 0) DataResult>.PageList(0, null, MultiLanguageConst.DataQuerySuccess); var tenantDb = saasService.GetBizDbScopeById(user.TenantId); var queryList = CreateQuery(tenantDb, flowList); //queryList = queryList.Where(x => SqlFunc.Subqueryable().Where( // y => y.BusinessId == x.Id && y.BusinessType == x.BusinessType && SqlFunc.SplitIn(y.MakerList, user.UserId)).Any()); if (!request.QueryCondition.IsNullOrEmpty()) { var whereList = db.ConfigQuery.Context.Utilities.JsonToConditionalModels(request.QueryCondition); queryList = queryList.Where(whereList); } var result = queryList.ToQueryPage(request.PageCondition); if (result.Data.Count > 0) { //关联用户名称 var userIds = result.Data.Where(x => x.OperatorId.HasValue).Select(x => x.OperatorId.Value) .Union(result.Data.Select(x => x.CreateBy)) .Distinct(); var users = db.Queryable().Where(x => userIds.Contains(x.Id)).Select(x => new { x.Id, x.UserName }).ToList(); foreach (var item in result.Data) { item.CreateByName = users.Find(x => x.Id == item.CreateBy)?.UserName; if (item.OperatorId.HasValue) { item.Operator = users.Find(x => x.Id == item.OperatorId.Value)?.UserName; } } } return result; } /// /// 获取整票审核列表 /// /// /// public DataResult> GetBizList(PageRequest request) { string auditType = FeeAuditType.Business.ToString(); var flowList = db.Queryable().Where(x => x.FlowStatus == RunningStatus && SqlFunc.SplitIn(x.MakerList, user.UserId) && x.AuditType == auditType) .Select(x => new FlowInstance { BusinessId = x.BusinessId, BusinessType = x.BusinessType }).ToList(); //没有待审批的列表直接返回不再执行后续查询 if (flowList.Count == 0) DataResult>.PageList(0, null, MultiLanguageConst.DataQuerySuccess); var tenantDb = saasService.GetBizDbScopeById(user.TenantId); var queryList = CreateBizQuery(tenantDb, flowList); if (!request.QueryCondition.IsNullOrEmpty()) { var whereList = db.ConfigQuery.Context.Utilities.JsonToConditionalModels(request.QueryCondition); queryList = queryList.Where(whereList); } var result = queryList.ToQueryPage(request.PageCondition); if (result.Data.Count > 0) { //关联用户名称 var userIds = result.Data.Where(x => x.OperatorId.HasValue).Select(x => x.OperatorId.Value) .Union(result.Data.Select(x => x.CreateBy)) .Distinct(); var users = db.Queryable().Where(x => userIds.Contains(x.Id)).Select(x => new { x.Id, x.UserName }).ToList(); foreach (var item in result.Data) { item.CreateByName = users.Find(x => x.Id == item.CreateBy)?.UserName; if (item.OperatorId.HasValue) { item.Operator = users.Find(x => x.Id == item.OperatorId.Value)?.UserName; } } } return result; } //创建各项业务数据的查询并集 internal static ISugarQueryable CreateQuery(SqlSugarScopeProvider tenantDb, IEnumerable additions) { //海运出口 var ids1 = additions?.Where(x => x.BusinessType == BusinessType.OceanShippingExport).Select(x => x.BusinessId).ToArray(); var query1 = tenantDb.Queryable((s, b, f, cs, csd) => new JoinQueryInfos( JoinType.Left, s.Id == b.BusinessId && b.BusinessType == BusinessType.OceanShippingExport, JoinType.Inner, s.Id == f.BusinessId && f.BusinessType == BusinessType.OceanShippingExport && AuditStatusArray.Contains(f.FeeStatus), JoinType.Left,s.SourceId == cs.Id, JoinType.Left, s.SourceDetailId == csd.Id )) .WhereIF(ids1 != null && ids1.Length > 0, (s, b, f) => ids1.Contains(f.Id)) .GroupBy(s => s.Id) .Select((s, b, f, cs, csd) => new FeeAuditBusiness { Id = s.Id, AccountDate = SqlFunc.ToDate(s.AccountDate), APFeeStatus = b.APFeeStatus, ARFeeStatus = b.ARFeeStatus, BusinessType = BusinessType.OceanShippingExport, BusinessStatus = s.BusinessStatusName, BusinessDate = s.BusinessDate,//业务日期 BLType = s.BLType, CargoId = s.CargoId, Carrier = s.Carrier, AgencyId = s.AgentId, CBM = s.CBM, CntrTotal = s.CntrTotal, ContractNo = s.ContractNo, CreateBy = s.CreateBy, CustomerId = s.CustomerId, CustomerName = s.CustomerName,//委托单位 CustomerNo = s.CustomerNo, CustomerService = s.CustomerService, CustomNo = s.CustomNo, CustomsNum = s.CustomsNum, DangerClass = s.DangerClass, Destination = s.Destination, DischargePort = s.DischargePort, Doc = s.Doc, ETD = s.ETD, Forwarder = s.Forwarder, GoodsName = s.GoodsName, HBLNO = s.HBLNO, InvoiceNo = s.InvoiceNo, IsBusinessLocking = b.IsBusinessLocking, IsFeeLocking = b.IsFeeLocking, IssueType = s.IssueType, KGS = s.KGS, LoadPort = s.LoadPort, MBLFrt = s.MBLFrt, MBLNO = s.MBLNO, Note = s.Note, OperatorId = s.OperatorId, OrderNo = s.OrderNo, PKGS = s.PKGS, ReceiptPlace = s.ReceiptPlace, Remark = s.Remark, SaleDeptId = s.SaleDeptId, //SaleDeptName //所属部门 SaleId = s.SaleId, SaleName = s.Sale,//揽货人 SourceId = s.SourceId, SourceName = cs.SourceName, SourceDetailId = s.SourceDetailId, DetailName = csd.DetailName, TradeTerm = s.TradeTerm, TransitTerms = s.Service,//运输条款 Vessel = s.Vessel,//船名 Voyage = s.Voyno,//航次 Yard = s.Yard //BusinessUnit = //经营单位 //ChangeOrder //更改单 //ChangeReason //更改单更改原因 //FreightRatio //运杂费比例 //查询:运输类型 (枚举值,暂未建立) //查询:是否费用提交 //查询:利润减少 }); //海运进口 //var ids2 = additions?.Where(x => x.BusinessType == BusinessType.OceanShippingImport).Select(x => x.BusinessId).ToArray(); return tenantDb.UnionAll(new List> { query1 }); } //创建各项业务数据的查询并集 internal static ISugarQueryable CreateBizQuery(SqlSugarScopeProvider tenantDb, IEnumerable additions) { //海运出口 var ids1 = additions?.Where(x => x.BusinessType == BusinessType.OceanShippingExport).Select(x => x.BusinessId).ToArray(); var query1 = tenantDb.Queryable((s, b, cs, csd) => new JoinQueryInfos( JoinType.Left, s.Id == b.BusinessId && b.BusinessType == BusinessType.OceanShippingExport, JoinType.Left, s.SourceId == cs.Id, JoinType.Left, s.SourceDetailId == csd.Id )) .WhereIF(ids1 != null && ids1.Length > 0, (s, b) => ids1.Contains(s.Id)) .GroupBy(s => s.Id) .Select((s, b, cs, csd) => new FeeAuditBusiness { Id = s.Id, AccountDate = SqlFunc.ToDate(s.AccountDate), APFeeStatus = b.APFeeStatus, ARFeeStatus = b.ARFeeStatus, BusinessType = BusinessType.OceanShippingExport, BusinessStatus = s.BusinessStatusName, BusinessDate = s.BusinessDate,//业务日期 BLType = s.BLType, CargoId = s.CargoId, Carrier = s.Carrier, AgencyId = s.AgentId, CBM = s.CBM, CntrTotal = s.CntrTotal, ContractNo = s.ContractNo, CreateBy = s.CreateBy, CustomerId = s.CustomerId, CustomerName = s.CustomerName,//委托单位 CustomerNo = s.CustomerNo, CustomerService = s.CustomerService, CustomNo = s.CustomNo, CustomsNum = s.CustomsNum, DangerClass = s.DangerClass, Destination = s.Destination, DischargePort = s.DischargePort, Doc = s.Doc, ETD = s.ETD, Forwarder = s.Forwarder, GoodsName = s.GoodsName, HBLNO = s.HBLNO, InvoiceNo = s.InvoiceNo, IsBusinessLocking = b.IsBusinessLocking, IsFeeLocking = b.IsFeeLocking, IssueType = s.IssueType, KGS = s.KGS, LoadPort = s.LoadPort, MBLFrt = s.MBLFrt, MBLNO = s.MBLNO, Note = s.Note, OperatorId = s.OperatorId, OrderNo = s.OrderNo, PKGS = s.PKGS, ReceiptPlace = s.ReceiptPlace, Remark = s.Remark, SaleDeptId = s.SaleDeptId, //SaleDeptName //所属部门 SaleId = s.SaleId, SaleName = s.Sale,//揽货人 SourceId = s.SourceId, SourceName = cs.SourceName, SourceDetailId = s.SourceDetailId, DetailName = csd.DetailName, TradeTerm = s.TradeTerm, TransitTerms = s.Service,//运输条款 Vessel = s.Vessel,//船名 Voyage = s.Voyno,//航次 Yard = s.Yard //BusinessUnit = //经营单位 //ChangeOrder //更改单 //ChangeReason //更改单更改原因 //FreightRatio //运杂费比例 //查询:运输类型 (枚举值,暂未建立) //查询:是否费用提交 //查询:利润减少 }); //海运进口 return tenantDb.UnionAll(new List> { query1 }); } /// /// 按费用批量审批 /// /// 审批结果:1=通过,2=驳回 /// 备注 /// 待审批的费用ID /// public DataResult Audit(int yesOrNo, string remark, params long[] idArray) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); var fees = tenantDb.Queryable().Where(x => idArray.Contains(x.Id)).Select(x => new { x.Id, x.FeeName, x.FeeStatus, x.FlowId }).ToList(); if (fees.Count == 0) return DataResult.Failed("未能获取费用信息"); if (fees.Exists(x => !x.FlowId.HasValue)) return DataResult.Failed("提交数据中包含不在审批流程中的费用"); if (fees.Exists(x => !AuditStatusArray.Contains(x.FeeStatus))) return DataResult.Failed("提交数据中包含不在待审批状态的费用"); var flowIds = fees.Select(x => x.FlowId.GetValueOrDefault()); var flows = db.Queryable().Where(x => flowIds.Contains(x.Id)).ToList(); if (flows.Count == 0) return DataResult.Failed("未能获取审批工作流"); if (flows.Exists(x => !x.MakerList.Contains(user.UserId))) return DataResult.Failed("所选费用包含不属于当前用户权限范围内的审批,禁止提交"); List list = new List(); foreach (var fee in fees) { var flow = flows.Find(x => x.Id == fee.FlowId.Value); if (flow == null) { continue; } var result = flowService.AuditFlowInstance(new FlowAuditInfo { Instance = flow, Status = yesOrNo, AuditNote = remark }); if (!result.Succeeded) { list.Add(fee.FeeName); } } if (list.Count > 0) return DataResult.Failed($"部分费用审批失败:{string.Join("、", list)}"); return DataResult.Success; } /// /// 本票审核(一键审核当前登录用户的所有待审核项) /// /// 审批结果:1=通过,2=驳回 /// 备注 /// public DataResult Audit(int yesOrNo, string remark) { var recordIds = db.Queryable().Where(x => x.FlowStatus == RunningStatus && SqlFunc.SplitIn(x.MakerList, user.UserId) && AuditTypes.Contains(x.AuditType)) .Select(x => x.BusinessId).ToArray(); //没有待审批的列表直接返回不再执行后续查询 if (recordIds.Length == 0) return DataResult.Failed("当前暂无待审批的费用"); return Audit(yesOrNo, remark, recordIds); } /// /// 按业务批量审批 /// /// 审批请求 /// public DataResult AuditBusiness(FeeBizAuditRequest request) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); var gpList = request.Items.GroupBy(x => x.BusinessType).ToList(); foreach (var gp in gpList) { var bIdArr = gp.Select(x => x.Id).ToArray(); var bizList = tenantDb.Queryable().Where(x => bIdArr.Contains(x.BusinessId) && x.BusinessType == gp.Key) .Select(x => new { x.Id, x.BillAuditStatus, x.FlowId }).ToList(); if (bizList.Count == 0) return DataResult.Failed("未能获取业务信息"); if (!bizList.Any(x => x.FlowId.HasValue)) return DataResult.Failed("业务未处于审批流程中"); if (bizList.Any(x => x.BillAuditStatus != BillAuditStatus.AuditSubmitted)) return DataResult.Failed("业务的审批状态不正确"); var fIdArr = bizList.Select(x => x.FlowId).ToArray(); string auditType = FeeAuditType.Business.ToString(); var flows = db.Queryable().Where(x => fIdArr.Contains(x.Id) && x.AuditType == auditType).ToList(); if (flows.Count == 0) return DataResult.Failed("未能获取审批工作流"); if (flows.Any(x => !x.MakerList.Contains(user.UserId))) return DataResult.Failed("所选项包含不属于当前用户权限范围内的审批,禁止提交"); foreach (var flow in flows) { var result = flowService.AuditFlowInstance(new FlowAuditInfo { Instance = flow, Status = request.Result, AuditNote = request.Remark }); if (!result.Succeeded) { //todo:记录未能成功审核的数据 } } } return DataResult.Success; } /// /// 设置业务费用锁定状态 /// /// 业务信息 /// public DataResult SetFeeLocking(IEnumerable items) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); int rows = tenantDb.Updateable(items) .WhereColumns(x => new { x.BusinessId, x.BusinessType }) .UpdateColumns(x => new { x.IsFeeLocking }) .ExecuteCommand(); return rows > 0 ? DataResult.Success : DataResult.Failed("更新失败"); } /// /// 根据审批结果更新审批状态 /// /// 回调信息 /// public DataResult UpdateAuditStatus(FlowCallback callback) { var auditType = callback.AuditType.ToEnum(); var tenantDb = saasService.GetBizDbScopeById(user.TenantId); FeeRecord fee = null; BusinessFeeStatus biz = null; if (auditType == FeeAuditType.Business) { biz = tenantDb.Queryable().Where(x => x.Id == callback.BusinessId && x.BusinessType == callback.BusinessType) .Select(x => new BusinessFeeStatus { Id = x.Id, BusinessId = x.BusinessId, BillAuditStatus = x.BillAuditStatus }).First(); if (biz == null) return DataResult.Failed("未能找到业务信息,更新状态失败", MultiLanguageConst.Operation_Failed); } else { fee = tenantDb.Queryable().Where(x => x.Id == callback.BusinessId && x.BusinessType == callback.BusinessType).Select( x => new FeeRecord { Id = x.Id, FeeStatus = x.FeeStatus }).First(); if (fee == null) return DataResult.Failed("未能找到费用记录,更新状态失败", MultiLanguageConst.Operation_Failed); fee.Reason = callback.RejectReason; } long userId = long.Parse(user.UserId); DateTime dtNow = DateTime.Now; tenantDb.Ado.BeginTran(); try { switch (auditType) { case FeeAuditType.ApplyAudit: fee.AuditBy = userId; fee.AuditOperator = user.UserName; fee.AuditDate = dtNow; if (callback.FlowStatus == FlowStatusEnum.Approve) { fee.FeeStatus = FeeStatus.AuditPassed; fee.Reason = string.Empty; } else if (callback.FlowStatus == FlowStatusEnum.Reject) fee.FeeStatus = FeeStatus.RejectSubmission; tenantDb.Updateable(fee).UpdateColumns(x => new { x.FeeStatus, x.AuditBy, x.AuditOperator, x.AuditDate, x.Reason, x.FlowId }).ExecuteCommand(); break; case FeeAuditType.ApplyModification: //申请修改审核成功需要回填费用信息 if (callback.FlowStatus == FlowStatusEnum.Approve) { var fm = tenantDb.Queryable().Where(x => x.FeeRecordId == fee.Id).OrderByDescending(x => x.CreateTime).First(); if (fm == null) return DataResult.Failed("未找到费用修改信息,更新失败", MultiLanguageConst.Operation_Failed); var entity = fm.Adapt(); entity.Id = fm.FeeRecordId; entity.FeeStatus = FeeStatus.AuditPassed; entity.Reason = callback.RejectReason; entity.UpdateBy = userId; entity.UpdateTime = dtNow; //全表更新 tenantDb.Updateable(entity).IgnoreColumns( x => new { x.AuditBy, x.AuditDate, x.AuditOperator, x.SubmitBy, x.SubmitDate }).ExecuteCommand(); //逻辑删除暂存数据 fm.Deleted = true; fm.DeleteTime = dtNow; fm.DeleteBy = userId; tenantDb.Updateable(fm).UpdateColumns(x => new { x.DeleteBy, x.Deleted, x.DeleteTime }).ExecuteCommand(); } else if (callback.FlowStatus == FlowStatusEnum.Reject) { fee.FeeStatus = FeeStatus.RejectApplication; tenantDb.Updateable(fee).UpdateColumns(x => new { x.FeeStatus, x.Reason, x.FlowId }).ExecuteCommand(); } break; case FeeAuditType.ApplyDeletion: if (callback.FlowStatus == FlowStatusEnum.Approve) { fee.Deleted = true; fee.DeleteBy = userId; fee.DeleteTime = dtNow; tenantDb.Updateable(fee).UpdateColumns(x => new { x.DeleteBy, x.Deleted, x.DeleteTime, x.Reason, x.FlowId }).ExecuteCommand(); //tenantDb.Deleteable(fee).ExecuteCommand(); } else { fee.FeeStatus = FeeStatus.RejectApplication; tenantDb.Updateable(fee).UpdateColumns(x => new { x.FeeStatus, x.Reason, x.FlowId }).ExecuteCommand(); } break; case FeeAuditType.Business: FeeStatus status = FeeStatus.RejectSubmission; if (callback.FlowStatus == FlowStatusEnum.Approve) { biz.BillAuditStatus = BillAuditStatus.AuditPassed; status = FeeStatus.AuditPassed; } else if (callback.FlowStatus == FlowStatusEnum.Reject) { biz.BillAuditStatus = BillAuditStatus.Rejected; } tenantDb.Updateable(biz).UpdateColumns(x => new { x.BillAuditStatus, x.FlowId }).ExecuteCommand(); tenantDb.Updateable() .SetColumns(x => x.FeeStatus == status) .SetColumns(x => x.FlowId == null) .SetColumns(x => x.AuditBy == userId) .SetColumns(x => x.AuditOperator == user.UserName) .SetColumns(x => x.AuditDate == dtNow) .Where(x => x.BusinessId == biz.BusinessId && x.BusinessType == callback.BusinessType && (x.FeeStatus == FeeStatus.Entering || x.FeeStatus == FeeStatus.RejectSubmission)).ExecuteCommand(); break; default: return DataResult.Failed("费用未处于审批状态,更新失败", MultiLanguageConst.Operation_Failed); } //驳回申请则逻辑删除关联工作流 if (callback.FlowStatus == FlowStatusEnum.Reject) { db.Updateable(new FlowInstance { Id = callback.InstanceId, Deleted = true, DeleteBy = 0, DeleteTime = DateTime.Now }).UpdateColumns(x => new { x.Deleted, x.DeleteBy, x.DeleteTime }).ExecuteCommand(); } tenantDb.Ado.CommitTran(); return DataResult.Successed("提交成功!", MultiLanguageConst.DataUpdateSuccess); } catch (Exception ex) { tenantDb.Ado.RollbackTran(); ex.Log(db); return DataResult.Failed("提交失败!", MultiLanguageConst.Operation_Failed); } finally { FeeRecordService.WriteBackStatus(tenantDb, callback.BusinessId, callback.BusinessType); } } //public DataResult> GetListByPage(PageRequest request) //{ // var tenantDb = saasService.GetBizDbScopeById(user.TenantId); // var whereList = db.ConfigQuery.Context.Utilities.JsonToConditionalModels(request.QueryCondition); // var query1 = tenantDb.Queryable() // .InnerJoin((x, y) => x.BusinessId == y.Id) // .LeftJoin((x, y, z) => x.CustomerId == z.Id) // .Select((x, y, z) => new FeeAudit // { // Id = x.Id, // BusinessId = x.BusinessId, // BusinessType = x.BusinessType, // FeeStatus = x.FeeStatus, // FeeType = x.FeeType, // FeeName = x.FeeName, // FeeEnName = x.FeeEnName, // CustomerName = x.CustomerName, // CustomerFullName = z.Description, //结算对象全称 // CustomerType = x.CustomerType, // CustomerTypeText = x.CustomerTypeText, // Unit = x.Unit, // UnitText = x.UnitText, // UnitPrice = x.UnitPrice, // TaxUnitPrice = x.TaxUnitPrice, // Quantity = x.Quantity, // TaxRate = x.TaxRate, // NoTaxAmount = x.NoTaxAmount, // Amount = x.Amount, // Currency = x.Currency, // CurrencyText = x.CurrencyText, // ExchangeRate = x.ExchangeRate, // AccTaxRate = x.AccTaxRate,//销项汇率 // Remark = x.Remark, // IsAdvancedPay = x.IsAdvancedPay,//是否垫付 // IsInvoice = x.IsInvoice, //是否开发票 // //FRT // CommissionRate = x.CommissionRate, //佣金比率 // CreateBy = x.CreateBy, // CreateTime = x.CreateTime, // AuditOperator = x.AuditOperator, // AuditDate = x.AuditDate, // SettlementAmount = x.SettlementAmount,//结算金额 // InvoiceAmount = x.InvoiceAmount,//开票金额 // OrderAmount = x.OrderAmount,//申请金额 // InvoiceNum = x.InvoiceNum,//发票号 // Tax = x.Tax,//税额 // DebitNo = x.DebitNo,//对账编号 // SubmitBy = x.SubmitBy, // SubmitDate = x.SubmitDate, // SaleOrg = x.SaleOrg, // Reason = x.Reason, // IsOpen = x.IsOpen,//是否机密 // }); // var queryList = tenantDb.UnionAll(new List> { query1 }); // var result = queryList.Where(whereList).ToQueryPage(request.PageCondition); // if (result.Data.Count > 0) // { // //关联用户名称 // var userIds = result.Data.Where(x => x.SubmitBy.HasValue).Select(x => x.SubmitBy.Value) // .Union(result.Data.Select(x => x.CreateBy)) // .Distinct(); // var users = db.Queryable().Where(x => userIds.Contains(x.Id)).Select(x => new { x.Id, x.UserName }).ToList(); // foreach (var item in result.Data) // { // item.CreateByName = users.Find(x => x.Id == item.CreateBy)?.UserName; // if (item.SubmitBy.HasValue) // { // item.SubmitByName = users.Find(x => x.Id == item.SubmitBy.Value)?.UserName; // } // } // } // return result; //} } }