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; using System.Data; using SqlSugar; using System.Numerics; using System.Text; using NPOI.POIFS.FileSystem; using System.Linq.Expressions; using NPOI.SS.Formula.Functions; using Admin.Core.Repository; using Microsoft.AspNetCore.SignalR; using Admin.Core.Common; 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 IPmt_materialRepository _material; 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; private readonly Ixl_planRepository _planRepository;//小料计划 private readonly IHw_PumpRepository _hwPumpRepository; private readonly IRT_planRepository _rtplanRepository; private readonly IPmt_weighRepository _pmtWeighRepository; private readonly IPmt_BinRepository _binRepository; private readonly IPmt_recipeRepository _pmtRecipeRepository; private readonly IUnitOfWork _unitOfWork; private readonly Ixl_weighRepository _xlWeighRepository; private readonly IXLPlan_weightRepository _XLPlan_weightRepository; 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, Ixl_planRepository planRepository, IXLPlan_weightRepository IXLPlan_weightRepository, IXLPlan_weightRepository xLPlan_weightRepository, IPmt_materialRepository PmtmaterialRepository, IHw_PumpRepository hwPumpRepository, IRT_planRepository rtplanRepository, IPmt_recipeRepository pmtRecipeRepository, IUnitOfWork unitOfWork, IPmt_weighRepository pmtWeighRepository, IPmt_BinRepository binRepository, Ixl_weighRepository xlWeighRepository) { this._dal = dal; base.BaseDal = dal; _wareHouse = wareHouse; _wareHouse_Sub = wareHouse_Sub; _feed = feed; _barrel = barrel; _materialRepository = materialRepository; _recipeRepository = recipeRepository; _lrWeighRepository = lrWeighRepository; _planRepository = planRepository; _XLPlan_weightRepository = xLPlan_weightRepository; _material = PmtmaterialRepository; _hwPumpRepository = hwPumpRepository; _rtplanRepository = rtplanRepository; _pmtRecipeRepository = pmtRecipeRepository; _unitOfWork = unitOfWork; _pmtWeighRepository = pmtWeighRepository; _binRepository = binRepository; _xlWeighRepository = xlWeighRepository; } #region 扫描桶二维码,获取绑定的小料配方物料 /// /// 扫描桶二维码,获取绑定的小料配方 /// /// 反应釜 /// 计划Id /// 料桶Id /// 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.ID == 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 GetNextSerialNum 获取下一个可用的序号SerialNum 规则:同机台、同日期、同班次 计划号最后2位的最大值加1 /// /// 获取下一个可用的序号 /// /// 计划生产日期 /// 返回可用的序号 public int GetNextSerialNumAsync() { string strSql = "SELECT MAX(Plan_Serial) FROM RT_plan"; Expression> exp = s1 => true; Expression> order = (x) => x.Plan_Serial; var result = _rtplanRepository.Query(exp,order,false).First(); if (result == null) { return 1; } else { return Convert.ToInt32(result.Plan_Serial) + 1; } } public int GetXLNextSerialNumAsync() { string strSql = "SELECT MAX(Plan_Serial) FROM xl_plan"; Expression> exp = s1 => true; Expression> order = (x) => x.Plan_Serial; var result = _planRepository.Query(exp, order, false).First(); if (result == null) { return 1; } else { return Convert.ToInt32(result.Plan_Serial) + 1; } } public int GetNextSerialNumFromLRPlan(DateTime planDate) { string strSql = "SELECT MAX(RIGHT(Plan_Id,2)) FROM Hw_plan WHERE LEFT(Plan_Id,8) = @PlanDate"; string ss = String.Format("{0:yyyyMMdd}", planDate); SugarParameter[] parameters = new SugarParameter[] { new SugarParameter($"@PlanDate", String.Format("{0:yyyyMMdd}", planDate)) }; var result = _planRepository.ExecSql(strSql, parameters); if (result == null) { return 1; } else { return Convert.ToInt32(result) + 1; } } public int GetXLNextSerialNumFromLRPlan(DateTime planDate) { string strSql = "SELECT MAX(RIGHT(Plan_Id,2)) FROM LR_plan WHERE LEFT(Plan_Id,8) = @PlanDate"; string ss = String.Format("{0:yyyyMMdd}", planDate); SugarParameter[] parameters = new SugarParameter[] { new SugarParameter($"@PlanDate", String.Format("{0:yyyyMMdd}", planDate)) }; var result = _planRepository.ExecSql(strSql, parameters); if (result == null) { return 1; } else { return Convert.ToInt32(result) + 1; } } #endregion /// /// 获取下一个可用的计划号 (6位日期、2位机台、1位班次、1位网络/本机、2位流水) /// /// 机台号 /// 计划生产日期 /// 班次 /// 返回生成的12位计划号 public static string GenerateNextPlanIDNew(DateTime planDate, int shiftID, int sNum) { string code = "01"; return String.Format("{0:yyyyMMdd}{1}{2}", planDate, code, shiftID) + FillZero(sNum.ToString(), 2); } #region "按字符串位数补0" /// /// 按字符串位数补0 /// /// 字符串 /// 字符长度 /// public static string FillZero(string CharTxt, int CharLen) { if (CharTxt.Length < CharLen) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < CharLen - CharTxt.Length; i++) { sb.Append("0"); } sb.Append(CharTxt); return sb.ToString(); } else { return CharTxt; } } #endregion public async Task DownRJPlanAsync(List MesDownLoadPlanList) { try { var list = MesDownLoadPlanList; List subList = new List(); List recipeList = new List(); list.ForEach((a) => { Hw_WareHouse_Sub sb = new Hw_WareHouse_Sub(); sb.MainId = int.Parse(a.MainId); sb.PId = a.PId; sb.ProductName = a.ProductName; sb.MaterialID = a.Material_Code; sb.Material_Code = a.Material_Code; sb.MaterialName = a.MaterialName; sb.MaterialType = a.MaterialType; sb.SetWeight = Convert.ToDecimal(a.SetWeight); sb.SetError = Convert.ToDecimal(a.SetError); sb.Difference = a.Difference; sb.Fixed = a.Fixed == "" || a.Fixed == null ? false : true; sb.FixedRatio = a.FixedRatio == "" || a.FixedRatio == null ? Convert.ToDecimal(0.00) : Convert.ToDecimal(a.FixedRatio); sb.Weighbridge = a.Weighbridge; sb.PumpCode = a.PumpCode; sb.Recipe = a.Recipe; sb.Remark = a.Remark; sb.CreateTime = DateTime.Now; sb.Tare = Convert.ToDecimal(a.Tare); subList.Add(sb); }); //查询溶剂数据 var xlList = subList.Where(d => d.MaterialType.Contains("溶剂")).ToList(); var xt = (from d in xlList select new { d.PId, d.ProductName, d.MaterialType, d.Recipe, d.Weighbridge, d.PumpCode }).Distinct().ToList(); if (xt.Count == 0) { return "成功"; } foreach (var item in xt) { try { #region 配方 string recipeCode = Guid.NewGuid().ToString("N"); string recipeID = Guid.NewGuid().ToString("N"); Pmt_recipe recipe = new Pmt_recipe(); recipe.ID = recipeID; recipe.Equip_Code = "01"; recipe.Recipe_Code = recipeCode; recipe.Version = "1"; recipe.Recipe_Name = item.Recipe; recipe.Recipe_Verify = 1; recipe.Total_Weight = 0; recipe.Total_Error = 0; recipe.CreateDateTime = DateTime.Now; #endregion #region 物料 var repiceList = xlList.Where(d => item.PId.Equals(d.PId) && item.ProductName.Equals(d.ProductName) && item.Recipe.Equals(d.Recipe)).ToList(); int i = 1; List weighList = new List(); foreach (var sub in repiceList) { Pmt_weigh material = new Pmt_weigh(); material.ID = Guid.NewGuid().ToString("N"); material.Equip_Code = "01"; material.Recipe_ID = recipeID; material.Weight_Id = i; if (sub.Material_Code == null | sub.Material_Code == "") { throw new Exception("未查询到物料!"); } var obj = await _material.FirstAsync(d => d.Material_code == sub.Material_Code); if (obj == null) { throw new Exception("未查询到当前物料!"); } material.Material_ID = obj.ID.ToString(); material.Set_Weight = Convert.ToDecimal(sub.SetWeight); material.Set_Error = Convert.ToDecimal(sub.SetError); recipe.Total_Weight = recipe.Total_Weight + material.Set_Weight; recipe.Total_Error = recipe.Total_Error + material.Set_Error; if (sub.Fixed) { material.IsRate = true; material.TheoryRate = Convert.ToDecimal(sub.FixedRatio); } else { material.IsRate = false; material.TheoryRate = 0; } weighList.Add(material); i++; } #endregion #region 计划 RT_plan plan = new RT_plan(); plan.Dosing_Id = 0; plan.Equip_Code = "01"; plan.Batch = item.PId; plan.ProductName = item.ProductName; int serialNum = 0; int rtPlanSNum = GetNextSerialNumAsync(); //xl_plan序号 int lrPlanSNum = GetNextSerialNumFromLRPlan(DateTime.Now); //Hw_Plan序号 if (rtPlanSNum >= lrPlanSNum) { serialNum = rtPlanSNum; } else { serialNum = lrPlanSNum; } string planID = GenerateNextPlanIDNew(DateTime.Now, 1, serialNum); //计划号 plan.Plan_Id = planID; plan.Plan_Serial = serialNum; plan.Recipe_ID = recipeID; plan.Recipe_Code = recipeCode; plan.Recipe_Name = item.Recipe; plan.Version = "1"; plan.Mixer_Line = null; plan.Recipe_Type = 0; plan.Shift_Id = "1"; plan.Shift_Class = ""; plan.Plan_Num = 1; plan.Real_Num = 0; plan.Duration_Time = 0; plan.End_Date = null; plan.Weight_Man = null; plan.Stock_Man = null; plan.Plan_Batch = null; plan.Plan_State = 5; plan.Plan_StateText = "未启动"; plan.Plan_Date = String.Format("{0:yyyy-MM-dd}", DateTime.Now); plan.IF_FLAG = 1; if (string.IsNullOrEmpty(item.Weighbridge)) { throw new Exception("地磅不可为空!"); } plan.Weighbridge = item.Weighbridge; plan.PumpBarCode = item.PumpCode; if (item.PumpCode == null || item.PumpCode == "") { throw new Exception("投料泵为空!"); } var pumpList = _hwPumpRepository.Query(); var pump = pumpList.FirstOrDefault(d => d.BarCode == item.PumpCode); plan.PumpName = pump.Name; #endregion if (recipe == null) { throw new Exception("配方数据不可为空!"); } if (weighList == null) { throw new Exception("配方物料数据不可为空!"); } if (plan == null) { throw new Exception("计划数据不可为空!"); } if (repiceList == null) { throw new Exception("反应釜计划数据不可为空!"); } bool r = SaveRecipe(recipe, weighList, plan, repiceList.ToList()); if (r == false) { string msg = $"批次[{plan.Batch}];配方[{item.Recipe}],导入数据失败!"; return msg; Console.WriteLine($"批次[{plan.Batch}];配方[{item.Recipe}],导入数据失败!"); } return "成功"; //Console.WriteLine($"{item.PId}——{item.ProductName}——{item.Recipe};状态:{r}"); } catch (Exception ex) { string msg = $"配方[{item.Recipe}] 导入失败!异常信息:{ex.Message}"; return msg; } } } catch (Exception ex) { return ex.Message; } return "执行失败"; } public async Task DownZBPlanAsync(List MesDownLoadPlanList) { try { var list = MesDownLoadPlanList; List subList = new List(); List recipeList = new List(); list.ForEach((a) => { Hw_WareHouse_Sub sb = new Hw_WareHouse_Sub(); sb.MainId = int.Parse(a.MainId); sb.PId = a.PId; sb.ProductName = a.ProductName; sb.MaterialID = a.Material_Code; sb.Material_Code = a.Material_Code; sb.MaterialName = a.MaterialName; sb.MaterialType = a.MaterialType; sb.SetWeight = Convert.ToDecimal(a.SetWeight); sb.SetError = Convert.ToDecimal(a.SetError); sb.Difference = a.Difference; sb.PumpCode = a.PumpCode; sb.Weighbridge = a.Weighbridge; sb.Recipe = a.Recipe; sb.Remark = a.Remark; sb.CreateTime = DateTime.Now; sb.Tare = Convert.ToDecimal(a.Tare); subList.Add(sb); }); //查询数据 var xlList = subList.Where(d => d.MaterialType.Contains("整包")).ToList(); var xt = from d in xlList group d by new { PId = d.PId, ProductName = d.ProductName, Material_Code = d.Material_Code, MaterialType = d.MaterialType, Recipe = d.Recipe, SetWeight = d.Recipe, SetError = d.SetError, Weighbridge = d.Weighbridge } into g select new { g.Key.PId, g.Key.ProductName, g.Key.Material_Code, g.Key.MaterialType, g.Key.Recipe, SetWeight = g.Sum(m => m.SetWeight), SetError = g.Sum(m => m.SetError), g.Key.Weighbridge }; if (xt.ToList().Count == 0) { return "成功"; } foreach (var item in xt) { try { #region 配方 string recipeID = Guid.NewGuid().ToString("N"); string recipeCode = Guid.NewGuid().ToString("N"); Pmt_recipe recipe = new Pmt_recipe(); { recipe.ID = recipeID; recipe.Equip_Code = "01"; recipe.Recipe_Code = recipeCode; recipe.Version = "1"; recipe.Recipe_Name = item.Recipe; recipe.Recipe_Verify = 1; recipe.Total_Weight = 0; recipe.Total_Error = 0; recipe.CreateDateTime = DateTime.Now; } #endregion #region 物料 List weighList = new List(); { Pmt_weigh material = new Pmt_weigh(); material.ID = Guid.NewGuid().ToString("N"); material.Equip_Code = "01"; material.Recipe_ID = recipe.ID; material.Weight_Id = 1; if (item.Material_Code == null | item.Material_Code == "") { throw new Exception("未查询到物料!"); } var obj = await _material.FirstAsync(d => d.Material_code == item.Material_Code); if (obj == null) { throw new Exception("未查询到当前物料!"); } material.Material_ID = obj.ID; material.Set_Weight = Convert.ToDecimal(item.SetWeight); material.Set_Error = Convert.ToDecimal(item.SetError); recipe.Total_Weight = Convert.ToDecimal(item.SetWeight); recipe.Total_Error = Convert.ToDecimal(item.SetError); weighList.Add(material); } #endregion #region 计划 RT_plan plan = new RT_plan(); plan.Dosing_Id = 0; plan.Equip_Code = "01"; plan.Batch = item.PId; plan.ProductName = item.ProductName; int serialNum = 0; int rtPlanSNum = GetNextSerialNumAsync(); //xl_plan序号 int lrPlanSNum = GetNextSerialNumFromLRPlan(DateTime.Now); //Hw_Plan序号 if (rtPlanSNum >= lrPlanSNum) { serialNum = rtPlanSNum; } else { serialNum = lrPlanSNum; } string planID = GenerateNextPlanIDNew(DateTime.Now, 1, serialNum); //计划号 plan.Plan_Id = planID; plan.Plan_Serial = serialNum; plan.Recipe_ID = recipe.ID; plan.Recipe_Code = recipeCode; plan.Recipe_Name = item.Recipe; plan.Version = "1"; plan.Mixer_Line = null; plan.Recipe_Type = 0; plan.Shift_Id = "1"; plan.Shift_Class = ""; plan.Plan_Num = 1; plan.Real_Num = 0; plan.Duration_Time = 0; plan.End_Date = null; plan.Weight_Man = null; plan.Stock_Man = null; plan.Plan_Batch = null; plan.Plan_State = 5; plan.Plan_StateText = "未启动"; plan.Plan_Date = String.Format("{0:yyyy-MM-dd}", DateTime.Now); plan.IF_FLAG = 1; if (string.IsNullOrEmpty(item.Weighbridge)) { throw new Exception("地磅不可为空!"); } plan.Weighbridge = item.Weighbridge; #endregion if (recipe == null) { throw new Exception("配方数据不可为空!"); } if (weighList == null) { throw new Exception("配方物料数据不可为空!"); } if (plan == null) { throw new Exception("计划数据不可为空!"); } var repiceList = xlList.Where(d => item.PId.Equals(d.PId) && item.ProductName.Equals(d.ProductName) && item.Recipe.Equals(d.Recipe)).ToList(); if (repiceList == null) { throw new Exception("反应釜计划数据不可为空!"); } bool r = SaveRecipe(recipe, weighList, plan, repiceList.ToList()); if (r == false) { string msg = $"批次[{plan.Batch}];配方[{item.Recipe}],导入数据失败!"; return msg; //Console.WriteLine($"批次[{plan.Batch}];配方[{item.Recipe}],导入数据失败!"); } //Console.WriteLine($"{item.PId}——{item.ProductName}——{item.Recipe};状态:{r}"); return "成功"; } catch (Exception ex) { string msg = $"配方[{item.Recipe}] 导入失败!异常信息:{ex.Message}"; return msg; //Console.WriteLine($"配方[{item.Recipe}] 导入失败!异常信息:{ex.Message}"); } } } catch (Exception ex) { return ex.Message; } return "执行失败"; } public async Task DownXLPlanAsync(List MesDownLoadPlanList) { try { var list = MesDownLoadPlanList; List subList = new List(); List recipeList = new List(); list.ForEach((a) => { Hw_WareHouse_Sub sb = new Hw_WareHouse_Sub(); sb.MainId = int.Parse(a.MainId); sb.PId = a.PId; sb.ProductName = a.ProductName; sb.BinId = a.BinId == "" || a.BinId == null ? 0 : int.Parse(a.BinId); sb.MaterialID = a.Material_Code; sb.Material_Code = a.Material_Code; sb.MaterialName = a.MaterialName; sb.MaterialType = a.MaterialType; sb.SetWeight = Convert.ToDecimal(a.SetWeight); sb.SetError = Convert.ToDecimal(a.SetError); sb.Difference = a.Difference; sb.Fixed = a.Fixed == "" || a.Fixed == null ? false : true; sb.FixedRatio = a.FixedRatio == a.FixedRatio ? Convert.ToDecimal(0.00) : Convert.ToDecimal(a.FixedRatio); sb.Recipe = a.Recipe; sb.Remark = a.Remark; subList.Add(sb); }); //查询小料数据 var xlList = subList.Where(d => d.MaterialType.Contains("尾料")).ToList(); var xt = (from d in xlList select new { d.PId, d.ProductName, d.MaterialType, d.Recipe, }).Distinct(); foreach (var item in xt) { try { string recipeID = Guid.NewGuid().ToString("N"); string recipeCode = Guid.NewGuid().ToString("N"); #region 配方 xl_recipe recipe = new xl_recipe(); recipe.ID = recipeID; recipe.Equip_Code = "01"; recipe.Recipe_Code = recipeCode; recipe.Version = "1"; recipe.Recipe_Name = item.Recipe; recipe.Recipe_Verify = 1; recipe.Total_Weight = 0; recipe.Total_Error = 0; recipe.CreateDateTime = DateTime.Now; recipe.IsCheck = 0; #endregion #region 物料 var repiceList = xlList.Where(d => item.PId.Equals(d.PId) && item.ProductName.Equals(d.ProductName) && item.Recipe.Equals(d.Recipe)).ToList(); int i = 1; List weighList = new List(); foreach (var sub in repiceList) { xl_weigh material = new xl_weigh(); material.Equip_Code = "01"; material.Recipe_ID = recipe.ID; material.Weight_Id = i; if (sub.Material_Code == null | sub.Material_Code == "") { throw new Exception("未查询到物料!"); } var obj = await _materialRepository.FirstAsync(d => d.Material_code == sub.Material_Code); if (obj == null) { throw new Exception("未查询到当前物料!"); } material.Material_ID = obj.ID; if (sub.BinId == 0) { throw new Exception("未查询到对应料仓!"); } var binInfo = await _binRepository.FirstAsync(d => d.Bin_Serial == sub.BinId && d.Material_ID == obj.ID); if (binInfo == null) { throw new Exception("未查询到对应料仓!"); } material.Bin_Serial = sub.BinId; material.Set_Weight = Convert.ToDecimal(sub.SetWeight); material.Set_Error = Convert.ToDecimal(sub.SetError); recipe.Total_Weight = recipe.Total_Weight + material.Set_Weight; recipe.Total_Error = recipe.Total_Error + material.Set_Error; weighList.Add(material); i++; } #endregion #region 计划 xl_plan plan = new xl_plan(); plan.Dosing_Id = 0; plan.Equip_Code = "01"; plan.Batch = item.PId; plan.ProductName = item.ProductName; int serialNum = 0; int rtPlanSNum = GetXLNextSerialNumAsync(); //xl_plan序号 int lrPlanSNum = GetXLNextSerialNumFromLRPlan(DateTime.Now); //LR_Plan序号 if (rtPlanSNum >= lrPlanSNum) { serialNum = rtPlanSNum; } else { serialNum = lrPlanSNum; } string planID = GenerateNextPlanIDNew(DateTime.Now, 1, serialNum); //计划号 plan.Plan_Id = planID; plan.Plan_Serial = serialNum; plan.Recipe_ID = recipe.ID; plan.Recipe_Code = recipeID; plan.Recipe_Name = item.Recipe; plan.Version = "1"; plan.Recipe_Type = 0; plan.Shift_Id = "1"; plan.Shift_Class = ""; plan.Plan_Num = 1; plan.Real_Num = 0; plan.Duration_Time = 0; plan.Mixer_Line = "0"; plan.End_Date = null; plan.Weight_Man = null; plan.Stock_Man = null; plan.Plan_Batch = null; plan.Plan_State = 5; plan.Plan_StateText = "未启动"; plan.Plan_Date = String.Format("{0:yyyy-MM-dd}", DateTime.Now); plan.IF_FLAG = 1; #endregion if (recipe == null) { throw new Exception("配方数据不可为空!"); } if (weighList == null) { throw new Exception("配方物料数据不可为空!"); } if (plan == null) { throw new Exception("计划数据不可为空!"); } if (repiceList == null) { throw new Exception("反应釜计划数据不可为空!"); } bool r = SaveXLRecipe(recipe, weighList, plan, repiceList.ToList()); if (r == false) { string msg = $"批次[{plan.Batch}];配方[{item.Recipe}],导入数据失败!"; return msg; //Console.WriteLine($"批次[{plan.Batch}];配方[{item.Recipe}],导入数据失败!"); } else { return "成功"; } //Console.WriteLine($"{item.PId}——{item.ProductName}——{item.Recipe};状态:{r}"); } catch (Exception ex) { string msg = $"配方[{item.Recipe}] 导入失败!异常信息:{ex.Message}"; return msg; //Console.WriteLine($"配方[{item.Recipe}] 导入失败!异常信息:{ex.Message}"); } } } catch (Exception ex) { return ex.Message; } return "执行失败"; } #region 保存配方、计划物料信息 /// /// 保存配方、计划物料信息 /// /// 配方、物料 /// /// /// /// public bool SaveRecipe(Pmt_recipe recipeList, List pmt_weighList, RT_plan plan, List sub) { try { var iflag3 = _rtplanRepository.Add(plan); if (iflag3.Result < 1) throw new Exception("保存计划失败!"); var iflag4 = _wareHouse_Sub.Add(sub); if (iflag4 < 1) throw new Exception("保存反应釜计划失败!"); var iflag1 = _pmtRecipeRepository.Add(recipeList); if (iflag1.Result < 1) throw new Exception("保存溶剂配方失败!"); var iflag2 = _pmtWeighRepository.Add(pmt_weighList); if (iflag2 < 1) throw new Exception("保存配方物料失败!"); return true; } catch (Exception ex) { return false; } } public bool SaveXLRecipe(xl_recipe recipeList, List pmt_weighList, xl_plan plan, List sub) { try { var iflag3 = _planRepository.Add(plan); if (iflag3.Result < 1) throw new Exception("保存计划失败!"); var iflag4 = _wareHouse_Sub.Add(sub); if (iflag4 < 1) throw new Exception("保存反应釜计划失败!"); var iflag1 = _recipeRepository.Add(recipeList); if (iflag1.Result < 1) throw new Exception("保存溶剂配方失败!"); var iflag2 = _xlWeighRepository.Add(pmt_weighList); if (iflag2 < 1) throw new Exception("保存配方物料失败!"); return true; } catch (Exception ex) { return false; } } #endregion #region 根据二维码获取物料 public async Task GetMaterialAsync(string barCode) { Pmt_material sub = await _material.FirstAsync(d => d.Material_code == barCode); return sub; } #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- sub.Tare;//设置重量减去皮重 view.SetError = sub.SetError; view.Tare = sub.Tare; 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状态 public async Task RealWeightInfo(string WeightNo) { string WeightInfo = ""; try { string name = string.Empty; if (string.IsNullOrEmpty(WeightNo)) { log.Error("点位名称为空!"); return "点位名称为空!"; } switch (WeightNo) { case "1": name = "DB104.DBW132"; break; case "2": name = "DB109.DBW134"; break; case "3": name = "DB104.DBW136"; break; case "4": name = "DB104.DBW138"; break; case "5": name = "DB104.DBW140"; break; case "6": name = "DB104.DBW142"; break; case "7": name = "DB104.DBW144"; break; case "8": name = "DB104.DBW146"; break; case "9": name = "DB104.DBW148"; break; case "10": name = "DB104.DBW150"; break; case "11": name = "DB104.DBW152"; break; case "12": name = "DB104.DBW154"; break; case "13": name = "DB104.DBW156"; break; case "14": name = "DB104.DBW158"; break; case "15": name = "DB104.DBW160"; break; case "16": name = "DB104.DBW162"; break; default: break; } var s7 = PlcConnect.Instance; var result = s7.ReadInt16(name);//反应釜点位 log.Error($"读取重量:{result.IsSuccess},返回信息:{result.Message}"); if (result.IsSuccess) { return (result.Content / 1000).ToString(); } else { log.Error(result.Message+",读取失败!"); return WeightNo+"称,读取失败!"; } //return WeightInfo; } catch (Exception ex) { log.Error(ex.Message); return WeightInfo; } } public async Task> GetPlanWeightInfo() { try { List XLPlanWeightView = await _XLPlan_weightRepository.GetPlanWeightList(); if (XLPlanWeightView != null) { return XLPlanWeightView; } return XLPlanWeightView; } catch (Exception ex) { return null; } } /// /// 投料口开/投料口关 /// /// 投料釜条码 /// 状态 0:关闭 1:开启 /// public async Task UpdatePlcState(string Kcode, int state) { List subList = null; Hw_Warehouse wh = null; string name = string.Empty; wh = await _wareHouse.FirstAsync(d => d.BarCode == Kcode); if (wh == null) return false; #region 反应釜工位信号 //反应釜工位报警 switch (wh.ID) { 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 if (string.IsNullOrEmpty(name)) { log.Error("点位名称为空!"); return false; } var s7 = PlcConnect.Instance; var result = s7.Write(name, short.Parse(state.ToString()));//反应釜点位 log.Error($"反应釜开启点位状态:{result.IsSuccess},返回信息:{result.Message}"); if (result.IsSuccess) { return result.IsSuccess; } else { log.Error("反应釜写入点位失败!"); return result.IsSuccess; } return true; } /// /// 更新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("开始投料"); #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; } var s7 = PlcConnect.Instance; var result = s7.Write(name,short.Parse(view.State.ToString()));//反应釜点位 log.Error($"反应釜开启点位状态:{result.IsSuccess},返回信息:{result.Message}"); if (result.IsSuccess) { if (view.State == 1) { foreach (var item in view.Child.Where(d=>d.MatType== "散装")) { } } return result.IsSuccess; } else { log.Error("反应釜写入点位失败!"); return result.IsSuccess; } #endregion } catch (Exception ex) { 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 } }