using Admin.Core.IRepository; using Admin.Core.IService; using Admin.Core.Model; using System.Threading.Tasks; using System.Linq; using System; using Admin.Core.Model.ViewModels; using log4net; using System.Collections.Generic; using Microsoft.Data.SqlClient; using Admin.Core.PlcServer; namespace Admin.Core.Service { public class Hw_WarehouseServices : BaseServices, IHw_WarehouseServices { private static readonly log4net.ILog log = LogManager.GetLogger(typeof(Hw_WarehouseServices)); private readonly IBaseRepository _dal; private readonly IHw_WarehouseRepository _wareHouse; private readonly IHw_WareHouse_SubRepository _wareHouse_Sub; private readonly IHw_FeedReportRepository _feed; private readonly IHw_BarrelRepository _barrel; private readonly Ixl_materialRepository _materialRepository; private readonly Ixl_recipeRepository _recipeRepository; private readonly ILR_weighRepository _lrWeighRepository; public Hw_WarehouseServices(IBaseRepository dal, IHw_WarehouseRepository wareHouse, IHw_WareHouse_SubRepository wareHouse_Sub, IHw_FeedReportRepository feed, IHw_BarrelRepository barrel, Ixl_materialRepository materialRepository, Ixl_recipeRepository recipeRepository, ILR_weighRepository lrWeighRepository) { this._dal = dal; base.BaseDal = dal; _wareHouse = wareHouse; _wareHouse_Sub = wareHouse_Sub; _feed = feed; _barrel = barrel; _materialRepository = materialRepository; _recipeRepository = recipeRepository; _lrWeighRepository = lrWeighRepository; } #region 扫描桶二维码,获取绑定的小料配方物料 /// /// 扫描桶二维码,获取绑定的小料配方 /// /// 桶条码 /// /// public async Task GetXlInfo(string kettleBarCode, string planId, string code) { List list = new List(); List materList = new List(); try { Hw_Barrel hw = await _barrel.FirstAsync(d => d.IsEnable == "是" && d.BarCode == code); if (hw == null) { return null; } var recipe = await _recipeRepository.FirstAsync(d => d.Recipe_Verify == 1 && d.Recipe_Code == hw.MaterialID); if (recipe == null) { return null; } var materialList = await _lrWeighRepository.QueryAsync(d => d.Plan_ID == hw.PlanId && d.Recipe_ID == recipe.ID); if (materialList.Count() == 0) { return null; } foreach (var material in materialList) { MaterialView childView = new MaterialView(); childView.MaterialID = material.Material_ID; var mat = await _materialRepository.FirstAsync(d => d.ID.Equals(material.Material_ID)); if (materialList == null) { continue; } childView.MaterialBarCode = mat.Material_code; childView.MaterialName = material.Material_Name; childView.Weight = material.Real_Weight; childView.Error = material.Real_Error; childView.MatchOrNot = 0; list.Add(childView); } var kettle = await _dal.FirstAsync(d => d.BarCode.Equals(kettleBarCode)); var subList = await _wareHouse_Sub.QueryAsync(d => d.MainId == kettle.ID && d.PId.Equals(planId) &&d.MaterialType.Contains("尾料")); foreach (var check in list) { MaterialView childView = new MaterialView(); childView.MaterialID = check.MaterialID; var mat = await _materialRepository.FirstAsync(d => d.ID.Equals(check.MaterialID)); childView.MaterialBarCode = mat.Material_code; childView.MaterialName = check.MaterialName; var pList = subList.Where(d => d.Material_Code.Equals(check.MaterialBarCode)); if (pList == null) { childView.MatchOrNot = 0; materList.Add(childView); continue; } foreach (var item in pList) { decimal? maxValue = item.SetWeight + item.SetError; decimal? minValue = item.SetWeight - item.SetError; if (minValue <= check.Weight && check.Weight <= maxValue) { childView.Weight = check.Weight; childView.Error = check.Error; childView.MatchOrNot = 1; } else { childView.Weight = check.Weight; childView.Error = check.Error; childView.MatchOrNot = 0; } } materList.Add(childView); } BarrelView view = new BarrelView() { BarrelID = hw.BarrelID, BarrelName = hw.BarrelName, BarCode = hw.BarCode, child = materList }; return view; } catch (Exception ex) { log.Error(ex.Message); return null; } } #endregion #region 根据传入的二维码、计划Id 查询反应釜下所有的物料 /// /// 根据传入的二维码、计划Id 查询反应釜下所有的物料 /// /// 反应釜二维码 /// 计划Id /// public async Task QueryByCode(string code, string planId) { List list = new List(); try { Hw_Warehouse wh = await _wareHouse.FirstAsync(d => d.BarCode == code); if (wh == null) return null; var sub = await _wareHouse_Sub.QueryAsync(d => d.MainId == wh.ID&& d.PId== planId&&(d.MaterialType.Contains("整包")|| d.MaterialType.Contains("尾料"))); if (sub.Count == 0) return null; sub.ForEach(sub => { HwWareHouseSubView view = new HwWareHouseSubView(); view.ID = sub.ID; view.MainId = sub.MainId; view.PId = sub.PId; view.ProductName = sub.ProductName; view.MaterialID = sub.MaterialID; view.Material_Code = sub.Material_Code; view.MaterialName = sub.MaterialName; view.BinId = sub.BinId; view.MaterialType = sub.MaterialType; view.SetWeight = sub.SetWeight; view.SetError = sub.SetError; list.Add(view); }); WarehouseView warehouseView = new WarehouseView() { ID = wh.ID, Name = wh.Name, BarCode = wh.BarCode, Children = list }; return warehouseView; } catch (Exception ex) { log.Error(ex.Message); return null; } } #endregion #region 更新PLC状态 /// /// 更新PLC状态 /// /// 本次验证状态 1开启;0关闭 /// public async Task UpdatePlcState(KettleView view) { List subList = null; List report = new List(); Hw_Warehouse wh = null; string message = string.Empty; string name = string.Empty; #region 反应釜工位信号 //反应釜工位报警 switch (view.Station) { case 1: name = "DB109.DBW4.0"; break; case 2: name = "DB109.DBW10.0"; break; case 3: name = "DB109.DBW16.0"; break; case 4: name = "DB109.DBW22.0"; break; case 5: name = "DB109.DBW28.0"; break; case 6: name = "DB109.DBW34.0"; break; case 7: name = "DB109.DBW40.0"; break; case 8: name = "DB109.DBW46.0"; break; case 9: name = "DB109.DBW52.0"; break; case 10: name = "DB109.DBW58.0"; break; case 11: name = "DB109.DBW64.0"; break; case 12: name = "DB109.DBW70.0"; break; case 13: name = "DB109.DBW76.0"; break; case 14: name = "DB109.DBW82.0"; break; case 15: name = "DB109.DBW88.0"; break; default: break; } #endregion try { //log.Info("开始"); var solventPlc = PlcHelper.siemensList.SingleOrDefault(d => d.EquipName.Equals("溶剂PLC")); log.Info($"PLC状态:{solventPlc.plc.IsConnected}"); if (solventPlc.plc.IsConnected) { #region 记录数据 //同时记录该扫码到数据库中 wh = await _wareHouse.FirstAsync(d => d.BarCode == view.KCode); if (wh == null) return false; subList = await _wareHouse_Sub.QueryAsync(d => d.MainId == wh.ID); if (subList.Count == 0) return false; log.Info("开启模式"); if (view.State == 1) { message = "开启"; } if (view.State == 0) { message = "关闭"; } if (string.IsNullOrEmpty(message)) { log.Error("传递状态为空!"); return false; } foreach (var item in view.Child) { Hw_FeedReport hw = new Hw_FeedReport() { WID = wh.ID, PlanId = view.PlanId, WName = wh.Name, WCode = wh.BarCode, MaterialId = item.MatCode, MaterialName = item.MatName, MCode = item.MatCode, MType = item.MatType, IsTrue = message, CreateTime = DateTime.Now, WholePackage = item.WholePackage.Trim() }; report.Add(hw); } await _feed.AddAsync(report); if (string.IsNullOrEmpty(name)) { log.Error("点位名称为空!"); return false; } bool result = solventPlc.plc.WriteInt16(name, view.State.ToString());//反应釜点位 if (result) { if (view.State == 1) { await _feed.AddAsync(report); } return result; } else { log.Error("写入点位失败!"); return result; } #endregion } else { return false; } } catch (Exception ex) { log.Info("异常:"+ex.Message); log.Error(ex.Message); return false; } } #endregion #region 获取所有计划号 /// /// 获取所有计划号 /// /// public async Task> GetWarehousePlan(string code) { Hw_Warehouse wh = await _wareHouse.FirstAsync(d=>d.BarCode== code.Trim()); if (wh==null) return null; var list = await _wareHouse_Sub.QueryAsync(d=>d.MainId== wh.ID); var planList = (from d in list select d.PId).Distinct(); return planList.ToList(); } #endregion } }