using AutoMapper; using Microsoft.Extensions.Logging; using Serilog; using Newtonsoft.Json; using OASystem.Domain; using OASystem.Domain.Dtos; using OASystem.Domain.Dtos.Financial; using OASystem.Domain.Dtos.PersonnelModule; using OASystem.Domain.Entities.Financial; using OASystem.Domain.Entities.PersonnelModule; using OASystem.Domain.ViewModels.Financial; using OASystem.Infrastructure.Repositories.PersonnelModule; using OASystem.Infrastructure.Repositories.System; namespace OASystem.Infrastructure.Repositories.Financial { /// /// 财务 - 日付申请 /// public class DailyFeePaymentRepository : BaseRepository { private readonly IMapper _mapper; private readonly SetDataTypeRepository _setDataTypeRep; private readonly UsersRepository _UsersRep; private readonly CompanyRepository _CompanyRep; private readonly GoodsRepository _goodsRep; private readonly ILogger _logger; /// /// /// /// /// /// /// /// /// /// public DailyFeePaymentRepository(SqlSugarClient sqlSugar, IMapper mapper, SetDataTypeRepository setDataTypeRep, UsersRepository usersRep, CompanyRepository companyRep, GoodsRepository goodsRep, ILogger logger) : base(sqlSugar) { _mapper = mapper; _setDataTypeRep = setDataTypeRep; _UsersRep = usersRep; _CompanyRep = companyRep; _goodsRep = goodsRep; _logger = logger; } /// /// 日付申请查询 使用的数据源 /// /// /// public async Task GetPagePriceTypeData(PortDtoBase dto, int currUserId = 0) { Result result = new Result() { Code = -2 }; dynamic? DailyFeePaymentList = null; var setTypeData = _setDataTypeRep.QueryDto().ToList(); var setData = _setDataTypeRep.QueryDto().ToList(); //48人员费用 49办公费用 50 销售费用 51 其他费用 55 大运会 var typeIds = new List() { 48, //人员费用 49, //办公费用 50, //销售费用 51, //其他费用 55, //大运会 90, //各部门基础固定费用明细 104, //团组费用 116, //物资采购 }; var priceTypeData = setTypeData.Where(s => typeIds.Contains(s.Id)).ToList(); var priceSubTypeData = setData.Where(s => typeIds.Contains(s.STid)).ToList(); //var isEnable = false; //员工姓名列表 var userData = _sqlSugar.Queryable() .LeftJoin((u, d) => u.DepId == d.Id) .LeftJoin((u, d, jp) => u.JobPostId == jp.Id) .Where((u, d, jp) => u.IsDel == 0) .Select((u, d, jp) => new { u.Id, u.CnName, u.DepId, d.DepName, u.JobPostId, jp.JobName }) .ToList(); //1 经理职位 查看该部门下所有人员 if (currUserId > 0) { //42 var auditUserIds = _sqlSugar.Queryable().Where(x => x.IsDel == 0 && x.SmId == 42 && x.FId == 12).Select(x => x.UId).ToList(); if (!auditUserIds.Contains(currUserId)) { var screenWheres = new List() { "经理", "主管" }; var userInfo = userData.Find(x => x.Id == currUserId && screenWheres.Contains(x.JobName)); if (userInfo != null) { userData = userData.Where(x => x.DepName.Equals(userInfo.DepName)).ToList(); } else { userData = userData.Where(x => x.Id == currUserId).ToList(); } } else { userData.Insert(0, new { Id = -1, CnName = "全部", DepId = 0, DepName = "", JobPostId = 0, JobName = "" }); } } var userData1 = userData.Select(x => new { x.Id, x.CnName }).ToList(); //62 公转 63 私转 var feeMarkTypeData = setTypeData.Where(s => s.Id == 62 || s.Id == 63).ToList(); var feeMarkSubTypeData = setData.Where(s => s.STid == 62 || s.STid == 63).ToList(); var companyNameData = await _CompanyRep.GetCompanyNameData(); //审核状态 var auditStatusData = new List() { new { Id = -1, Name = "全部" }, new { Id = 0, Name = "未审核" }, new { Id = 1, Name = "已审核" }, new { Id = 2, Name = "审核未通过" }, new { Id = 3, Name = "自动审核" } }; if (dto.PortType == 1) //web { DailyFeePaymentList = new { FeeTypeData = priceTypeData, FeeSubTypeData = priceSubTypeData, UserNameData = userData1, FeeMarkTypeData = feeMarkTypeData, FeeMarkSubTypeData = feeMarkSubTypeData, CompanyNameData = companyNameData.Data, AuditStatusData = auditStatusData }; } else if (dto.PortType == 2) //安卓 { DailyFeePaymentList = new { UserNameData = userData1, FeeTypeData = priceTypeData, FeeTypeSubData = priceSubTypeData }; } result.Code = 0; result.Msg = "查询成功!"; result.Data = DailyFeePaymentList; return result; } /// /// 总经理自动审核通过类型 /// 90 Parent 各部门基础固定费用明细 /// 104 Parent 团组费用 /// 672 Sub 办公费用-信息部申请费用 /// 1433 Sub 团组/会务储备物资采购 /// /// /// public async Task GMAutoApprovalType(int typeId) { if (typeId < 1) return false; var parentIds = new List() { 90, // 各部门基础固定费用明细 104, // 团组费用 }; var subIds = new List() { 672, //办公费用-信息部申请费用 1433, //团组/会务储备物资采购 }; var parentTypeDatas = await _sqlSugar.Queryable().Where(x => x.IsDel == 0 && parentIds.Contains(x.STid)).ToListAsync(); var subTypeDatas = await _sqlSugar.Queryable().Where(x => x.IsDel == 0 && subIds.Contains(x.Id)).ToListAsync(); var typeDatas = new List(); if (parentTypeDatas.Any()) typeDatas.AddRange(parentTypeDatas); if (subTypeDatas.Any()) typeDatas.AddRange(subTypeDatas); if (typeDatas.Any(x => x.Id == typeId)) return true; return false; } /// /// 日付申请查询 使用的数据源 /// /// /// public async Task GetPriceTypeAddData(PortDtoBase dto) { Result result = new() { Code = -2 }; dynamic? DailyFeePaymentList = null; var setTypeData = _setDataTypeRep.QueryDto().ToList(); var setData = _setDataTypeRep.QueryDto().ToList(); //48人员费用 49办公费用 50 销售费用 51 其他费用 55 大运会 var priceTypeData = setTypeData.Where(s => s.Id == 48 || s.Id == 49 || s.Id == 50 || s.Id == 51 || s.Id == 55).ToList(); var priceSubTypeData = setData.Where(s => s.STid == 48 || s.STid == 49 || s.STid == 50 || s.STid == 51 || s.STid == 55).ToList(); //员工姓名列表 var userNameData = await _UsersRep.GetUserNameList(dto.PortType); //62 公转 63 私转 var feeMarkTypeData = setTypeData.Where(s => s.Id == 62 || s.Id == 63).ToList(); var feeMarkSubTypeData = setData.Where(s => s.STid == 62 || s.STid == 63).ToList(); var companyNameData = await _CompanyRep.GetCompanyNameData(); if (dto.PortType == 1) //web { DailyFeePaymentList = new Fin_DailyFeePaymentPagePriceTypeDataView { FeeTypeData = priceTypeData, FeeSubTypeData = priceSubTypeData, UserNameData = userNameData.Data, FeeMarkTypeData = feeMarkTypeData, FeeMarkSubTypeData = feeMarkSubTypeData, CompanyNameData = companyNameData.Data }; } else if (dto.PortType == 2) //安卓 { DailyFeePaymentList = new { CompanyNameData = companyNameData.Data, FeeTypeData = feeMarkTypeData, FeeTypeSubData = feeMarkSubTypeData }; } result.Code = 0; result.Msg = "查询成功!"; result.Data = DailyFeePaymentList; return result; } /// /// 日付申请 page 查询 /// /// /// public async Task GetPageSearchAll(PageDailyFeePaymentDto dto) { Result result = new Result() { Code = -2 }; ListViewBase dailyFeePaymentPageList = new ListViewBase() { ReceiveDt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }; #region sql条件处理 string sqlWhere = ""; if (dto.CompanyId != -1) //公司 sqlWhere += string.Format(" And dfp.CompanyId = {0}", dto.CompanyId); if (dto.FinancialAuditStatus != -1) //财务审核 sqlWhere += string.Format(" And dfp.FAudit = {0}", dto.FinancialAuditStatus); if (dto.ManagerAuditStatus != -1) //总经理审核 sqlWhere += string.Format(" And dfp.MAudit = {0}", dto.ManagerAuditStatus); if (dto.IsPaySign != -1) //付款状态 { sqlWhere += string.Format(" And dfp.IsPay = {0}", dto.IsPaySign); } if (dto.FeeTypeId != -1) //费用类型 { if (dto.FeeSubTypeId != -1) //子类处理 { sqlWhere += string.Format(" And dfp.PriceTypeId = {0}", dto.FeeSubTypeId); } else { var setData = _setDataTypeRep.QueryDto(s => s.STid == dto.FeeTypeId).ToList(); if (setData.Count > 0) { string setDataIds = string.Join(",", setData.Select(x => x.Id).ToList()); sqlWhere += string.Format(" And dfp.PriceTypeId In ({0})", setDataIds); } } } if (!string.IsNullOrEmpty(dto.FeeDesc)) sqlWhere += string.Format(" And dfp.Instructions Like '%{0}%'", dto.FeeDesc); if (dto.CreateUserId != -1) sqlWhere += string.Format(" And dfp.CreateUserId = {0}", dto.CreateUserId); int startIndex = (dto.PageIndex - 1) * dto.PageSize + 1; int endIndex = startIndex + dto.PageSize - 1; string sqlPage = string.Format(@"Select * From ( Select row_number() over (order by dfp.Id Desc) as RowNumber, dfp.Id,dfp.CompanyId,c.CompanyName,dfp.Instructions,dfp.SumPrice, dfp.CreateUserId,u.CnName CreateUser,dfp.CreateTime,dfp.FAudit,dfp.MAudit, dfp.PriceTypeId,dfp.IsPay From Fin_DailyFeePayment dfp Inner Join Sys_Company c On dfp.CompanyId = c.Id Left Join Sys_Users u On dfp.CreateUserId = u.Id Where dfp.IsDel=0 {0} ) temp Where RowNumber Between {1} and {2}", sqlWhere, startIndex, endIndex); string sqlCount = string.Format(@"Select COUNT(1) as Count From ( Select dfp.Id,dfp.CompanyId,c.CompanyName,dfp.Instructions,dfp.SumPrice, dfp.CreateUserId,u.CnName CreateUser,dfp.CreateTime,dfp.FAudit,dfp.MAudit, dfp.PriceTypeId From Fin_DailyFeePayment dfp Inner Join Sys_Company c On dfp.CompanyId = c.Id Left Join Sys_Users u On dfp.CreateUserId = u.Id Where dfp.IsDel=0 {0} ) temp ", sqlWhere); #endregion if (dto.PortType == 1 || dto.PortType == 2 || dto.PortType == 3) //web { //Fin_DailyFeePaymentPageCount var dailyFeePaymentCount = await _sqlSugar.SqlQueryable(sqlCount).FirstAsync(); var DailyFeePaymentData = await _sqlSugar.SqlQueryable(sqlPage).ToListAsync(); int totalCount = dailyFeePaymentCount.Count; dailyFeePaymentPageList = new ListViewBase { CurrPageIndex = dto.PageIndex, CurrPageSize = dto.PageSize, DataCount = totalCount, DataList = DailyFeePaymentData }; } result.Code = 0; result.Msg = "查询成功!"; result.Data = dailyFeePaymentPageList; return result; } /// /// 日付申请 single 查询 By Id /// /// /// public async Task GetSearchById(SearchDailyFeePaymentDto dto) { Result result = new Result() { Code = -2 }; if (dto.PortType == 1) //web { Fin_DailyFeePaymentInfolView feeData = new Fin_DailyFeePaymentInfolView(); string feeSql = string.Format(@"Select * From Fin_DailyFeePayment Where IsDel=0 And Id = {0} ", dto.Id); feeData = await _sqlSugar.SqlQueryable(feeSql).FirstAsync(); string feeContentSql = string.Format(@"Select * From Fin_DailyFeePaymentContent Where IsDel=0 And DFPId = {0} ", dto.Id); feeData.FeeContents = await _sqlSugar.SqlQueryable(feeContentSql).ToListAsync(); result.Code = 0; result.Msg = "查询成功!"; result.Data = feeData; } else if (dto.PortType == 2 || dto.PortType == 3) //android And ios { Fin_DailyFeePaymentInfoAndroidlView feeData = new Fin_DailyFeePaymentInfoAndroidlView(); string feeSql = string.Format(@"Select * From Fin_DailyFeePayment Where IsDel=0 And Id = {0} ", dto.Id); feeData = await _sqlSugar.SqlQueryable(feeSql).FirstAsync(); //feeData.TransferTypeId = feeData.TransferTypeId == 0 ? 62 : feeData.TransferTypeId == 1 ? 63 : 0; string feeContentSql = string.Format(@"Select * From Fin_DailyFeePaymentContent Where IsDel=0 And DFPId = {0} ", dto.Id); feeData.FeeContents = await _sqlSugar.SqlQueryable(feeContentSql).ToListAsync(); result.Code = 0; result.Msg = "查询成功!"; result.Data = feeData; } return result; } /// /// 日付申请 添加 /// /// /// public async Task Add(AddDailyFeePaymentDto dto) { Result result = new Result() { Code = -2 }; _sqlSugar.BeginTran(); var _fee = _mapper.Map(dto); _fee.CreateUserId = dto.UserId; _fee.GroupId = dto.GroupId; //自动审核验证 var auditPer = await GMAutoApprovalType(dto.PriceTypeId); var priceTypeInfo = await _sqlSugar.Queryable().FirstAsync(x => x.IsDel == 0 && x.Id == dto.PriceTypeId); if (auditPer) { _fee.MAudit = 3; _fee.MAuditDate = DateTime.Now; } int? feeId = await _sqlSugar.Insertable(_fee).ExecuteReturnIdentityAsync(); if (dto.FeeContents.Any()) { var _feeContents = _mapper.Map>(dto.FeeContents); foreach (var item in _feeContents) { item.DFPId = feeId == null ? -1 : Convert.ToInt32(feeId); item.CreateUserId = dto.UserId; } await _sqlSugar.Insertable(_feeContents).ExecuteCommandAsync(); } _sqlSugar.CommitTran(); result.Code = 0; var data = new { dailyId = feeId, sign = 1 }; result.Data = data; return result; } /// /// 日付申请 编辑 /// /// /// public async Task Edit(EditDailyFeePaymentDto dto) { Result result = new Result() { Code = -2 }; //自动审核验证 var auditPer = await GMAutoApprovalType(dto.PriceTypeId); #region 已审核的数据不可编辑 var dailyFeeInfo = await _sqlSugar.Queryable().Where(it => it.Id == dto.Id && it.IsDel == 0).FirstAsync(); if (dailyFeeInfo != null) { var auditIds = new List() { 1, 3 }; if (auditIds.Contains(dailyFeeInfo.FAudit) || auditIds.Contains(dailyFeeInfo.MAudit)) { if (auditPer) { if (dailyFeeInfo.IsPay == 1) { result.Msg = "该笔费用已付款,不可修改!"; return result; } } else { result.Msg = "审核已通过,不可修改!"; return result; } } } #endregion _sqlSugar.BeginTran(); try { Fin_DailyFeePayment _fee = _mapper.Map(dto); _fee.CreateUserId = dto.UserId; int? editFeeStatus = await _sqlSugar.Updateable() .SetColumns(a => new Fin_DailyFeePayment { Instructions = dto.Instructions, SumPrice = dto.SumPrice, TransferTypeId = dto.TransferTypeId, PriceTypeId = dto.PriceTypeId, CompanyId = dto.CompanyId, GroupId = dto.GroupId, }) .SetColumnsIF(auditPer, a => a.MAudit == 3) .SetColumnsIF(auditPer, a => a.MAuditDate == DateTime.Now) .Where(a => a.Id == dto.Id) .ExecuteCommandAsync(); var _feeContents = _mapper.Map>(dto.FeeContents); await _sqlSugar.Updateable() .Where(a => a.DFPId == _fee.Id) .SetColumns(a => new Fin_DailyFeePaymentContent { IsDel = 1, DeleteUserId = _fee.CreateUserId, DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), }) .ExecuteCommandAsync(); if (_feeContents.Any()) { foreach (var item in _feeContents) { item.DFPId = _fee.Id; item.CreateUserId = dto.UserId; } await _sqlSugar.Insertable(_feeContents).ExecuteCommandAsync(); } _sqlSugar.CommitTran(); result.Code = 0; var data = new { dailyId = dto.Id, sign = 2 }; result.Data = data; } catch (Exception ex) { _sqlSugar.RollbackTran(); result.Msg = ex.Message; } return result; } /// /// 日付申请 删除 /// /// /// public async Task Del(DelDailyFeePaymentDto dto) { Result result = new Result() { Code = -2 }; int? delFeeStatus = await _sqlSugar.Updateable() .Where(a => a.Id == dto.Id) .SetColumns(a => new Fin_DailyFeePayment { IsDel = 1, DeleteUserId = dto.UserId, DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), }).ExecuteCommandAsync(); result.Code = 0; return result; } /// /// 日付申请 审核 /// /// /// public async Task DailyPaymentAudit(DP_AuditStatusDto dto) { Result result = new Result() { Code = -2 }; if (dto.AuditType == 1) //财务审核 { int auditStatus = await _sqlSugar.Updateable() .Where(a => a.Id == dto.Id) .SetColumns(a => new Fin_DailyFeePayment { FAudit = dto.AuditStatus, FAuditDate = DateTime.Now, }).ExecuteCommandAsync(); if (auditStatus > 0) result.Code = 0; else result.Msg = "财务审核操作失败"; } else if (dto.AuditType == 2) //总经理 { int auditStatus = await _sqlSugar.Updateable() .Where(a => a.Id == dto.Id) .SetColumns(a => new Fin_DailyFeePayment { MAudit = dto.AuditStatus, MAuditDate = DateTime.Now, }).ExecuteCommandAsync(); if (auditStatus > 0) result.Code = 0; else result.Msg = "总经理审核操作失败"; } #region 审核完全通过 指定类型 向物资添加信息 //费用类型 var feeTypeIds = new List() { 1433, //团组/会务储备物资采购 1435, //公司固定物资采购 }; //审核状态集合 var auditStatuses = new List() { 1, //审核通过 3, //自动审核 }; var dailyInfo = await _sqlSugar.Queryable() .FirstAsync(x => x.Id == dto.Id && x.IsDel == 0 && auditStatuses.Contains(x.MAudit) && auditStatuses.Contains(x.FAudit) && feeTypeIds.Contains(x.PriceTypeId)); if (dailyInfo != null) { //执行物资添加、入库、关联信息操作 var linkOpRes = await ApplicationLinkGoodsAddAsync(dailyInfo.Id); // Updated the logging statement to ensure consistent message templates _logger.LogInformation("【日付申请单关联物品】请求参数:{DailyInfoId}\r\n返回参数:{LinkOpResData}\r\n返回消息:{LinkOpResMsg}", dailyInfo.Id, JsonConvert.SerializeObject(linkOpRes.Data), linkOpRes.Msg); } #endregion return result; } /// /// 购买申请单关联物品 /// /// 日付申请Id /// public async Task ApplicationLinkGoodsAddAsync(int applicatId) { if (applicatId < 1) return new JsonView() { Code = StatusCodes.Status400BadRequest, Msg = $"日付申请单ID不正确!" }; //if (currUserId < 1) return new JsonView() { Code = StatusCodes.Status400BadRequest, Msg = $"当前登陆人ID不正确!" }; var dailyInfoRes = await GetSearchById(new Domain.Dtos.Financial.SearchDailyFeePaymentDto() { PortType = 1, Id = applicatId }); if (dailyInfoRes.Code != 0) return new JsonView() { Code = StatusCodes.Status400BadRequest, Msg = dailyInfoRes?.Msg ?? "日付申请单信息不存在!" }; string dynamicJson = JsonConvert.SerializeObject(dailyInfoRes.Data); Fin_DailyFeePaymentInfolView dailyInfo = JsonConvert.DeserializeObject(dynamicJson); if (dailyInfo == null || !dailyInfo.FeeContents.Any()) { return new JsonView() { Code = StatusCodes.Status400BadRequest, Msg = $"付申请单信息不存在!!" }; } //审核验证 总经理 && 财务 审核通过 才可进行 物品添加、入库、关联信息 操作 if (dailyInfo.MAudit == 0 || dailyInfo.MAudit == 2 || dailyInfo.FAudit == 0 || dailyInfo.FAudit == 2) { return new JsonView() { Code = StatusCodes.Status400BadRequest, Msg = $"审核未通过,不可进行物资关联信息!" }; } _sqlSugar.BeginTran(); //1.验证物品信息 var currGoodsTypeId = dailyInfo.PriceTypeId switch { 1433 => 1424, //团组物资 1435 => 1426, //固定资产 _ => 0 }; var paras = new List(); foreach (var item in dailyInfo.FeeContents) { var goodsInfo = await _sqlSugar.Queryable().FirstAsync(x => x.Name.Equals(item.PriceName) && x.IsDel == 0) ?? new Pm_GoodsInfo() { Id = 0, Name = item.PriceName, Type = currGoodsTypeId, Unit = "-", CreateUserId = dailyInfo.CreateUserId, Remark = $"日付申请模块新增物品信息(需自行更改单位):\n{item.Remark}", }; //物品不存在执行添加 if (goodsInfo.Id == 0) { goodsInfo.Id = await _sqlSugar.Insertable(goodsInfo).ExecuteReturnIdentityAsync(); if (goodsInfo.Id < 1) { _sqlSugar.RollbackTran(); return new JsonView() { Code = StatusCodes.Status400BadRequest, Msg = $"物品添加失败!" }; } } //执行入库信息添加 var storageRes = await _goodsRep.GoodsStorageOp(new GoodsStorageOpDto() { GoodsId = goodsInfo.Id, Quantity = item.Quantity, UnitPrice = item.Price, TotalPrice = item.ItemTotal, SupplierName = "-", SupplierTel = "-", SupplierAddress = "-", SupplierSource = "-", StorageUserId = 374, //固定前台ID为入库人 StorageTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Remark = $"日付申请模块新增物品入库信息:{item.Remark}", }, 374); if (storageRes.Code != StatusCodes.Status200OK) { _sqlSugar.RollbackTran(); return new JsonView() { Code = StatusCodes.Status400BadRequest, Msg = $"物品入库信息添加失败!" }; } var storageId = Convert.ToInt32(storageRes.Data.GetType().GetProperty("sign").GetValue(storageRes.Data, null) ?? 0); //执行关联表添加 var addStatus = await _sqlSugar.Insertable(new Fin_ApplicationLinkGoods( id: 0, dailyId: dailyInfo.Id, goodsId: goodsInfo.Id, goodsStorageId: storageId, remark: "", userId: dailyInfo.CreateUserId )).ExecuteCommandAsync(); if (addStatus < 1) { _sqlSugar.RollbackTran(); return new JsonView() { Code = StatusCodes.Status400BadRequest, Msg = $"日付、物品入库信息关联信息添加失败!" }; } paras.Add(new { dailyId = dailyInfo.Id, goodsId = goodsInfo.Id, GoodsStorageId = storageId, LinkTableId = addStatus }); } _sqlSugar.CommitTran(); return new JsonView() { Code = StatusCodes.Status200OK, Data = paras, Msg = $"操作成功!" }; } } }