From ddbff347a3c12a3258d179293c9f319ad85e03a4 Mon Sep 17 00:00:00 2001 From: zhangxiaofeng <1939543722@qq.com> Date: Fri, 19 Jul 2024 15:31:48 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=8F=B0=E7=9B=B8?= =?UTF-8?q?=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Constants/TaskFlowDataNameConst.cs | 18 ++++ .../Data/TaskFlowDataContext.cs | 18 +++- .../ISpaceBookingMSKAPIService.cs | 7 ++ .../SpaceBooking/SpaceBookingMSKAPIService.cs | 92 ++++++++++++++----- .../TaskPlat/Interface/IMyModuleTest1.cs | 1 + .../TaskPlat/Method/MyModuleTest1.cs | 4 + .../TaskPlat/Method/TaskManageService.cs | 9 +- .../TaskPlat/Other/TaskFlowRuner.cs | 56 ++++++----- 8 files changed, 158 insertions(+), 47 deletions(-) create mode 100644 ds-wms-service/DS.Module.Core/Constants/TaskFlowDataNameConst.cs diff --git a/ds-wms-service/DS.Module.Core/Constants/TaskFlowDataNameConst.cs b/ds-wms-service/DS.Module.Core/Constants/TaskFlowDataNameConst.cs new file mode 100644 index 00000000..e56befd3 --- /dev/null +++ b/ds-wms-service/DS.Module.Core/Constants/TaskFlowDataNameConst.cs @@ -0,0 +1,18 @@ +namespace DS.Module.Core +{ + /// + /// 维护一些常用的,用于任务台数据上下文读写参数的参数名 + /// + public static class TaskFlowDataNameConst + { + /// + /// 任务任务请求报文 + /// + public const string TaskManageOrderMessageInfo = nameof(TaskManageOrderMessageInfo); + + /// + /// 租户Id + /// + public const string TenantId = "TenantId"; + } +} diff --git a/ds-wms-service/DS.Module.Core/Data/TaskFlowDataContext.cs b/ds-wms-service/DS.Module.Core/Data/TaskFlowDataContext.cs index 4b58c19c..19092acf 100644 --- a/ds-wms-service/DS.Module.Core/Data/TaskFlowDataContext.cs +++ b/ds-wms-service/DS.Module.Core/Data/TaskFlowDataContext.cs @@ -14,6 +14,18 @@ { dataContext.Add(key, value); } + + /// + /// + /// + public TaskFlowDataContext(params (string key, object value)[] keyValues) + { + foreach (var item in keyValues) + { + dataContext.Add(item.key, item.value); + } + } + /// /// /// @@ -35,7 +47,11 @@ { if (dataContext.ContainsKey(key)) { - return (T)dataContext[key]; + var value = dataContext[key]; + if (value is T t) + { + return t; + } } return default; } diff --git a/ds-wms-service/DS.WMS.Core/Op/Interface/SpaceBooking/ISpaceBookingMSKAPIService.cs b/ds-wms-service/DS.WMS.Core/Op/Interface/SpaceBooking/ISpaceBookingMSKAPIService.cs index 7e12e935..f40ef2d7 100644 --- a/ds-wms-service/DS.WMS.Core/Op/Interface/SpaceBooking/ISpaceBookingMSKAPIService.cs +++ b/ds-wms-service/DS.WMS.Core/Op/Interface/SpaceBooking/ISpaceBookingMSKAPIService.cs @@ -1,4 +1,5 @@ using DS.Module.Core; +using DS.Module.Core.Data; using DS.WMS.Core.Op.Dtos; using System; using System.Collections.Generic; @@ -106,6 +107,12 @@ namespace DS.WMS.Core.Op.Interface /// 返回回执 Task> SyncBCInfo(string mblno, long tenantId, string opTypeName = "BookingConfirmation"); + /// + /// 同步BC状态(BC,Cancellation)作为任务台执行模块 + /// + /// 数据上下文 + Task> SyncBCInfoTask(TaskFlowDataContext dataContext); + /// /// 获取初始化页面默认值 /// diff --git a/ds-wms-service/DS.WMS.Core/Op/Method/SpaceBooking/SpaceBookingMSKAPIService.cs b/ds-wms-service/DS.WMS.Core/Op/Method/SpaceBooking/SpaceBookingMSKAPIService.cs index 91a24057..060ba48b 100644 --- a/ds-wms-service/DS.WMS.Core/Op/Method/SpaceBooking/SpaceBookingMSKAPIService.cs +++ b/ds-wms-service/DS.WMS.Core/Op/Method/SpaceBooking/SpaceBookingMSKAPIService.cs @@ -32,10 +32,13 @@ using DS.WMS.Core.Op.Interface; using DS.WMS.Core.Map.Method; using Microsoft.Owin.Security.Provider; using LanguageExt; +using DS.Module.Core.Data; +using DS.WMS.Core.TaskPlat.Dtos; +using NLog.Fluent; namespace DS.WMS.Core.Op.Method { - public class SpaceBookingMSKAPIService: ISpaceBookingMSKAPIService + public class SpaceBookingMSKAPIService : ISpaceBookingMSKAPIService { private readonly IServiceProvider _serviceProvider; private readonly ISqlSugarClient db; @@ -433,7 +436,8 @@ namespace DS.WMS.Core.Op.Method } - showDto.Legs = legs.OrderBy(t => t.ETD).Select((t, idx) => { + showDto.Legs = legs.OrderBy(t => t.ETD).Select((t, idx) => + { t.SortNo = idx + 1; return t; }).ToList(); @@ -462,7 +466,7 @@ namespace DS.WMS.Core.Op.Method //newModel.priceID = null; var json = Newtonsoft.Json.JsonConvert.SerializeObject(newModel); - model.PId = SnowFlakeSingle.Instance.NextId(); + model.PId = SnowFlakeSingle.Instance.NextId(); //string md5 = json.ToMd5(); @@ -537,7 +541,7 @@ namespace DS.WMS.Core.Op.Method //船公司代码不能为空 //if (string.IsNullOrWhiteSpace(model.carrierId)) - //throw new Exception(MultiLanguageConst.GetDescription(nameof(MultiLanguageConst.SpaceBookingAPIVesselCarrierCodeNull))); + //throw new Exception(MultiLanguageConst.GetDescription(nameof(MultiLanguageConst.SpaceBookingAPIVesselCarrierCodeNull))); string sendUrl = string.Empty; @@ -604,7 +608,7 @@ namespace DS.WMS.Core.Op.Method //var ctnCodeMappingList = _cache.GetAllMappingCtn().GetAwaiter().GetResult().ToList(); //if (ctnCodeMappingList.Count > 0) - //ctnCodeMappingList = ctnCodeMappingList.Where(x => x.CarrierCode == "MSK" && x.Module == "BOOK_MSK_API").ToList(); + //ctnCodeMappingList = ctnCodeMappingList.Where(x => x.CarrierCode == "MSK" && x.Module == "BOOK_MSK_API").ToList(); MSKAPIBookingDto bookingDto = new MSKAPIBookingDto { @@ -824,7 +828,7 @@ namespace DS.WMS.Core.Op.Method //var ctnMapping = ctnCodeMappingList.FirstOrDefault(t => t.Code.Equals(ctn.ctnCode)); //if (ctnMapping == null) - //throw Oops.Oh($"未配置相应的箱型对应{ctn.ctnName},请联系管理员"); + //throw Oops.Oh($"未配置相应的箱型对应{ctn.ctnName},请联系管理员"); MSKAPIBookingEquipmentAndHaulage haulage = new MSKAPIBookingEquipmentAndHaulage { @@ -1282,7 +1286,7 @@ namespace DS.WMS.Core.Op.Method if (model.carrierCode.Equals("MSK", StringComparison.OrdinalIgnoreCase)) { - queryUrl = configService.GetConfig(CONST_MSK_API_LOCATION_URL,long.Parse(user.TenantId),false).GetAwaiter().GetResult()?.Data?.Value; + queryUrl = configService.GetConfig(CONST_MSK_API_LOCATION_URL, long.Parse(user.TenantId), false).GetAwaiter().GetResult()?.Data?.Value; } else { @@ -1293,12 +1297,12 @@ namespace DS.WMS.Core.Op.Method //未配置 MSK API 查询港口请求接口地址(马士基API合约查询港口URL),请联系管理员 if (string.IsNullOrWhiteSpace(queryUrl)) throw new Exception(MultiLanguageConst.GetDescription(nameof(MultiLanguageConst.SpaceBookingAPISearchLocNoConfig))); - + var webAccountConfig = codeThirdPartyService.GetCodeThirdPartyInfoWithCompany("MSKApi").GetAwaiter().GetResult()?.Data; //未配置第三方账户个人或公司账户(MSKApi) if (webAccountConfig == null) - throw new Exception(MultiLanguageConst.GetDescription(nameof(MultiLanguageConst.SpaceBookingAPIThirdPartyNull))); + throw new Exception(MultiLanguageConst.GetDescription(nameof(MultiLanguageConst.SpaceBookingAPIThirdPartyNull))); MSKAPISearchLocationDto queryInfo = new MSKAPISearchLocationDto { @@ -1324,9 +1328,9 @@ namespace DS.WMS.Core.Op.Method } catch (Exception ex) { - Logger.Log(NLog.LogLevel.Info,$"请求MSK API检索始发地、目的港口异常,原因:{ex.Message}"); + Logger.Log(NLog.LogLevel.Info, $"请求MSK API检索始发地、目的港口异常,原因:{ex.Message}"); - throw new Exception(string.Format(MultiLanguageConst.GetDescription(nameof(MultiLanguageConst.SpaceBookingAPISearchLocException)),ex.Message)); + throw new Exception(string.Format(MultiLanguageConst.GetDescription(nameof(MultiLanguageConst.SpaceBookingAPISearchLocException)), ex.Message)); } } @@ -1363,7 +1367,7 @@ namespace DS.WMS.Core.Op.Method var entity = await tenantDb.Queryable().FirstAsync(a => a.Id == id); //if (entity == null) - //throw Oops.Oh($"获取马士基API订舱详情失败,不存在或已作废"); + //throw Oops.Oh($"获取马士基API订舱详情失败,不存在或已作废"); model = entity.Adapt(); @@ -1461,7 +1465,7 @@ namespace DS.WMS.Core.Op.Method } //if (selectedShipSchedule == null) - //throw Oops.Oh("船期数据校验失败,请重新查询船期信息"); + //throw Oops.Oh("船期数据校验失败,请重新查询船期信息"); model.placeOfReceiptCountryName = selectedShipSchedule.originCountryName; model.placeOfReceiptRegionName = selectedShipSchedule.originRegionName; @@ -1484,12 +1488,12 @@ namespace DS.WMS.Core.Op.Method .First(a => a.Id == model.id); //if (oldInfo == null) - //throw Oops.Oh("订舱数据不存在或已作废"); + //throw Oops.Oh("订舱数据不存在或已作废"); if (oldInfo.Status == "SUCC") { //if (isSendApi) - //throw Oops.Oh("订舱数据已发送成功,不能重复发送"); + //throw Oops.Oh("订舱数据已发送成功,不能重复发送"); //throw Oops.Oh("订舱数据已发送成功,不能修改"); } @@ -1544,7 +1548,8 @@ namespace DS.WMS.Core.Op.Method ctnEntity.UpdateBy = long.Parse(user.UserId); //ctnEntity.UpdatedUserName = UserManager.Name; - tenantDb.Updateable(ctnEntity).IgnoreColumns(x => new { + tenantDb.Updateable(ctnEntity).IgnoreColumns(x => new + { x.CreateBy, //x.CreatedUserName, x.CreateTime, @@ -1579,13 +1584,15 @@ namespace DS.WMS.Core.Op.Method if (ctnEntityList.Count > 0) { - ctnEntityList.ForEach(async ctn => { + ctnEntityList.ForEach(async ctn => + { ctn.Deleted = true; ctn.DeleteTime = nowDate; ctn.DeleteBy = long.Parse(user.UserId); //ctn.UpdatedUserName = UserManager.Name; - await tenantDb.Updateable(ctn).UpdateColumns(x => new { + await tenantDb.Updateable(ctn).UpdateColumns(x => new + { x.Deleted, x.DeleteTime, x.DeleteBy, @@ -1690,7 +1697,8 @@ namespace DS.WMS.Core.Op.Method shipScheduleRecord.DeleteBy = long.Parse(user.UserId); //shipScheduleRecord.UpdatedUserName = UserManager.Name; - await tenantDb.Updateable(shipScheduleRecord).UpdateColumns(x => new { + await tenantDb.Updateable(shipScheduleRecord).UpdateColumns(x => new + { x.Deleted, x.DeleteTime, x.DeleteBy, @@ -1743,7 +1751,8 @@ namespace DS.WMS.Core.Op.Method info.DeleteBy = long.Parse(user.UserId); //info.UpdatedUserName = UserManager.Name; - await tenantDb.Updateable(info).UpdateColumns(x => new { + await tenantDb.Updateable(info).UpdateColumns(x => new + { x.Deleted, x.DeleteTime, x.DeleteBy @@ -1766,7 +1775,7 @@ namespace DS.WMS.Core.Op.Method .Where(a => ids.Contains(a.Id)).ToListAsync(); //if (list.Count != ids.Length) - //throw Oops.Oh("订舱数据获取失败,请确认选中的记录是否存在"); + //throw Oops.Oh("订舱数据获取失败,请确认选中的记录是否存在"); List msgList = new List(); int totalNum = list.Count; @@ -1976,7 +1985,8 @@ namespace DS.WMS.Core.Op.Method model.UpdateBy = long.Parse(user.UserId); //model.UpdatedUserName = UserManager.Name; - await tenantDb.Updateable(model).UpdateColumns(x => new { + await tenantDb.Updateable(model).UpdateColumns(x => new + { x.IsRecvBC, x.LstRecvBCDate, x.UpdateTime, @@ -1992,7 +2002,8 @@ namespace DS.WMS.Core.Op.Method model.UpdateBy = long.Parse(user.UserId); //model.UpdatedUserName = UserManager.Name; - await tenantDb.Updateable(model).UpdateColumns(x => new { + await tenantDb.Updateable(model).UpdateColumns(x => new + { x.IsRecvBKCancel, x.LstRecvBKCancelDate, x.UpdateTime, @@ -2011,6 +2022,41 @@ namespace DS.WMS.Core.Op.Method return DataResult.Success(result); } + + /// + /// 同步BC状态(BC,Cancellation)作为任务台执行模块 + /// + /// 数据上下文 + public async Task> SyncBCInfoTask(TaskFlowDataContext dataContext) + { + var messageInfo = dataContext.Get(TaskFlowDataNameConst.TaskManageOrderMessageInfo); + if (messageInfo == null) + { + throw new ArgumentNullException($"缺少参数:{TaskFlowDataNameConst.TaskManageOrderMessageInfo}"); + } + if (string.IsNullOrEmpty(messageInfo.Main?.BCInfo?.MBLNo)) + { + throw new ArgumentNullException($"提单号为空"); + } + + var tenantId = dataContext.Get(TaskFlowDataNameConst.TenantId); + if (tenantId == 0) + { + throw new ArgumentNullException($"缺少参数:TenantId"); + } + + string type = messageInfo.Main.TaskType switch + { + TaskBaseTypeEnum.BC => "BookingConfirmation", + TaskBaseTypeEnum.CANCELLATION => "Cancellation", + _ => throw new NotImplementedException() + }; + + var result = await this.SyncBCInfo(messageInfo.Main.BCInfo.MBLNo, tenantId, type); + Logger.Log(NLog.LogLevel.Info, $"入库完BC,自动推送状态到API订舱列表 mblno={messageInfo.Main.BCInfo.MBLNo} synRlt={JsonConvert.SerializeObject(result)}"); + + return result; + } #endregion #region 批量复制前调取校验预警 diff --git a/ds-wms-service/DS.WMS.Core/TaskPlat/Interface/IMyModuleTest1.cs b/ds-wms-service/DS.WMS.Core/TaskPlat/Interface/IMyModuleTest1.cs index 484c2ff2..67a98407 100644 --- a/ds-wms-service/DS.WMS.Core/TaskPlat/Interface/IMyModuleTest1.cs +++ b/ds-wms-service/DS.WMS.Core/TaskPlat/Interface/IMyModuleTest1.cs @@ -6,6 +6,7 @@ namespace DS.WMS.Core.TaskPlat.Interface public interface IMyModuleTest1 { Task TestMethod11(TaskFlowDataContext dataContext); + Task TestMethod11(); DataResult TestMethod12(TaskFlowDataContext dataContext); //public string G() diff --git a/ds-wms-service/DS.WMS.Core/TaskPlat/Method/MyModuleTest1.cs b/ds-wms-service/DS.WMS.Core/TaskPlat/Method/MyModuleTest1.cs index e0b29ce8..5977c589 100644 --- a/ds-wms-service/DS.WMS.Core/TaskPlat/Method/MyModuleTest1.cs +++ b/ds-wms-service/DS.WMS.Core/TaskPlat/Method/MyModuleTest1.cs @@ -21,6 +21,10 @@ namespace DS.WMS.Core.TaskPlat.Method return Task.FromResult(DataResult.Successed($"TestMethod11返回的成功结果,address:{address},height:{height},bcInfoVessel:{bcInfoVessel}")); } + public Task TestMethod11() + { + return Task.FromResult(DataResult.Successed($"TestMethod11返回的成功结果")); + } public DataResult TestMethod12(TaskFlowDataContext dataContext) { throw new Exception("TestMethod12内的测试异常"); diff --git a/ds-wms-service/DS.WMS.Core/TaskPlat/Method/TaskManageService.cs b/ds-wms-service/DS.WMS.Core/TaskPlat/Method/TaskManageService.cs index e6fa3ef1..38cdcf96 100644 --- a/ds-wms-service/DS.WMS.Core/TaskPlat/Method/TaskManageService.cs +++ b/ds-wms-service/DS.WMS.Core/TaskPlat/Method/TaskManageService.cs @@ -478,9 +478,14 @@ namespace DS.WMS.Core.TaskPlat.Method 2、推送钉钉消息@操作人 通知收到变更 */ - TaskFlowDataContext dataContext = new(nameof(TaskManageOrderMessageInfo), info); + // 执行自动化操作 + TaskFlowDataContext dataContext = new( + (TaskFlowDataNameConst.TaskManageOrderMessageInfo, info), + (TaskFlowDataNameConst.TenantId, long.Parse(user.TenantId)) + ); + TaskFlowRuner taskFlow = new TaskFlowRuner(tenantDb, serviceProvider); - await taskFlow.Run(info.Main.TaskType, info, taskInfo, dataContext); + await taskFlow.Run(info.Main.TaskType, taskInfo.Id, dataContext); if (info.Main.TaskType == TaskBaseTypeEnum.BC) { diff --git a/ds-wms-service/DS.WMS.Core/TaskPlat/Other/TaskFlowRuner.cs b/ds-wms-service/DS.WMS.Core/TaskPlat/Other/TaskFlowRuner.cs index cf72b666..fd8c8cfc 100644 --- a/ds-wms-service/DS.WMS.Core/TaskPlat/Other/TaskFlowRuner.cs +++ b/ds-wms-service/DS.WMS.Core/TaskPlat/Other/TaskFlowRuner.cs @@ -1,6 +1,5 @@ using DS.Module.Core; using DS.Module.Core.Data; -using DS.WMS.Core.TaskPlat.Dtos; using DS.WMS.Core.TaskPlat.Entity; using Newtonsoft.Json; using SqlSugar; @@ -33,16 +32,11 @@ namespace DS.WMS.Core.TaskPlat /// 执行 /// /// 任务类型 - /// 任务原始接收信息 - /// 任务基础信息 - /// 原始入参数据 + /// 任务Id + /// 起始入参数据上下文 /// (执行日志Id,模块是否全部执行完成,模块执行结果是否全部为success) - public async Task<(long flowLogId, bool isAllComplete, bool isAllSuccess)> Run(TaskBaseTypeEnum taskBaseType, TaskManageOrderMessageInfo messageInfo, TaskBaseInfo taskInfo, TaskFlowDataContext dataContext) + public async Task<(long flowLogId, bool isAllComplete, bool isAllSuccess)> Run(TaskBaseTypeEnum taskBaseType, long taskId, TaskFlowDataContext dataContext) { - if (taskInfo == null) - { - throw new ArgumentNullException(nameof(taskInfo)); - } if (dataContext == null) { throw new ArgumentNullException(nameof(dataContext)); @@ -58,7 +52,7 @@ namespace DS.WMS.Core.TaskPlat TaskFlowLog log = new() { IsMatch = false, - TaskId = taskInfo.Id, + TaskId = taskId, TaskType = taskBaseType.ToString(), IsComplete = false, ExceptionMessage = msg, @@ -73,43 +67,60 @@ namespace DS.WMS.Core.TaskPlat .Where(x => allConfigIdList.Contains(x.ConfigId)) .ToListAsync(); + // 判断每项流程达成的条件数量 Dictionary configMatchCount = allConfigList.ToDictionary(x => x.Id, x => 0); - - //dynamic taskInfoDynamic = taskInfo; foreach (var configItem in allConfigList) { var conditionListGroup = allConditionList.Where(x => x.ConfigId == configItem.Id); foreach (var conditionItem in conditionListGroup) { - var (_, val, _) = GetPropertyValue(messageInfo, conditionItem.FieldName); + string? valStr; + if (conditionItem.FieldName.Contains('.')) + { + var firstKey = conditionItem.FieldName.Split('.').First(); + + if (!dataContext.ContainsKey(firstKey)) continue; + + var obj = dataContext.Get(firstKey)!; - if (val == null) continue; + var propertyPath = conditionItem.FieldName.Substring(conditionItem.FieldName.IndexOf('.') + 1); + var (_, val, _) = GetPropertyValue(obj, propertyPath); + if (val == null) continue; + + valStr = val.ToString(); + } + else + { + if (!dataContext.ContainsKey(conditionItem.FieldName)) continue; + + var obj = dataContext.Get(conditionItem.FieldName)!; + valStr = obj.ToString(); + } - var valStr = val.ToString()!; if (conditionItem.MatchType == 1) { - if (valStr.Equals(conditionItem.MatchValue, StringComparison.CurrentCultureIgnoreCase)) + if (valStr?.Equals(conditionItem.MatchValue, StringComparison.CurrentCultureIgnoreCase) == true) { configMatchCount[configItem.Id] = configMatchCount[configItem.Id] + 1; } } else if (conditionItem.MatchType == 2) { - if (valStr.Contains(conditionItem.MatchValue!, StringComparison.CurrentCultureIgnoreCase)) + if (valStr?.Contains(conditionItem.MatchValue, StringComparison.CurrentCultureIgnoreCase) == true) { configMatchCount[configItem.Id] = configMatchCount[configItem.Id] + 1; } } else if (conditionItem.MatchType == 3) { - if (valStr.StartsWith(conditionItem.MatchValue!, StringComparison.CurrentCultureIgnoreCase)) + if (valStr?.StartsWith(conditionItem.MatchValue, StringComparison.CurrentCultureIgnoreCase) == true) { configMatchCount[configItem.Id] = configMatchCount[configItem.Id] + 1; } } else if (conditionItem.MatchType == 4) { - if (valStr.EndsWith(conditionItem.MatchValue!, StringComparison.CurrentCultureIgnoreCase)) + if (valStr?.EndsWith(conditionItem.MatchValue, StringComparison.CurrentCultureIgnoreCase) == true) { configMatchCount[configItem.Id] = configMatchCount[configItem.Id] + 1; } @@ -117,6 +128,7 @@ namespace DS.WMS.Core.TaskPlat } } + // 取出最匹配的流程 KeyValuePair? bestMatched = null!; foreach (var item in configMatchCount) { @@ -134,6 +146,7 @@ namespace DS.WMS.Core.TaskPlat if (item.Value == bestMatched.Value.Value) { + // 如果达成的条件数量相等,则取最早的流程 if (item.Key < bestMatched.Value.Key) { bestMatched = new KeyValuePair(item.Key, item.Value); @@ -154,7 +167,7 @@ namespace DS.WMS.Core.TaskPlat { Id = SnowFlakeSingle.Instance.NextId(), IsMatch = true, - TaskId = taskInfo.Id, + TaskId = taskId, TaskType = taskBaseType.ToString(), MatchMainConfigId = targetConfig.Id, ConfigList = JsonConvert.SerializeObject(configList), @@ -163,6 +176,7 @@ namespace DS.WMS.Core.TaskPlat IsSuccess = true, }; + // 执行流程 foreach (var configItem in configList) { TaskFlowLogDetail flowLogDetail = new() @@ -256,7 +270,7 @@ namespace DS.WMS.Core.TaskPlat flowLogDetail.IsComplete = false; flowLogDetail.IsSuccess = false; - flowLogDetail.ExceptionMessage = WriteLog("", ex); + flowLogDetail.ExceptionMessage = WriteLog("模块执行过程中发生异常", ex); await tenantDb.Insertable(flowLogDetail).ExecuteCommandAsync(); if (configItem.IsExceptionContinue) From ebae4bf0d5cd2b3d8ff46bd6b1ffbfb2a00e3d3a Mon Sep 17 00:00:00 2001 From: jianghaiqing Date: Fri, 19 Jul 2024 15:45:04 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=88=B1=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/BookingSlot/BookingSlotStockDto.cs | 58 +++++- .../Op/Dtos/BookingSlot/ImportSlotsDto.cs | 36 ++++ .../BookingSlot/IBookingSlotService.cs | 14 +- .../Method/BookingSlot/BookingSlotService.cs | 165 +++++++++--------- .../BookingSlotServiceController.cs | 43 ++--- .../PublishProfiles/FolderProfile.pubxml.user | 2 +- 6 files changed, 196 insertions(+), 122 deletions(-) create mode 100644 ds-wms-service/DS.WMS.Core/Op/Dtos/BookingSlot/ImportSlotsDto.cs diff --git a/ds-wms-service/DS.WMS.Core/Op/Dtos/BookingSlot/BookingSlotStockDto.cs b/ds-wms-service/DS.WMS.Core/Op/Dtos/BookingSlot/BookingSlotStockDto.cs index e794f1f1..889718af 100644 --- a/ds-wms-service/DS.WMS.Core/Op/Dtos/BookingSlot/BookingSlotStockDto.cs +++ b/ds-wms-service/DS.WMS.Core/Op/Dtos/BookingSlot/BookingSlotStockDto.cs @@ -1,5 +1,7 @@ -using System; +using SqlSugar; +using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -11,6 +13,11 @@ namespace DS.WMS.Core.Op.Dtos /// public class BookingSlotStockDto { + /// + /// 主键 + /// + public long Id { get; set; } + /// /// 船名 /// @@ -165,5 +172,54 @@ namespace DS.WMS.Core.Op.Dtos /// 剩余箱数 /// public int RemainCtnsNum { get; set; } + + /// + /// 备注 + /// + public string Note { get; set; } + + /// + /// 创建时间 + /// + public DateTime CreateTime { get; set; } + + /// + /// 创建人 + public long CreateBy { get; set; } + + /// + /// 创建人名称 + /// + public string CreateUserName { get; set; } + /// + /// 修改人 + /// + public long UpdateBy { get; set; } + /// + /// 修改人名称 + /// + public string UpdateUserName { get; set; } + /// + /// 更新时间 + /// + public DateTime UpdateTime { get; set; } + + /// + /// 删除 + /// + public bool Deleted { get; set; } = false; + /// + /// 删除人名称 + /// + public string DeleteUserName { get; set; } + /// + /// 删除时间 + /// + public DateTime DeleteTime { get; set; } + + /// + /// 删除人 + /// + public long DeleteBy { get; set; } } } diff --git a/ds-wms-service/DS.WMS.Core/Op/Dtos/BookingSlot/ImportSlotsDto.cs b/ds-wms-service/DS.WMS.Core/Op/Dtos/BookingSlot/ImportSlotsDto.cs new file mode 100644 index 00000000..10f8fa94 --- /dev/null +++ b/ds-wms-service/DS.WMS.Core/Op/Dtos/BookingSlot/ImportSlotsDto.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DS.WMS.Core.Op.Dtos +{ + /// + /// 引入舱位 + /// + public class ImportSlotsDto + { + /// + /// 待引入的舱位列表 + /// + public List slots { get; set; } + + /// + /// 待关联的订舱记录 + /// + public long bookingOrderId { get; set; } + + /// + /// 是否进行剩余量检查 + /// + + public bool isCheck { get; set; } + + /// + /// 额外的用于生成管理记录的信息 + /// + + public BookingGenerateDto generateModel { get; set; } + } +} diff --git a/ds-wms-service/DS.WMS.Core/Op/Interface/BookingSlot/IBookingSlotService.cs b/ds-wms-service/DS.WMS.Core/Op/Interface/BookingSlot/IBookingSlotService.cs index 2e94ddfe..c62b246a 100644 --- a/ds-wms-service/DS.WMS.Core/Op/Interface/BookingSlot/IBookingSlotService.cs +++ b/ds-wms-service/DS.WMS.Core/Op/Interface/BookingSlot/IBookingSlotService.cs @@ -52,12 +52,9 @@ namespace DS.WMS.Core.Op.Interface /// /// 为指定订舱记录引入舱位信息 /// - /// 待引入的舱位列表 - /// 待关联的订舱记录 - /// 是否进行剩余量检查 - /// 额外的用于生成管理记录的信息 + /// 引入的舱位请求参数 /// (是否成功,提示消息) - Task<(bool isSuccess, string message)> ImportSlots(List slots, long bookingOrderId, bool isCheck, BookingGenerateDto generateModel = null); + Task> ImportSlots(ImportSlotsDto model); /// /// 库存台账查询 @@ -88,12 +85,11 @@ namespace DS.WMS.Core.Op.Interface Task>> GetFile(long id); /// - /// 分页查询订舱舱位 + /// 舱位台账查询 /// - /// + /// 查询条件 /// - Task Page(BookingSlotBasePageInput input); - + Task>> GetPageAsync(PageRequest querySearch); /// /// 舱位接收保存、取消接口 diff --git a/ds-wms-service/DS.WMS.Core/Op/Method/BookingSlot/BookingSlotService.cs b/ds-wms-service/DS.WMS.Core/Op/Method/BookingSlot/BookingSlotService.cs index 132dc6b1..c4796052 100644 --- a/ds-wms-service/DS.WMS.Core/Op/Method/BookingSlot/BookingSlotService.cs +++ b/ds-wms-service/DS.WMS.Core/Op/Method/BookingSlot/BookingSlotService.cs @@ -47,6 +47,7 @@ using DS.WMS.Core.Code.Interface; using DS.WMS.Core.Code.Method; using DS.WMS.Core.Map.Method; using DS.Module.Core.Extensions; +using DS.Module.Core.Constants; namespace DS.WMS.Core.Op.Method { @@ -173,17 +174,17 @@ namespace DS.WMS.Core.Op.Method if (isNeedUpdateOldStock) { //更新库存 - //await _publisher.PublishAsync(new ChannelEventSource("BookingSlotStock:Update", new BookingSlotStockUpdateModel - //{ - // BOOKING_SLOT_TYPE = oldObj.BOOKING_SLOT_TYPE, - // CARRIERID = oldObj.CARRIERID, - // CONTRACT_NO = oldObj.CONTRACT_NO, - // VESSEL = oldObj.VESSEL, - // VOYNO = oldObj.VOYNO, - // PORTLOADID = oldObj.PORTLOADID, - // PORTDISCHARGEID = oldObj.PORTDISCHARGEID, - // TenantId = model.TenantId - //})); + await _bookingSlotStockService.BookingSlotStock(new BookingSlotStockUpdateModel + { + BookingSlotType = oldObj.BookingSlotType, + CarrierCode = oldObj.CarrierCode, + ContractNo = oldObj.ContractNo, + Vessel = oldObj.Vessel, + Voyno = oldObj.Voyno, + PortLoadId = oldObj.PortLoadId, + PortDischargeId = oldObj.PortDischargeId, + TenantId = long.Parse(user.TenantId) + }); } var delCtnList = tenantDb.Queryable().Where(x => x.SlotId == model.Id).ToList(); @@ -342,17 +343,17 @@ namespace DS.WMS.Core.Op.Method } //更新库存 - //await _publisher.PublishAsync(new ChannelEventSource("BookingSlotStock:Update", new BookingSlotStockUpdateModel - //{ - // BOOKING_SLOT_TYPE = model.BOOKING_SLOT_TYPE, - // CARRIERID = model.CARRIERID, - // CONTRACT_NO = model.CONTRACT_NO, - // VESSEL = model.VESSEL, - // VOYNO = model.VOYNO, - // PORTLOADID = model.PORTLOADID, - // PORTDISCHARGEID = model.PORTDISCHARGEID, - // TenantId = model.TenantId - //})); + await _bookingSlotStockService.BookingSlotStock(new BookingSlotStockUpdateModel + { + BookingSlotType = model.BookingSlotType, + CarrierCode = model.CarrierCode, + ContractNo = model.ContractNo, + Vessel = model.Vessel, + Voyno = model.Voyno, + PortLoadId = model.PortLoadCode, + PortDischargeId = model.PortDischargeCode, + TenantId = long.Parse(user.TenantId) + }); var inputDto = new BookingSlotBaseApiDto { @@ -2238,7 +2239,13 @@ namespace DS.WMS.Core.Op.Method if (id > 0) { ////对应订舱和舱位关系 - var allocRlt = await ImportSlots(importSlots, id, false, generateModel); + var allocRlt = await ImportSlots(new ImportSlotsDto { + slots = importSlots, + bookingOrderId = id, + isCheck = false, + generateModel = generateModel + }); + Logger.Log(NLog.LogLevel.Info, "根据舱位生成订舱,引入订舱关系完成"); //更新舱位的拆合单标记 @@ -2404,38 +2411,32 @@ namespace DS.WMS.Core.Op.Method } #endregion + #region 为指定订舱记录引入舱位信息 /// /// 为指定订舱记录引入舱位信息 /// - /// 待引入的舱位列表 - /// 待关联的订舱记录 - /// 是否进行剩余量检查 - /// 额外的用于生成管理记录的信息 - /// isSuccess:检查(余量及已引用检查)是否成功通过,message:提示信息 - [NonAction] - public async Task<(bool isSuccess, string message)> ImportSlots(List slots, - long bookingOrderId, - bool isCheck, - BookingGenerateDto generateModel = null) + /// 引入的舱位请求参数 + /// 返回回执 + public async Task> ImportSlots(ImportSlotsDto model) { - slots ??= new List(); + model.slots ??= new List(); var tenantDb = saasService.GetBizDbScopeById(user.TenantId); Monitor.Enter(ImportLockObj); try { - if (isCheck) + if (model.isCheck) { - (bool isExists, bool isEnough, string message) checkResult = await CheckImportSlots(slots, bookingOrderId); + (bool isExists, bool isEnough, string message) checkResult = await CheckImportSlots(model.slots, model.bookingOrderId); if (checkResult.isExists || !checkResult.isEnough) - return (false, checkResult.message); + return DataResult.FailedData(checkResult.message); } - var slotIdList = slots.Select(s => s.Id).ToList(); + var slotIdList = model.slots.Select(s => s.Id).ToList(); List latestSlotList = await tenantDb.Queryable().Where(b => slotIdList.Contains(b.Id)).ToListAsync(); - foreach (var inSlotItem in slots) + foreach (var inSlotItem in model.slots) { var latestSlot = latestSlotList.First(b => b.Id == inSlotItem.Id); @@ -2454,33 +2455,33 @@ namespace DS.WMS.Core.Op.Method var newSlotAllocation = latestSlot.Adapt(config); newSlotAllocation.Id = 0; newSlotAllocation.BookingSlotId = latestSlot.Id; - newSlotAllocation.BookingId = bookingOrderId; + newSlotAllocation.BookingId = model.bookingOrderId; newSlotAllocation.AlloBillNo = latestSlot.SlotBookingNo; newSlotAllocation.FinalBillNo = latestSlot.SlotBookingNo; - if (generateModel != null) - { - newSlotAllocation.CustomerId = generateModel.CustomerId; - newSlotAllocation.CustomerName = generateModel.CustomerName; - newSlotAllocation.CustServiceId = generateModel.CustServiceId?.ToString(); - newSlotAllocation.CustService = generateModel.CustServiceName; - newSlotAllocation.SaleId = generateModel.SaleId?.ToString(); - newSlotAllocation.Sale = generateModel.SaleName; - newSlotAllocation.DocId = generateModel.DocId?.ToString(); - newSlotAllocation.Doc = generateModel.DocName; - newSlotAllocation.OpId = generateModel.OpId?.ToString(); - newSlotAllocation.Op = generateModel.OpName; - newSlotAllocation.Business = generateModel.BUSINESS; - newSlotAllocation.BusinessId = generateModel.BUSINESSID; - newSlotAllocation.SaleTime = generateModel.SALE_TIME; - newSlotAllocation.Shipper = generateModel.SHIPPER; - newSlotAllocation.GoodsName = generateModel.GOODSNAME; - newSlotAllocation.SellingPrice = generateModel.SELLING_PRICE; - newSlotAllocation.SplitOrMergeFlag = generateModel.SplitOrMerge; - - if (generateModel.SplitOrMerge == 1 || generateModel.SplitOrMerge == 2) + if (model.generateModel != null) + { + newSlotAllocation.CustomerId = model.generateModel.CustomerId; + newSlotAllocation.CustomerName = model.generateModel.CustomerName; + newSlotAllocation.CustServiceId = model.generateModel.CustServiceId?.ToString(); + newSlotAllocation.CustService = model.generateModel.CustServiceName; + newSlotAllocation.SaleId = model.generateModel.SaleId?.ToString(); + newSlotAllocation.Sale = model.generateModel.SaleName; + newSlotAllocation.DocId = model.generateModel.DocId?.ToString(); + newSlotAllocation.Doc = model.generateModel.DocName; + newSlotAllocation.OpId = model.generateModel.OpId?.ToString(); + newSlotAllocation.Op = model.generateModel.OpName; + newSlotAllocation.Business = model.generateModel.BUSINESS; + newSlotAllocation.BusinessId = model.generateModel.BUSINESSID; + newSlotAllocation.SaleTime = model.generateModel.SALE_TIME; + newSlotAllocation.Shipper = model.generateModel.SHIPPER; + newSlotAllocation.GoodsName = model.generateModel.GOODSNAME; + newSlotAllocation.SellingPrice = model.generateModel.SELLING_PRICE; + newSlotAllocation.SplitOrMergeFlag = model.generateModel.SplitOrMerge; + + if (model.generateModel.SplitOrMerge == 1 || model.generateModel.SplitOrMerge == 2) { - newSlotAllocation.AlloBillNo = generateModel.NewMBlNo; + newSlotAllocation.AlloBillNo = model.generateModel.NewMBlNo; } } @@ -2504,7 +2505,7 @@ namespace DS.WMS.Core.Op.Method { var file = lastestBcFile.Adapt(); file.Id = 0; - file.LinkId = bookingOrderId; + file.LinkId = model.bookingOrderId; await tenantDb.Insertable(file).ExecuteCommandAsync(); } @@ -2515,21 +2516,10 @@ namespace DS.WMS.Core.Op.Method ContractNo = latestSlot.ContractNo, Vessel = latestSlot.Vessel, Voyno = latestSlot.Voyno, + PortLoadId = latestSlot.PortLoadCode, PortDischargeId = latestSlot.PortLoadCode, - //PORTDISCHARGEID = latestSlot.PORTDISCHARGEID, }); - // 更新库存 - //await _publisher.PublishAsync(new ChannelEventSource("BookingSlotStock:Update", new Event.BookingSlotStockUpdateModel - //{ - // BOOKING_SLOT_TYPE = latestSlot.BOOKING_SLOT_TYPE, - // CARRIERID = latestSlot.CARRIERID, - // CONTRACT_NO = latestSlot.CONTRACT_NO, - // VESSEL = latestSlot.VESSEL, - // VOYNO = latestSlot.VOYNO, - // PORTLOADID = latestSlot.PORTLOADID, - // PORTDISCHARGEID = latestSlot.PORTDISCHARGEID, - // TenantId = latestSlot.TenantId, - //})); + } } finally @@ -2537,8 +2527,9 @@ namespace DS.WMS.Core.Op.Method Monitor.Exit(ImportLockObj); } - return (true, "引入成功"); + return DataResult.Success("引入成功"); } + #endregion #region 检索舱位对应的订舱订单(BY 舱位主键) /// @@ -2693,9 +2684,25 @@ namespace DS.WMS.Core.Op.Method throw new NotImplementedException(); } - Task IBookingSlotService.Page(BookingSlotBasePageInput input) + /// + /// 舱位台账查询 + /// + /// 查询条件 + /// + public async Task>> GetPageAsync(PageRequest querySearch) { - throw new NotImplementedException(); + var tenantDb = saasService.GetBizDbScopeById(user.TenantId); + //序列化查询条件 + var whereList = db.ConfigQuery.Context.Utilities.JsonToConditionalModels(querySearch.QueryCondition); + var result = tenantDb.Queryable() + .InnerJoin((a, b) => a.Id == b.SlotId) + .Select() + .Where(whereList); + //.ToQueryPageAsync(request.PageCondition); + var list = result.ToList(); + var data = await result.ToQueryPageAsync(querySearch.PageCondition); + + return data; } Task IBookingSlotService.InnerApiReceive(BookingSlotBaseApiDto dto, DynameFileInfo file, DynameFileInfo modifyFile) diff --git a/ds-wms-service/DS.WMS.OpApi/Controllers/BookingSlotServiceController.cs b/ds-wms-service/DS.WMS.OpApi/Controllers/BookingSlotServiceController.cs index 38a308d0..31a43d93 100644 --- a/ds-wms-service/DS.WMS.OpApi/Controllers/BookingSlotServiceController.cs +++ b/ds-wms-service/DS.WMS.OpApi/Controllers/BookingSlotServiceController.cs @@ -78,8 +78,7 @@ namespace DS.WMS.OpApi.Controllers /// 检查指定订舱记录,是否可以引入舱位列表 /// /// 待引入的舱位列表 - /// 待关联的订舱记录 - /// (指定订舱记录是否已经引入过舱位数据,现有舱位及箱子是否满足需求,提示信息) + /// 返回回执 [HttpPost] [Route("CheckImportSlots")] public async Task CheckImportSlots([FromBody] List slots) @@ -92,16 +91,13 @@ namespace DS.WMS.OpApi.Controllers /// /// 为指定订舱记录引入舱位信息 /// - /// 待引入的舱位列表 - /// 待关联的订舱记录 - /// 是否进行剩余量检查 - /// 额外的用于生成管理记录的信息 + /// 引入舱位参数 /// (是否成功,提示消息) [HttpPost] [Route("ImportSlots")] - public async Task ImportSlots([FromBody] List slots) + public async Task> ImportSlots([FromBody] ImportSlotsDto model) { - return null;//await _bookingSlotService.ImportSlots(slots, 0, false, null); + return await _bookingSlotService.ImportSlots(model); } #endregion @@ -140,8 +136,8 @@ namespace DS.WMS.OpApi.Controllers /// 舱位详情 /// 返回输出 [HttpPost] - [Route("Save3")] - public async Task> Save3([FromBody] BookingSlotBaseSaveInput input) + [Route("Save")] + public async Task> Save([FromBody] BookingSlotBaseSaveInput input) { return await _bookingSlotService.Save(input); } @@ -163,32 +159,15 @@ namespace DS.WMS.OpApi.Controllers #region 分页查询订舱舱位 /// - /// 分页查询订舱舱位 + /// 舱位台账查询 /// - /// + /// 查询条件 /// [HttpPost] - [Route("Page")] - public async Task Page([FromBody] BookingSlotBasePageInput input) + [Route("GetPage")] + public async Task>> GetPageAsync(PageRequest querySearch) { - return await _bookingSlotService.Page(input); - } - #endregion - - #region 舱位接收保存、取消接口 - /// - /// 舱位接收保存、取消接口 - /// - /// - /// - /// - /// - [HttpPost] - [Route("InnerApiReceive")] - public async Task> InnerApiReceive([FromBody] BookingSlotBaseApiDto dto) - { - return null;// await _bookingSlotService.InnerApiReceive(dto, null, null); - + return await _bookingSlotService.GetPageAsync(querySearch); } #endregion diff --git a/ds-wms-service/DS.WMS.OpApi/Properties/PublishProfiles/FolderProfile.pubxml.user b/ds-wms-service/DS.WMS.OpApi/Properties/PublishProfiles/FolderProfile.pubxml.user index 9a4fd0d9..47a47f25 100644 --- a/ds-wms-service/DS.WMS.OpApi/Properties/PublishProfiles/FolderProfile.pubxml.user +++ b/ds-wms-service/DS.WMS.OpApi/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -6,7 +6,7 @@ <_PublishTargetUrl>D:\Code\PublishCopy\ds8-opapi - True|2024-07-19T05:48:27.9722093Z||;False|2024-07-19T13:47:56.7900396+08:00||;True|2024-07-19T11:41:15.4223247+08:00||;True|2024-07-19T08:46:28.8014836+08:00||;True|2024-07-18T19:24:50.4184188+08:00||;True|2024-07-18T19:19:14.7056635+08:00||;True|2024-07-18T19:04:43.5615501+08:00||;True|2024-07-18T18:38:39.1976753+08:00||;True|2024-07-18T18:25:15.6833492+08:00||;True|2024-07-18T18:08:46.3114951+08:00||;True|2024-07-18T17:59:12.5292256+08:00||;True|2024-07-18T16:18:45.8049777+08:00||;True|2024-07-18T16:12:42.9723969+08:00||;True|2024-07-18T16:07:14.1432207+08:00||;True|2024-07-17T17:44:18.4741963+08:00||;True|2024-07-17T17:42:47.2735071+08:00||;True|2024-07-17T16:13:32.9037697+08:00||;True|2024-07-17T15:40:21.2550083+08:00||;True|2024-07-17T14:03:08.1814323+08:00||;True|2024-07-15T13:43:42.6073130+08:00||;True|2024-07-15T11:53:40.6498579+08:00||;True|2024-07-15T11:53:03.1652559+08:00||;True|2024-07-15T11:42:33.0154478+08:00||;True|2024-07-15T10:20:03.3925876+08:00||;True|2024-07-15T10:13:28.1415352+08:00||;True|2024-07-08T14:33:12.6884426+08:00||;True|2024-07-08T09:56:58.4995696+08:00||; + True|2024-07-19T07:33:45.3242155Z||;False|2024-07-19T15:32:41.9604526+08:00||;True|2024-07-19T13:48:27.9722093+08:00||;False|2024-07-19T13:47:56.7900396+08:00||;True|2024-07-19T11:41:15.4223247+08:00||;True|2024-07-19T08:46:28.8014836+08:00||;True|2024-07-18T19:24:50.4184188+08:00||;True|2024-07-18T19:19:14.7056635+08:00||;True|2024-07-18T19:04:43.5615501+08:00||;True|2024-07-18T18:38:39.1976753+08:00||;True|2024-07-18T18:25:15.6833492+08:00||;True|2024-07-18T18:08:46.3114951+08:00||;True|2024-07-18T17:59:12.5292256+08:00||;True|2024-07-18T16:18:45.8049777+08:00||;True|2024-07-18T16:12:42.9723969+08:00||;True|2024-07-18T16:07:14.1432207+08:00||;True|2024-07-17T17:44:18.4741963+08:00||;True|2024-07-17T17:42:47.2735071+08:00||;True|2024-07-17T16:13:32.9037697+08:00||;True|2024-07-17T15:40:21.2550083+08:00||;True|2024-07-17T14:03:08.1814323+08:00||;True|2024-07-15T13:43:42.6073130+08:00||;True|2024-07-15T11:53:40.6498579+08:00||;True|2024-07-15T11:53:03.1652559+08:00||;True|2024-07-15T11:42:33.0154478+08:00||;True|2024-07-15T10:20:03.3925876+08:00||;True|2024-07-15T10:13:28.1415352+08:00||;True|2024-07-08T14:33:12.6884426+08:00||;True|2024-07-08T09:56:58.4995696+08:00||; \ No newline at end of file From 1db768c7467e63a27bf257cf32a8b7197231cfef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B5=87=E6=96=87=E9=BE=99?= Date: Fri, 19 Jul 2024 16:15:27 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E7=94=9F=E6=88=90=E5=8F=91=E7=A5=A8?= =?UTF-8?q?=E6=98=8E=E7=BB=86=E7=9A=84bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DS.Module.Core/Data/BaseModel.cs | 29 +- .../Entity/ApplicationDetailRelation.cs | 60 +++ .../Entity/FeeCodeInvoiceDetail.cs | 43 -- .../DS.WMS.Core/Invoice/Dtos/BuildOption.cs | 14 + .../Invoice/Method/GeneralInvoiceService.cs | 23 + .../Invoice/Method/InvoiceService`1.cs | 484 +++++++++++++----- .../Controllers/GeneralInvoiceController.cs | 2 +- .../DS.WMS.FeeApi/Logs/internal-nlog.txt | 168 ++++++ 8 files changed, 640 insertions(+), 183 deletions(-) create mode 100644 ds-wms-service/DS.WMS.Core/Application/Entity/ApplicationDetailRelation.cs delete mode 100644 ds-wms-service/DS.WMS.Core/Application/Entity/FeeCodeInvoiceDetail.cs create mode 100644 ds-wms-service/DS.WMS.Core/Invoice/Dtos/BuildOption.cs diff --git a/ds-wms-service/DS.Module.Core/Data/BaseModel.cs b/ds-wms-service/DS.Module.Core/Data/BaseModel.cs index 645b16a6..7b82c327 100644 --- a/ds-wms-service/DS.Module.Core/Data/BaseModel.cs +++ b/ds-wms-service/DS.Module.Core/Data/BaseModel.cs @@ -40,7 +40,7 @@ public abstract class BaseModel : IDeleted /// 创建人名称 /// [Description("创建人名称")] - [SugarColumn(IsOnlyIgnoreUpdate = true, IsNullable = true, ColumnDescription = "创建人名称", Length =50)] + [SugarColumn(IsOnlyIgnoreUpdate = true, IsNullable = true, ColumnDescription = "创建人名称", Length = 50)] public string CreateUserName { get; set; } /// /// 修改人 @@ -117,7 +117,7 @@ public abstract class BaseModelV2 : IDeleted /// 创建时间 /// [Description("创建时间")] - [SqlSugar.SugarColumn(IsOnlyIgnoreUpdate = true, ColumnDescription = "创建时间")] + [SugarColumn(IsOnlyIgnoreUpdate = true, ColumnDescription = "创建时间")] public DateTime CreateTime { get; set; } /// @@ -152,13 +152,34 @@ public abstract class BaseModelV2 : IDeleted /// 删除时间 /// [Description("删除时间")] - [SugarColumn(IsNullable = true, ColumnDescription = "删除时间")] + [SugarColumn(IsNullable = true, ColumnDescription = "删除时间", IsOnlyIgnoreInsert = true)] public DateTime? DeleteTime { get; set; } /// /// 删除人 /// [Description("删除人")] - [SugarColumn(IsNullable = true, ColumnDescription = "删除人")] + [SugarColumn(IsNullable = true, ColumnDescription = "删除人", IsOnlyIgnoreInsert = true)] public long? DeleteBy { get; set; } + + /// + /// 创建人名称 + /// + [Description("创建人名称")] + [SugarColumn(IsOnlyIgnoreUpdate = true, IsNullable = true, ColumnDescription = "创建人名称", Length = 50)] + public string? CreateUserName { get; set; } + + /// + /// 修改人名称 + /// + [Description("修改人名称")] + [SugarColumn(IsNullable = true, ColumnDescription = "修改人名称", Length = 50)] + public string? UpdateUserName { get; set; } + + /// + /// 删除人名称 + /// + [Description("删除人名称")] + [SugarColumn(IsNullable = true, ColumnDescription = "删除人名称", Length = 50, IsOnlyIgnoreInsert = true)] + public string? DeleteUserName { get; set; } } \ No newline at end of file diff --git a/ds-wms-service/DS.WMS.Core/Application/Entity/ApplicationDetailRelation.cs b/ds-wms-service/DS.WMS.Core/Application/Entity/ApplicationDetailRelation.cs new file mode 100644 index 00000000..dae1327e --- /dev/null +++ b/ds-wms-service/DS.WMS.Core/Application/Entity/ApplicationDetailRelation.cs @@ -0,0 +1,60 @@ +using DS.WMS.Core.Fee.Entity; +using SqlSugar; + +namespace DS.WMS.Core.Application.Entity +{ + /// + /// 费用代码与发票申请明细关系 + /// + [SugarTable("application_detail_relation", TableDescription = "发票明细与费用明细关系")] + public class ApplicationDetailRelation + { + /// + /// 费用明细ID + /// + [SugarColumn(IsPrimaryKey = true)] + public long DetailId { get; set; } + + /// + /// 发票明细 + /// + [Navigate(NavigateType.OneToOne, nameof(DetailId))] + public ApplicationDetail? Detail { get; set; } + + /// + /// 发票明细ID + /// + [SugarColumn(IsPrimaryKey = true)] + public long InvoiceDetailId { get; set; } + + /// + /// 发票明细 + /// + [Navigate(NavigateType.OneToOne, nameof(InvoiceDetailId))] + public InvoiceDetail? InvoiceDetail { get; set; } + + ///// + ///// 费用代码ID + ///// + //public long? FeeId { get; set; } + + ///// + ///// 费用代码 + ///// + //[Navigate(NavigateType.OneToOne, nameof(FeeId))] + //public FeeCode? FeeCode { get; set; } + + /// + /// 发票申请/发票ID + /// + [SugarColumn(ColumnDescription = "发票申请/发票ID", IsNullable = false)] + public long InvoiceId { get; set; } + + /// + /// 原始发票明细名称 + /// + [SugarColumn(ColumnDescription = "原始发票明细名称", IsNullable = false, Length = 50)] + public string OriginalName { get; set; } + + } +} diff --git a/ds-wms-service/DS.WMS.Core/Application/Entity/FeeCodeInvoiceDetail.cs b/ds-wms-service/DS.WMS.Core/Application/Entity/FeeCodeInvoiceDetail.cs deleted file mode 100644 index d21fedf6..00000000 --- a/ds-wms-service/DS.WMS.Core/Application/Entity/FeeCodeInvoiceDetail.cs +++ /dev/null @@ -1,43 +0,0 @@ -using DS.WMS.Core.Fee.Entity; -using SqlSugar; - -namespace DS.WMS.Core.Application.Entity -{ - /// - /// 费用代码与发票申请明细关系 - /// - [SugarTable("fee_code_invoice_detail", TableDescription = "费用代码与发票申请明细关系")] - public class FeeCodeInvoiceDetail - { - /// - /// 费用代码ID - /// - [SugarColumn(IsPrimaryKey = true)] - public long FeeCodeId { get; set; } - - /// - /// 费用代码 - /// - [Navigate(NavigateType.OneToOne, nameof(FeeCodeId))] - public FeeCode? FeeCode { get; set; } - - /// - /// 发票明细ID - /// - [SugarColumn(IsPrimaryKey = true)] - public long InvoiceDetailId { get; set; } - - /// - /// 费用代码 - /// - [Navigate(NavigateType.OneToOne, nameof(InvoiceDetailId))] - public InvoiceDetail? InvoiceDetail { get; set; } - - /// - /// 发票明细名称 - /// - [SugarColumn(ColumnDescription = "发票明细名称", Length = 50, IsNullable = false)] - public string DetailName { get; set; } = string.Empty; - - } -} diff --git a/ds-wms-service/DS.WMS.Core/Invoice/Dtos/BuildOption.cs b/ds-wms-service/DS.WMS.Core/Invoice/Dtos/BuildOption.cs new file mode 100644 index 00000000..c791fe3d --- /dev/null +++ b/ds-wms-service/DS.WMS.Core/Invoice/Dtos/BuildOption.cs @@ -0,0 +1,14 @@ +namespace DS.WMS.Core.Invoice.Dtos +{ + /// + /// 发票明细操作类型 + /// + public enum BuildOption + { + Create, + + Update, + + Delete + } +} diff --git a/ds-wms-service/DS.WMS.Core/Invoice/Method/GeneralInvoiceService.cs b/ds-wms-service/DS.WMS.Core/Invoice/Method/GeneralInvoiceService.cs index 04b8b7bf..502eb8b6 100644 --- a/ds-wms-service/DS.WMS.Core/Invoice/Method/GeneralInvoiceService.cs +++ b/ds-wms-service/DS.WMS.Core/Invoice/Method/GeneralInvoiceService.cs @@ -116,6 +116,8 @@ namespace DS.WMS.Core.Invoice.Method return DataResult>.Success(details); } + + protected override Task PreSaveAsync(Entity.Invoice invoice) { invoice.Type = InvoiceType.Applcation; @@ -123,11 +125,32 @@ namespace DS.WMS.Core.Invoice.Method return Task.FromResult(DataResult.Success); } + protected override async Task OnSaveAsync(Entity.Invoice invoice) + { + var list = invoice.Details?.Where(x => x.DetailId.HasValue).Select(x => new ApplicationDetail + { + Id = x.DetailId.GetValueOrDefault(), + ProcessedAmount = x.ApplyAmount, + OriginalProcessedAmount = x.OriginalAmount + }).ToList(); + + if (list != null && list.Count > 0) + { + //增加发票申请明细的已处理金额 + await TenantDb.Updateable(list) + .PublicSetColumns(x => x.ProcessedAmount, "+").PublicSetColumns(x => x.OriginalProcessedAmount, "+") + .UpdateColumns(x => new { x.ProcessedAmount, x.OriginalProcessedAmount }) + .ExecuteCommandAsync(); + } + } + protected override Task PostSaveAsync(Entity.Invoice invoice) { return Task.Factory.StartNew(UpdateInvoiceApplications, new List { invoice }); } + + protected override async Task OnDeleteDetailAsync(List invoices, DeleteOption deleteOption) { var list = invoices.SelectMany(x => x.Details).Where(x => x.DetailId.HasValue).Select(x => new ApplicationDetail diff --git a/ds-wms-service/DS.WMS.Core/Invoice/Method/InvoiceService`1.cs b/ds-wms-service/DS.WMS.Core/Invoice/Method/InvoiceService`1.cs index 976163b8..6b5e7c51 100644 --- a/ds-wms-service/DS.WMS.Core/Invoice/Method/InvoiceService`1.cs +++ b/ds-wms-service/DS.WMS.Core/Invoice/Method/InvoiceService`1.cs @@ -163,6 +163,7 @@ namespace DS.WMS.Core.Invoice.Method #pragma warning disable CS4014 + /// /// 提交发票开票 /// @@ -215,7 +216,8 @@ namespace DS.WMS.Core.Invoice.Method x.OriginalProcessedAmount, y.CustomerId }).ToListAsync(); - invoice.Details = new List(details.Count); + + invoice.Details ??= new List(details.Count); foreach (var item in details) { @@ -271,7 +273,8 @@ namespace DS.WMS.Core.Invoice.Method //将请求明细转换为数据库的费用明细 invoice.Details = request.Details.Select(x => new ApplicationDetail { - ApplicationId = x.ApplicationId, + Id = x.Id, + ApplicationId = x.ApplicationId == 0 ? x.ApplicationId : invoice.Id, RefId = x.RefId, DetailId = x.Id == 0 ? null : x.Id, RecordId = x.RecordId, @@ -280,17 +283,19 @@ namespace DS.WMS.Core.Invoice.Method FeeId = x.FeeId, FeeName = x.FeeName, FeeType = x.FeeType, - ApplyAmount = x.Amount, Currency = x.Currency, + ApplyAmount = x.ApplyAmount, ExchangeRate = x.ExchangeRate, OriginalAmount = x.OriginalAmount, OriginalCurrency = x.OriginalCurrency ?? (invoice.Currency.IsNullOrEmpty() ? x.Currency : invoice.Currency), }).ToList(); } - if (invoice.Details?.Count > 0) { + //筛选出新增的费用明细 + invoice.Details = invoice.Details.FindAll(x => x.Id == 0); + //金额禁止为0 if (invoice.Details.Any(x => x.ApplyAmount == 0 || x.OriginalAmount == 0)) return DataResult.FailedWithDesc(nameof(MultiLanguageConst.AmountCannotBeZero)); @@ -304,18 +309,15 @@ namespace DS.WMS.Core.Invoice.Method result = await PreSaveAsync(invoice); if (!result.Succeeded) return DataResult.Failed(result.Message, result.MultiCode); - - invoice.ApplyAmount = invoice.Details.Sum(x => x.ApplyAmount); - invoice.AmountUppercase = new Money(invoice.ApplyAmount).ToString(); - invoice.OriginalAmount = invoice.Details.Sum(x => x.OriginalAmount); - invoice.OtherInvoiceAmount = invoice.Details.Where(x => x.Currency != RMB_CODE).Sum(x => x.OriginalAmount); } await TenantDb.Ado.BeginTranAsync(); try { + BuildOption buildOption; if (invoice.Id == 0)//新增 { + buildOption = BuildOption.Create; //创建时需要生成申请单编号 var sequence = CommonService.Value.GetSequenceNext(); if (!sequence.Succeeded) @@ -328,30 +330,33 @@ namespace DS.WMS.Core.Invoice.Method } else//编辑 { - if (invoice.Details?.Count > 0) + buildOption = BuildOption.Update; + await TenantDb.Updateable(invoice).UpdateColumns(x => new { + x.InvoiceNO, + x.InvoiceDate, + //x.Currency, + x.ReceiptCurrency, + x.CustomerId, + x.CustomerName, + x.AutualCustomerName, + x.InvoiceHeader, + x.Account, + x.CustomerAddTel, + x.CustomerBank, + x.OperatorId, + x.TaxID, + x.TaxRate, + x.OrgId, + x.SaleDeptId + }).ExecuteCommandAsync(); + + if (invoice.Details?.Count > 0) await TenantDb.Insertable(invoice.Details).ExecuteCommandAsync(); - ////因需要重新生成明细,所以要先清空现有发票明细 - //await TenantDb.Deleteable().Where(x => x.ApplicationId == invoice.Id).ExecuteCommandAsync(); - } - else if (invoice.InvoiceDetails?.Count > 0) - { - //更新发票明细 + if (invoice.InvoiceDetails?.Count > 0) + //发票明细只有更新 await TenantDb.Updateable(invoice.InvoiceDetails).IgnoreColumns(x => new { x.Category }).ExecuteCommandAsync(); - } - - await TenantDb.Updateable(invoice).IgnoreColumns(x => new - { - x.BillNO, - x.IsLocked, - - x.CreateBy, - x.CreateTime, - x.Deleted, - x.DeleteBy, - x.DeleteTime - }).ExecuteCommandAsync(); } if (invoice.Details?.Count > 0) @@ -360,21 +365,26 @@ namespace DS.WMS.Core.Invoice.Method var fees = invoice.Details.Select(x => new FeeRecord { Id = x.RecordId, - InvoiceAmount = x.OriginalAmount + InvoiceAmount = x.OriginalAmount, + OrderInvSettlementAmount = x.OriginalAmount, }).ToList(); - await TenantDb.Updateable(fees) - .PublicSetColumns(x => x.InvoiceAmount, "+") - .UpdateColumns(x => new { x.InvoiceAmount }) - .ExecuteCommandAsync(); - await BuildInvoiceDetailAsync([invoice]); - if (invoice.InvoiceDetails?.Count > 0) - await TenantDb.Insertable(invoice.InvoiceDetails).ExecuteCommandAsync(); + var updateable = TenantDb.Updateable(fees).PublicSetColumns(x => x.InvoiceAmount, "+"); + if (invoice.Type == InvoiceType.Applcation) + updateable = updateable.PublicSetColumns(x => x.OrderInvSettlementAmount, "+") + .UpdateColumns(x => new { x.OrderInvSettlementAmount }); + + await updateable.UpdateColumns(x => new { x.InvoiceAmount }).ExecuteCommandAsync(); + + //生成发票明细 + await BuildInvoiceDetailAsync(invoice, buildOption); + + //重新计算发票总金额 + await RefreshInvoiceAsync([invoice]); } await OnSaveAsync(invoice); await TenantDb.Ado.CommitTranAsync(); - PostSaveAsync(invoice); return DataResult.Success(invoice); @@ -387,6 +397,199 @@ namespace DS.WMS.Core.Invoice.Method } } + /// + /// 生成发票明细 + /// + /// 发票 + /// 生成类型 + /// + protected async Task BuildInvoiceDetailAsync(TEntity invoice, BuildOption option) + { + if (invoice.Details == null || invoice.Details.Count == 0) + return; + + var ids = invoice.Details.Select(x => x.Id); + if (option == BuildOption.Create) + { + var feesCodes = await TenantDb.Queryable().InnerJoin((d, fc) => d.FeeId == fc.Id && ids.Contains(d.Id)) + .Select((d, fc) => new + { + DetailId = d.Id, + FeeId = fc.Id, + fc.GoodName + }).ToListAsync(); + var feeCodeGroups = feesCodes.GroupBy(x => x.GoodName).ToList(); + + invoice.InvoiceDetails = new List(feeCodeGroups.Count); + List relations = []; + foreach (var g in feeCodeGroups) + { + var invDetail = new InvoiceDetail + { + Id = SnowFlakeSingle.Instance.NextId(), + ApplicationId = invoice.Id, + Name = g.Key, + TaxRate = invoice.TaxRate, + TaxUnitPrice = invoice.Details.FindAll(x => g.Select(x => x.DetailId).Contains(x.Id)).Sum(x => x.ApplyAmount), + Category = DetailCategory.InvoiceIssuance + }; + invDetail.TaxAmount = invDetail.TaxUnitPrice * invoice.TaxRate; + invDetail.UnitPrice = invDetail.TaxUnitPrice - invDetail.TaxAmount; + + invoice.InvoiceDetails.Add(invDetail); + + foreach (var item in g) + { + relations.Add(new ApplicationDetailRelation + { + DetailId = item.DetailId, + InvoiceDetailId = invDetail.Id, + OriginalName = g.Key, + InvoiceId = invoice.Id + }); + } + } + + await TenantDb.Insertable(invoice.InvoiceDetails).ExecuteCommandAsync(); + await TenantDb.Insertable(relations).ExecuteCommandAsync(); + } + //更新时只处理增加的明细 + else if (option == BuildOption.Update) + { + //获取现有发票明细对应关系 + var relations = await TenantDb.Queryable().Where(x => x.InvoiceId == invoice.Id) + .Select(x => new + { + x.DetailId, + x.InvoiceDetailId, + x.OriginalName, + }).ToListAsync(); + var feeIds = invoice.Details.Select(x => x.FeeId); + var feesCodes = await TenantDb.Queryable().Where(x => feeIds.Contains(x.Id)) + .Select(x => new + { + FeeId = x.Id, + x.GoodName + }).ToListAsync(); + + invoice.InvoiceDetails = []; //新增的发票明细 + List invoiceDetailList = []; //更新的发票明细 + List relationList = []; //新增的明细关系 + + foreach (var detail in invoice.Details) + { + var goodsName = feesCodes.Find(x => x.FeeId == detail.FeeId)?.GoodName; //转换为发票明细名称 + var relation = relations.Find(x => string.Equals(x.OriginalName, goodsName, StringComparison.Ordinal)); + if (relation == null) //需要新增发票明细 + { + var invDetail = new InvoiceDetail + { + Id = SnowFlakeSingle.Instance.NextId(), + ApplicationId = invoice.Id, + Name = goodsName, + TaxRate = invoice.TaxRate, + TaxUnitPrice = detail.ApplyAmount, + Category = DetailCategory.InvoiceIssuance + }; + invDetail.TaxAmount = invDetail.TaxUnitPrice * invoice.TaxRate; + invDetail.UnitPrice = invDetail.TaxUnitPrice - invDetail.TaxAmount; + + invoice.InvoiceDetails.Add(invDetail); + + relationList.Add(new ApplicationDetailRelation + { + DetailId = detail.Id, + InvoiceDetailId = invDetail.Id, + InvoiceId = invoice.Id, + OriginalName = goodsName + }); + } + else //发票明细已存在,追加金额 + { + //添加到更新列表 + invoiceDetailList.Add(new InvoiceDetail + { + Id = relation.InvoiceDetailId, + TaxUnitPrice = detail.ApplyAmount + }); + } + } + + if (invoice.InvoiceDetails.Count > 0) + await TenantDb.Insertable(invoice.InvoiceDetails).ExecuteCommandAsync(); + + //执行发票明细金额更新 + if (invoiceDetailList.Count > 0) + { + var ids2 = invoiceDetailList.Select(x => x.Id); + var updateList = await TenantDb.Queryable().Where(x => ids2.Contains(x.Id)).Select(x => new InvoiceDetail + { + Id = x.Id, + TaxUnitPrice = x.TaxUnitPrice, + TaxRate = x.TaxRate, + TaxAmount = x.TaxAmount, + UnitPrice = x.UnitPrice + }).ToListAsync(); + foreach (var item in updateList) + { + var invDetail = invoiceDetailList.Find(x => x.Id == item.Id); + item.TaxUnitPrice += (invDetail?.TaxUnitPrice).GetValueOrDefault(); + item.TaxAmount = item.TaxUnitPrice * invoice.TaxRate; + item.UnitPrice = item.TaxUnitPrice - item.TaxAmount; + } + + await TenantDb.Updateable(updateList).UpdateColumns(x => new + { + x.TaxUnitPrice, + x.TaxAmount, + x.UnitPrice + }).ExecuteCommandAsync(); + } + + if (relationList.Count > 0) + await TenantDb.Insertable(relationList).ExecuteCommandAsync(); + } + else if (option == BuildOption.Delete) + { + } + + } + + /// + /// 重新计算发票的各项金额数据 + /// + /// 发票 + /// + protected async Task RefreshInvoiceAsync(List invoices) + { + var ids = invoices.Select(x => x.Id); + var details = await TenantDb.Queryable().Where(x => ids.Contains(x.ApplicationId)) + .Select(x => new { x.ApplicationId, x.Currency, x.ApplyAmount, x.OriginalAmount }).ToListAsync(); + var invDetails = await TenantDb.Queryable().Where(x => ids.Contains(x.ApplicationId)) + .Select(x => new { x.ApplicationId, x.TaxUnitPrice }).ToListAsync(); + + foreach (var invoice in invoices) + { + var currDetails = details.FindAll(x => x.ApplicationId == invoice.Id); + + invoice.ApplyAmount = currDetails.Sum(x => x.ApplyAmount); + invoice.AmountUppercase = new Money(invoice.ApplyAmount).ToString(); + invoice.OriginalAmount = currDetails.Sum(x => x.OriginalAmount); + invoice.OtherInvoiceAmount = currDetails.FindAll(x => x.Currency != RMB_CODE).Sum(x => x.OriginalAmount); + + invoice.InvoiceAmount = invDetails.FindAll(x => x.ApplicationId == invoice.Id).Sum(x => x.TaxUnitPrice); + } + + return await TenantDb.Updateable(invoices).UpdateColumns(x => new + { + x.ApplyAmount, + x.AmountUppercase, + x.OriginalAmount, + x.OtherInvoiceAmount, + x.InvoiceAmount + }).ExecuteCommandAsync(); + } + /// /// 用于发票的状态检查 /// @@ -429,32 +632,38 @@ namespace DS.WMS.Core.Invoice.Method /// public async Task DeleteAsync(params long[] ids) { - var apps = await TenantDb.Queryable().Where(x => ids.Contains(x.Id)).Select(x => new TEntity + await TenantDb.Ado.BeginTranAsync(); + try { - Id = x.Id, - IsLocked = x.IsLocked - }).ToListAsync(); - var details = await TenantDb.Queryable().Where(x => ids.Contains(x.ApplicationId)).Select( - x => new ApplicationDetail + var apps = await TenantDb.Queryable().Where(x => ids.Contains(x.Id)).Select(x => new TEntity { Id = x.Id, - ApplicationId = x.ApplicationId, - DetailId = x.DetailId, - RefId = x.RefId, - RecordId = x.RecordId, - ApplyAmount = x.ApplyAmount, - OriginalAmount = x.OriginalAmount + Type = x.Type, + IsLocked = x.IsLocked }).ToListAsync(); - foreach (var app in apps) - app.Details = details.FindAll(x => x.ApplicationId == app.Id); await TenantDb.Ado.BeginTranAsync(); + if (apps.Count == 0) + return DataResult.FailedWithDesc(nameof(MultiLanguageConst.EmptyData)); - var result = PreDelete(apps); - if (!result.Succeeded) - return result; + var details = await TenantDb.Queryable().Where(x => ids.Contains(x.ApplicationId)).Select( + x => new ApplicationDetail + { + Id = x.Id, + ApplicationId = x.ApplicationId, + DetailId = x.DetailId, + RefId = x.RefId, + RecordId = x.RecordId, + ApplyAmount = x.ApplyAmount, + OriginalAmount = x.OriginalAmount + }).ToListAsync(); + + foreach (var app in apps) + app.Details = details.FindAll(x => x.ApplicationId == app.Id); + + var result = PreDelete(apps); + if (!result.Succeeded) + return result; - try - { await OnDeleteDetailAsync(apps, DeleteOption.Entire); await TenantDb.DeleteNav(x => ids.Contains(x.Id)).Include(x => x.Details).ExecuteCommandAsync(); await TenantDb.Ado.CommitTranAsync(); @@ -478,7 +687,10 @@ namespace DS.WMS.Core.Invoice.Method /// public async Task DeleteDetailAsync(params long[] ids) { - var details = await TenantDb.Queryable().Where(x => ids.Contains(x.Id)).Select( + await TenantDb.Ado.BeginTranAsync(); + try + { + var details = await TenantDb.Queryable().Where(x => ids.Contains(x.Id)).Select( x => new ApplicationDetail { Id = x.Id, @@ -489,28 +701,32 @@ namespace DS.WMS.Core.Invoice.Method ApplyAmount = x.ApplyAmount, OriginalAmount = x.OriginalAmount }).ToListAsync(); - var appIds = details.Select(x => x.ApplicationId).Distinct().ToList(); - var apps = await TenantDb.Queryable().Where(x => appIds.Contains(x.Id)).Select(x => new TEntity - { - Id = x.Id, - IsLocked = x.IsLocked - }).ToListAsync(); - foreach (var app in apps) - app.Details = details.FindAll(x => x.ApplicationId == app.Id); + if (details.Count == 0) + return DataResult.FailedWithDesc(nameof(MultiLanguageConst.EmptyData)); - var result = PreDelete(apps); - if (!result.Succeeded) - return result; + var invIds = details.Select(x => x.ApplicationId).Distinct().ToList(); + var invoices = await TenantDb.Queryable().Where(x => invIds.Contains(x.Id)).Select(x => new TEntity + { + Id = x.Id, + Type = x.Type, + IsLocked = x.IsLocked + }).ToListAsync(); - await TenantDb.Ado.BeginTranAsync(); - try - { - await OnDeleteDetailAsync(apps, DeleteOption.DetailOnly); + foreach (var app in invoices) + app.Details = details.FindAll(x => x.ApplicationId == app.Id); + + var result = PreDelete(invoices); + if (!result.Succeeded) + return result; + + await OnDeleteDetailAsync(invoices, DeleteOption.DetailOnly); await TenantDb.Deleteable(details).ExecuteCommandAsync(); + //重新计算发票总金额 + await RefreshInvoiceAsync(invoices); await TenantDb.Ado.CommitTranAsync(); - PostDeleteAsync(apps, DeleteOption.Entire); + PostDeleteAsync(invoices, DeleteOption.Entire); return DataResult.Success; } @@ -529,8 +745,33 @@ namespace DS.WMS.Core.Invoice.Method /// public async Task DeleteInvoiceDetailAsync(params long[] ids) { - int rows = await TenantDb.Deleteable().Where(x => ids.Contains(x.Id)).ExecuteCommandAsync(); - return rows > 0 ? DataResult.Success : DataResult.FailedWithDesc(nameof(MultiLanguageConst.Operation_Failed)); + await TenantDb.Ado.BeginTranAsync(); + try + { + var invDetails = await TenantDb.Queryable().Where(x => ids.Contains(x.Id)) + .Select(x => new { x.ApplicationId, x.TaxUnitPrice }).ToListAsync(); + var groups = invDetails.GroupBy(x => x.ApplicationId); + foreach (var g in groups) + { + var list = g.Select(x => new TEntity { Id = g.Key, InvoiceAmount = g.Sum(x => x.TaxUnitPrice) }).ToList(); + //更新发票主表的开票金额 + await TenantDb.Updateable(list).PublicSetColumns(x => x.InvoiceAmount, "-") + .UpdateColumns(x => new { x.InvoiceAmount }).ExecuteCommandAsync(); + } + + await TenantDb.Deleteable().Where(x => ids.Contains(x.Id)).ExecuteCommandAsync(); + //删除对应关系 + await TenantDb.Deleteable().Where(x => ids.Contains(x.InvoiceDetailId)).ExecuteCommandAsync(); + + await TenantDb.Ado.CommitTranAsync(); + return DataResult.Success; + } + catch (Exception ex) + { + await TenantDb.Ado.RollbackTranAsync(); + await ex.LogAsync(Db); + return DataResult.FailedWithDesc(nameof(MultiLanguageConst.Operation_Failed)); + } } /// @@ -554,12 +795,15 @@ namespace DS.WMS.Core.Invoice.Method /// protected virtual async Task OnDeleteDetailAsync(List invoices, DeleteOption deleteOption) { - var excludeIds = invoices.SelectMany(x => x.Details).Select(x => x.Id).ToList(); - //await TenantDb.Deleteable().Where(x => excludeIds.Contains(x.Id)).ExecuteCommandAsync(); + var appIds = invoices.Select(x => x.Id); if (deleteOption == DeleteOption.DetailOnly) { - var appIds = invoices.Select(x => x.Id).ToList(); + //删除明细需要同时变更发票明细 + foreach (var item in invoices) + BuildInvoiceDetailAsync(item, BuildOption.Delete); + + var excludeIds = invoices.SelectMany(x => x.Details).Select(x => x.Id); var details = await TenantDb.Queryable().Where(x => appIds.Contains(x.ApplicationId) && !excludeIds.Contains(x.Id)) .Select(x => new ApplicationDetail { @@ -577,24 +821,39 @@ namespace DS.WMS.Core.Invoice.Method item.AmountUppercase = new Money(item.ApplyAmount).ToString(); } - ////删除明细需要同时变更发票明细 - //await CreateInvoiceDetailsAsync(invoices); - //var invDetails = invoices.SelectMany(x => x.InvoiceDetails).ToList(); - //if (invDetails.Count > 0) - // await TenantDb.Insertable(invDetails).ExecuteCommandAsync(); - await TenantDb.Updateable(invoices).UpdateColumns(x => new { x.ApplyAmount, x.AmountUppercase }).ExecuteCommandAsync(); + + //删除明细之间的关系 + + } + else if (deleteOption == DeleteOption.Entire) + { + //删除发票主表则同时删除对应发票明细 + await TenantDb.Deleteable().Where(x => appIds.Contains(x.ApplicationId)).ExecuteCommandAsync(); + + //删除明细之间的关系 + await TenantDb.Deleteable().Where(x => appIds.Contains(x.InvoiceId)).ExecuteCommandAsync(); + } + + foreach (var item in invoices) + { + //还原费用表的已开票金额 + var fees = item.Details?.Select(x => new FeeRecord { Id = x.RecordId, InvoiceAmount = x.OriginalAmount }).ToList(); + + var updateable = TenantDb.Updateable(fees).PublicSetColumns(x => x.InvoiceAmount, "-"); + + if (item.Type == InvoiceType.Applcation) + updateable = updateable.PublicSetColumns(x => x.OrderInvSettlementAmount, "-") + .UpdateColumns(x => new { x.OrderInvSettlementAmount }); + + await updateable.UpdateColumns(x => new { x.InvoiceAmount }).ExecuteCommandAsync(); + } - //还原费用表的已开票金额 - var fees = invoices.SelectMany(x => x.Details).Select(x => new FeeRecord { Id = x.RecordId, InvoiceAmount = x.OriginalAmount }).ToList(); - await TenantDb.Updateable(fees) - .PublicSetColumns(it => it.InvoiceAmount, "-").UpdateColumns(x => new { x.InvoiceAmount }) - .ExecuteCommandAsync(); } /// @@ -604,51 +863,6 @@ namespace DS.WMS.Core.Invoice.Method /// 发票删除选项 protected virtual Task PostDeleteAsync(List invoices, DeleteOption deleteOption) => Task.CompletedTask; - /// - /// 生成发票明细 - /// - /// - /// - protected async Task BuildInvoiceDetailAsync(IEnumerable invoices) - { - foreach (var invoice in invoices) - { - if (invoice.Details?.Count > 0 && (invoice.InvoiceDetails == null || invoice.InvoiceDetails.Count == 0)) - { - var ids = invoice.Details.Select(x => x.RecordId).ToList(); - var feesCodes = await TenantDb.Queryable().InnerJoin((f, c) => f.FeeId == c.Id && ids.Contains(f.Id)) - .Select((f, c) => new - { - FeeId = c.Id, - c.GoodName - }).ToListAsync(); - - var list = feesCodes.GroupBy(x => x.GoodName).Select(x => new - { - Name = x.Key, - FeeIds = x.Select(y => y.FeeId) - }).ToList(); - invoice.InvoiceDetails = new List(list.Count); - foreach (var item in list) - { - var invDetail = new InvoiceDetail - { - ApplicationId = invoice.Id, - Name = item.Name, - TaxRate = invoice.TaxRate, - TaxUnitPrice = invoice.Details.FindAll(x => item.FeeIds.Contains(x.FeeId)).Sum(x => x.ApplyAmount), - Category = DetailCategory.InvoiceIssuance - }; - invDetail.TaxAmount = invDetail.TaxUnitPrice * invoice.TaxRate; - invDetail.UnitPrice = invDetail.TaxUnitPrice - invDetail.TaxAmount; - - invoice.InvoiceDetails.Add(invDetail); - invoice.InvoiceAmount = invoice.InvoiceDetails.Sum(x => x.TaxUnitPrice); - } - } - } - } - /// /// 设置发票的锁定状态 diff --git a/ds-wms-service/DS.WMS.FeeApi/Controllers/GeneralInvoiceController.cs b/ds-wms-service/DS.WMS.FeeApi/Controllers/GeneralInvoiceController.cs index d4169af9..9037fec8 100644 --- a/ds-wms-service/DS.WMS.FeeApi/Controllers/GeneralInvoiceController.cs +++ b/ds-wms-service/DS.WMS.FeeApi/Controllers/GeneralInvoiceController.cs @@ -101,7 +101,7 @@ namespace DS.WMS.FeeApi.Controllers } /// - /// 删除发票明细 + /// 删除费用明细 /// /// 发票明细ID /// diff --git a/ds-wms-service/DS.WMS.FeeApi/Logs/internal-nlog.txt b/ds-wms-service/DS.WMS.FeeApi/Logs/internal-nlog.txt index 74d142b7..1fb6dc3b 100644 --- a/ds-wms-service/DS.WMS.FeeApi/Logs/internal-nlog.txt +++ b/ds-wms-service/DS.WMS.FeeApi/Logs/internal-nlog.txt @@ -2945,3 +2945,171 @@ 2024-07-17 15:41:56.4414 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config 2024-07-17 15:41:56.4498 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile 2024-07-17 15:41:56.4498 Info Configuration initialized. +2024-07-18 11:27:43.4190 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-18 11:27:43.4666 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-18 11:27:43.4666 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-18 11:27:43.4898 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-18 11:27:43.4948 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-18 11:27:43.4948 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-18 11:27:43.4948 Info Configuration initialized. +2024-07-18 11:34:31.2142 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-18 11:34:31.2422 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-18 11:34:31.2450 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-18 11:34:31.2450 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-18 11:34:31.2450 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-18 11:34:31.2627 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-18 11:34:31.2627 Info Configuration initialized. +2024-07-18 11:38:08.5155 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-18 11:38:08.5914 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-18 11:38:08.6284 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-18 11:38:08.6636 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-18 11:38:08.6756 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-18 11:38:08.6830 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-18 11:38:08.6830 Info Configuration initialized. +2024-07-18 11:44:51.6688 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-18 11:44:51.7113 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-18 11:44:51.7181 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-18 11:44:51.7365 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-18 11:44:51.7460 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-18 11:44:51.7460 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-18 11:44:51.7460 Info Configuration initialized. +2024-07-18 13:35:21.5138 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-18 13:35:21.5612 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-18 13:35:21.5612 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-18 13:35:21.6011 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-18 13:35:21.6127 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-18 13:35:21.6127 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-18 13:35:21.6234 Info Configuration initialized. +2024-07-18 13:58:32.4861 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-18 13:58:32.5226 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-18 13:58:32.5280 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-18 13:58:32.5280 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-18 13:58:32.5469 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-18 13:58:32.5469 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-18 13:58:32.5469 Info Configuration initialized. +2024-07-18 16:42:24.0738 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-18 16:42:24.1256 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-18 16:42:24.1256 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-18 16:42:24.2047 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-18 16:42:24.2047 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-18 16:42:24.2047 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-18 16:42:24.2190 Info Configuration initialized. +2024-07-18 16:55:27.1766 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-18 16:55:27.2060 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-18 16:55:27.2060 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-18 16:55:27.2217 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-18 16:55:27.2217 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-18 16:55:27.2217 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-18 16:55:27.2336 Info Configuration initialized. +2024-07-18 17:22:41.4230 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-18 17:22:41.4910 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-18 17:22:41.4958 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-18 17:22:41.5180 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-18 17:22:41.5180 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-18 17:22:41.5300 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-18 17:22:41.5300 Info Configuration initialized. +2024-07-18 17:28:44.7162 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-18 17:28:44.7668 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-18 17:28:44.7668 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-18 17:28:44.7891 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-18 17:28:44.7963 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-18 17:28:44.7963 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-18 17:28:44.7963 Info Configuration initialized. +2024-07-18 17:41:32.0585 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-18 17:41:32.0991 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-18 17:41:32.0991 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-18 17:41:32.1223 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-18 17:41:32.1223 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-18 17:41:32.1223 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-18 17:41:32.1446 Info Configuration initialized. +2024-07-19 09:19:34.9862 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-19 09:19:35.0109 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-19 09:19:35.0109 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-19 09:19:35.0305 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-19 09:19:35.0305 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-19 09:19:35.0377 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-19 09:19:35.0377 Info Configuration initialized. +2024-07-19 11:24:38.2652 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-19 11:24:38.3020 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-19 11:24:38.3075 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-19 11:24:38.3254 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-19 11:24:38.3374 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-19 11:24:38.3374 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-19 11:24:38.3504 Info Configuration initialized. +2024-07-19 11:27:23.3357 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-19 11:27:23.3822 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-19 11:27:23.3822 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-19 11:27:23.4045 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-19 11:27:23.4121 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-19 11:27:23.4121 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-19 11:27:23.4121 Info Configuration initialized. +2024-07-19 11:29:46.6648 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-19 11:29:46.7253 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-19 11:29:46.7253 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-19 11:29:46.7540 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-19 11:29:46.7654 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-19 11:29:46.7654 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-19 11:29:46.7776 Info Configuration initialized. +2024-07-19 11:38:32.6478 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-19 11:38:32.7002 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-19 11:38:32.7002 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-19 11:38:32.7221 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-19 11:38:32.7304 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-19 11:38:32.7304 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-19 11:38:32.7425 Info Configuration initialized. +2024-07-19 13:37:25.8031 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-19 13:37:25.8405 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-19 13:37:25.8405 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-19 13:37:25.8681 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-19 13:37:25.8681 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-19 13:37:25.8681 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-19 13:37:25.8870 Info Configuration initialized. +2024-07-19 14:01:42.4487 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-19 14:01:42.5039 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-19 14:01:42.5083 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-19 14:01:42.5343 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-19 14:01:42.5458 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-19 14:01:42.5458 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-19 14:01:42.5666 Info Configuration initialized. +2024-07-19 14:25:22.8202 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-19 14:25:22.8617 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-19 14:25:22.8655 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-19 14:25:22.8655 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-19 14:25:22.8868 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-19 14:25:22.8868 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-19 14:25:22.8975 Info Configuration initialized. +2024-07-19 14:27:52.9955 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-19 14:27:53.0208 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-19 14:27:53.0461 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-19 14:27:53.0592 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-19 14:27:53.0592 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-19 14:27:53.0708 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-19 14:27:53.0708 Info Configuration initialized. +2024-07-19 14:43:21.1470 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-19 14:43:21.1798 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-19 14:43:21.1798 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-19 14:43:21.2084 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-19 14:43:21.2164 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-19 14:43:21.2164 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-19 14:43:21.2269 Info Configuration initialized. +2024-07-19 14:51:05.4318 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-19 14:51:05.4863 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-19 14:51:05.4931 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-19 14:51:05.5167 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-19 14:51:05.5309 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-19 14:51:05.5309 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-19 14:51:05.5439 Info Configuration initialized. +2024-07-19 14:54:06.9457 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-19 14:54:07.0147 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-19 14:54:07.0147 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-19 14:54:07.0368 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-19 14:54:07.0481 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-19 14:54:07.0560 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-19 14:54:07.0686 Info Configuration initialized. +2024-07-19 15:00:10.8049 Info Registered target NLog.Targets.FileTarget(Name=allfile) +2024-07-19 15:00:10.8635 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) +2024-07-19 15:00:10.8694 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) +2024-07-19 15:00:10.8886 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False +2024-07-19 15:00:10.8983 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.FeeApi\bin\Debug\net8.0\nlog.config +2024-07-19 15:00:10.8983 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile +2024-07-19 15:00:10.8983 Info Configuration initialized.