using Khd.Core.Domain.Dto.wcs; using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Wcs.Global; using Masuit.Tools.Logging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System.Data; using Z.EntityFramework.Plus; namespace Khd.Core.Wcs.Wcs { /// /// 根据出入库记录创建出入库任务 /// public class CreateTaskByRecord { private readonly IHost _host; private readonly Plc.S7.Plc _plc; List ScanPoint { get; set; }//点位信息 private BaseSitenode? sitenode { get; set; }//站台信息 private NodeSetting? NodeSettingCarNo { get; set; } private NodeSetting? NodeSettingCarState { get; set; } private NodeSetting? NodeSettingCarRun { get; set; } private NodeSetting? NodeSettingWcsState { get; set; } private NodeSetting? NodeSettingWcsSend { get; set; } private NodeSetting? NodeSettingWcsSendMaterial { get; set; } private NodeSetting? NodeSettingPLCSendSendMaterialstate { get; set; } public CreateTaskByRecord(IHost host, Plc.S7.Plc plc, string siteNo) { this._host = host; this._plc = plc; this.ScanPoint = StaticData.BasePlcpointList.ToList();//加载当前站点所对应的点位 this.sitenode = StaticData.SiteNodeList.FirstOrDefault(t => t.siteNo == siteNo);//获取当前站台信息 //this.NodeSettingCarNo = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("carno")); //this.NodeSettingCarState = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("carstate")); //this.NodeSettingCarRun = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("carrun")); //this.NodeSettingWcsState = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("plcsendK")); //this.NodeSettingWcsSend = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("wcsend")); //this.NodeSettingWcsSendMaterial = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("wcssendmessage")); //this.NodeSettingPLCSendSendMaterialstate = this.ScanPoint.FirstOrDefault(t => t.plcpointNo.Contains("plcsendmessage")); try { //默认启动,清理plc的上位机写入点位值 //this._plc.Write(NodeSettingCarRun.plcpointAddress, MainCentralControl.QingKongDianWei); //this._plc.Write(NodeSettingWcsSend.plcpointAddress, MainCentralControl.QingKongDianWei); //this._plc.Write(NodeSettingWcsSendMaterial.plcpointAddress, MainCentralControl.QingKongDianWei); } catch (Exception ex) { Console.WriteLine("站点" + siteNo + " 初始化数据异常" + ex.Message); LogManager.Error(ex); } } /// /// 启动上件扫描监听 /// public void StartPoint() { var FlowPointThread = new Thread(MonitorInLocatorPoint); FlowPointThread.Start(); Console.WriteLine(DateTime.Now+":出库任务监听启动成功"); LogManager.Info("出库任务监听启动成功"); } public void MonitorInLocatorPoint() { while (true) { try { //原料&辅料出库 CreateRawTask(); //成品&半成品出库 CreateProductTask(); } catch (Exception ex) { LogManager.Error(ex); } finally { Thread.Sleep(2000); } } } /// /// 成品出库 /// public void CreateProductTask() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); var proStock = dbContext.WmsProductStock.Where(t => t.activeFlag == "0").ToList(); var proOutStock = dbContext.WmsProductOutstock.Where(t => t.executeStatus == "0").ToList(); //获取最早入库时间 foreach (var item in proOutStock) { //自动获取id var objid = StaticData.SnowId.NextId(); //锁定库存 WcsOutstockLock stockLock = new() { objid = objid, materialId = item.productId, qty = item.applyQty, warehouseId = item.warehouseId, wmsOrderId = item.productOutstockId, wmsOrderDetailId = item.productOutstockId, createBy = "sys", createTime = DateTime.Now }; var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "O" && t.dicField == item.productType).FirstOrDefault(); //获取最早入库时间 var firstDate = proStock.Where(t => t.productId == item.productId && t.warehouseId == item.warehouseId).OrderBy(t => t.createDate).FirstOrDefault(); if (firstDate != null && dic != null) { //创建出库任务 WcsTask newTask = new() { objid = objid, taskType = Convert.ToInt32(dic.dicValue), containerNo = "", taskStatus = 0, materialId = item.warehouseId, qty = 1, startPointId = item.warehouseId, startPointNo = "", currPointId = item.warehouseId, currPointNo = "", endPointId = item.warehouseId, endPointNo = "", }; dbContext.Add(newTask); dbContext.SaveChanges(); //回写wms记录表 dbContext.WmsProductOutstock.Where(t => t.productOutstockId == item.productOutstockId).Update(t => new WmsProductOutstock() { executeStatus = "1", updateDate = DateTime.Now }); } } } public void CreateRawTask() { using var scope = _host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); //原材料库存 var rawStock = dbContext.WmsRawStock.Where(t => t.activeFlag == "0").ToList(); //原材料出库记录 var rawOutStock = dbContext.WmsRawOutstock.Where(t => t.executeStatus == "0").ToList(); foreach (var item in rawOutStock) { //自动获取id var objid = StaticData.SnowId.NextId(); long orderID = 0; //插入锁定库存 WcsOutstockLock stockLock = new() { objid = objid, materialId = item.productId, qty = 1, warehouseId = item.warehouseId, wmsOrderId = item.rawOutstockId, wmsOrderDetailId = item.rawOutstockId, createBy = "sys", createTime = DateTime.Now }; dbContext.Add(stockLock); if (item.warehouseId == 5)//五楼辅料出库 { //辅料出库时,需创建订单表数据 orderID = StaticData.SnowId.NextId(); WcsWarehouseOrder order = new() { objid = orderID, wmsOrderId = item.rawOutstockId, orderType = Convert.ToInt32(item.taskType), qty = 1, createBy = "", createTime = DateTime.Now }; dbContext.Add(order); } var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "O").FirstOrDefault(); if(dic!= null) { WcsTask rawTask = new() { objid = StaticData.SnowId.NextId(), orderId = item.rawOutstockId, masterId = orderID, taskType = Convert.ToInt32(dic.dicValue), containerNo = "", taskStatus = 0, materialId = item.warehouseId, qty = 1, startPointId = item.warehouseId, startPointNo = "", currPointId = item.warehouseId, currPointNo = "", endPointId = item.warehouseId, endPointNo = "" }; dbContext.Add(rawTask); //获取最早入库时间 var firstDate = rawStock.Where(t => t.materialId == item.productId && t.warehouseId == item.warehouseId).OrderBy(t => t.createDate).FirstOrDefault(); //回写wms出库记录表 dbContext.WmsRawOutstock.Where(t => t.rawOutstockId == item.rawOutstockId).Update(t => new WmsProductOutstock() { executeStatus = "1", updateDate = DateTime.Now }); } } } } }