using MailKit.Search; using Masuit.Tools; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using SixLabors.Fonts; using SqlSugar; using System; using System.Net; using System.Net.Mail; using System.Text; using WIDESEA_Cache; using WIDESEA_Core.Const; using WIDESEA_DTO.WMS; using WIDESEA_IOrderRepository; using WIDESEA_IServices; using WIDESEA_Model.Models.ERP; using WIDESEA_Model.Models.Order; using WIDESEA_OrderRepository; using WIDESEAWCS_BasicInfoRepository; namespace WIDESEA_StorageTaskServices { public class MyBackgroundService : IHostedService, IDisposable { private readonly ILogger _logger; private readonly IStockInfoRepository _stockInfoRepository; private readonly IDt_AreaInfoRepository _areaInfoRepository; //区域 private readonly IDt_TaskRepository _taskRepository; private readonly IDt_StationManagerRepository _stationManagerRepository; private readonly ISys_ConfigService _configService; private readonly ILocationInfoRepository _locationRepository; private readonly IDt_InboundOrderRepository _inboundOrderRepository; private readonly IDt_OtherOutboundOrderRepository _otheroutboundorderRepository; private readonly IDt_ProductionOutboundOrderRepository _productionoutboundorderRepository; private readonly IDt_InventoryOutboundOrderRepository _inventoryoutboundorderRepository; private readonly IDt_AllocateOutboundOrderRepository _allocateoutboundorderRepository; private Timer _timer; public MyBackgroundService(ILogger logger, ILocationInfoRepository locationRepository, IStockInfoRepository stockInfoRepository, IDt_AreaInfoRepository areaInfoRepository, IDt_TaskRepository taskRepository, IDt_StationManagerRepository stationManagerRepository, ISys_ConfigService configService,IDt_InboundOrderRepository inboundOrderRepository, IDt_OtherOutboundOrderRepository otheroutboundorderRepository, IDt_AllocateOutboundOrderRepository allocateoutboundorderRepository, IDt_InventoryOutboundOrderRepository inventoryOutboundOrderRepository,IDt_ProductionOutboundOrderRepository productionOutboundOrderRepository) { _logger = logger; _locationRepository = locationRepository; _stockInfoRepository = stockInfoRepository; _areaInfoRepository = areaInfoRepository; _taskRepository = taskRepository; _stationManagerRepository = stationManagerRepository; _configService = configService; _inboundOrderRepository = inboundOrderRepository; _otheroutboundorderRepository = otheroutboundorderRepository; _allocateoutboundorderRepository = allocateoutboundorderRepository; _inventoryoutboundorderRepository = inventoryOutboundOrderRepository; _productionoutboundorderRepository = productionOutboundOrderRepository; } public Task StartAsync(CancellationToken cancellationToken) { _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromMinutes(5)); return Task.CompletedTask; } private void DoWork(object state) { try { #region 入库单据同步 List ERPPrintChecklist =SqlSugarHelper.DBERP.Queryable().Where(x => true).ToList(); var printCheckList = _inboundOrderRepository.QueryData(x => true); List inboundOrderAdd = new List(); List inboundOrderUpdate = new List(); foreach (var item in ERPPrintChecklist) { var x = printCheckList.Where(x => x.MaterialNo == item.料号 && x.UpperOrderNo == item.单号 && x.WarehouseName == item.入库仓库名称).FirstOrDefault(); if (x == null) { Dt_InboundOrder Print = new Dt_InboundOrder() { OrderNo = GetOrderPintCode("OrderNoIn"), UpperOrderNo = item.单号, DemandClassification = item.需求分类, OrderType = item.单据类型, WarehouseName = item.入库仓库名称, Datetime = item.日期.ToString(), LineNumber = item.行号, ProductDrawingNumber = item.产品图号, MaterialNo = item.料号, MaterialName = item.品名, Weight = item.单重, Specs = item.规格, Unit = item.单位, Texture = item.用友材质, Quantity = item.入库数量, OrderStatus = item.单据状态 }; inboundOrderAdd.Add(Print); } else { if (x.OrderNo == null || x.OrderNo == "") { x.OrderNo = GetOrderPintCode("OrderNoIn"); x.UpperOrderNo = item.单号; x.DemandClassification = item.需求分类; x.OrderType = item.单据类型; x.WarehouseName = item.入库仓库名称; x.Datetime = item.日期.ToString(); x.LineNumber = item.行号; x.ProductDrawingNumber = item.产品图号; x.MaterialNo = item.料号; x.MaterialName = item.品名; x.Weight = item.单重; x.Specs = item.规格; x.Unit = item.单位; x.Texture = item.用友材质; x.Quantity = item.入库数量; x.OrderStatus = item.单据状态; inboundOrderUpdate.Add(x); } } } if (inboundOrderAdd.Count > 0) { _inboundOrderRepository.AddData(inboundOrderAdd); } if (inboundOrderUpdate.Count > 0) { _inboundOrderRepository.UpdateData(inboundOrderUpdate); } #endregion #region ERP生产领料单同步 var productionOutOrder = _productionoutboundorderRepository.Db.Queryable().Includes(x => x.Details).ToList(); List EngineeringoutboundOrderAdd = new List(); List EngineeringoutboundOrderUpdate = new List(); List productionoutboundOrderAdd = new List(); List productionoutboundOrderUpdate = new List(); List EngineeringERP = SqlSugarHelper.DBERP.Queryable().Where(x => true).ToList(); List productERP = SqlSugarHelper.DBERP.Queryable().Where(x => true).ToList(); foreach (var item in EngineeringERP) { var x = productionOutOrder.Where(x => x.UpperOrderNo == item.单号).FirstOrDefault(); if (x == null) { if(productionoutboundOrderAdd.Where(x => x.UpperOrderNo == item.单号).FirstOrDefault()==null) { Dt_ProductionOutboundOrder outOrder = new Dt_ProductionOutboundOrder() { OrderNo = GetOrderPintCode("OrderNoOut"), UpperOrderNo = item.单号, OrderStatus = (int)OrderStateEmun.未开始, OrderType = (int)OrderTypeEmun.生产领料单, CreateType = (int)OrderCreateTypeEmun.ERP推送, Details = new List() { new Dt_ProductionOutboundOrderDetail() { MaterielCode = item.子件料号, MaterielName = item.子件品名, DemandClassification = item.需求名称, OrderQuantity = item.子件实际用量, NotOutQuantity = item.子件未发数量, OverOutQuantity = item.子件发放数量, } } }; EngineeringoutboundOrderAdd.Add(outOrder); } else { var existingOrder = EngineeringoutboundOrderAdd.Where(x => x.UpperOrderNo == item.单号).FirstOrDefault(); existingOrder.Details.Add(new Dt_ProductionOutboundOrderDetail() { MaterielCode = item.子件料号, MaterielName = item.子件品名, DemandClassification = item.需求名称, OrderQuantity = item.子件实际用量, NotOutQuantity = item.子件未发数量, OverOutQuantity = item.子件发放数量, }); } } //else //{ // foreach (var detail in x.Details) // { // if (detail.MaterielCode != item.子件料号 && detail.MaterielName != item.子件品名) // { // if (EngineeringoutboundOrderUpdate.Where(o => o.UpperOrderNo == item.单号).FirstOrDefault() == null) // { // x.Details = new List() // { // new Dt_ProductionOutboundOrderDetail() // { // MaterielCode = item.子件料号, // MaterielName = item.子件品名, // DemandClassification = item.需求名称, // OrderQuantity = item.子件实际用量, // NotOutQuantity = item.子件未发数量, // OverOutQuantity = item.子件发放数量, // } // }; // EngineeringoutboundOrderUpdate.Add(x); // } // else // { // var existingOrder = EngineeringoutboundOrderUpdate.Where(o => o.UpperOrderNo == item.单号).FirstOrDefault(); // existingOrder.Details.Add(new Dt_ProductionOutboundOrderDetail() // { // MaterielCode = item.子件料号, // MaterielName = item.子件品名, // DemandClassification = item.需求名称, // OrderQuantity = item.子件实际用量, // NotOutQuantity = item.子件未发数量, // OverOutQuantity = item.子件发放数量, // }); // } // } // } //} } if (EngineeringoutboundOrderAdd.Count > 0) { foreach (var order in EngineeringoutboundOrderAdd) { _productionoutboundorderRepository.AddDataNavAsync(order); } } if (EngineeringoutboundOrderUpdate.Count > 0) { _productionoutboundorderRepository.UpdateDataNav(EngineeringoutboundOrderUpdate); } foreach (var item in productERP) { var x = productionOutOrder.Where(x => x.UpperOrderNo == item.单号).FirstOrDefault(); if (x == null) { if (productionoutboundOrderAdd.Where(x => x.UpperOrderNo == item.单号).FirstOrDefault() == null) { Dt_ProductionOutboundOrder outOrder = new Dt_ProductionOutboundOrder() { OrderNo = GetOrderPintCode("OrderNoOut"), UpperOrderNo = item.单号, OrderStatus = (int)OrderStateEmun.未开始, OrderType = (int)OrderTypeEmun.生产领料单, CreateType = (int)OrderCreateTypeEmun.ERP推送, Details = new List() { new Dt_ProductionOutboundOrderDetail() { MaterielCode = item.子件料号, MaterielName = item.子件品名, DemandClassification = item.需求名称, OrderQuantity = item.子件实际用量, NotOutQuantity = item.子件未发数量, OverOutQuantity = item.子件发放数量, } } }; productionoutboundOrderAdd.Add(outOrder); } else { var existingOrder = productionoutboundOrderAdd.Where(x => x.UpperOrderNo == item.单号).FirstOrDefault(); existingOrder.Details.Add(new Dt_ProductionOutboundOrderDetail() { MaterielCode = item.子件料号, MaterielName = item.子件品名, DemandClassification = item.需求名称, OrderQuantity = item.子件实际用量, NotOutQuantity = item.子件未发数量, OverOutQuantity = item.子件发放数量, }); } } //else //{ // foreach (var detail in x.Details) // { // if (productionoutboundOrderUpdate.Where(o => o.UpperOrderNo == item.单号).FirstOrDefault() == null) // { // x.Details = new List() // { // new Dt_ProductionOutboundOrderDetail() // { // MaterielCode = item.子件料号, // MaterielName = item.子件品名, // DemandClassification = item.需求名称, // OrderQuantity = item.子件实际用量, // NotOutQuantity = item.子件未发数量, // OverOutQuantity = item.子件发放数量, // } // }; // productionoutboundOrderUpdate.Add(x); // } // else // { // var existingOrder = productionoutboundOrderUpdate.Where(o => o.UpperOrderNo == item.单号).FirstOrDefault(); // existingOrder.Details.Add(new Dt_ProductionOutboundOrderDetail() // { // MaterielCode = item.子件料号, // MaterielName = item.子件品名, // DemandClassification = item.需求名称, // OrderQuantity = item.子件实际用量, // NotOutQuantity = item.子件未发数量, // OverOutQuantity = item.子件发放数量, // }); // } // } //} } if (productionoutboundOrderAdd.Count > 0) { foreach (var order in productionoutboundOrderAdd) { _productionoutboundorderRepository.AddDataNavAsync(order); } } if (productionoutboundOrderUpdate.Count > 0) { _productionoutboundorderRepository.UpdateDataNav(productionoutboundOrderUpdate); } #endregion } catch (Exception ex) { ConsoleHelper.WriteErrorLine($"错误信息:" + ex.Message); } } public string GetOrderPintCode(string printCode) { string PrintCode = ""; var PrintSetting = SqlSugarHelper.DbWMS.Queryable().Where(x => x.PrintCode == printCode).ToList().FirstOrDefault(); if (PrintSetting.Spare1 == DateTime.Now.ToString("yyyyMMdd")) { PrintCode = PrintSetting.Spare1 + PrintSetting.PrintNo.ToString().PadLeft(PrintSetting.Spare2, '0'); PrintSetting.PrintNo = PrintSetting.PrintNo + 1; } else { PrintSetting.Spare1 = DateTime.Now.ToString("yyyyMMdd"); PrintSetting.PrintNo = 2; PrintCode = PrintSetting.Spare1 + 1.ToString().PadLeft(PrintSetting.Spare2, '0'); } SqlSugarHelper.DbWMS.Updateable(PrintSetting).ExecuteCommand(); return PrintCode; } public Task StopAsync(CancellationToken cancellationToken) { _logger.LogInformation("MyBackgroundService is stopping."); _timer?.Change(Timeout.Infinite, 0); return Task.CompletedTask; } public void Dispose() { _timer?.Dispose(); } } }