diff --git a/ds-wms-service/DS.WMS.FeeBillRecvService/DS.WMS.FeeBillRecvService.csproj b/ds-wms-service/DS.WMS.FeeBillRecvService/DS.WMS.FeeBillRecvService.csproj index 0c83bc4b..f7cb63cc 100644 --- a/ds-wms-service/DS.WMS.FeeBillRecvService/DS.WMS.FeeBillRecvService.csproj +++ b/ds-wms-service/DS.WMS.FeeBillRecvService/DS.WMS.FeeBillRecvService.csproj @@ -21,4 +21,10 @@ + + + Always + + + diff --git a/ds-wms-service/DS.WMS.FeeBillRecvService/Dtos/CustomerTypeEnum.cs b/ds-wms-service/DS.WMS.FeeBillRecvService/Dtos/CustomerTypeEnum.cs new file mode 100644 index 00000000..5d463437 --- /dev/null +++ b/ds-wms-service/DS.WMS.FeeBillRecvService/Dtos/CustomerTypeEnum.cs @@ -0,0 +1,142 @@ +using iText.Kernel.Pdf.Canvas.Parser.ClipperLib; +using iText.Layout.Properties; +using Microsoft.AspNetCore.Mvc; +using Spire.Xls.Core; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace DS.WMS.FeeBillRecvService +{ + /// + /// 客户类型枚举 + /// + public enum CustomerTypeEnum + { + /// + /// 船公司 + /// + [Description("船公司")] + carrier, + /// + /// 场站 + /// + [Description("场站")] + yard, + /// + /// 订舱口 + /// + [Description("订舱口")] + booking, + /// + /// 车队 + /// + [Description("车队")] + truck, + /// + /// 委托单位 + /// + [Description("委托单位")] + controller, + /// + /// 船公司 + /// + [Description("报关行")] + custom, + /// + /// 代理(国外) + /// + [Description("代理(国外)")] + agent, + /// + /// 代理(国内) + /// + [Description("代理(国内)")] + agentcn, + + /// + /// 快递公司 + /// + [Description("快递公司")] + express, + /// + /// 航空公司 + /// + [Description("航空公司")] + airlines, + /// + /// 发货人 + /// + [Description("发货人")] + shipper, + /// + /// 收货人 + /// + [Description("收货人")] + consignee, + /// + /// 通知人 + /// + [Description("通知人")] + notifyParty, + /// + /// 仓库 + /// + [Description("仓库")] + wareHouse, + /// + /// 通知人 + /// + [Description("保险公司")] + insurer, + /// + /// 租箱公司 + /// + [Description("租箱公司")] + leasing, + /// + /// 贸易代理 + /// + [Description("贸易代理")] + tradingagency, + /// + /// 船代 + /// + [Description("船代")] + shipagency, + /// + /// 经营单位 + /// + [Description("经营单位")] + enterprise, + /// + /// 码头 + /// + [Description("码头")] + wharf, + /// + /// 国内同行 + /// + [Description("国内同行")] + domesticPeers, + /// + /// 国外同行 + /// + [Description("国外同行")] + foreignCounterparts, + /// + /// 国内直客 + /// + [Description("国内直客")] + isDirectCustomerCn, + /// + /// 国内发货人 + /// + [Description("国内发货人")] + shippercn, + } +} diff --git a/ds-wms-service/DS.WMS.FeeBillRecvService/Dtos/FeeUnitEnum.cs b/ds-wms-service/DS.WMS.FeeBillRecvService/Dtos/FeeUnitEnum.cs new file mode 100644 index 00000000..e76acf0e --- /dev/null +++ b/ds-wms-service/DS.WMS.FeeBillRecvService/Dtos/FeeUnitEnum.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DS.WMS.FeeBillRecvService +{ + /// + /// 计费标准枚举 + /// + public enum FeeUnitEnum + { + /// + /// 单票 + /// + [Description("单票")] + P, + /// + /// 重量 + /// + [Description("重量")] + Z, + /// + /// 尺码 + /// + [Description("尺码")] + C, + /// + /// 件数 + /// + [Description("件数")] + J, + /// + /// 计费吨 + /// + [Description("计费吨")] + JF, + /// + /// TEU + /// + [Description("TEU")] + TEU, + /// + /// 净重 + /// + [Description("净重")] + JZ, + /// + /// 总价 + /// + [Description("总价")] + ZJ, + /// + /// 计价重量 + /// + [Description("计价重量")] + JJZL, + /// + /// 箱型 + /// + [Description("箱型")] + XX, + /// + /// 天 + /// + [Description("天")] + DAY, + /// + /// 个 + /// + [Description("个")] + GE, + /// + /// 小时 + /// + [Description("小时")] + HOUR, + /// + /// 票 + /// + [Description("票")] + Bill, + /// + /// 箱 + /// + [Description("箱")] + CNTR, + } +} diff --git a/ds-wms-service/DS.WMS.FeeBillRecvService/RecvFeeBillWorker.cs b/ds-wms-service/DS.WMS.FeeBillRecvService/RecvFeeBillWorker.cs index c6322518..17acda4f 100644 --- a/ds-wms-service/DS.WMS.FeeBillRecvService/RecvFeeBillWorker.cs +++ b/ds-wms-service/DS.WMS.FeeBillRecvService/RecvFeeBillWorker.cs @@ -3,10 +3,25 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using DS.Module.Core; +using DS.Module.Core.Data; +using DS.Module.SqlSugar; +using DS.Module.UserModule; +using DS.WMS.Core.Fee.Entity; +using DS.WMS.Core.HangfireJob.Interface; +using DS.WMS.Core.Info.Entity; +using DS.WMS.Core.Op.Entity; +using DS.WMS.Core.Sys.Entity; +using DS.WMS.FeeBillRecvService.Dtos; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using NPOI.OpenXmlFormats.Wordprocessing; +using Org.BouncyCastle.Ocsp; using RabbitMQ.Client; using RabbitMQ.Client.Events; +using SqlSugar; namespace DS.WMS.FeeBillRecvService { @@ -15,43 +30,25 @@ namespace DS.WMS.FeeBillRecvService private readonly ILogger _logger; private IConnection mqConn; private IModel model; + private readonly IServiceProvider _serviceProvider; + private readonly ISqlSugarClient db; + private readonly IUser user; + private readonly ISaasDbService saasService; - public RecvFeeBillWorker(ILogger logger) - { - _logger = logger; - } - - public override async Task StartAsync(CancellationToken stoppingToken) + public RecvFeeBillWorker(IServiceProvider serviceProvider, + ILogger logger) { - try - { - //while (!stoppingToken.IsCancellationRequested) - //{ - // _OpServer = new BackgroundJobServer(new BackgroundJobServerOptions - // { - // SchedulePollingInterval = TimeSpan.FromMinutes(1), - // ServerName = "OpWorkService", - // Queues = new[] { "op" } - // }); - // await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken); - //} - } - catch (OperationCanceledException ex) - { - Console.WriteLine(ex.ToString()); - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - //Environment.Exit(1); - } - + _logger = logger; + _serviceProvider = serviceProvider; + db = _serviceProvider.GetRequiredService(); + user = _serviceProvider.GetRequiredService(); + saasService = _serviceProvider.GetRequiredService(); } protected override Task ExecuteAsync(CancellationToken stoppingToken) { - _logger.LogInformation("启动j账单 ExecuteAsync"); + _logger.LogInformation("启动账单 ExecuteAsync"); return Task.Run(() => { @@ -65,14 +62,18 @@ namespace DS.WMS.FeeBillRecvService private void BindMQ() { - string ExchangeName = "billcenter.output.ds7new.444c19c1-0bf5-4709-a08b-c9859ca775e6"; - string QueueName = $"billcenter.output.ds7new.444c19c1-0bf5-4709-a08b-c9859ca775e6"; + //string ExchangeName = "billcenter.output.ds7new.444c19c1-0bf5-4709-a08b-c9859ca775e6"; + //string QueueName = $"billcenter.output.ds7new.444c19c1-0bf5-4709-a08b-c9859ca775e6"; + + string ExchangeName = AppSetting.app(new string[] { "FeeSettings", "ExchangeName" }); + string QueueName = AppSetting.app(new string[] { "FeeSettings", "QueueName" }); + var mqUrl = AppSetting.app(new string[] { "FeeSettings", "MQUrl" }); ConnectionFactory factory = new ConnectionFactory(); //var repoSysCfg = _serviceScope.ServiceProvider.GetService>(); - var mqUrl = "amqp://djy_mail:djymailqwe@47.104.207.5:12567/djy_email_parser"; + //var mqUrl = "amqp://dongsheng8bill:dongsheng8bill@47.104.207.5:12567/billcenter"; //var mqUrl = repoSysCfg.FirstOrDefault(x => x.Code == "DjyBookingAutoMQUrl")?.Value; if (string.IsNullOrEmpty(mqUrl)) { @@ -86,7 +87,7 @@ namespace DS.WMS.FeeBillRecvService model = mqConn.CreateModel(); model.ExchangeDeclare(ExchangeName, ExchangeType.Topic); - model.QueueDeclare(QueueName, false, false, true, null); + model.QueueDeclare(QueueName, false, false, false, null); model.QueueBind(QueueName, ExchangeName, "*", null); var consumer = new EventingBasicConsumer(model); @@ -95,6 +96,9 @@ namespace DS.WMS.FeeBillRecvService var body = arg.Body; var strBody = Encoding.UTF8.GetString(body.ToArray()); _logger.LogInformation($"收到订舱自动化消息队列:{strBody}"); + + DoWork(strBody); + }; model.BasicConsume(QueueName, true, consumer); } @@ -110,10 +114,197 @@ namespace DS.WMS.FeeBillRecvService _logger.LogInformation("BookingAutoService Dispose"); } - private async Task DoWork(CancellationToken cancellationToken) + private void DoWork(string json) + { + /* + 1、反串行化报文,转成对象 + 2、用提单号检索订单信息,如果匹配不到订单信息需要生成待办任务。 + 3、入库费用并写入订单的应付费用表 + */ + + string msg = string.Empty; + + try + { + var model = GetInfo(json, out msg); + + _logger.LogInformation($"报文转换完成 GID={model.GID} BookingBill={model.BookingBill} 共【{model.DetailList.Count}】条"); + + //var tenantDb = saasService.GetBizJobDbScopeById(new JobDbInitConfig + //{ + // UserId = 1819549542463442944, + // UserName = "东胜8测试", + // TenantId = 1819549542425694208, + // OrgId = 1819557001806614528 + + //}); + + var tenantDb = saasService.GetBizJobDbScopeById(new JobDbInitConfig + { + //UserId = long.Parse(AppSetting.app(new string[] { "FeeSettings", "UserId" })), + //UserName = AppSetting.app(new string[] { "FeeSettings", "UserName" }), + TenantId = long.Parse(AppSetting.app(new string[] { "FeeSettings", "TenantId" })), + //OrgId = long.Parse(AppSetting.app(new string[] { "FeeSettings", "OrgId" })), + }); + + _logger.LogInformation($"提取对应租户数据访问完成 GID={model.GID} BookingBill={model.BookingBill}"); + + string blno = model.BookingBill?.Trim(); + + _logger.LogInformation($"提取订单信息 GID={model.GID} BookingBill={model.BookingBill}"); + + var booking = tenantDb.Queryable().ClearFilter(typeof(IOrgId)).First(a => a.MBLNO == blno && a.Deleted == false && (a.IsRefund == null || a.IsRefund.Value == false) + && (a.IsChangeETD == null || a.IsChangeETD.Value == false)); + + _logger.LogInformation($"提取订单完成 GID={model.GID} BookingBill={model.BookingBill} Order={JsonConvert.SerializeObject(booking)}"); + + + if (booking != null) + { + DateTime nowDate = DateTime.Now; + + var custTypeDict = DS.Module.Core.EnumUtil.GetEnumDictionaryWithKey(typeof(CustomerTypeEnum)); + + var feeUnitDict = DS.Module.Core.EnumUtil.GetEnumDictionaryWithKey(typeof(FeeUnitEnum)); + + var codeCurrency = tenantDb.Queryable().ToList(); + + var userInfo = db.Queryable().Filter(null, true).First(x => x.Id == booking.OperatorId && x.TenantId == long.Parse("1819549542425694208")); + + List errorMsgList = new List(); + + int start = 1; + + foreach (var fee in model.DetailList) + { + string qFee = fee.CustSysName?.Trim(); + + //if(string.IsNullOrWhiteSpace(qFee)) + //{ + // errorMsgList.Add("没有费用名称"); + + // continue; + //} + + var feecode = tenantDb.Queryable().First(x => x.Name == qFee); + + if (feecode == null) + { + + } + + var newfee = new FeeRecord(); + + newfee.BusinessId = booking.Id; + newfee.FeeId = feecode.Id; + newfee.FeeName = feecode.Name; + newfee.FeeCode = feecode.Code; + newfee.TaxRate = feecode.TaxRate == null ? 0 : (decimal)feecode.TaxRate; + newfee.BusinessType = BusinessType.OceanShippingExport; + + string custShortName = string.Empty; + string custType = string.Empty; + + if (fee.CustSettleFor.IndexOf("#") >= 0) + { + var currArg = fee.CustSettleFor.Split(new char[] { '#' }); + custShortName = currArg[0]?.Trim(); + + if (currArg.Length == 2) + { + custType = currArg[1].Trim(); + } + } + else + { + custShortName = fee.CustSettleFor?.Trim(); + } + + var customerInfo = tenantDb.Queryable().ClearFilter(typeof(IOrgId)).First(x => x.ShortName == custShortName); + + newfee.CustomerId = customerInfo.Id; + newfee.CustomerName = customerInfo.Description; + + var custTypeKey = custTypeDict.FirstOrDefault(x => x.Value == custType); + + newfee.CustomerType = custTypeKey.Key; + newfee.CustomerTypeText = custTypeKey.Value; + + + newfee.FeeType = FeeType.Payable; //租箱月结明细.FeeType; + + + var feeUnitKey = feeUnitDict.FirstOrDefault(x => x.Value == fee.CustFeeStandard?.Trim()); + + newfee.Unit = feeUnitKey.Key; + newfee.UnitText = feeUnitKey.Value; + + var currCurrCode = codeCurrency.First(a => a.CodeName == fee.CustCurrency); + + newfee.Currency = currCurrCode.CodeName; + + if (!fee.UnitPrice.HasValue) + { + if (fee.Quantity.HasValue && fee.Amount.HasValue) + { + var price = fee.Amount.Value / fee.Quantity.Value; + + newfee.TaxUnitPrice = price; + } + else + { + newfee.TaxUnitPrice = 0; + } + } + else + { + newfee.TaxUnitPrice = fee.UnitPrice.Value; + } + + newfee.Quantity = fee.Quantity.HasValue ? fee.Quantity.Value : 0; + newfee.Amount = fee.Amount.HasValue ? fee.Amount.Value : 0; + + newfee.CreateTime = nowDate; + newfee.CreateBy = userInfo.Id; + newfee.CreateUserName = userInfo.UserName; + newfee.UpdateTime = nowDate; + + newfee.Note = "大简云账单解析"; + + _logger.LogInformation($"写入账单开始 第【{start}】条 GID={model.GID} BookingBill={model.BookingBill} Order={JsonConvert.SerializeObject(newfee)}"); + + tenantDb.Insertable(newfee).ExecuteCommand(); + + _logger.LogInformation($"写入账单完成 第【{start}】条 GID={model.GID} BookingBill={model.BookingBill} Order={JsonConvert.SerializeObject(newfee)}"); + + start++; + } + } + + + } + catch (Exception ex) + { + _logger.LogInformation($"产生异常,原因:{ex.Message}"); + + } + } + + private FeeBillReadDto GetInfo(string json,out string msg) { - // 这里放你的业务逻辑代码 - await Task.CompletedTask; + FeeBillReadDto model = null; + msg = string.Empty; + + try + { + model = JsonConvert.DeserializeObject(json); + } + catch(Exception ex) + { + msg = $"转换报文异常,原因:{ex.Message}"; + } + + return model; } } } diff --git a/ds-wms-service/DS.WMS.FeeBillRecvService/appsettings.json b/ds-wms-service/DS.WMS.FeeBillRecvService/appsettings.json index 993532c9..36c150fc 100644 --- a/ds-wms-service/DS.WMS.FeeBillRecvService/appsettings.json +++ b/ds-wms-service/DS.WMS.FeeBillRecvService/appsettings.json @@ -18,5 +18,15 @@ "Connection": "server=rm-m5e06xxqpa68a68ry5o.mysql.rds.aliyuncs.com;port=3306;uid=rulesengine_admin;pwd=Rule1qaz2wsx!QAZ;database=shippingweb8_log" } ] + }, + "FeeSettings": { + "ShowName": "昭阳接收邮件账单", + "UserId": "1819549542463442944", + "UserName": "东胜8测试", + "TenantId": "1819549542425694208", + "OrgId": "1819557001806614528", + "ExchangeName": "billcenter.output.ds7new.444c19c1-0bf5-4709-a08b-c9859ca775e6", + "QueueName": "billcenter.output.ds7new.444c19c1-0bf5-4709-a08b-c9859ca775e6", + "MQUrl": "amqp://dongsheng8bill:dongsheng8bill@47.104.207.5:12567/billcenter" } } diff --git a/ds-wms-service/DS.WMS.FeeBillRecvService/nlog.config b/ds-wms-service/DS.WMS.FeeBillRecvService/nlog.config new file mode 100644 index 00000000..46e6f7cb --- /dev/null +++ b/ds-wms-service/DS.WMS.FeeBillRecvService/nlog.config @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file