From 854e65c96b5eb85cd347366fae137fb0d37c5df2 Mon Sep 17 00:00:00 2001 From: zhangxiaofeng <1939543722@qq.com> Date: Thu, 9 May 2024 09:27:55 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E6=8E=A5=E6=94=B6=E5=85=AC=E5=8F=B8?= =?UTF-8?q?=E3=80=81=E5=91=98=E5=B7=A5=E5=8F=98=E5=8A=A8=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E6=8E=A8=E9=80=81bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MQ/RecCompanyUserChangeService.cs | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/Myshipping.Core/MQ/RecCompanyUserChangeService.cs b/Myshipping.Core/MQ/RecCompanyUserChangeService.cs index d95e4826..28009b88 100644 --- a/Myshipping.Core/MQ/RecCompanyUserChangeService.cs +++ b/Myshipping.Core/MQ/RecCompanyUserChangeService.cs @@ -58,21 +58,26 @@ namespace Myshipping.Core.MQ ConnectionFactory factory = new ConnectionFactory(); var repoSysCfg = _serviceScope.ServiceProvider.GetService>(); - var mqUrl = repoSysCfg.FirstOrDefault(x => x.Code == "CompanyUserChangeMqUrl").Value; - _logger.LogInformation($"准备连接公司用户同步消息队列:{mqUrl}"); - factory.Uri = new Uri(mqUrl); - mqConn = factory.CreateConnection("客户订舱平台客户端"); - - model = mqConn.CreateModel(); - model.ExchangeDeclare(ExchangeName, ExchangeType.Fanout); - model.QueueDeclare(QueueName, false, false, true, null); - model.QueueBind(QueueName, ExchangeName, "", null); - - var consumer = new EventingBasicConsumer(model); - consumer.Received += Consumer_Received; - model.BasicConsume(QueueName, true, consumer); - - + var mqUrl = repoSysCfg.FirstOrDefault(x => x.Code == "CompanyUserChangeMqUrl")?.Value; + if (string.IsNullOrEmpty(mqUrl)) + { + _logger.LogError($"接收公司、员工变动消息推送所需MQUrl未配置"); + } + else + { + _logger.LogInformation($"准备连接公司用户同步消息队列:{mqUrl}"); + factory.Uri = new Uri(mqUrl); + mqConn = factory.CreateConnection("客户订舱平台客户端"); + + model = mqConn.CreateModel(); + model.ExchangeDeclare(ExchangeName, ExchangeType.Fanout); + model.QueueDeclare(QueueName, false, false, true, null); + model.QueueBind(QueueName, ExchangeName, "", null); + + var consumer = new EventingBasicConsumer(model); + consumer.Received += Consumer_Received; + model.BasicConsume(QueueName, true, consumer); + } }); } From 15a256b28c2590312e6be72848f7cc54dfaf7c2a Mon Sep 17 00:00:00 2001 From: wanghaomei <86whm@163.com> Date: Thu, 9 May 2024 13:54:40 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E4=B8=AD=E8=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EDI/ZhongYuanSoApiHelper.cs | 11 ++++++++-- .../BookingCustomerOrderService.cs | 22 ++++++++++++++++--- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/Myshipping.Application/EDI/ZhongYuanSoApiHelper.cs b/Myshipping.Application/EDI/ZhongYuanSoApiHelper.cs index c5fe180e..57201c18 100644 --- a/Myshipping.Application/EDI/ZhongYuanSoApiHelper.cs +++ b/Myshipping.Application/EDI/ZhongYuanSoApiHelper.cs @@ -115,15 +115,22 @@ namespace Myshipping.Application.EDI postModel.saveName = template.TemplateName; var mapPortLoad = mappingPortLoad.FirstOrDefault(x => x.Module == "DjyCustBooking" && x.CarrierCode == "COSCO" && x.Code == custOrder.PORTLOADCODE); - var mapPort = mappingPort.FirstOrDefault(x => x.Module == "DjyCustBooking" && x.CarrierCode == "COSCO" && x.Code == custOrder.PORTDISCHARGECODE); + //var mapPort = mappingPort.FirstOrDefault(x => x.Module == "DjyCustBooking" && x.CarrierCode == "COSCO" && x.Code == custOrder.PORTDISCHARGECODE); if (mapPortLoad == null) { return new KeyValuePair(false, $"未找到起运港映射信息:{custOrder.PORTLOADCODE}"); } + //if (mapPort == null) + //{ + // return new KeyValuePair(false, $"未找到目的港映射信息:{custOrder.PORTDISCHARGECODE}"); + //} + + //2024年5月9日,衣国豪:改用目的地,而不是卸货港 + var mapPort = mappingPort.FirstOrDefault(x => x.Module == "DjyCustBooking" && x.CarrierCode == "COSCO" && x.Code == custOrder.DESTINATIONCODE); if (mapPort == null) { - return new KeyValuePair(false, $"未找到目的港映射信息:{custOrder.PORTDISCHARGECODE}"); + return new KeyValuePair(false, $"未找到目的地映射信息:{custOrder.DESTINATIONCODE}"); } //运输条款 diff --git a/Myshipping.Application/Service/BookingCustomerOrder/BookingCustomerOrderService.cs b/Myshipping.Application/Service/BookingCustomerOrder/BookingCustomerOrderService.cs index 475b711d..f31684f4 100644 --- a/Myshipping.Application/Service/BookingCustomerOrder/BookingCustomerOrderService.cs +++ b/Myshipping.Application/Service/BookingCustomerOrder/BookingCustomerOrderService.cs @@ -2087,6 +2087,8 @@ namespace Myshipping.Application // throw Oops.Bah("目的港代码和名称不能为空"); //} + + //起运港校验 if (string.IsNullOrEmpty(input.PORTLOADCODE)) { throw Oops.Bah("起运港代码不能为空"); @@ -2098,6 +2100,8 @@ namespace Myshipping.Application throw Oops.Bah($"未找到匹配的起运港:{input.PORTLOADCODE}"); } + + //目的港校验 if (string.IsNullOrEmpty(input.PORTDISCHARGECODE)) { throw Oops.Bah("目的港代码不能为空"); @@ -2109,6 +2113,19 @@ namespace Myshipping.Application throw Oops.Bah($"未找到匹配的目的港:{input.PORTDISCHARGECODE}"); } + + //目的地校验 + if (string.IsNullOrEmpty(input.DESTINATIONCODE)) + { + throw Oops.Bah("目的地代码不能为空"); + } + + var destination = portDestList.FirstOrDefault(x => x.Code == input.DESTINATIONCODE); + if (destination == null) + { + throw Oops.Bah($"未找到匹配的目的地:{input.DESTINATIONCODE}"); + } + if (string.IsNullOrEmpty(input.SERVICECODE)) { throw Oops.Bah("运输条款代码不能为空"); @@ -2227,7 +2244,6 @@ namespace Myshipping.Application } - var destination = portDestList.FirstOrDefault(x => x.Code == input.DESTINATIONCODE); //赋值根据唯一代码匹配后的代码、名称等信息 custOrder.CARRIER = carr.EnName; @@ -2236,8 +2252,8 @@ namespace Myshipping.Application custOrder.PORTDISCHARGE = portDest.EnName; custOrder.PORTDISCHARGEID = portDest.EdiCode; custOrder.SERVICE = service.Name; - custOrder.DESTINATION = destination?.EnName; - custOrder.DESTINATIONID = destination?.EdiCode; + custOrder.DESTINATION = destination.EnName; + custOrder.DESTINATIONID = destination.EdiCode; custOrder.BLFRT = frt.EnName; //2024年4月19日,将分拆的收发通拼接到大文本的收发通中 From a3d88e0634273ab9e49bbd5efe8c7b6aaa2deea9 Mon Sep 17 00:00:00 2001 From: zhangxiaofeng <1939543722@qq.com> Date: Thu, 9 May 2024 15:45:41 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E7=9C=9F=E6=8F=90=E5=8D=95=E5=8F=B7?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BookingOrder/BookingOrderService.cs | 52 +++++++++++++++---- Myshipping.Core/Util/JsonUtil.cs | 9 +++- 2 files changed, 51 insertions(+), 10 deletions(-) diff --git a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs index 0608cb35..5285779d 100644 --- a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs +++ b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs @@ -1498,8 +1498,8 @@ namespace Myshipping.Application //条件限制 重复限制 if (!string.IsNullOrWhiteSpace(input.MBLNO) && input.ParentId == 0) { - var et = await _rep.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.MBLNO == input.MBLNO && x.TenantId == UserManager.TENANT_ID && x.ParentId == 0 && x.Id != input.Id).FirstAsync(); - if (et != null) + var et = await _rep.AsQueryable().Filter(null, true).AnyAsync(x => x.IsDeleted == false && x.MBLNO == input.MBLNO && x.TenantId == UserManager.TENANT_ID && x.ParentId == 0 && x.Id != input.Id); + if (et) { throw Oops.Bah("当前主提单号已存在,请勿重复录入!"); } @@ -1520,8 +1520,8 @@ namespace Myshipping.Application //查询表中是否有当前输入的分单号 if (input.ParentId > 0) //分单 { - var et = await _rep.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.HBLNO == input.HBLNO && x.TenantId == UserManager.TENANT_ID && x.Id != input.Id && x.Id != input.ParentId).FirstAsync(); - if (et != null) + var et = await _rep.AsQueryable().Filter(null, true).AnyAsync(x => x.IsDeleted == false && x.HBLNO == input.HBLNO && x.TenantId == UserManager.TENANT_ID && x.Id != input.Id && x.Id != input.ParentId); + if (et) { throw Oops.Bah("当前分提单号已存在,请勿重复录入!"); } @@ -1541,8 +1541,8 @@ namespace Myshipping.Application //陈冠宇提订舱编号不允许重复 if (!string.IsNullOrWhiteSpace(input.CUSTNO)) { - var et = await _rep.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.CUSTNO == input.CUSTNO && x.TenantId == UserManager.TENANT_ID && x.ParentId == 0 && x.Id != input.Id).FirstAsync(); - if (et != null) + var et = await _rep.AsQueryable().Filter(null, true).AnyAsync(x => x.IsDeleted == false && x.CUSTNO == input.CUSTNO && x.TenantId == UserManager.TENANT_ID && x.ParentId == 0 && x.Id != input.Id); + if (et) { throw Oops.Bah("当前订舱编号已存在,请勿重复录入!"); } @@ -1551,12 +1551,46 @@ namespace Myshipping.Application //孙晓飞提PONO不允许重复 if (!string.IsNullOrWhiteSpace(input.PONO)) { - var et = await _rep.AsQueryable().Filter(null, true).Where(x => x.IsDeleted == false && x.PONO == input.PONO && x.TenantId == UserManager.TENANT_ID && x.ParentId == 0 && x.Id != input.Id).FirstAsync(); - if (et != null) + var et = await _rep.AsQueryable().Filter(null, true).AnyAsync(x => x.IsDeleted == false && x.PONO == input.PONO && x.TenantId == UserManager.TENANT_ID && x.ParentId == 0 && x.Id != input.Id); + if (et) { throw Oops.Bah("当前PONO已存在,请勿重复录入!"); } } + + // 陈冠宇提真提单号不允许重复 + if (!string.IsNullOrWhiteSpace(input.TMBLNO)) + { + // 主单 + if (input.ParentId == 0) + { + // 在其它主单、其它分单中判断是否有重复 + if (await _rep.AsQueryable().Filter(null, true).AnyAsync(x => x.TMBLNO == input.TMBLNO + && x.IsDeleted == false + && x.TenantId == UserManager.TENANT_ID + && (x.ParentId == 0 || (x.ParentId != 0 && x.ParentId != input.Id)) + && x.Id != input.Id)) + { + throw Oops.Bah("当前真提单号已存在,请勿重复录入!"); + } + } + else + // 分单 + { + // 在除"所在主单与兄弟分单"的所有订舱中判断是否有重复 + if (await _rep.AsQueryable().Filter(null, true).AnyAsync(x => x.TMBLNO == input.TMBLNO + && x.IsDeleted == false + && x.TenantId == UserManager.TENANT_ID + && x.ParentId != input.ParentId // 过滤:因为同一主单的其它分单真提单号可以重复 + && x.Id != input.ParentId // 过滤:因为主单可以与分单的真题单号重复 + && x.Id != input.Id)) + { + throw Oops.Bah("当前真提单号已存在,请勿重复录入!"); + } + } + + } + //版本号避免多人同时操作数据错乱 //if (!string.IsNullOrWhiteSpace(input.VERSION) && input.Id != 0) //{ @@ -2296,7 +2330,7 @@ namespace Myshipping.Application var tenantParamList = await _cache.GetAllTenantParam(); var isAskDs = tenantParamList.FirstOrDefault(x => x.TenantId == UserManager.TENANT_ID && x.ParaCode == TenantParamCode.ASK_DS_BEFORE_DELETE_BOOKING_ORDER); - + foreach (var ar in arr) { long Id = Convert.ToInt64(ar); diff --git a/Myshipping.Core/Util/JsonUtil.cs b/Myshipping.Core/Util/JsonUtil.cs index c85f7c3d..86697e1c 100644 --- a/Myshipping.Core/Util/JsonUtil.cs +++ b/Myshipping.Core/Util/JsonUtil.cs @@ -202,7 +202,14 @@ public static class JsonUtil return "提单号存在中文字符或特殊字符"; } } - + if (propName.ToUpper() == "TMBLNO" && !string.IsNullOrEmpty(sourceVal.ToString())) + { + if (!Regex.IsMatch(sourceVal.ToString(), @"^[a-zA-Z0-9]+$")) + { + return "真提单号存在中文字符或特殊字符"; + } + } + if (Regex.IsMatch(sourceVal.ToString(), @"[\u4e00-\u9fa5]") && propName.ToUpper() == "HBLNO") { return "分提单号存在中文字符"; From aaf582b935fec86b3fef897c054a218712ac2f66 Mon Sep 17 00:00:00 2001 From: zhangxiaofeng <1939543722@qq.com> Date: Thu, 9 May 2024 15:55:26 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExpressDelivery/ExpressDeliveryService.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Myshipping.Application/Service/ExpressDelivery/ExpressDeliveryService.cs b/Myshipping.Application/Service/ExpressDelivery/ExpressDeliveryService.cs index b016e642..395f0224 100644 --- a/Myshipping.Application/Service/ExpressDelivery/ExpressDeliveryService.cs +++ b/Myshipping.Application/Service/ExpressDelivery/ExpressDeliveryService.cs @@ -378,7 +378,7 @@ namespace Myshipping.Application string statusDesc = $"{STATUS_SEND}(单号:{waybillNo})"; // 不需要等待的任务,并且不会因为异常导致当前请求终止 - _ = Task.Run(async () => + _ = Task.Run(() => { #region 添加快递动态 try @@ -390,7 +390,7 @@ namespace Myshipping.Application StatusCode = "DJY03", StatusDesc = statusDesc }; - await _statusRep.InsertAsync(status); + _statusRep.Insert(status); } catch (Exception ex) { @@ -401,8 +401,8 @@ namespace Myshipping.Application #region 为与快递关联的订舱添加动态 try { - List mblnoList = await _businessRep.AsQueryable(b => b.PId == Id).Select(b => b.MBLNO).ToListAsync(); - _ = InsertNewBookingStatusWithMblnoList(mblnoList, statusDesc); + List mblnoList = _businessRep.AsQueryable(b => b.PId == Id).Select(b => b.MBLNO).ToList(); + _= InsertNewBookingStatusWithMblnoList(mblnoList, statusDesc); } catch (Exception ex) { @@ -413,9 +413,9 @@ namespace Myshipping.Application #region 维护地址簿 try { - if (!await _addressRep.IsExistsAsync(a => a.People == order.SJPeople && a.Tel == order.SJTel)) + if (!_addressRep.IsExists(a => a.People == order.SJPeople && a.Tel == order.SJTel)) { - await _addressRep.InsertAsync(new ExpressDeliveryAddress() + _addressRep.Insert(new ExpressDeliveryAddress() { Address = order.SJAddress, City = order.SJCity, @@ -427,9 +427,9 @@ namespace Myshipping.Application Type = 1 }); } - if (!await _addressRep.IsExistsAsync(a => a.People == order.FJPeople && a.Tel == order.FJTel)) + if (!_addressRep.IsExists(a => a.People == order.FJPeople && a.Tel == order.FJTel)) { - await _addressRep.InsertAsync(new ExpressDeliveryAddress() + _addressRep.Insert(new ExpressDeliveryAddress() { Address = order.FJAddress, City = order.FJCity, From 9b9a45d176e14c302ad1ce7287facee8fe1b1b5e Mon Sep 17 00:00:00 2001 From: wanghaomei <86whm@163.com> Date: Thu, 9 May 2024 16:52:35 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E4=B8=AD=E8=BF=9C=E8=AE=A2=E8=88=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EDI/ZhongYuanSoApiHelper.cs | 21 ++++++++++------ .../Entity/BookingCustomerOrder.cs | 14 +++++++++++ .../BookingCustomerOrderService.cs | 17 +++++++++++++ .../Service/BookingCustomerOrder/Dto/Dtos.cs | 25 +++++++++++++++++++ 4 files changed, 70 insertions(+), 7 deletions(-) diff --git a/Myshipping.Application/EDI/ZhongYuanSoApiHelper.cs b/Myshipping.Application/EDI/ZhongYuanSoApiHelper.cs index 57201c18..1fca0684 100644 --- a/Myshipping.Application/EDI/ZhongYuanSoApiHelper.cs +++ b/Myshipping.Application/EDI/ZhongYuanSoApiHelper.cs @@ -114,19 +114,14 @@ namespace Myshipping.Application.EDI postModel.uploadType = template.Category; //DRAFT, TEMPLATE, BOOKING分别对应:草稿, 模板, 订舱 postModel.saveName = template.TemplateName; + //起运港 var mapPortLoad = mappingPortLoad.FirstOrDefault(x => x.Module == "DjyCustBooking" && x.CarrierCode == "COSCO" && x.Code == custOrder.PORTLOADCODE); - //var mapPort = mappingPort.FirstOrDefault(x => x.Module == "DjyCustBooking" && x.CarrierCode == "COSCO" && x.Code == custOrder.PORTDISCHARGECODE); if (mapPortLoad == null) { return new KeyValuePair(false, $"未找到起运港映射信息:{custOrder.PORTLOADCODE}"); } - //if (mapPort == null) - //{ - // return new KeyValuePair(false, $"未找到目的港映射信息:{custOrder.PORTDISCHARGECODE}"); - //} - - //2024年5月9日,衣国豪:改用目的地,而不是卸货港 + //目的地,2024-5-9,衣国豪需求,由目的港改为目的地 var mapPort = mappingPort.FirstOrDefault(x => x.Module == "DjyCustBooking" && x.CarrierCode == "COSCO" && x.Code == custOrder.DESTINATIONCODE); if (mapPort == null) { @@ -155,6 +150,8 @@ namespace Myshipping.Application.EDI { originCity = mapPortLoad.MapCode, destinationCity = mapPort.MapCode, + polPortName = extObj?.GetStringValue("PolPortName"), + podPortName = extObj?.GetStringValue("PodPortName"), vesselName = custOrder.VESSEL, voyageNumber = custOrder.VOYNO, serviceCode = custOrder.LANECODE, @@ -547,6 +544,16 @@ namespace Myshipping.Application.EDI /// public string destinationCity { get; set; } + /// + /// 起始港名 + /// + public string polPortName { get; set; } + + /// + /// 目的港名 + /// + public string podPortName { get; set; } + /// /// 船名 /// diff --git a/Myshipping.Application/Entity/BookingCustomerOrder.cs b/Myshipping.Application/Entity/BookingCustomerOrder.cs index 5f7e89e9..976276d8 100644 --- a/Myshipping.Application/Entity/BookingCustomerOrder.cs +++ b/Myshipping.Application/Entity/BookingCustomerOrder.cs @@ -686,6 +686,20 @@ namespace Myshipping.Application.Entity [Description("订舱公司分机号")] public string BookingPhoneExtension { get; set; } + /// + /// 收货地 + /// + public string PLACERECEIPT { get; set; } + + /// + /// 收货地唯一代码 + /// + public string PLACERECEIPTCODE { get; set; } + + /// + /// 收货地代码 + /// + public string PLACERECEIPTID { get; set; } } /// diff --git a/Myshipping.Application/Service/BookingCustomerOrder/BookingCustomerOrderService.cs b/Myshipping.Application/Service/BookingCustomerOrder/BookingCustomerOrderService.cs index f31684f4..ea05d807 100644 --- a/Myshipping.Application/Service/BookingCustomerOrder/BookingCustomerOrderService.cs +++ b/Myshipping.Application/Service/BookingCustomerOrder/BookingCustomerOrderService.cs @@ -2114,6 +2114,19 @@ namespace Myshipping.Application } + ////收货地校验 + //if (string.IsNullOrEmpty(input.PLACERECEIPTCODE)) + //{ + // throw Oops.Bah("收货地代码不能为空"); + //} + + var placereceipt = portLoadList.FirstOrDefault(x => x.Code == input.PLACERECEIPTCODE); + //if (placereceipt == null) + //{ + // throw Oops.Bah($"未找到匹配的收货地:{input.PLACERECEIPTCODE}"); + //} + + //目的地校验 if (string.IsNullOrEmpty(input.DESTINATIONCODE)) { @@ -2252,6 +2265,8 @@ namespace Myshipping.Application custOrder.PORTDISCHARGE = portDest.EnName; custOrder.PORTDISCHARGEID = portDest.EdiCode; custOrder.SERVICE = service.Name; + custOrder.PLACERECEIPT = placereceipt?.EnName; + custOrder.PLACERECEIPTID = placereceipt?.EdiCode; custOrder.DESTINATION = destination.EnName; custOrder.DESTINATIONID = destination.EdiCode; custOrder.BLFRT = frt.EnName; @@ -2291,6 +2306,8 @@ namespace Myshipping.Application jobj["Account"] = input.BOOKINGACCOUNT; jobj["Password"] = input.BOOKINGPASSWORD; jobj["OpMail"] = input.OPMAIL; + jobj["PolPortName"] = input.PolPortName; + jobj["PodPortName"] = input.PodPortName; custOrder.ExtendData = jobj.ToJsonString(); var ctns = input.CtnList.Adapt>(); diff --git a/Myshipping.Application/Service/BookingCustomerOrder/Dto/Dtos.cs b/Myshipping.Application/Service/BookingCustomerOrder/Dto/Dtos.cs index 4f4f8fa4..6459b0ec 100644 --- a/Myshipping.Application/Service/BookingCustomerOrder/Dto/Dtos.cs +++ b/Myshipping.Application/Service/BookingCustomerOrder/Dto/Dtos.cs @@ -591,6 +591,21 @@ namespace Myshipping.Application /// 订舱公司分机号 /// public string BookingPhoneExtension { get; set; } + + /// + /// 收货地 + /// + public string PLACERECEIPT { get; set; } + + /// + /// 收货地唯一代码 + /// + public string PLACERECEIPTCODE { get; set; } + + /// + /// 收货地代码 + /// + public string PLACERECEIPTID { get; set; } } //保存dto @@ -1215,5 +1230,15 @@ namespace Myshipping.Application /// 操作邮箱 /// public string OPMAIL { get; set; } + + /// + /// 起始港名 + /// + public string PolPortName { get; set; } + + /// + /// 目的港名 + /// + public string PodPortName { get; set; } } } From a7abfa2dfd2476c6845a906d59b620ed6020ba93 Mon Sep 17 00:00:00 2001 From: zhangxiaofeng <1939543722@qq.com> Date: Fri, 10 May 2024 15:19:45 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E8=A7=A3=E6=9E=90=E6=94=B6=E8=B4=A7?= =?UTF-8?q?=E5=9C=B0=EF=BC=8C=E5=BE=97=E5=88=B0=E8=A3=85=E8=B4=A7=E6=B8=AF?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=8F=8A=E4=BB=A3=E7=A0=81=EF=BC=9B=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E4=BA=A4=E8=B4=A7=E5=9C=B0=EF=BC=8C=E5=BE=97=E5=88=B0?= =?UTF-8?q?=E4=B8=BA=E5=8D=B8=E8=B4=A7=E6=B8=AF=E5=90=8D=E7=A7=B0=E5=8F=8A?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/BookingSlot/BookingSlotService.cs | 63 +++++++++++++++++-- 1 file changed, 58 insertions(+), 5 deletions(-) diff --git a/Myshipping.Application/Service/BookingSlot/BookingSlotService.cs b/Myshipping.Application/Service/BookingSlot/BookingSlotService.cs index 7061ee79..7ae3ef28 100644 --- a/Myshipping.Application/Service/BookingSlot/BookingSlotService.cs +++ b/Myshipping.Application/Service/BookingSlot/BookingSlotService.cs @@ -323,6 +323,59 @@ namespace Myshipping.Application }); } + // 解析收货地,得到装货港名称及代码 + if (!string.IsNullOrWhiteSpace(dto.DataObj.PLACERECEIPT)) + { + var portEnName = dto.DataObj.PLACERECEIPT.Split(',')[0]?.Trim(); + if (!string.IsNullOrWhiteSpace(portEnName)) + { + var portInfo = (await _cache.GetAllCodePortLoad()).FirstOrDefault(x => x.EnName.Equals(portEnName, StringComparison.OrdinalIgnoreCase)); + if (portInfo!= null) + { + dto.DataObj.PORTLOAD = portInfo.EnName; + dto.DataObj.PORTLOADID = portInfo.EdiCode; + } + else + { + _logger.LogInformation("通过收货地城市名称未匹配到港口信息,订舱编号:{SLOT_BOOKING_NO}", dto.DataObj.SLOT_BOOKING_NO); + } + } + else + { + _logger.LogInformation("收货地分割后得到的城市名称为空,订舱编号:{SLOT_BOOKING_NO}", dto.DataObj.SLOT_BOOKING_NO); + } + } + else + { + _logger.LogInformation("收货地为空,订舱编号:{SLOT_BOOKING_NO}", dto.DataObj.SLOT_BOOKING_NO); + } + // 解析交货地,得到为卸货港名称及代码 + if (!string.IsNullOrWhiteSpace(dto.DataObj.PLACEDELIVERY)) + { + var portEnName = dto.DataObj.PLACEDELIVERY.Split(',')[0]?.Trim(); + if (!string.IsNullOrWhiteSpace(portEnName)) + { + var portInfo = (await _cache.GetAllCodePort()).FirstOrDefault(x => x.EnName.Equals(portEnName, StringComparison.OrdinalIgnoreCase)); + if (portInfo != null) + { + dto.DataObj.PORTDISCHARGE = portInfo.EnName; + dto.DataObj.PORTDISCHARGEID = portInfo.EdiCode; + } + else + { + _logger.LogInformation("通过交货地城市名称未匹配到港口信息,订舱编号:{SLOT_BOOKING_NO}", dto.DataObj.SLOT_BOOKING_NO); + } + } + else + { + _logger.LogInformation("交货地分割后得到的城市名称为空,订舱编号:{SLOT_BOOKING_NO}", dto.DataObj.SLOT_BOOKING_NO); + } + } + else + { + _logger.LogInformation("交货地为空,订舱编号:{SLOT_BOOKING_NO}", dto.DataObj.SLOT_BOOKING_NO); + } + BookingSlotBase model = null; if (dto.OpType == "add") { @@ -1056,7 +1109,7 @@ namespace Myshipping.Application TimeSpan ts = eDate.Subtract(bDate); var timeDiff = ts.TotalMilliseconds; - if(compareResult != null) + if (compareResult != null) { _logger.LogInformation("批次={no} 请求完成,耗时:{timeDiff}ms. 结果{msg}", batchNo, timeDiff, compareResult.succ ? "成功" : "失败"); } @@ -1175,7 +1228,7 @@ namespace Myshipping.Application { _logger.LogInformation("推送BC比对异常,原因:{error}", ex.Message); - // throw Oops.Oh($"推送BC比对异常,原因:{ex.Message}"); + // throw Oops.Oh($"推送BC比对异常,原因:{ex.Message}"); } } @@ -1206,7 +1259,7 @@ namespace Myshipping.Application throw Oops.Oh($"获取舱位变更比对结果错误,比对内容不存在"); } - if(!string.IsNullOrWhiteSpace(compareInfo.COMPARE_RLT)) + if (!string.IsNullOrWhiteSpace(compareInfo.COMPARE_RLT)) { return JSON.Deserialize>(compareInfo.COMPARE_RLT); } @@ -1346,7 +1399,7 @@ namespace Myshipping.Application CLOSEVGMDATE = bookingSlotBase.VGM_SUBMISSION_CUT_DATE, CLOSINGDATE = bookingSlotBase.CY_CUT_DATE, CLOSEDOCDATE = bookingSlotBase.SI_CUT_DATE, - CUSTSERVICEID = generateModel.CustServiceId.HasValue? generateModel.CustServiceId.Value.ToString():null, + CUSTSERVICEID = generateModel.CustServiceId.HasValue ? generateModel.CustServiceId.Value.ToString() : null, CUSTSERVICE = generateModel.CustServiceName, ctnInputs = new List() }; @@ -1565,7 +1618,7 @@ namespace Myshipping.Application { BookingSlotWithOrderDto dto = null; - var slotInfo = await _repBase.AsQueryable().Filter(null,true).FirstAsync(a => a.SLOT_BOOKING_NO == slotBookingNo && a.TenantId == tenantId && a.IsDeleted == false); + var slotInfo = await _repBase.AsQueryable().Filter(null, true).FirstAsync(a => a.SLOT_BOOKING_NO == slotBookingNo && a.TenantId == tenantId && a.IsDeleted == false); if (slotInfo == null) { From 3d8066c35931691dddb76166dc42085f4cb1af94 Mon Sep 17 00:00:00 2001 From: zhangxiaofeng <1939543722@qq.com> Date: Fri, 10 May 2024 16:54:34 +0800 Subject: [PATCH 7/8] =?UTF-8?q?1.=E8=88=B1=E4=BD=8D=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E8=A1=A8=E8=A1=A5=E5=85=85=E5=AD=97=E6=AE=B5=202.=E8=88=B1?= =?UTF-8?q?=E4=BD=8D=E6=9B=B4=E6=96=B0=E5=90=8E=E5=AF=B9=E6=97=A7=E7=9A=84?= =?UTF-8?q?=E8=88=B1=E4=BD=8D=E4=BF=A1=E6=81=AF=E7=9A=84=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BookingSlot/BookingSlotAllocation.cs | 36 +++++++- .../Entity/BookingSlot/BookingSlotBase.cs | 12 +++ .../Service/BookingSlot/BookingSlotService.cs | 87 ++++++++++++++++++- .../BookingSlot/Dto/BookingSlotBaseDto.cs | 57 +++++++++++- 4 files changed, 187 insertions(+), 5 deletions(-) diff --git a/Myshipping.Application/Entity/BookingSlot/BookingSlotAllocation.cs b/Myshipping.Application/Entity/BookingSlot/BookingSlotAllocation.cs index 2a4ed3c0..833b8445 100644 --- a/Myshipping.Application/Entity/BookingSlot/BookingSlotAllocation.cs +++ b/Myshipping.Application/Entity/BookingSlot/BookingSlotAllocation.cs @@ -250,6 +250,40 @@ namespace Myshipping.Application /// [SugarColumn(ColumnName = "TenantName")] public string TenantName{ get; set; } - + + /// + /// 客户名称 + /// + public string CUSTOMERNAME { get; set; } + + /// + /// 客服名称 + /// + public string CUSTSERVICE { get; set; } + + /// + /// 销售名称 + /// + public string SALE { get; set; } + + /// + /// 销售日期 + /// + public DateTime? SALE_TIME { get; set; } + + /// + /// 发货人 + /// + public string SHIPPER { get; set; } + + /// + /// 品名 + /// + public string GOODSNAME { get; set; } + + /// + /// 卖价 + /// + public decimal? SELLING_PRICE { get; set; } } } \ No newline at end of file diff --git a/Myshipping.Application/Entity/BookingSlot/BookingSlotBase.cs b/Myshipping.Application/Entity/BookingSlot/BookingSlotBase.cs index 159d1670..06b6b7bc 100644 --- a/Myshipping.Application/Entity/BookingSlot/BookingSlotBase.cs +++ b/Myshipping.Application/Entity/BookingSlot/BookingSlotBase.cs @@ -360,5 +360,17 @@ namespace Myshipping.Application [SugarColumn(ColumnName = "CUSTOM_SI_CUT_DATE")] [Description("客户样单截止日期")] public Nullable CUSTOM_SI_CUT_DATE { get; set; } + + /// + /// 备注 + /// + [Description("备注")] + public string REMARK { get; set; } + + /// + /// 计费日期 + /// + [Description("计费日期")] + public DateTime? PRICE_CALCULATION_DATE { get; set; } } } \ No newline at end of file diff --git a/Myshipping.Application/Service/BookingSlot/BookingSlotService.cs b/Myshipping.Application/Service/BookingSlot/BookingSlotService.cs index 7ae3ef28..0b9b048a 100644 --- a/Myshipping.Application/Service/BookingSlot/BookingSlotService.cs +++ b/Myshipping.Application/Service/BookingSlot/BookingSlotService.cs @@ -144,8 +144,35 @@ namespace Myshipping.Application input.Adapt(model); + // 1.判断新的舱位信息的7个库存统计维度是否发生变化 + // 2.如果有变化,则需要更新旧的库存信息 + bool isNeedUpdateOldStock = false; + if (oldObj.VESSEL != model.VESSEL + || oldObj.VOYNO != model.VOYNO + || oldObj.BOOKING_SLOT_TYPE != model.BOOKING_SLOT_TYPE + || oldObj.CARRIERID != model.CARRIERID + || oldObj.PLACERECEIPT != model.PLACERECEIPT + || oldObj.PLACEDELIVERY != model.PLACEDELIVERY) + { + isNeedUpdateOldStock = true; + } + await _repBase.UpdateAsync(model); + 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, + PLACERECEIPT = oldObj.PLACERECEIPT, + PLACEDELIVERY = oldObj.PLACEDELIVERY + })); + } await _repCtn.DeleteAsync(x => x.SLOT_ID == model.Id); foreach (var ctn in input.CtnList) { @@ -330,7 +357,7 @@ namespace Myshipping.Application if (!string.IsNullOrWhiteSpace(portEnName)) { var portInfo = (await _cache.GetAllCodePortLoad()).FirstOrDefault(x => x.EnName.Equals(portEnName, StringComparison.OrdinalIgnoreCase)); - if (portInfo!= null) + if (portInfo != null) { dto.DataObj.PORTLOAD = portInfo.EnName; dto.DataObj.PORTLOADID = portInfo.EdiCode; @@ -484,7 +511,36 @@ namespace Myshipping.Application var oldObj = model.Adapt(); dto.DataObj.Adapt(model); + + // 1.判断新的舱位信息的7个库存统计维度是否发生变化 + // 2.如果有变化,则需要更新旧的库存信息 + bool isNeedUpdateOldStock = false; + if (oldObj.VESSEL != model.VESSEL + || oldObj.VOYNO != model.VOYNO + || oldObj.BOOKING_SLOT_TYPE != model.BOOKING_SLOT_TYPE + || oldObj.CARRIERID != model.CARRIERID + || oldObj.PLACERECEIPT != model.PLACERECEIPT + || oldObj.PLACEDELIVERY != model.PLACEDELIVERY) + { + isNeedUpdateOldStock = true; + } await _repBase.UpdateAsync(model); + + 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, + PLACERECEIPT = oldObj.PLACERECEIPT, + PLACEDELIVERY = oldObj.PLACEDELIVERY + })); + } + await _repCtn.DeleteAsync(x => x.SLOT_ID == model.Id); foreach (var ctn in dto.DataObj.CtnList) { @@ -1047,6 +1103,35 @@ namespace Myshipping.Application var result = entities.Adapt>(); + // 查询舱位绑定的销售信息,赋值到舱位对象中 + var slotIds = result.Items.Select(x => x.Id); + if (slotIds.Any()) + { + List allocationInfoList = await _repAllocation.AsQueryable() + .Where(x => slotIds.Contains(x.BOOKING_SLOT_ID)) + .Select(x => new BookingSlotSaleInfoDto + { + BOOKING_SLOT_ID = x.BOOKING_SLOT_ID, + CUSTOMERNAME = x.CUSTOMERNAME, + CUSTSERVICE = x.CUSTSERVICE, + SALE = x.SALE, + SALE_TIME = x.SALE_TIME, + SHIPPER = x.SHIPPER, + GOODSNAME = x.GOODSNAME, + SELLING_PRICE = x.SELLING_PRICE + }).ToListAsync(); + + var group = allocationInfoList.GroupBy(x => x.BOOKING_SLOT_ID); + foreach (var item in group) + { + var slot = result.Items.FirstOrDefault(x => x.Id == item.Key); + if (slot != null) + { + slot.BookingSlotSaleInfoList = item.ToList(); + } + } + } + return result.XnPagedResult(); } #endregion diff --git a/Myshipping.Application/Service/BookingSlot/Dto/BookingSlotBaseDto.cs b/Myshipping.Application/Service/BookingSlot/Dto/BookingSlotBaseDto.cs index ee5c65ca..bbe76320 100644 --- a/Myshipping.Application/Service/BookingSlot/Dto/BookingSlotBaseDto.cs +++ b/Myshipping.Application/Service/BookingSlot/Dto/BookingSlotBaseDto.cs @@ -441,6 +441,11 @@ namespace Myshipping.Application.Service.BookingSlot.Dto /// 修改者名称 /// public string UpdatedUserName { get; set; } + + /// + /// 舱位关联的订舱信息 + /// + public List BookingSlotSaleInfoList { get; set; } } /// @@ -462,12 +467,12 @@ namespace Myshipping.Application.Service.BookingSlot.Dto /// /// 操作类型,add 新增、update 更新、del 删除取消 /// - public string OpType { get; set; } + public string OpType { get; set; } /// /// 数据对象 /// - public BookingSlotBaseApiSaveDto DataObj { get; set; } + public BookingSlotBaseApiSaveDto DataObj { get; set; } /// /// 批次号 @@ -478,7 +483,7 @@ namespace Myshipping.Application.Service.BookingSlot.Dto /// /// 舱位基础信息含箱信息列表Dto /// - public class BookingSlotBaseWithCtnDto: BookingSlotBaseDto + public class BookingSlotBaseWithCtnDto : BookingSlotBaseDto { /// /// Id @@ -490,4 +495,50 @@ namespace Myshipping.Application.Service.BookingSlot.Dto /// public List CtnList { get; set; } } + + /// + /// 舱位销售信息 + /// + public class BookingSlotSaleInfoDto + { + /// + /// 舱位主键 + /// + public long BOOKING_SLOT_ID { get; set; } + + /// + /// 客户名称 + /// + public string CUSTOMERNAME { get; set; } + + /// + /// 客服名称 + /// + public string CUSTSERVICE { get; set; } + + /// + /// 销售名称 + /// + public string SALE { get; set; } + + /// + /// 销售日期 + /// + public DateTime? SALE_TIME { get; set; } + + /// + /// 发货人 + /// + public string SHIPPER { get; set; } + + /// + /// 品名 + /// + public string GOODSNAME { get; set; } + + /// + /// 卖价 + /// + public decimal? SELLING_PRICE { get; set; } + } } From 613413efac566d6d7b15146dfbeb32fc38d25b9e Mon Sep 17 00:00:00 2001 From: zhangxiaofeng <1939543722@qq.com> Date: Fri, 10 May 2024 17:38:21 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E5=BA=93=E5=AD=98=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E3=80=81=E8=AE=A1=E8=B4=B9=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Event/BookingSlotStockSubscriber.cs | 18 ++++++++++++++---- .../BookingOrder/BookingOrderService.cs | 8 +++++--- .../Service/BookingSlot/BookingSlotService.cs | 15 ++++++++++----- .../BookingSlot/Dto/BookingSlotBaseDto.cs | 12 ++++++++++++ 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/Myshipping.Application/Event/BookingSlotStockSubscriber.cs b/Myshipping.Application/Event/BookingSlotStockSubscriber.cs index a345ecc7..ba70cf76 100644 --- a/Myshipping.Application/Event/BookingSlotStockSubscriber.cs +++ b/Myshipping.Application/Event/BookingSlotStockSubscriber.cs @@ -64,10 +64,6 @@ namespace Myshipping.Application.Event && x.PLACERECEIPT == paraObj.PLACERECEIPT) .OrderByDescending(x => x.UpdatedTime) .ToListAsync(); - if (!baseList.Any()) - { - return; - } var stockObj = await _repStock.AsQueryable() .Filter(null, true) @@ -79,6 +75,15 @@ namespace Myshipping.Application.Event && x.CARRIERID == paraObj.CARRIERID && x.PLACEDELIVERY == paraObj.PLACEDELIVERY && x.PLACERECEIPT == paraObj.PLACERECEIPT); + + if (!baseList.Any()) + { + // 从库存表删除这7项维度的库存数据 + + return; + } + + if (stockObj == null) { stockObj = new BookingSlotStock(); @@ -222,5 +227,10 @@ namespace Myshipping.Application.Event /// 交货地 /// public string PLACEDELIVERY { get; set; } + + /// + /// 租户Id + /// + public long? TenantId { get; set; } } } diff --git a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs index 5285779d..220cb580 100644 --- a/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs +++ b/Myshipping.Application/Service/BookingOrder/BookingOrderService.cs @@ -1588,7 +1588,7 @@ namespace Myshipping.Application throw Oops.Bah("当前真提单号已存在,请勿重复录入!"); } } - + } //版本号避免多人同时操作数据错乱 @@ -11925,7 +11925,8 @@ namespace Myshipping.Application x.VESSEL, x.VOYNO, x.PLACERECEIPT, - x.PLACEDELIVERY + x.PLACEDELIVERY, + x.TenantId }).ToListAsync(); if (slotList.Count > 0) @@ -11958,7 +11959,8 @@ namespace Myshipping.Application VESSEL = item.VESSEL, VOYNO = item.VOYNO, PLACERECEIPT = item.PLACERECEIPT, - PLACEDELIVERY = item.PLACEDELIVERY + PLACEDELIVERY = item.PLACEDELIVERY, + TenantId = item.TenantId })); } } diff --git a/Myshipping.Application/Service/BookingSlot/BookingSlotService.cs b/Myshipping.Application/Service/BookingSlot/BookingSlotService.cs index 0b9b048a..69b064a1 100644 --- a/Myshipping.Application/Service/BookingSlot/BookingSlotService.cs +++ b/Myshipping.Application/Service/BookingSlot/BookingSlotService.cs @@ -170,7 +170,8 @@ namespace Myshipping.Application VESSEL = oldObj.VESSEL, VOYNO = oldObj.VOYNO, PLACERECEIPT = oldObj.PLACERECEIPT, - PLACEDELIVERY = oldObj.PLACEDELIVERY + PLACEDELIVERY = oldObj.PLACEDELIVERY, + TenantId = model.TenantId })); } await _repCtn.DeleteAsync(x => x.SLOT_ID == model.Id); @@ -212,7 +213,8 @@ namespace Myshipping.Application VESSEL = model.VESSEL, VOYNO = model.VOYNO, PLACERECEIPT = model.PLACERECEIPT, - PLACEDELIVERY = model.PLACEDELIVERY + PLACEDELIVERY = model.PLACEDELIVERY, + TenantId = model.TenantId })); return await Detail(model.Id); @@ -537,7 +539,8 @@ namespace Myshipping.Application VESSEL = oldObj.VESSEL, VOYNO = oldObj.VOYNO, PLACERECEIPT = oldObj.PLACERECEIPT, - PLACEDELIVERY = oldObj.PLACEDELIVERY + PLACEDELIVERY = oldObj.PLACEDELIVERY, + TenantId = model.TenantId })); } @@ -659,7 +662,8 @@ namespace Myshipping.Application VESSEL = model.VESSEL, VOYNO = model.VOYNO, PLACERECEIPT = model.PLACERECEIPT, - PLACEDELIVERY = model.PLACEDELIVERY + PLACEDELIVERY = model.PLACEDELIVERY, + TenantId = model.TenantId })); } else @@ -1044,7 +1048,8 @@ namespace Myshipping.Application VESSEL = latestSlot.VESSEL, VOYNO = latestSlot.VOYNO, PLACERECEIPT = latestSlot.PLACERECEIPT, - PLACEDELIVERY = latestSlot.PLACEDELIVERY + PLACEDELIVERY = latestSlot.PLACEDELIVERY, + TenantId = latestSlot.TenantId, })); } } diff --git a/Myshipping.Application/Service/BookingSlot/Dto/BookingSlotBaseDto.cs b/Myshipping.Application/Service/BookingSlot/Dto/BookingSlotBaseDto.cs index bbe76320..89090911 100644 --- a/Myshipping.Application/Service/BookingSlot/Dto/BookingSlotBaseDto.cs +++ b/Myshipping.Application/Service/BookingSlot/Dto/BookingSlotBaseDto.cs @@ -328,6 +328,18 @@ namespace Myshipping.Application.Service.BookingSlot.Dto /// [Description("客户样单截止日期")] public Nullable CUSTOM_SI_CUT_DATE { get; set; } + + /// + /// 备注 + /// + [Description("备注")] + public string REMARK { get; set; } + + /// + /// 计费日期 + /// + [Description("计费日期")] + public DateTime? PRICE_CALCULATION_DATE { get; set; } } ///