using EyeSoft.Logging; using NPOI.SS.Formula.Functions; using OASystem.Domain; using OASystem.Domain.Entities.Groups; using OASystem.Domain.Entities.Resource; using OASystem.Domain.ViewModels.Groups; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OASystem.Infrastructure.Repositories.Groups { /// /// 费用审核仓储 /// public class FeeAuditRepository:BaseRepository { public FeeAuditRepository(SqlSugarClient sqlSugar) : base(sqlSugar) { } /// /// 费用自动审核 /// /// /// 1.酒店 76 /// 2.op 79 /// 3.其他费用-出行物资 98 /// 4.保险 82 /// /// 团组Id /// 数据Id(模块类型主表Id) /// public async Task FeeAutomaticAudit(int feeType, int diId, int dataId) { var _view = new JsonView() { Code = 201, Msg = "自动审核操作失败" }; if (diId < 1) { _view.Msg = MsgTips.DiId; return _view; } if (dataId < 1) { _view.Msg = MsgTips.Id; return _view; } var stids = new List() { 17, 66, 91 }; var setData = _sqlSugar.Queryable().Where(x => x.IsDel == 0 && stids.Contains(x.STid)).ToList(); string _teamCurrency = string.Empty; decimal _teamRate = 0.00M; var costContents = new List(); if (feeType != 4) { var groupInfo = _sqlSugar.Queryable().Where(x => x.IsDel == 0 && x.DiId == diId).First(); if (groupInfo == null) { _view.Msg = $"团组成本信息未填写!"; return _view; } _teamCurrency = groupInfo.Currency; _teamRate = groupInfo.Rate; //币种验证 统一为currencycode三字码 if (int.TryParse(_teamCurrency, out int currency)) _teamCurrency = setData.Find(x => x.Id == currency)?.Name ?? ""; string costContentSql = $"Select * From Grp_GroupCost"; costContents = _sqlSugar.SqlQueryable(costContentSql).Where(x => x.IsDel == 0 && x.Diid == diId).ToList(); if (costContents.Count < 1) { _view.Msg = $"团组成本信息未填写!"; return _view; } //处理 成本详细信息 日期为空 for (int i = 0; i < costContents.Count; i++) { if (string.IsNullOrEmpty(costContents[i].Date)) { int index = i - 1; if (index >= 0) { costContents[i].Date = costContents[index].Date; var dtBool = DateTime.TryParse(costContents[i].Date, out DateTime _dateTime); if (dtBool) { costContents[i].CurrTime = _dateTime; } } } else { var dtBool = DateTime.TryParse(costContents[i].Date, out DateTime _dateTime); if (dtBool) { costContents[i].CurrTime = _dateTime; } } } } if (feeType == 1) { //1089 对冲账或其他 不在审核范围 var hotelCostInfo = _sqlSugar.Queryable().Where(x => x.IsDel == 0 && x.DiId == diId && x.Id == dataId && x.CheckType != 1089).First(); var hotelCostDetails = _sqlSugar.Queryable().Where(x => x.IsDel == 0 && x.DiId == diId && x.HrId == dataId).ToList(); if (hotelCostInfo == null) { _view.Msg = $"酒店费用数据未填写"; QuashAudit(76, diId, dataId); return _view; } //酒店费用金额 == 0 不自动审核 if (hotelCostInfo.CardPrice == 0.0000M) { _view.Msg = $"酒店费用金额 == 0 不自动审核"; QuashAudit(76, diId, dataId); return _view; } //获取C表汇率 decimal _rate = 1.0000M; var roomFeeInfo = hotelCostDetails.Where(x => x.PriceType == 1).First(); if (roomFeeInfo == null) { _view.Msg = $"酒店房间费用付款数据未填写"; return _view; } _rate = roomFeeInfo.Rate == 0.0000M ? 1.0000M : roomFeeInfo.Rate; bool isAutoAudit = true; //是否自动审核 DateTime checkIn = Convert.ToDateTime(hotelCostInfo.CheckInDate), checkOut = Convert.ToDateTime(hotelCostInfo.CheckOutDate); if (checkOut > checkIn) checkOut = checkOut.AddDays(-1); //房费计算,结束日期为前一天 var hotelCostInfos = costContents.Where(x => x.CurrTime >= checkIn && x.CurrTime <= checkOut).ToList(); if (hotelCostInfos.Count < 1) isAutoAudit = false; decimal otherFee = hotelCostDetails.Where(x => x.PriceType != 1).Sum(x => x.Price * (x.Rate == 0.0000M ? 1.0000M : x.Rate)); if (otherFee > 0) { otherFee /= (checkOut - checkIn).Days; } var hotelCostInfosGroup = hotelCostInfos.GroupBy(x => x.Date); foreach (var item in hotelCostInfosGroup) { var hotelSingleRoomFee = item.Sum(x => x.HotelSingleRoomFee) * _teamRate; //成本单间费用 var hotelDoubleRoomFee = item.Sum(x => x.HotelDoubleRoomFee) * _teamRate; //成本双人间费用 var hotelSuiteFee = item.Sum(x => x.HotelSuiteFee) * _teamRate; //成本套房费用 var hotelSuiteRoomFee = item.Sum(x => x.HotelSuiteRoomFee) * _teamRate; //成本其他房型间费用 //1.判断费用是否 <= 成本费用 //1.1 判断单间费用 decimal singleRoomPrice = (hotelCostInfo.SingleRoomPrice + otherFee) * _rate; //酒店录入费用 if (singleRoomPrice > 0) if (singleRoomPrice > hotelSingleRoomFee) isAutoAudit = false; //1.2 判断双人间费用 decimal doubleRoomPrice = (hotelCostInfo.DoubleRoomPrice + otherFee) * _rate;//酒店录入费用 if (doubleRoomPrice > 0) if (doubleRoomPrice > hotelDoubleRoomFee) isAutoAudit = false; //1.3 判断套房费用 decimal suiteRoomPrice = (hotelCostInfo.SuiteRoomPrice + otherFee) * _rate;//酒店录入费用 if (suiteRoomPrice > 0) if (suiteRoomPrice > hotelSuiteFee) isAutoAudit = false; //1.4 判断其他房型费用 decimal otherRoomPrice = (hotelCostInfo.OtherRoomPrice + otherFee) * _rate;//酒店录入费用 if (otherRoomPrice > 0) if (otherRoomPrice > hotelSuiteRoomFee) isAutoAudit = false; } //2.判断是否自动审核 if (isAutoAudit) { var ccpUpdate = _sqlSugar.Updateable() .SetColumns(it => it.IsAuditGM == 3) .SetColumns(it => it.AuditGMOperate == 4) .SetColumns(it => it.AuditGMDate == DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")) .Where(s => s.DIId == diId && s.CTable == 76 && s.CId == dataId) .ExecuteCommand(); if (ccpUpdate > 0) { _view.Code = 200; _view.Msg = "自动审核执行成功"; return _view; } } else { //撤销该条数据的自动审核 --> 该条数据的审核状态是自动审核 3 --> 0 var quashStatus = QuashAudit(76, diId, dataId); if (quashStatus) { _view.Code = 200; _view.Msg = "费用超团组成本,自动审核撤销成功!"; return _view; } } } else if (feeType == 2) { //1.基础数据参数验证 var priceType = new List() { 1062 //1062 尾款 }; var opinfos = _sqlSugar.Queryable() .Where(x => x.IsDel == 0 && x.DiId == diId && x.Id == dataId && !priceType.Contains(x.PriceType)) .First(); //var opinfos = _sqlSugar.Queryable() // .Where(x => x.IsDel == 0 && x.DiId == diId && x.Id == dataId ) // .First(); if (opinfos == null) { _view.Msg = $"OP费用费用类型属于“尾款”或者 内容未填写"; return _view; } //1.含超时费用/超支费用 手动审核 if (opinfos.SelectCheck.Contains("超时") || opinfos.SelectCheck.Contains("超支") || opinfos.SelectCheck.Contains("尾款")) { _view.Msg = @$"OP费用含尾款/超支/超时费用,请手动审核"; return _view; } //1.参数验证 var opCheckPriceTyeps = opinfos.SelectCheck.Split(','); var opCheckPriceTyepIds = setData.Where(x => opinfos.SelectCheck.Split(',').Contains(x.Name)).Select(x => x.Id).ToList(); var opContents = _sqlSugar.Queryable() .Where(x => x.IsDel == 0 && x.DiId == diId && x.CTGGRId == dataId && opCheckPriceTyepIds.Contains(x.SId)) .OrderBy(x => x.DatePrice, OrderByType.Asc) .ToList(); if (opContents.Count < 1) { _view.Msg = $"OP费用费用内容未填写"; return _view; } //获取C表汇率 decimal _opRate = 1.0000M; var payInfo = _sqlSugar.Queryable().Where(x => x.IsDel == 0 && x.DIId == diId && x.CTable == 79 && x.CId == dataId).First(); if (payInfo == null) { _view.Msg = $"OP费用付款数据未填写"; return _view; } _opRate = payInfo.DayRate; string opCurrencyName = setData.Find(x => x.Id == opContents[0].Currency)?.Name ?? ""; //团组、OP币种 验证是否一致 if (opCurrencyName.Equals(_teamCurrency)) { _opRate = payInfo.DayRate; _teamRate = payInfo.DayRate; } var opBasicDatas = setData.Where(x => x.STid == 17).ToList(); //费用类型基础数据 bool isAutoAudit = true; if (!DateTime.TryParse(opinfos.ServiceStartTime, out DateTime startDt1) || !DateTime.TryParse(opinfos.ServiceEndTime, out DateTime endDt1)) { _view.Msg = $"OP费用服务起止日期格式不正确!"; return _view; } DateTime startDt = startDt1; DateTime endDt = endDt1; var opCostDatas = costContents.Where(it => Convert.ToDateTime(it.Date) >= startDt && Convert.ToDateTime(it.Date) <= endDt).ToList(); if (opCostDatas.Count < 1) { _view.Msg = $"该时间段内团组成本未填写!"; return _view; } var noAuditFeeTypeIds = new List { 982 ,//982 车超时费 -- 暂无 96 ,//96 接送机费 -- 暂无 97 ,//97 其他费用 -- 暂无 992 ,//992 住补费用 -- 暂无 1059,//1059 导游超时费用 -- 暂无 1070,//1070 尾款金额 -- 暂无 1071,//1071 其他额外费用 -- 暂无 1073,//1073 翻译超时费 -- 暂无 1074,//1074 早餐超支费用 -- 暂无 1075,//1075 午餐超支费用 -- 暂无 1076,//1076 晚餐超支费用 -- 暂无 }; //费用类型筛选 包含 feeTypeIds && 包含这些类型费用大于0 var noAuditFeeContents = opContents.Where(x => x.Price > 0 && noAuditFeeTypeIds.Contains(x.SId)).ToList(); if (noAuditFeeContents.Count > 0) { _view.Msg = @$"OP费用含尾款/超支/超时费用,请手动审核"; return _view; } //2.按天按项 检查费用是否超过预算 var opDayContent = opContents.GroupBy(x => x.DatePrice); foreach (var item in opDayContent) { var opCostInfo = opCostDatas.Where(x => Convert.ToDateTime(x.Date) == item.Key).ToList(); if (opCostInfo.Count < 1) continue; //车费 91 var opCarCost = item.FirstOrDefault(x => x.SId == 91); if (opCarCost != null) if (opCarCost.Price * _opRate > _teamRate * opCostInfo.Sum(x => x.CarFee)) isAutoAudit = false; //982 车超时费 -- 暂无 //92 导游费 var opGuideCost = item.FirstOrDefault(x => x.SId == 92); if (opGuideCost != null) if (opGuideCost.Price * _opRate > _teamRate * opCostInfo.Sum(x => x.GuideFee)) isAutoAudit = false; //94 导游景点费 var opGuideScenicCost = item.FirstOrDefault(x => x.SId == 94); if (opGuideScenicCost != null) if (opGuideScenicCost.Price * _opRate > _teamRate * opCostInfo.Sum(x => x.GuideScenicFee)) isAutoAudit = false; //95 导游小费 var opGuideTipCost = item.FirstOrDefault(x => x.SId == 95); if (opGuideTipCost != null) if (opGuideTipCost.Price * _opRate > _teamRate * opCostInfo.Sum(x => x.GuideTipFee)) isAutoAudit = false; //983 导游餐补 var opGuideMealCost = item.FirstOrDefault(x => x.SId == 983); if (opGuideMealCost != null) if (opGuideMealCost.Price * _opRate > _teamRate * opCostInfo.Sum(x => x.GuideMealFee)) isAutoAudit = false; //984 导游房补 var opGuideRoomCost = item.FirstOrDefault(x => x.SId == 984); if (opGuideRoomCost != null) if (opGuideRoomCost.Price * _opRate > _teamRate * opCostInfo.Sum(x => x.GuideRoomFee)) isAutoAudit = false; //985 导游交通 var opGuideTrafficCost = item.FirstOrDefault(x => x.SId == 985); if (opGuideTrafficCost != null) if (opGuideTrafficCost.Price * _opRate > _teamRate * opCostInfo.Sum(x => x.GuideTrafficFee)) isAutoAudit = false; //96 接送机费 -- 暂无 //97 其他费用 -- 暂无 //979 司机工资 var opDriverCost = item.FirstOrDefault(x => x.SId == 979); if (opDriverCost != null) if (opDriverCost.Price * _opRate > _teamRate * opCostInfo.Sum(x => x.DriverFee)) isAutoAudit = false; //980 司机小费 var opDriverTipCost = item.FirstOrDefault(x => x.SId == 980); if (opDriverTipCost != null) if (opDriverTipCost.Price * _opRate > _teamRate * opCostInfo.Sum(x => x.DriverTipFee)) isAutoAudit = false; //981 司机餐补 var opDriverMealCost = item.FirstOrDefault(x => x.SId == 981); if (opDriverMealCost != null) if (opDriverMealCost.Price * _opRate > _teamRate * opCostInfo.Sum(x => x.DriverMealFee)) isAutoAudit = false; //988 客户早餐费用 var opClientBreakfastCost = item.FirstOrDefault(x => x.SId == 988); if (opClientBreakfastCost != null) if (opClientBreakfastCost.Price * _opRate > _teamRate * opCostInfo.Sum(x => x.ClientBreakfastFee)) isAutoAudit = false; //93 客户午餐费用 var opClientLunchCost = item.FirstOrDefault(x => x.SId == 93); if (opClientLunchCost != null) if (opClientLunchCost.Price * _opRate > _teamRate * opCostInfo.Sum(x => x.ClientLunchFee)) isAutoAudit = false; //989 客户晚餐费用 var opClientDinnerCost = item.FirstOrDefault(x => x.SId == 989); if (opClientDinnerCost != null) if (opClientDinnerCost.Price * _opRate > _teamRate * opCostInfo.Sum(x => x.ClientDinnerFee)) isAutoAudit = false; //990 景点门票费 var opScenicTicketCost = item.FirstOrDefault(x => x.SId == 990); if (opScenicTicketCost != null) if (opScenicTicketCost.Price * _opRate > _teamRate * opCostInfo.Sum(x => x.ScenicTicketFee)) isAutoAudit = false; //991 饮料/零食/水果 var opDrinkSnackFruitCost = item.FirstOrDefault(x => x.SId == 991); if (opDrinkSnackFruitCost != null) if (opDrinkSnackFruitCost.Price * _opRate > _teamRate * opCostInfo.Sum(x => x.DrinkSnackFruitFee)) isAutoAudit = false; //992 住补费用 -- 暂无 //994 翻译费 var opTranslatorCost = item.FirstOrDefault(x => x.SId == 994); if (opTranslatorCost != null) if (opTranslatorCost.Price * _opRate > _teamRate * opCostInfo.Sum(x => x.TranslatorFee)) isAutoAudit = false; //1059 导游超时费用 -- 暂无 //1070 尾款金额 -- 暂无 //1071 其他额外费用 -- 暂无 //1073 翻译超时费 -- 暂无 //1074 早餐超支费用 -- 暂无 //1075 午餐超支费用 -- 暂无 //1076 晚餐超支费用 -- 暂无 } //更改审核状态 if (isAutoAudit) { var ccpUpdate = _sqlSugar.Updateable() .SetColumns(it => it.IsAuditGM == 3) .SetColumns(it => it.AuditGMOperate == 4) .SetColumns(it => it.AuditGMDate == DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")) .Where(s => s.DIId == diId && s.CTable == 79 && s.CId == dataId) .ExecuteCommand(); if (ccpUpdate > 0) { _view.Code = 200; _view.Msg = "自动审核执行成功!"; return _view; } } else { //撤销该条数据的自动审核 --> 该条数据的审核状态是自动审核 3 --> 0 if (QuashAudit(79, diId, dataId)) { _view.Code = 200; _view.Msg = "费用超团组成本,自动审核撤销成功!"; return _view; } } } else if (feeType == 3) { #region 出行物资的功能及相关费用自动审核 var isAutoAudit = false; var currModule = 98; //其他款项 int groupSize = 0; // 团组人数 var groupDetails = await _sqlSugar.Queryable().Where(x => x.IsDel == 0 && x.Id == diId).FirstAsync(); if (groupDetails != null) groupSize = groupDetails.VisitPNumber; decimal groupCostCNYTotal = costContents.Sum(x => x.TeFee) * _teamRate * groupSize; //团组成本出行物资总金额 if (groupCostCNYTotal <= 0.00M) { _view.Msg = $"团组成本出行物资费用数据未填写"; QuashAudit(currModule, diId, dataId); return _view; } var teNames = setData.Where(x => x.STid == 91).Select(x => x.Name).ToList(); var otherFeeDatas = _sqlSugar.Queryable() .InnerJoin((dp, ccp) => dp.Id == ccp.CId && ccp.CTable == 98 && ccp.IsDel == 0) .Where((dp, ccp) => dp.IsDel == 0 && dp.DiId == diId) .ToList(); var ids = new List(); foreach (var item in otherFeeDatas) { if (item.PriceName.Contains("、")) { var priceNames = item.PriceName.Split('、'); foreach (var priceName in priceNames) { if (teNames.Contains(priceName)) { ids.Add(item.Id); continue; } } } else if (teNames.Contains(item.PriceName)) { ids.Add(item.Id); } } ids = ids.Distinct().ToList(); decimal otherFeeCNYTotal = otherFeeDatas.Where(x => ids.Contains(x.Id)).Sum(x => x.FeeTotal); //其他费用出行物资总金额 if (otherFeeCNYTotal <= 0.00M) { _view.Msg = $"其他款项出行物资费用数据未填写"; QuashAudit(currModule, diId, dataId); return _view; } if (otherFeeCNYTotal > groupCostCNYTotal) { _view.Msg = $"其他款项出行物资费用超出团组成本物资费用"; QuashAudit(currModule, diId, dataId); return _view; } isAutoAudit = true; //2.判断是否自动审核 if (isAutoAudit) { var ccpUpdate = _sqlSugar.Updateable() .SetColumns(it => it.IsAuditGM == 3) .SetColumns(it => it.AuditGMOperate == 4) .SetColumns(it => it.AuditGMDate == DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")) .Where(s => s.DIId == diId && s.CTable == currModule && s.CId == dataId) .ExecuteCommand(); if (ccpUpdate > 0) { _view.Code = 200; _view.Msg = "自动审核执行成功"; return _view; } } else { //撤销该条数据的自动审核 --> 该条数据的审核状态是自动审核 3 --> 0 var quashStatus = QuashAudit(currModule, diId, dataId); if (quashStatus) { _view.Code = 200; _view.Msg = "费用超团组成本,自动审核撤销成功!"; return _view; } } #endregion } else if (feeType == 4) { #region 保险费用录入自动审核 var currModule = 82; var groupDetails = _sqlSugar.Queryable().Where(x => x.IsDel == 0 && x.Id == diId).First(); if (groupDetails == null) { _view.Msg = $"团组信息为空,不可自动审核!"; return _view; } var insuranceCountryCostData = _sqlSugar.Queryable().Where(x => x.IsDel == 0).ToList(); if (!insuranceCountryCostData.Any()) { _view.Msg = $"保险国家费用信息为空,不可自动审核!"; return _view; } var insuranceType = _sqlSugar.Queryable().Where(x => x.IsDel == 0 && x.Id != 2).Select(x => x.Id).ToList(); var insuranceCostData1 = _sqlSugar.Queryable() .LeftJoin((c, ccp) => c.Id == ccp.CId && ccp.CTable == 82) .Where((c, ccp) => c.IsDel == 0 && c.DiId == diId) .Select((c, ccp) => new { c.Id, c.Iid, ccpId = ccp.Id, CNYPrice = ccp.PayMoney * ccp.DayRate }) .ToList(); if (!insuranceCostData1.Any()) { _view.Msg = $"暂无保险数据,不可自动审核!"; return _view; } if (insuranceCostData1.Where(x => x.Iid == 2).ToList().Any()) { _view.Msg = $"保险数据为类型为“新数据请不要选此项”,不可自动审核!"; return _view; } #region 处理已审核通过的 “新数据请不要选此项” 数据 var insuranceCostData2 = insuranceCostData1.Where(x => x.Iid == 2).ToList(); if (insuranceCostData2.Any()) { //_view.Msg = $"保险数据为类型为“新数据请不要选此项”,不可自动审核!"; //return _view; var ccpIds = insuranceCostData2.Select(x => x.ccpId).ToList(); var auditCcpIds = _sqlSugar.Queryable().Where(x => x.IsDel == 0 && ccpIds.Contains(x.Id) && x.IsAuditGM == 3).Select(x => x.Id).ToList(); if (auditCcpIds.Any()) { var ccpUpd = _sqlSugar.Updateable() .SetColumns(it => it.IsAuditGM == 0) .SetColumns(it => it.AuditGMOperate == 0) .SetColumns(it => it.AuditGMDate == string.Empty) .Where(s => auditCcpIds.Contains(s.Id)) .ExecuteCommand(); } } #endregion //var insuranceCostData = insuranceCostData1.Where(x => insuranceType.Contains(x.Iid)).ToList(); var insuranceCostData = insuranceCostData1.ToList(); var currInsuranceInfo = insuranceCostData.Where(x => x.Id == dataId).FirstOrDefault(); if (!insuranceCostData.Any() && currInsuranceInfo == null) { _view.Msg = $"暂无保险数据,不可自动审核!"; return _view; } if (currInsuranceInfo.CNYPrice == 0.00M) { _view.Msg = $"保险数据未录入费用信息,不可自动审核!"; QuashAudit(currModule, diId, dataId); return _view; } var groupPeopleNum = groupDetails.VisitPNumber; var visitCountrys = groupDetails.VisitCountry.Split("|").ToList(); if (!visitCountrys.Any()) { _view.Msg = $"出访国家为空,不可自动审核!"; return _view; } var basicCountrys = insuranceCountryCostData.Select(x => x.CountryName).ToList(); var schengenCountry = visitCountrys.Intersect(basicCountrys); //申根国 var unSchengenCountry = visitCountrys.Except(basicCountrys); //非申根国 var schengenCost = insuranceCountryCostData.Where(x => schengenCountry.Contains(x.CountryName)).Sum(x => x.Cost); // 申根国费用 var unSchengenCost = unSchengenCountry.Count() * 35; // 非申根国费用 var groupBudgetCost = (schengenCost + unSchengenCost) * groupPeopleNum; var groupActialCost = insuranceCostData.Sum(x => x.CNYPrice); if (groupActialCost > groupBudgetCost) { _view.Msg = $"保险费用超出团组成本费用"; QuashAudit(currModule, diId, dataId); return _view; } //自动审核 var ccpUpdate = _sqlSugar.Updateable() .SetColumns(it => it.IsAuditGM == 3) .SetColumns(it => it.AuditGMOperate == 4) .SetColumns(it => it.AuditGMDate == DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")) .Where(s => s.DIId == diId && s.CTable == currModule && s.CId == dataId) .ExecuteCommand(); if (ccpUpdate > 0) { _view.Code = 200; _view.Msg = "自动审核执行成功"; } else _view.Msg = "自动审核执行失败"; return _view; #endregion } else _view.Msg = $"请传入有效的feeType参数"; return _view; } /// /// hotel、op 撤销自动审核的数据 /// /// /// 酒店 76 /// op 79 /// /// /// /// private bool QuashAudit(int type, int diId, int dataId) { //撤销该条数据的自动审核 --> 该条数据的审核状态是自动审核 3 --> 0 var ccpInfo = _sqlSugar.Queryable() .Where(s => s.DIId == diId && s.CTable == type && s.CId == dataId && s.IsAuditGM == 3) .First(); if (ccpInfo != null) { var ccpUpdate = _sqlSugar.Updateable() .SetColumns(it => it.IsAuditGM == 0) .SetColumns(it => it.AuditGMOperate == 0) .SetColumns(it => it.AuditGMDate == string.Empty) .Where(s => s.Id == ccpInfo.Id) .ExecuteCommand(); if (ccpUpdate > 0) { return true; } } return false; } // /// /// 费用自动审核 /// /// /// 1.酒店 76 /// 2.op 79 /// /// 团组Id /// 数据Id(模块类型主表Id) /// public string IsOverBudget(int feeType, int diId, int dataId) { string _view ="-"; if (diId < 1) { return _view; } if (dataId < 1) { return _view; } List stids = new List() { 17, 66 }; var setData = _sqlSugar.Queryable().Where(x => x.IsDel == 0 && stids.Contains(x.STid)).ToList(); string _teamCurrency = string.Empty; var groupInfo = _sqlSugar.Queryable().Where(x => x.IsDel == 0 && x.DiId == diId).First(); if (groupInfo == null) { return _view; } _teamCurrency = groupInfo.Currency; //币种验证 统一为currencycode三字码 if (int.TryParse(_teamCurrency, out int currency)) _teamCurrency = setData.Find(x => x.Id == currency)?.Name ?? ""; string costContentSql = $"Select * From Grp_GroupCost"; var costContents = _sqlSugar.SqlQueryable(costContentSql).Where(x => x.IsDel == 0 && x.Diid == diId).ToList(); if (costContents.Count < 1) { return _view; } //处理 成本详细信息 日期为空 for (int i = 0; i < costContents.Count; i++) { if (string.IsNullOrEmpty(costContents[i].Date)) { int index = i - 1; if (index >= 0) { costContents[i].Date = costContents[index].Date; } } } if (feeType == 1) { var hotelCostInfo = _sqlSugar.Queryable().Where(x => x.IsDel == 0 && x.DiId == diId && x.Id == dataId).First(); var hotelCostDetails = _sqlSugar.Queryable().Where(x => x.IsDel == 0 && x.DiId == diId && x.HrId == dataId).ToList(); if (hotelCostInfo == null) return _view; //获取C表汇率 decimal _rate = 1.0000M; var roomFeeInfo = hotelCostDetails.Where(x => x.PriceType == 1).First(); if (roomFeeInfo == null) return _view; _rate = roomFeeInfo.Rate == 0.0000M ? 1.0000M : roomFeeInfo.Rate; bool isAutoAudit = true; //是否自动审核 DateTime checkIn = Convert.ToDateTime(hotelCostInfo.CheckInDate), checkOut = Convert.ToDateTime(hotelCostInfo.CheckOutDate); if (checkOut > checkIn) checkOut = checkOut.AddDays(-1); //房费计算,结束日期为前一天 var hotelCostInfos = costContents.Where(x => Convert.ToDateTime(x.Date) >= checkIn && Convert.ToDateTime(x.Date) <= checkOut).ToList(); if (hotelCostInfos.Count < 1) isAutoAudit = false; decimal otherFee = hotelCostDetails.Where(x => x.PriceType != 1).Sum(x => x.Price * (x.Rate == 0.0000M ? 1.0000M : x.Rate)); if (otherFee > 0) { otherFee /= (checkOut - checkIn).Days; } var hotelCostInfosGroup = hotelCostInfos.GroupBy(x => x.Date); foreach (var item in hotelCostInfosGroup) { decimal hotelSingleRoomFee = item.Sum(x => x.HotelSingleRoomFee); decimal hotelDoubleRoomFee = item.Sum(x => x.HotelDoubleRoomFee); decimal hotelSuiteFee = item.Sum(x => x.HotelSuiteFee); decimal hotelSuiteRoomFee = item.Sum(x => x.HotelSuiteRoomFee); //1.判断费用是否 <= 成本费用 //1.1 判断单间费用 decimal singleRoomPrice = (hotelCostInfo.SingleRoomPrice + otherFee) * _rate; if (singleRoomPrice > 0) if (singleRoomPrice > hotelSingleRoomFee * _rate) isAutoAudit = false; //1.2 判断双人间费用 decimal doubleRoomPrice = (hotelCostInfo.DoubleRoomPrice + otherFee) * _rate; if (doubleRoomPrice > 0) if (doubleRoomPrice > hotelDoubleRoomFee * _rate) isAutoAudit = false; //1.3 判断套房费用 decimal suiteRoomPrice = (hotelCostInfo.SuiteRoomPrice + otherFee) * _rate; if (suiteRoomPrice > 0) if (suiteRoomPrice > hotelSuiteFee * _rate) isAutoAudit = false; //1.4 判断其他房型费用 decimal otherRoomPrice = (hotelCostInfo.OtherRoomPrice + otherFee) * _rate; if (otherRoomPrice > 0) if (otherRoomPrice > hotelSuiteRoomFee * _rate) isAutoAudit = false; } //2.判断是否自动审核 if (isAutoAudit) { return $"未超预算"; } } else if (feeType == 2) { //1.基础数据参数验证 var priceType = new List() { 1062 }; var opinfos = _sqlSugar.Queryable() .Where(x => x.IsDel == 0 && x.DiId == diId && x.Id == dataId && !priceType.Contains(x.PriceType)) .First(); //var opinfos = _sqlSugar.Queryable() // .Where(x => x.IsDel == 0 && x.DiId == diId && x.Id == dataId ) // .First(); if (opinfos == null) return _view; //1.含超时费用/超支费用 手动审核 if (opinfos.SelectCheck.Contains("超时") || opinfos.SelectCheck.Contains("超支") || opinfos.SelectCheck.Contains("尾款")) return _view; //1.参数验证 var opCheckPriceTyeps = opinfos.SelectCheck.Split(','); var opCheckPriceTyepIds = setData.Where(x => opinfos.SelectCheck.Split(',').Contains(x.Name)).Select(x => x.Id).ToList(); var opContents = _sqlSugar.Queryable() .Where(x => x.IsDel == 0 && x.DiId == diId && x.CTGGRId == dataId && opCheckPriceTyepIds.Contains(x.SId)) .OrderBy(x => x.DatePrice, OrderByType.Asc) .ToList(); if (opContents.Count < 1) return _view; //获取C表汇率 decimal _rate = 1.0000M; var payInfo = _sqlSugar.Queryable().Where(x => x.IsDel == 0 && x.DIId == diId && x.CTable == 79 && x.Id == dataId).First(); if (payInfo == null) return _view; _rate = payInfo.DayRate; string opCurrencyName = setData.Find(x => x.Id == opContents[0].Currency)?.Name ?? ""; var opBasicDatas = setData.Where(x => x.STid == 17).ToList(); //费用类型基础数据 bool isAutoAudit = true; if (!DateTime.TryParse(opinfos.ServiceStartTime, out DateTime startDt1) || !DateTime.TryParse(opinfos.ServiceEndTime, out DateTime endDt1)) return _view; DateTime startDt = startDt1; DateTime endDt = endDt1; var opCostDatas = costContents.Where(it => Convert.ToDateTime(it.Date) >= startDt && Convert.ToDateTime(it.Date) <= endDt).ToList(); if (opCostDatas.Count < 1) return _view; var noAuditFeeTypeIds = new List { 982 ,//982 车超时费 -- 暂无 96 ,//96 接送机费 -- 暂无 97 ,//97 其他费用 -- 暂无 992 ,//992 住补费用 -- 暂无 1059,//1059 导游超时费用 -- 暂无 1070,//1070 尾款金额 -- 暂无 1071,//1071 其他额外费用 -- 暂无 1073,//1073 翻译超时费 -- 暂无 1074,//1074 早餐超支费用 -- 暂无 1075,//1075 午餐超支费用 -- 暂无 1076,//1076 晚餐超支费用 -- 暂无 }; //费用类型筛选 包含 feeTypeIds && 包含这些类型费用大于0 var noAuditFeeContents = opContents.Where(x => x.Price > 0 && noAuditFeeTypeIds.Contains(x.SId)).ToList(); if (noAuditFeeContents.Count > 0) return _view; //2.按天按项 检查费用是否超过预算 var opDayContent = opContents.GroupBy(x => x.DatePrice); foreach (var item in opDayContent) { var opCostInfo = opCostDatas.Where(x => Convert.ToDateTime(x.Date) == item.Key).ToList(); if (opCostInfo.Count < 1) continue; //车费 91 var opCarCost = item.FirstOrDefault(x => x.SId == 91); if (opCarCost != null) if (opCarCost.Price * _rate > _rate * opCostInfo.Sum(x => x.CarFee)) isAutoAudit = false; //982 车超时费 -- 暂无 //92 导游费 var opGuideCost = item.FirstOrDefault(x => x.SId == 92); if (opGuideCost != null) if (opGuideCost.Price * _rate > _rate * opCostInfo.Sum(x => x.GuideFee)) isAutoAudit = false; //94 导游景点费 var opGuideScenicCost = item.FirstOrDefault(x => x.SId == 94); if (opGuideScenicCost != null) if (opGuideScenicCost.Price * _rate > _rate * opCostInfo.Sum(x => x.GuideScenicFee)) isAutoAudit = false; //95 导游小费 var opGuideTipCost = item.FirstOrDefault(x => x.SId == 95); if (opGuideTipCost != null) if (opGuideTipCost.Price * _rate > _rate * opCostInfo.Sum(x => x.GuideTipFee)) isAutoAudit = false; //983 导游餐补 var opGuideMealCost = item.FirstOrDefault(x => x.SId == 983); if (opGuideMealCost != null) if (opGuideMealCost.Price * _rate > _rate * opCostInfo.Sum(x => x.GuideMealFee)) isAutoAudit = false; //984 导游房补 var opGuideRoomCost = item.FirstOrDefault(x => x.SId == 984); if (opGuideRoomCost != null) if (opGuideRoomCost.Price * _rate > _rate * opCostInfo.Sum(x => x.GuideRoomFee)) isAutoAudit = false; //985 导游交通 var opGuideTrafficCost = item.FirstOrDefault(x => x.SId == 985); if (opGuideTrafficCost != null) if (opGuideTrafficCost.Price * _rate > _rate * opCostInfo.Sum(x => x.GuideTrafficFee)) isAutoAudit = false; //96 接送机费 -- 暂无 //97 其他费用 -- 暂无 //979 司机工资 var opDriverCost = item.FirstOrDefault(x => x.SId == 979); if (opDriverCost != null) if (opDriverCost.Price * _rate > _rate * opCostInfo.Sum(x => x.DriverFee)) isAutoAudit = false; //980 司机小费 var opDriverTipCost = item.FirstOrDefault(x => x.SId == 980); if (opDriverTipCost != null) if (opDriverTipCost.Price * _rate > _rate * opCostInfo.Sum(x => x.DriverTipFee)) isAutoAudit = false; //981 司机餐补 var opDriverMealCost = item.FirstOrDefault(x => x.SId == 981); if (opDriverMealCost != null) if (opDriverMealCost.Price * _rate > _rate * opCostInfo.Sum(x => x.DriverMealFee)) isAutoAudit = false; //988 客户早餐费用 var opClientBreakfastCost = item.FirstOrDefault(x => x.SId == 988); if (opClientBreakfastCost != null) if (opClientBreakfastCost.Price * _rate > _rate * opCostInfo.Sum(x => x.ClientBreakfastFee)) isAutoAudit = false; //93 客户午餐费用 var opClientLunchCost = item.FirstOrDefault(x => x.SId == 93); if (opClientLunchCost != null) if (opClientLunchCost.Price * _rate > _rate * opCostInfo.Sum(x => x.ClientLunchFee)) isAutoAudit = false; //989 客户晚餐费用 var opClientDinnerCost = item.FirstOrDefault(x => x.SId == 989); if (opClientDinnerCost != null) if (opClientDinnerCost.Price * _rate > _rate * opCostInfo.Sum(x => x.ClientDinnerFee)) isAutoAudit = false; //990 景点门票费 var opScenicTicketCost = item.FirstOrDefault(x => x.SId == 990); if (opScenicTicketCost != null) if (opScenicTicketCost.Price * _rate > _rate * opCostInfo.Sum(x => x.ScenicTicketFee)) isAutoAudit = false; //991 饮料/零食/水果 var opDrinkSnackFruitCost = item.FirstOrDefault(x => x.SId == 991); if (opDrinkSnackFruitCost != null) if (opDrinkSnackFruitCost.Price * _rate > _rate * opCostInfo.Sum(x => x.DrinkSnackFruitFee)) isAutoAudit = false; //992 住补费用 -- 暂无 //994 翻译费 var opTranslatorCost = item.FirstOrDefault(x => x.SId == 994); if (opTranslatorCost != null) if (opTranslatorCost.Price * _rate > _rate * opCostInfo.Sum(x => x.TranslatorFee)) isAutoAudit = false; //1059 导游超时费用 -- 暂无 //1070 尾款金额 -- 暂无 //1071 其他额外费用 -- 暂无 //1073 翻译超时费 -- 暂无 //1074 早餐超支费用 -- 暂无 //1075 午餐超支费用 -- 暂无 //1076 晚餐超支费用 -- 暂无 } //更改审核状态 if (isAutoAudit) return _view; } else return _view; return _view; } } }