using DS.Module.Core; using DS.Module.SqlSugar; using DS.Module.UserModule; using DS.WMS.Core.Check.Dtos; using DS.WMS.Core.Check.Interface; using DS.WMS.Core.Fee.Entity; using DS.WMS.Core.Sys.Interface; using Microsoft.Extensions.DependencyInjection; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using DS.Module.Core.Extensions; using DS.WMS.Core.Check.Entity; using Mapster; using DS.WMS.Core.Op.View; using MathNet.Numerics.LinearAlgebra.Factorization; using NPOI.SS.Formula.Functions; using NPOI.Util; using Quartz.Logging; using DS.Module.Core.Data; using System.Collections; using LanguageExt.ClassInstances.Pred; using DS.WMS.Core.Fee.Dtos; using Microsoft.EntityFrameworkCore.Metadata.Internal; namespace DS.WMS.Core.Check.Method { public class CheckBillAutoService : ICheckBillAutoService { private readonly IServiceProvider _serviceProvider; private readonly ISqlSugarClient db; private readonly IUser user; private readonly ISaasDbService saasService; private readonly ICommonService commonService; /// /// /// /// public CheckBillAutoService(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; db = _serviceProvider.GetRequiredService(); user = _serviceProvider.GetRequiredService(); saasService = _serviceProvider.GetRequiredService(); commonService = _serviceProvider.GetRequiredService(); } public DataResult EditCheckBillAutoInfo(CheckBillAutoReq req) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); if (req.Id == 0) { var data = req.Adapt(); var sequence = commonService.GetSequenceNext(); if (!sequence.Succeeded) { return DataResult.Failed(sequence.Message, MultiLanguageConst.SequenceSetNotExist); } data.AutoBillNo = sequence.Data; data.CheckStatus = 0; data.CheckStatusName = "未对账"; var entity = tenantDb.Insertable(data).ExecuteReturnEntity(); return DataResult.Successed("添加成功!", entity.Id, MultiLanguageConst.DataCreateSuccess); } else { var info = tenantDb.Queryable().Where(x => x.Id == req.Id).First(); info = req.Adapt(info); tenantDb.Updateable(info).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand(); return DataResult.Successed("更新成功!", MultiLanguageConst.DataUpdateSuccess); } } public DataResult> GetCheckBillAutoDetailList(PageRequest request) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); //序列化查询条件 var whereList = db.ConfigQuery.Context.Utilities.JsonToConditionalModels(request.QueryCondition); var data = tenantDb.Queryable() .Where(whereList).Select() .ToQueryPage(request.PageCondition); return data; } public DataResult GetCheckBillAutoInfo(string id) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); var data = tenantDb.Queryable() .Where(a => a.Id == long.Parse(id)) .Select() .First(); return DataResult.Success(data, MultiLanguageConst.DataQuerySuccess); } public DataResult> GetCheckBillAutoList(PageRequest request) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); //序列化查询条件 var whereList = db.ConfigQuery.Context.Utilities.JsonToConditionalModels(request.QueryCondition); var data = tenantDb.Queryable() .Where(whereList).Select() .ToQueryPage(request.PageCondition); return data; } public async Task CreateCheckBillAutoByExcel(string id, List req) { if (req.IsNull() || req.Count == 0) return await Task.FromResult(DataResult.Failed("导入excel无数据")); var tenantDb = saasService.GetBizDbScopeById(user.TenantId); var info = tenantDb.Queryable().First(x => x.Id == long.Parse(id)); if (info.IsNull()) { return await Task.FromResult(DataResult.Failed("自动对账主表信息不存在!")); } if (info.CustomerId == 0 || info.CustomerName.IsNull()) { return await Task.FromResult(DataResult.Failed("请维护主单结算对象!")); } var nums = req.Select(x => x.提单号); if (!tenantDb.Queryable().Where(x => nums.Contains(x.MBLNO)).Any())//|| nums.Contains(x.HBLNO) { return await Task.FromResult(DataResult.Failed("请检查导入提单号信息")); } var details = new List(); foreach (var item in req) { var mblno = item.提单号; var bizList = tenantDb.Queryable().Where(x => x.MBLNO.Contains(mblno)).ToList(); if (bizList.Count > 1) { var mblnos = bizList.Select(x => x.MBLNO).Distinct(); foreach (var temp in mblnos) { var mblno1 = temp; var usdAmount = 0M; var rmbAmount = 0M; var bizlist1 = bizList.Where(x => x.MBLNO == mblno1).ToList(); var mainBiz = bizlist1[0]; foreach (var biz in bizlist1) { var feeList = tenantDb.Queryable().Where(x => x.BusinessId == biz.BusinessId && x.CustomerId == info.CustomerId && x.FeeType == FeeType.Payable).ToList(); foreach (var record in feeList) { if (record.Currency == "RMB") { rmbAmount += record.Amount; } if (record.Currency == "USD") { usdAmount += record.Amount; } } } var detail = new CheckBillAutoDetail() { CheckId = info.Id, MBLNO = mainBiz.MBLNO, RMBLocalAmount = rmbAmount, USDLocalAmount = usdAmount, RMBCheckAmount = item.RMB金额, USDCheckAmount = item.USD金额, RMBDifferenceAmount = rmbAmount - item.RMB金额, USDDifferenceAmount = usdAmount - item.USD金额, CustomerId = info.CustomerId, CustomerName = info.CustomerName, ETD = mainBiz.ETD, Vessel = mainBiz.Vessel, VesselId = mainBiz.VesselId, Voyno = mainBiz.Voyno, OperatorId = mainBiz.OperatorId, OperatorName = mainBiz.OperatorName, SaleId = mainBiz.SaleId, SaleName = mainBiz.SaleName, IsEqual = (rmbAmount - item.RMB金额 == 0 && usdAmount - item.USD金额 == 0) ? true : false, }; details.Add(detail); } } else if (bizList.Count == 1) { var biz = bizList[0]; var feeList = tenantDb.Queryable().Where(x => x.BusinessId == biz.BusinessId && x.CustomerId == info.CustomerId && x.FeeType == FeeType.Payable).ToList(); var usdAmount = 0M; var rmbAmount = 0M; foreach (var record in feeList) { if (record.Currency == "RMB") { rmbAmount += record.Amount; } if (record.Currency == "USD") { usdAmount += record.Amount; } } var detail = new CheckBillAutoDetail() { CheckId = info.Id, MBLNO = biz.MBLNO, RMBLocalAmount = rmbAmount, USDLocalAmount = usdAmount, RMBCheckAmount = item.RMB金额, USDCheckAmount = item.USD金额, RMBDifferenceAmount = rmbAmount - item.RMB金额, USDDifferenceAmount = usdAmount - item.USD金额, CustomerId = info.CustomerId, CustomerName = info.CustomerName, ETD = biz.ETD, Vessel = biz.Vessel, VesselId = biz.VesselId, Voyno = biz.Voyno, OperatorId = biz.OperatorId, OperatorName = biz.OperatorName, SaleId = biz.SaleId, SaleName = biz.SaleName, IsEqual = (rmbAmount - item.RMB金额 == 0 && usdAmount - item.USD金额 == 0) ? true : false, }; details.Add(detail); } else { continue; } } if (details.Count > 0) { await tenantDb.Insertable(details).ExecuteCommandAsync(); if (details.Where(x => x.IsEqual == false).Any()) { info.CheckStatus = 2; info.CheckStatusName = "对账不一致"; } else { info.CheckStatus = 1; info.CheckStatusName = "对账一致"; } await tenantDb.Updateable(info).ExecuteCommandAsync(); } else { return await Task.FromResult(DataResult.Failed("无匹配的数据!")); } return await Task.FromResult(DataResult.Successed("导入成功!")); } /// /// 对账明细批量删除 /// /// 主表Id及明细业务Ids /// public DataResult BatchDelCheckBillAutoDetail(IdModel req) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); var checkId = long.Parse(req.Id); if (req.Id.IsNull()) return DataResult.Failed("主表Id不能为空"); var info = tenantDb.Queryable().First(x => x.Id == checkId); if (info.IsNull()) return DataResult.Failed("客户对账信息不存在"); if (req.Ids.Length == 0) return DataResult.Failed("明细业务Ids不能为空"); var businessList = tenantDb.Queryable().Where(x => x.CheckId == checkId && req.Ids.Contains(x.Id)).ToList(); if (businessList.Count > 0) tenantDb.Deleteable(businessList).ExecuteCommand(); var details = tenantDb.Queryable().Where(x => x.CheckId == checkId && !req.Ids.Contains(x.Id)).ToList(); if (details.Count > 0) { if (details.Where(x => x.IsEqual == false).Any()) { info.CheckStatus = 2; info.CheckStatusName = "对账不一致"; } else { info.CheckStatus = 1; info.CheckStatusName = "对账一致"; } tenantDb.Updateable(info).ExecuteCommand(); } return DataResult.Successed("删除成功!", MultiLanguageConst.DataDelSuccess); } /// /// 自动对账批量删除 /// /// 主表Ids /// public DataResult BatchDelCheckBillAuto(IdModel req) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); if (req.Ids.Length == 0) return DataResult.Failed("业务Ids不能为空"); if (tenantDb.Queryable().Where(x => req.Ids.Contains(x.Id) && (x.BillNo != null && x.BillNo != "")).Any()) { return DataResult.Failed("存在已生成的对账信息!"); } var billLists = tenantDb.Queryable().Where(x => req.Ids.Contains(x.Id)).ToList(); if (billLists.Count > 0) { var details = tenantDb.Queryable().Where(x => req.Ids.Contains(x.CheckId)).ToList(); if (details.Count > 0) { tenantDb.Deleteable(details).ExecuteCommand(); } tenantDb.Deleteable(billLists).ExecuteCommand(); } return DataResult.Successed("删除成功!", MultiLanguageConst.DataDelSuccess); } /// /// 自动对账重新匹配 /// /// 主表Id /// public DataResult RecountCheckBillAuto(IdModel req) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); if (req.Id.IsNull()) return DataResult.Failed("业务Id不能为空"); var info = tenantDb.Queryable().Where(x => x.Id == long.Parse(req.Id)).First(); if (info.IsNotNull()) { if (info.BillNo.IsNotNull()) { return DataResult.Failed("存在已生成的对账信息!"); } var list = tenantDb.Queryable().Where(x => x.CheckId == long.Parse(req.Id)).ToList(); foreach (var bill in list) { var mblno = bill.MBLNO; var usdAmount = 0M; var rmbAmount = 0M; var bizList = tenantDb.Queryable().Where(x => x.MBLNO.Contains(mblno)).ToList(); var mblnos = bizList.Select(x => x.MBLNO).Distinct(); foreach (var temp in mblnos) { var mblno1 = temp; var bizlist1 = bizList.Where(x => x.MBLNO == mblno1).ToList(); //var mainBiz = bizlist1[0]; foreach (var biz in bizlist1) { var feeList = tenantDb.Queryable().Where(x => x.BusinessId == biz.BusinessId && x.CustomerId == info.CustomerId && x.FeeType == FeeType.Payable).ToList(); foreach (var record in feeList) { if (record.Currency == "RMB") { rmbAmount += record.Amount; } if (record.Currency == "USD") { usdAmount += record.Amount; } } } } bill.RMBLocalAmount = rmbAmount; bill.USDLocalAmount = usdAmount; bill.RMBDifferenceAmount = rmbAmount - bill.RMBCheckAmount; bill.USDDifferenceAmount = usdAmount - bill.USDCheckAmount; bill.IsEqual = (rmbAmount - bill.RMBCheckAmount == 0 && usdAmount - bill.USDCheckAmount == 0) ? true : false; } tenantDb.Updateable(list).ExecuteCommand(); //更新主表 if (list.Where(x => x.IsEqual == false).Any()) { info.CheckStatus = 2; info.CheckStatusName = "对账不一致"; } else { info.CheckStatus = 1; info.CheckStatusName = "对账一致"; } tenantDb.Updateable(info).ExecuteCommand(); } else { return DataResult.Failed("自动对账主表信息不存在"); } return DataResult.Successed("重新匹配成功!", MultiLanguageConst.DataUpdateSuccess); } /// /// 生成对账单 /// /// 主表Id /// public async Task CreateCheckBill(IdModel req) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); if (req.Id.IsNull()) return await Task.FromResult(DataResult.Failed("业务Id不能为空")); var info = await tenantDb.Queryable().Where(x => x.Id == long.Parse(req.Id)).FirstAsync(); if (info.IsNull()) return await Task.FromResult(DataResult.Failed("自动对账主表信息不存在")); if (info.BillNo.IsNotNull()) return await Task.FromResult(DataResult.Failed("对账信息已生成!")); var list = await tenantDb.Queryable().Where(x => x.CheckId == long.Parse(req.Id) && x.IsEqual == true).ToListAsync(); if (list.Count == 0) return await Task.FromResult(DataResult.Failed("自动对账明细无一致的明细!")); await tenantDb.Ado.BeginTranAsync(); try { var data = info.Adapt(); var sequence = commonService.GetSequenceNext(); if (!sequence.Succeeded) { return await Task.FromResult(DataResult.Failed(sequence.Message, MultiLanguageConst.SequenceSetNotExist)); } data.BillNo = sequence.Data; var entity = await tenantDb.Insertable(data).ExecuteReturnEntityAsync(); var businessList = new List(); var feeList = new List(); foreach (var bill in list) { var mblno = bill.MBLNO; var bizList = tenantDb.Queryable().Where(x => x.MBLNO.Contains(mblno)).ToList(); var mblnos = bizList.Select(x => x.MBLNO).Distinct(); foreach (var temp in mblnos) { var mblno1 = temp; var bizlist1 = bizList.Where(x => x.MBLNO == mblno1).ToList(); //var mainBiz = bizlist1[0]; foreach (var biz in bizlist1) { var feeRecordList = tenantDb.Queryable().Where(x => x.BusinessId == biz.BusinessId && x.CustomerId == info.CustomerId && x.FeeType == FeeType.Payable).ToList(); if (feeRecordList.Count > 0) { businessList.Add(new CheckBillBusiness() { CheckId = entity.Id, BusinessId = biz.BusinessId }); foreach (var record in feeRecordList) { feeList.Add(new CheckBillFeeRecords() { CheckId = entity.Id, BusinessId = biz.BusinessId, FeeRecordId = record.Id, CheckBillAmount = record.Amount, }); //对账标识 record.IsDebit = true; record.DebitNo = entity.Id.ToString(); } //更新费用记录 await tenantDb.Updateable(feeRecordList).ExecuteCommandAsync(); } } } } if (businessList.Count > 0) { await tenantDb.Insertable(businessList).ExecuteCommandAsync(); if (feeList.Count > 0) { await tenantDb.Insertable(feeList).ExecuteCommandAsync(); } } info.BillNo = sequence.Data; await tenantDb.Updateable(info).ExecuteCommandAsync(); await tenantDb.Ado.CommitTranAsync(); return await Task.FromResult(DataResult.Successed("生成对账单成功!", MultiLanguageConst.DataUpdateSuccess)); } catch (Exception ex) { await tenantDb.Ado.RollbackTranAsync(); await ex.LogAsync(tenantDb); return DataResult.FailedWithDesc(nameof(MultiLanguageConst.Operation_Failed)); } } /// /// 取消生成的对账单 /// /// 主表Id /// public async Task CancelCheckBill(IdModel req) { var tenantDb = saasService.GetBizDbScopeById(user.TenantId); if (req.Id.IsNull()) return await Task.FromResult(DataResult.Failed("业务Id不能为空")); var info = await tenantDb.Queryable().Where(x => x.Id == long.Parse(req.Id)).FirstAsync(); if (info.IsNull()) return await Task.FromResult(DataResult.Failed("自动对账主表信息不存在")); if (info.BillNo.IsNull()) return await Task.FromResult(DataResult.Failed("对账信息未生成!")); var bill = await tenantDb.Queryable().Where(x => x.BillNo == info.BillNo).FirstAsync(); if (bill.IsNull()) return await Task.FromResult(DataResult.Failed("对账信息不存在!")); if ((bool)bill.IsLocking) return await Task.FromResult(DataResult.Failed("对账信息已锁定!")); await tenantDb.Ado.BeginTranAsync(); try { var billlist = await tenantDb.Queryable().Where(x => x.CheckId == bill.Id).ToListAsync(); var feelist = await tenantDb.Queryable().Where(x => x.CheckId == bill.Id).ToListAsync(); await tenantDb.Deleteable(feelist).ExecuteCommandAsync(); await tenantDb.Deleteable(billlist).ExecuteCommandAsync(); await tenantDb.Deleteable(bill).ExecuteCommandAsync(); info.BillNo = ""; await tenantDb.Updateable(info).ExecuteCommandAsync(); await tenantDb.Ado.CommitTranAsync(); return await Task.FromResult(DataResult.Successed("取消对账单成功!", MultiLanguageConst.DataUpdateSuccess)); } catch (Exception ex) { await tenantDb.Ado.RollbackTranAsync(); await ex.LogAsync(tenantDb); return DataResult.FailedWithDesc(nameof(MultiLanguageConst.Operation_Failed)); } } } }