using Admin.Core.IRepository; using Admin.Core.IService; using Admin.Core.Model; using System.Threading.Tasks; using Admin.Core.Model.ViewModels; using System.Linq; using System.Collections.Generic; using log4net; using Admin.Core.PlcServer; using System; using Admin.Core.Common; using NPOI.OpenXmlFormats.Dml.Diagram; namespace Admin.Core.Service { public class SolventServices : ISolventServices { private static readonly log4net.ILog log = LogManager.GetLogger(typeof(SolventServices)); private readonly IRT_planRepository _planRepository; private readonly IPmt_recipeRepository _recipeRepository; private readonly IPmt_weighRepository _weighRepository; private readonly IPmt_materialRepository _materialRepository; private readonly IHw_SolventErrorPreventionReportRepository _solventErrorPreventionReportRepository; private readonly IHw_weighRepository _hwWeighRepository; private readonly IHw_PumpRepository _hwPumpRepository; private readonly IHw_CylinderRepository _hwCylinderRepository; int execNum = 0; #region 构造函数 public SolventServices(IRT_planRepository planRepository, IPmt_recipeRepository recipeRepository, IPmt_weighRepository weighRepository, IPmt_materialRepository materialRepository, IHw_SolventErrorPreventionReportRepository solventErrorPreventionReportRepository, IHw_weighRepository hwWeighRepository, IHw_PumpRepository hwPumpRepository, IHw_CylinderRepository hwCylinderRepository) { _planRepository = planRepository; _recipeRepository = recipeRepository; _weighRepository = weighRepository; _materialRepository = materialRepository; _solventErrorPreventionReportRepository = solventErrorPreventionReportRepository; _hwWeighRepository = hwWeighRepository; _hwPumpRepository = hwPumpRepository; _hwCylinderRepository = hwCylinderRepository; } #endregion #region 拉缸类型验证成功后执行PCL开始称量 /// /// //扫描拉缸(容器)条码后验证成功,执行PLC 启动 /// /// 验证成功后传递过来相关数据 /// 是否执行成功! public async Task> ExecPlcState(VerifyView view) { MessageModel result = new MessageModel(); try { if (view.Weighbridge == "1号地磅") { { var s7 = PlcConnect.Instance; var rtPlanList = await _planRepository.QueryAsync(d => d.Plan_State == 3); if (rtPlanList.Count > 0) { if (string.IsNullOrEmpty(view.Plan_Id)) { var r = rtPlanList.FirstOrDefault(); view.Plan_Id = r.Plan_Id; } var rtPlan = rtPlanList.FirstOrDefault(d => d.Plan_Id == view.Plan_Id); List list = new List(); if (view.BarCodeList!=null) { foreach (var item in view.BarCodeList) { string[] str = item.Split("-"); Hw_SolventErrorPreventionReport report = new Hw_SolventErrorPreventionReport() { PlanId = view.Plan_Id, Batch = rtPlan.Batch, ProductName = rtPlan.ProductName, FinishedNum = s7.ReadInt16("DB110.DBW1758.0").Content, RMatCode = view.RMatCode, MaterialID = view.MaterialID, MaterialName = view.MaterialName, Weight = view.MaterialWeight, WholeMaterial = view.WholeMaterial, Material_InventoryCode = str[0], Material_BatchNumber = str[1], Material_SerialCode = str[2], BarCodeStr = item, CreateTime = DateTime.Now }; list.Add(report); } int i = await _solventErrorPreventionReportRepository.AddAsync(list); } #region MyRegion //if (s7.ReadInt16("DB110.DBW8").Content != 250) //{ //var hwWeighList = await _hwWeighRepository.GetWaiteMaterial(view.Plan_Id); //if (hwWeighList != null) //{ // if (hwWeighList.Count() > (rtPlan.Exec_Num + 1)) // { // rtPlan.Exec_Num = 1; // } // else if (hwWeighList.Count() == (rtPlan.Exec_Num + 1)) // { // rtPlan.Exec_Num = rtPlan.Exec_Num + 1; // } // else // { // rtPlan.Exec_Num = 1; // } //} //else //{ // rtPlan.Exec_Num = 0; //} //var num = s7.ReadInt16("DB110.DBW1758.0").Content; //if (num == 0) //{ // rtPlan.Exec_Num = 1; //} //else //{ // rtPlan.Exec_Num = num; //} ////rtPlan.Exec_Num = plcList.plc.ReadInt16("DB110.DBW1758.0"); //保存本次数据 #endregion var cylinderList = _hwCylinderRepository.Query(); if (cylinderList.Count == 0) { result.success = false; result.msg = "未获查询到拉缸信息"; return result; } if (view.CylinderBarCode.Trim() == "00000000") { rtPlan.CylinderName = "00000000"; rtPlan.CylinderBarCode = "00000000"; await _planRepository.UpdateExecDb(rtPlan);//更新数据库 result.success = true; result.msg = "更新拉缸信息成功!"; int rate = Convert.ToInt32(view.Rate * 100); var writeRate = s7.Write("DB110.DBW10.0", short.Parse(rate.ToString()));//传入固率 log.Info($"1号地磅 传入固含:{writeRate.IsSuccess},结果:{writeRate.Message}"); var barCode = s7.Write("DB110.DBW1768.0", short.Parse("1")); //写入启动称量信号 log.Info($"1号地磅 写入BarCode:{barCode.IsSuccess},结果:{barCode.Message}"); if (barCode.IsSuccess && writeRate.IsSuccess) { result.success = true; result.msg = "更新计划信息成功!称量开始!"; } else { result.success = false; result.msg = $"计划执行失败,请检查网络是否联通![传入固含:{writeRate.IsSuccess},结果:{writeRate.Message}]<>[开始信号:{barCode.IsSuccess},结果:{barCode.Message}]"; } } else { Hw_Cylinder hw_Cylinder = cylinderList.FirstOrDefault(d => d.BarCode == view.CylinderBarCode.Trim()); if (hw_Cylinder == null) { result.success = false; result.msg = $"未查询到拉缸信息!拉缸二维码:【{view.CylinderBarCode}】"; } else { rtPlan.CylinderName = hw_Cylinder.Name; rtPlan.CylinderBarCode = hw_Cylinder.BarCode; log.Info(view.CylinderBarCode); await _planRepository.UpdateExecDb(rtPlan);//更新数据库 int rate = Convert.ToInt32(view.Rate * 100); var writeRate = s7.Write("DB110.DBW10.0", short.Parse(rate.ToString()));//传入固率 log.Info($"1号地磅 传入固含:{writeRate.IsSuccess},结果:{writeRate.Message}"); var barCode = s7.Write("DB110.DBW1768.0", short.Parse("1")); //写入启动称量信号 log.Info($"1号地磅 写入BarCode:{barCode.IsSuccess},结果:{barCode.Message}"); if (barCode.IsSuccess && writeRate.IsSuccess) { result.success = true; result.msg = "更新计划信息成功!称量开始!"; } else { result.success = false; result.msg = $"计划执行失败,请检查网络是否联通![传入固含:{writeRate.IsSuccess},结果:{writeRate.Message}]<>[开始信号:{barCode.IsSuccess},结果:{barCode.Message}]"; } } } } } } if (view.Weighbridge == "2号地磅") { { var s7 = PlcConnect.Instance; var rtPlanList = await _planRepository.QueryAsync(d => d.Plan_State == 3); if (rtPlanList.Count > 0) { if (string.IsNullOrEmpty(view.Plan_Id)) { var r = rtPlanList.FirstOrDefault(); view.Plan_Id = r.Plan_Id; } var rtPlan = rtPlanList.FirstOrDefault(d => d.Plan_Id == view.Plan_Id); List list = new List(); if (view.BarCodeList != null) { foreach (var item in view.BarCodeList) { string[] str = item.Split("-"); Hw_SolventErrorPreventionReport report = new Hw_SolventErrorPreventionReport() { PlanId = view.Plan_Id, Batch = rtPlan.Batch, ProductName = rtPlan.ProductName, FinishedNum = s7.ReadInt16("DB111.DBW1758.0").Content, RMatCode = view.RMatCode, MaterialID = view.MaterialID, MaterialName = view.MaterialName, Weight = view.MaterialWeight, WholeMaterial = view.WholeMaterial, Material_InventoryCode = str[0], Material_BatchNumber = str[1], Material_SerialCode = str[2], BarCodeStr = item, CreateTime = DateTime.Now }; list.Add(report); } int i = await _solventErrorPreventionReportRepository.AddAsync(list); } #region MyRegion //if (s7.ReadInt16("DB111.DBW8").Content != 250) //{ //var hwWeighList = await _hwWeighRepository.GetWaiteMaterial(view.Plan_Id); //if (hwWeighList != null) //{ // if (hwWeighList.Count() > (rtPlan.Exec_Num + 1)) // { // rtPlan.Exec_Num = 1; // } // else if (hwWeighList.Count() == (rtPlan.Exec_Num + 1)) // { // rtPlan.Exec_Num = rtPlan.Exec_Num + 1; // } // else // { // rtPlan.Exec_Num = 1; // } //} //else //{ // rtPlan.Exec_Num = 0; //} //var num = s7.ReadInt16("DB111.DBW1758.0").Content; //if (num == 0) //{ // rtPlan.Exec_Num = 1; //} //else //{ // rtPlan.Exec_Num = num; //} ////rtPlan.Exec_Num = plcList.plc.ReadInt16("DB111.DBW1758.0"); //保存本次数据 #endregion var cylinderList = _hwCylinderRepository.Query(); if (cylinderList.Count == 0) { result.success = false; result.msg = "未获查询到拉缸信息"; return result; } if (view.CylinderBarCode.Trim() == "00000000") { rtPlan.CylinderName = "00000000"; rtPlan.CylinderBarCode = "00000000"; await _planRepository.UpdateExecDb(rtPlan);//更新数据库 result.success = true; result.msg = "更新拉缸信息成功!"; int rate = Convert.ToInt32(view.Rate * 100); var writeRate = s7.Write("DB111.DBW10.0", short.Parse(rate.ToString()));//传入固率 log.Info($"2号地磅 传入固含:{writeRate.IsSuccess},结果:{writeRate.Message}"); var barCode = s7.Write("DB111.DBW1768.0", short.Parse("1")); //写入启动称量信号 log.Info($"2号地磅 写入BarCode:{barCode.IsSuccess},结果:{barCode.Message}"); if (barCode.IsSuccess && writeRate.IsSuccess) { result.success = true; result.msg = "更新计划信息成功!称量开始!"; } else { result.success = false; result.msg = $"计划执行失败,请检查网络是否联通![传入固含:{writeRate.IsSuccess},结果:{writeRate.Message}]<>[开始信号:{barCode.IsSuccess},结果:{barCode.Message}]"; } } else { Hw_Cylinder hw_Cylinder = cylinderList.FirstOrDefault(d => d.BarCode == view.CylinderBarCode.Trim()); if (hw_Cylinder == null) { result.success = false; result.msg = $"未查询到拉缸信息!拉缸二维码:【{view.CylinderBarCode}】"; } else { rtPlan.CylinderName = hw_Cylinder.Name; rtPlan.CylinderBarCode = hw_Cylinder.BarCode; log.Info(view.CylinderBarCode); await _planRepository.UpdateExecDb(rtPlan);//更新数据库 int rate = Convert.ToInt32(view.Rate * 100); var writeRate = s7.Write("DB111.DBW10.0", short.Parse(rate.ToString()));//传入固率 log.Info($"2号地磅 传入固含:{writeRate.IsSuccess},结果:{writeRate.Message}"); var barCode = s7.Write("DB111.DBW1768.0", short.Parse("1")); //写入启动称量信号 log.Info($"2号地磅 写入BarCode:{barCode.IsSuccess},结果:{barCode.Message}"); if (barCode.IsSuccess && writeRate.IsSuccess) { result.success = true; result.msg = "更新计划信息成功!称量开始!"; } else { result.success = false; result.msg = $"计划执行失败,请检查网络是否联通![传入固含:{writeRate.IsSuccess},结果:{writeRate.Message}]<>[开始信号:{barCode.IsSuccess},结果:{barCode.Message}]"; } } } } } } return result; } catch (System.Exception ex) { log.Info(ex.Message); result.success = false; result.msg = $"执行数据异常:{ex.Message}"; return result; } } #endregion #region 泵投料釜比对信息 /// /// 泵投料釜比对信息 /// /// 计划ID /// 泵Code /// 投料泵Code /// public async Task ExecState(string planId, string pumpCode, string cylinderCode) { try { var s7 = PlcConnect.Instance; var result = await _planRepository.QueryAsync(d => d.Plan_Id == planId && d.PumpBarCode == pumpCode && d.CylinderBarCode == cylinderCode); if (result.Count > 0) { #region 写入PLC var pumpList = _hwPumpRepository.Query(); if (pumpList.Count == 0) { return false; } var pump = pumpList.FirstOrDefault(d => d.BarCode == pumpCode); if (pump == null) { return false; } switch (pump.RowNum) { case 1: s7.Write("DB110.DBW282.0",short.Parse("1")); break; case 2: s7.Write("DB110.DBW294.0", short.Parse("1")); break; case 3: s7.Write("DB110.DBW306.0", short.Parse("1")); break; case 4: s7.Write("DB110.DBW318.0", short.Parse("1")); break; case 5: s7.Write("DB110.DBW330.0", short.Parse("1")); break; case 6: s7.Write("DB110.DBW342.0", short.Parse("1")); break; case 7: s7.Write("DB110.DBW354.0", short.Parse("1")); break; case 8: s7.Write("DB110.DBW366.0", short.Parse("1")); break; case 9: s7.Write("DB110.DBW 378.0", short.Parse("1")); break; default: break; } #endregion return true; } else { #region 写入PLC var pumpList = _hwPumpRepository.Query(); if (pumpList.Count > 0) { return false; } var pump = pumpList.FirstOrDefault(d => d.BarCode == pumpCode); if (pump == null) { return false; } switch (pump.RowNum) { case 1: s7.Write("DB110.DBW282.0",short.Parse("2")); break; case 2: s7.Write("DB110.DBW294.0", short.Parse("2")); break; case 3: s7.Write("DB110.DBW306.0", short.Parse("2")); break; case 4: s7.Write("DB110.DBW318.0", short.Parse("2")); break; case 5: s7.Write("DB110.DBW330.0", short.Parse("2")); break; case 6: s7.Write("DB110.DBW342.0", short.Parse("2")); break; case 7: s7.Write("DB110.DBW354.0", short.Parse("2")); break; case 8: s7.Write("DB110.DBW366.0", short.Parse("2")); break; case 9: s7.Write("DB110.DBW 378.0", short.Parse("2")); break; default: break; } #endregion return true; } } catch (System.Exception ex) { log.Error(ex.Message); return false; } } #endregion #region 拉缸查询 /// /// 拉缸查询 /// /// /// /// public async Task GetByCylinderCode(string code, string weighbridge) { try { var list = await _planRepository.GetDownLoadPlan(code, weighbridge); if (list.Count == 0) return null; var plan = list.FirstOrDefault(); var hwWeighList = await _hwWeighRepository.GetWaiteMaterial(plan.Plan_Id); if (hwWeighList == null) return null; if (weighbridge == "1号地磅") { var s7 = PlcConnect.Instance; int planNum = s7.ReadInt16("DB110.DBW2.0").Content;//执行批次 if (plan.Plan_Num > planNum) { var rtPlanList = await _planRepository.QueryAsync(d => d.Plan_State == 3); var rtPlan = rtPlanList.FirstOrDefault(d => d.Plan_Id == plan.Plan_Id); int materialNo = s7.ReadInt16("DB110.DBW1758").Content;//当前执行物料 if (materialNo == 0) materialNo = 1; var hwWeigh = hwWeighList.FirstOrDefault(d => d.MID == materialNo); if (hwWeigh == null) return null; return hwWeigh; } else { return null; } } else { var s7 = PlcConnect.Instance; int planNum = s7.ReadInt16("DB111.DBW2.0").Content;//执行批次 if (plan.Plan_Num > planNum) { var rtPlanList = await _planRepository.QueryAsync(d => d.Plan_State == 3); var rtPlan = rtPlanList.FirstOrDefault(d => d.Plan_Id == plan.Plan_Id); execNum = rtPlan.Exec_Num; int materialNo = s7.ReadInt16("DB111.DBW1758").Content;//当前执行物料 var hwWeigh = hwWeighList.FirstOrDefault(d => d.MID == materialNo); if (hwWeigh == null) return null; return hwWeigh; } else { return null; } } } catch (System.Exception ex) { log.Info(ex.Message); return null; } } #endregion #region 整包物料查询 /// /// 整包物料查询 /// /// 整包物料编码 /// 地磅 /// public async Task GetByZbCode(string code, string weighbridge) { try { string str1 = string.Empty; if (!code.Contains("kg")) { string[] str = code.Split("-"); str1= str[0]; } else { str1= code; } var list = await _planRepository.GetDownLoadPlan(str1, weighbridge); if (list.Count == 0) return null; var plan = list.FirstOrDefault(d=>d.Plan_State==3); if (weighbridge == "1号地磅") { var s7 = PlcConnect.Instance; var rtPlanList = await _planRepository.QueryAsync(d => d.Plan_State == 3); var rtPlan = rtPlanList.FirstOrDefault(d => d.Plan_Id == plan.Plan_Id); int materialNo = s7.ReadInt16("DB110.DBW1758").Content;//当前执行物料 if (materialNo == 0) materialNo = 1; var planView = list.FirstOrDefault(d => d.MID == materialNo&& d.Plan_State == 3); if (planView == null) return null; return planView; } else { var rtPlanList = await _planRepository.QueryAsync(d => d.Plan_State == 3); var rtPlan = rtPlanList.FirstOrDefault(d => d.Plan_Id == plan.Plan_Id); var s7 = PlcConnect.Instance; int materialNo = s7.ReadInt16("DB110.DBW1758").Content;//当前执行物料 if (materialNo == 0) materialNo = 1; var planView = list.FirstOrDefault(d => d.MID == materialNo); if (planView == null) return null; return planView; } } catch (System.Exception ex) { log.Info(ex.Message); return null; } } #endregion #region 拉缸与泵匹配 /// /// 泵查询——计划已经完成后 /// /// /// /// public async Task GetByPumpCode(string code) { try { List planList = (await _planRepository.QueryAsync(d => d.Plan_State == 8)).OrderByDescending(d => d.End_Date).ToList(); if (planList.Count == 0) return null; var plan = planList.FirstOrDefault(d => d.PumpBarCode == code); if (plan == null) return null; PumpAndCylinderView view = new PumpAndCylinderView() { Plan_Id= plan.Plan_Id, CylinderName=plan.CylinderName, CylinderBarCode=plan.CylinderBarCode, PumpName = plan.PumpName, PumpBarCode = plan.PumpBarCode }; return view; } catch (System.Exception ex) { throw; } } #endregion #region 获取所有溶剂计划 /// /// 获取所有溶剂计划 /// /// public async Task> GetSolventPlanInfo() { List list = new List(); List plan = await _planRepository.QueryAsync(); plan.ForEach(x => { SolventPlanView view = new SolventPlanView(); view.Plan_Id = x.Plan_Id; view.Plan_Num = x.Plan_Num; view.Real_Num = x.Real_Num; view.Plan_Serial = x.Plan_Serial; view.Plan_Date = x.Plan_Date; view.Plan_State = x.Plan_State; view.Plan_StateText = x.Plan_StateText; view.Plan_TotalError = x.Plan_TotalError; view.Plan_TotalWeight = x.Plan_TotalWeight; view.Recipe_Code = x.Recipe_Code; view.Recipe_Name = x.Recipe_Name; list.Add(view); }); return list; } #endregion } }