diff --git a/ds-wms-service/DS.WMS.Core/Settlement/Method/FreeSettlementService.cs b/ds-wms-service/DS.WMS.Core/Settlement/Method/FreeSettlementService.cs index 727eaa74..9fe9e79c 100644 --- a/ds-wms-service/DS.WMS.Core/Settlement/Method/FreeSettlementService.cs +++ b/ds-wms-service/DS.WMS.Core/Settlement/Method/FreeSettlementService.cs @@ -276,9 +276,9 @@ namespace DS.WMS.Core.Settlement.Method var templist = await TenantDb.Queryable().Where(x => x.ApplicationId == id) .ToListAsync(); - model.Details = templist.Adapt>(); + model.SettlementDetails = templist.Adapt>(); - return DataResult.Success(model); + return DataResult.Success(model); } /// @@ -373,11 +373,8 @@ namespace DS.WMS.Core.Settlement.Method return DataResult.Success(model); } - protected override Task> GetSettlementDetails(long id) - { - throw new NotImplementedException(); - } - protected override async Task PreSaveAsync(ApplicationSettlement settlement) + + protected override async Task PreSaveAsync(Entity.ApplicationSettlement settlement) { //settlement.Mode = SettlementMode.FreeSettlement; //settlement.BillType = SettlementBillType.Payment; @@ -420,7 +417,7 @@ namespace DS.WMS.Core.Settlement.Method return sb.Length > 0 ? DataResult.Failed(sb.ToString()) : DataResult.Success; } - protected override DataResult PreDelete(List settlements) + protected override DataResult PreDelete(List settlements) { if (settlements.Any(x => x.IsLocked)) return DataResult.FailedWithDesc(nameof(MultiLanguageConst.SettlementIsLocked)); diff --git a/ds-wms-service/DS.WMS.Core/Settlement/Method/SettlementService`1.cs b/ds-wms-service/DS.WMS.Core/Settlement/Method/SettlementService`1.cs index 804ac7a1..de04ea64 100644 --- a/ds-wms-service/DS.WMS.Core/Settlement/Method/SettlementService`1.cs +++ b/ds-wms-service/DS.WMS.Core/Settlement/Method/SettlementService`1.cs @@ -24,7 +24,7 @@ namespace DS.WMS.Core.Settlement.Method /// 结算基础实现 /// /// 实体的类型声明 - public abstract class SettlementService : FeeServiceBase, ISettlementService + public class SettlementService : FeeServiceBase, ISettlementService where TEntity : SettlementBase, new() { readonly Lazy CommonService; @@ -125,7 +125,7 @@ namespace DS.WMS.Core.Settlement.Method if (!result.Succeeded) return DataResult.Failed(result.Message, result.MultiCode); - List? details = null; + List? details1 = null; //自由结算 if (settlement.Mode == SettlementMode.FreeSettlement && request.Details?.Count > 0) { @@ -220,7 +220,7 @@ namespace DS.WMS.Core.Settlement.Method if (settlement.Mode == SettlementMode.Payment || settlement.Mode == SettlementMode.Charge) { var detailCategory = settlement.Mode == SettlementMode.Payment ? DetailCategory.PaidApplication : DetailCategory.ChargeApplication; - details = await TenantDb.Queryable().Where(x => ids.Contains(x.ApplicationId) && x.Category == detailCategory) + details1 = await TenantDb.Queryable().Where(x => ids.Contains(x.ApplicationId) && x.Category == detailCategory) .Select(x => new ApplicationDetail { ApplicationId = settlement.Id, @@ -242,7 +242,7 @@ namespace DS.WMS.Core.Settlement.Method if (!string.IsNullOrEmpty(settlement.Currency)) //指定结算币别 { - var details2 = details.FindAll(x => x.OriginalCurrency != settlement.Currency); + var details2 = details1.FindAll(x => x.OriginalCurrency != settlement.Currency); foreach (var detail in details2) { detail.Currency = settlement.Currency; @@ -259,111 +259,33 @@ namespace DS.WMS.Core.Settlement.Method detail.ApplyAmount = Math.Round(exchange.ExchangeRate.GetValueOrDefault() * detail.OriginalAmount, 2, MidpointRounding.AwayFromZero); } } - - - //执行结算费用分配 - foreach (var doc in request.Documents) - { - var details2 = details.Where(x => x.RefId == doc.Id).OrderBy(x => x.ApplyAmount).ToList(); - - var rmbDetails = details2.FindAll(x => x.Currency == FeeCurrency.RMB_CODE); - if (rmbDetails.Count > 0) - { - var totalRMB = rmbDetails.Sum(x => x.ApplyAmount); - doc.SettlementRMB ??= totalRMB; - - if (doc.SettlementRMB > totalRMB) - return DataResult.Failed("人民币结算金额不能大于剩余人民币金额"); - - if (totalRMB != doc.SettlementRMB) - { - var rest = totalRMB - doc.SettlementRMB.GetValueOrDefault(); - foreach (var detail in rmbDetails) - { - if (rest == 0) - break; - - detail.ApplyAmount = detail.ApplyAmount - rest; - rest = detail.ApplyAmount - rest; - } - } - } - - var usdDetails = details2.FindAll(x => x.Currency == FeeCurrency.USD_CODE); - if (usdDetails.Count > 0) - { - var totalUSD = usdDetails.Sum(x => x.ApplyAmount); - doc.SettlementUSD ??= totalUSD; - - if (doc.SettlementUSD > totalUSD) - return DataResult.Failed("美元结算金额不能大于剩余美元金额"); - - if (totalUSD != doc.SettlementUSD) - { - var rest = totalUSD - doc.SettlementUSD.GetValueOrDefault(); - foreach (var detail in usdDetails) - { - if (rest == 0) - break; - - detail.ApplyAmount = detail.ApplyAmount - rest; - rest = detail.ApplyAmount - rest; - } - } - } - - var otherDetails = details2.FindAll(x => x.Currency != FeeCurrency.RMB_CODE && x.Currency != FeeCurrency.USD_CODE); - if (otherDetails.Count > 0) - { - var total = rmbDetails.Sum(x => x.ApplyAmount); - doc.SettlementOther ??= total; - - if (doc.SettlementOther > total) - return DataResult.Failed("其他结算金额不能大于剩余其他金额"); - - if (total != doc.SettlementOther) - { - var rest = total - doc.SettlementOther.GetValueOrDefault(); - foreach (var detail in otherDetails) - { - if (rest == 0) - break; - - detail.ApplyAmount = detail.ApplyAmount - rest; - rest = detail.ApplyAmount - rest; - } - } - } - } } //发票结算 else if (settlement.Mode == SettlementMode.InvoiceSettlement || settlement.Mode == SettlementMode.PaymentInvoiceSettlement) { - details = await TenantDb.Queryable() - .InnerJoin((d, f) => d.RecordId == f.Id) - .Where((d, f) => ids.Contains(d.ApplicationId) && d.Category == DetailCategory.InvoiceIssuance) - .Select((d, f) => new ApplicationDetail + details1 = await TenantDb.Queryable().Where(x => ids.Contains(x.ApplicationId) && x.Category == DetailCategory.InvoiceIssuance) + .Select(x => new ApplicationDetail { ApplicationId = settlement.Id, - RefId = d.ApplicationId, - DetailId = d.Id, - RecordId = d.RecordId, + RefId = x.ApplicationId, + DetailId = x.Id, + RecordId = x.RecordId, Category = DetailCategory.InvoiceSettlement, - CustomerName = d.CustomerName ?? settlement.CustomerName, - FeeId = d.FeeId, - FeeName = d.FeeName, - FeeType = d.FeeType, - - ApplyAmount = d.ApplyAmount - d.ProcessedAmount, - Currency = d.Currency, - OriginalAmount = d.OriginalAmount - d.OriginalProcessedAmount, - OriginalCurrency = d.OriginalCurrency, - ExchangeRate = d.ExchangeRate + CustomerName = x.CustomerName ?? settlement.CustomerName, + FeeId = x.FeeId, + FeeName = x.FeeName, + FeeType = x.FeeType, + + ApplyAmount = x.ApplyAmount - x.ProcessedAmount, + Currency = x.Currency, + OriginalAmount = x.OriginalAmount - x.OriginalProcessedAmount, + OriginalCurrency = x.OriginalCurrency, + ExchangeRate = x.ExchangeRate }).ToListAsync(); if (settlement.Currency != FeeCurrency.RMB_CODE) //发票结算非人民币需做转换 { - var details2 = details.FindAll(x => x.OriginalCurrency != settlement.Currency); + var details2 = details1.FindAll(x => x.OriginalCurrency != settlement.Currency); foreach (var detail in details2) { detail.Currency = settlement.Currency; @@ -381,12 +303,78 @@ namespace DS.WMS.Core.Settlement.Method } } } + + //执行结算费用分配 + foreach (var doc in request.Documents) + { + var details2 = details1.Where(x => x.RefId == doc.Id).OrderBy(x => x.ApplyAmount).ToList(); + + var rmbDetails = details2.FindAll(x => x.Currency == FeeCurrency.RMB_CODE); + var totalRMB = rmbDetails.Sum(x => x.ApplyAmount); + doc.SettlementRMB ??= totalRMB; + + if (doc.SettlementRMB > totalRMB) + return DataResult.Failed("人民币结算金额不能大于剩余人民币金额"); + + if (totalRMB < doc.SettlementRMB) + { + var rest = totalRMB - doc.SettlementRMB.GetValueOrDefault(); + foreach (var detail in rmbDetails) + { + if (rest == 0) + break; + + detail.ApplyAmount = detail.ApplyAmount - rest; + rest = detail.ApplyAmount - rest; + } + } + + var usdDetails = details2.FindAll(x => x.Currency == FeeCurrency.USD_CODE); + var totalUSD = usdDetails.Sum(x => x.ApplyAmount); + doc.SettlementUSD ??= totalUSD; + + if (doc.SettlementUSD > totalUSD) + return DataResult.Failed("美元结算金额不能大于剩余美元金额"); + + if (totalUSD < doc.SettlementUSD) + { + var rest = totalUSD - doc.SettlementUSD.GetValueOrDefault(); + foreach (var detail in usdDetails) + { + if (rest == 0) + break; + + detail.ApplyAmount = detail.ApplyAmount - rest; + rest = detail.ApplyAmount - rest; + } + } + + var otherDetails = details2.FindAll(x => x.Currency != FeeCurrency.RMB_CODE && x.Currency != FeeCurrency.USD_CODE); + var total = rmbDetails.Sum(x => x.ApplyAmount); + doc.SettlementOther ??= total; + + if (doc.SettlementOther > total) + return DataResult.Failed("其他结算金额不能大于剩余其他金额"); + + if (total < doc.SettlementOther) + { + var rest = total - doc.SettlementOther.GetValueOrDefault(); + foreach (var detail in otherDetails) + { + if (rest == 0) + break; + + detail.ApplyAmount = detail.ApplyAmount - rest; + rest = detail.ApplyAmount - rest; + } + } + } } - if (details?.Count > 0) - settlement.Details.AddRange(details); - //仅保留新增费用明细 - settlement.Details = settlement.Details.FindAll(x => x.Id == 0); + + if (details1?.Count > 0) + settlement.Details.AddRange(details1); + //金额禁止为0 if (settlement.Details.Exists(x => x.ApplyAmount == 0 || x.OriginalAmount == 0)) return DataResult.FailedWithDesc(nameof(MultiLanguageConst.AmountCannotBeZero)); @@ -394,22 +382,18 @@ namespace DS.WMS.Core.Settlement.Method if (settlement.Details.Exists(x => x.OriginalCurrency.IsNullOrEmpty())) return DataResult.FailedWithDesc(nameof(MultiLanguageConst.OriginalCurrencyCanNotNull)); - if (settlement.Details.Count > 0) - { - result = await PreSaveAsync(settlement); - if (!result.Succeeded) - return DataResult.Failed(result.Message, result.MultiCode); - } + settlement.Amount = settlement.Details.Sum(x => x.ApplyAmount); + result = await PreSaveAsync(settlement); + if (!result.Succeeded) + return DataResult.Failed(result.Message, result.MultiCode); + var details = settlement.Details.FindAll(x => x.Id == 0); await TenantDb.Ado.BeginTranAsync(); try { //关联导航属性插入 if (settlement.Id == 0) { - if (!string.IsNullOrEmpty(settlement.Currency)) - settlement.Amount = settlement.Details.Sum(x => x.ApplyAmount); - //创建时需要生成申请单编号 var sequence = CommonService.Value. GetSequenceNext(); if (!sequence.Succeeded) @@ -423,12 +407,8 @@ namespace DS.WMS.Core.Settlement.Method } else { - if (settlement.Details.Count > 0) - await TenantDb.Insertable(settlement.Details).ExecuteCommandAsync(); - - if (!string.IsNullOrEmpty(settlement.Currency)) - settlement.Amount = await TenantDb.Queryable() - .Where(x => x.ApplicationId == settlement.Id).SumAsync(x => x.ApplyAmount); + if (details.Count > 0) + await TenantDb.Insertable(details).ExecuteCommandAsync(); await TenantDb.Updateable(settlement).IgnoreColumns(x => new { @@ -445,10 +425,10 @@ namespace DS.WMS.Core.Settlement.Method await OnSaveAsync(settlement); - if (settlement.Details.Count > 0) + if (details.Count > 0) { //更新费用记录的已结算金额 - var fees = settlement.Details.Select(x => new FeeRecord + var fees = details.Select(x => new FeeRecord { Id = x.RecordId, SettlementAmount = x.OriginalAmount diff --git a/ds-wms-service/DS.WMS.FeeApi/Controllers/PaymentFreeSettlementController.cs b/ds-wms-service/DS.WMS.FeeApi/Controllers/PaymentFreeSettlementController.cs index 6ada946e..3855dc77 100644 --- a/ds-wms-service/DS.WMS.FeeApi/Controllers/PaymentFreeSettlementController.cs +++ b/ds-wms-service/DS.WMS.FeeApi/Controllers/PaymentFreeSettlementController.cs @@ -1,8 +1,6 @@ using DS.Module.Core; using DS.Module.Core.Data; using DS.WMS.Core.Application.Dtos; -using DS.WMS.Core.Application.Entity; -using DS.WMS.Core.Fee.Dtos; using DS.WMS.Core.Settlement.Dtos; using DS.WMS.Core.Settlement.Entity; using DS.WMS.Core.Settlement.Interface;