using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; using WIDESEA_Common; using WIDESEA_Common.Tools; using WIDESEA_Core.EFDbContext; using WIDESEA_Core.Utilities; using WIDESEA_Entity.DomainModels; using WIDESEA_Services; using WIDESEA_Services.IRepositories; using WIDESEA_Services.Repositories; using WIDESEA_Services.Services; using WIDESEA_WCS.WCSClient; namespace WIDESEA_WCS.Jobs { public partial class EquipmentExecutor : SchedulerExecuteBase { private static int _readTBUPSignalso = 0; /// /// 涂布设备上料逻辑 /// /// public static void TBSB_UpTask() { if (Interlocked.Exchange(ref _readTBUPSignalso, 1) == 0) { try { VOLContext Context = new VOLContext(); WebResponseContent responseContent = new WebResponseContent(); Idt_task_numberRepository tasknumberRep = new dt_task_numberRepository(Context); dt_task_numberService tasknumber = new dt_task_numberService(tasknumberRep); Ibase_ware_locationRepository locRepository = new base_ware_locationRepository(Context); Ibase_routing_tableRepository routingRepository = new base_routing_tableRepository(Context); Ibill_pda_groupdiskRepository pdaRepository = new bill_pda_groupdiskRepository(Context); Idt_agvtaskRepository agvRepository = new dt_agvtaskRepository(Context); Ibill_group_stockRepository groupRepository = new bill_group_stockRepository(Context); List TBSBS = new List { "负极1号涂布机", "负极2号涂布机", "负极3号涂布机" }; PLCClient zagvplc = WCSService.Clients.Find(v => v.PLCName == "负极1号AGV"); foreach (var TBSB in TBSBS) { try { WriteLog.Info($"{TBSB}上料").Write($"{TBSB}开始,时间:" + DateTime.Now + " ----------", $"{TBSB}上料"); PLCClient plc = WCSService.Clients.Find(v => v.PLCName == TBSB); if (plc == null) { continue; } var SBtask = agvRepository.FindFirst(f => f.agv_toaddress == plc.PLCDescroption || f.agv_fromaddress == plc.PLCDescroption); if (SBtask != null) { continue; } WriteLog.Info($"{TBSB}上料").Write($"SBtask:{SBtask},时间:" + DateTime.Now + " ----------", $"{TBSB}上料"); //启用工单 string IsBatchNo = plc.ReadValue(ConveyorLineInfoDBName.R_TBSB_IsWorkBatchNo.ToString(), plc.PLCDescroption).ToString(); if (IsBatchNo == "False") { GetEquipmentInfo(plc.PLCDescroption, "", "启用工单为:" + IsBatchNo, "", ""); continue; } WriteLog.Info($"{TBSB}上料").Write($"IsBatchNo:{IsBatchNo},时间:" + DateTime.Now + " ----------", $"{TBSB}上料"); //当前设备有没有上料请求 string isSBWork = plc.ReadValue(ConveyorLineInfoDBName.R_TBSB_UPrequest.ToString(), plc.PLCDescroption).ToString(); WriteLog.Info($"{TBSB}上料").Write($"isSBWork:{isSBWork},时间:" + DateTime.Now + " ----------", $"{TBSB}上料"); //读取设备的工单号 string batchNo = plc.ReadValue(ConveyorLineInfoDBName.R_TBSB_UPbatchNo.ToString(), plc.PLCDescroption).ToString(); if (batchNo == null) { GetEquipmentInfo(plc.PLCDescroption, "", batchNo, "", ""); continue; } WriteLog.Info($"{TBSB}上料").Write($"batchNo:{batchNo},时间:" + DateTime.Now + " ----------", $"{TBSB}上料"); //上工序名 string processName = plc.ReadValue(ConveyorLineInfoDBName.R_TBSB_TBbatchNo.ToString(), plc.PLCDescroption).ToString(); WriteLog.Info($"{TBSB}上料").Write($"processName:{processName},时间:" + DateTime.Now + " ----------", $"{TBSB}上料"); //单面涂布模式 string oneside = plc.ReadValue(ConveyorLineInfoDBName.R_TBSB_OneSide.ToString(), plc.PLCDescroption).ToString(); WriteLog.Info($"{TBSB}上料").Write($"oneside:{oneside},时间:" + DateTime.Now + " ----------", $"{TBSB}上料"); //双面涂布模式 string twoside = plc.ReadValue(ConveyorLineInfoDBName.R_TBSB_TwoSide.ToString(), plc.PLCDescroption).ToString(); WriteLog.Info($"{TBSB}上料").Write($"twoside:{twoside},时间:" + DateTime.Now + " ----------", $"{TBSB}上料"); var route = routingRepository.Find(f => f.route_end == plc.PLCDescroption); List storedHCJ = new List(); List emptyHCJ = new List(); var iswork = ""; foreach (var r in route) { var task = agvRepository.FindFirst(f => f.agv_toaddress == r.route_began); if (task != null) { continue; } var fromaddress = locRepository.FindFirst(f => f.upper_code == r.route_began || f.down_code == r.route_began); iswork = zagvplc.ReadValue(ConveyorLineInfoDBName.R_Location_iswork.ToString(), r.route_began).ToString(); //if (iswork == "2" && fromaddress.location_state == LocationStateEnum.LocationState_Stored.ToString()) { storedHCJ.Add(r.route_began); } //else if (iswork == "1" && fromaddress.location_state == LocationStateEnum.LocationState_Empty.ToString()) { emptyHCJ.Add(r.route_began); } if (iswork == "2") { storedHCJ.Add(r.route_began); } else if (iswork == "1") { emptyHCJ.Add(r.route_began); } } GetEquipmentInfo(plc.PLCDescroption, isSBWork, batchNo, processName + "单面模式:" + oneside + "双面模式" + twoside, "有货的缓存架数量是" + storedHCJ.Count() + ";" + "空的缓存架数量是" + emptyHCJ.Count()); WriteLog.Info($"{TBSB}上料").Write($"{processName} + \"单面模式:\" + {oneside} + \"双面模式\" + {twoside}, \"有货的缓存架数量是\" + {storedHCJ.Count()} + \";\" + \"空的缓存架数量是\" + {emptyHCJ.Count()},时间:" + DateTime.Now + " ----------", $"{TBSB}上料"); if (emptyHCJ.Count() > 0) { if (bool.Parse(twoside)) { var jjktask = agvRepository.FindFirst(f => (f.agv_toaddress.Contains("JJK") && f.agv_fromaddress.Contains("FJ")) || (f.agv_fromaddress == "nou" && f.agv_toaddress.Contains("HCJ") && f.agv_toaddress.Contains("FJ"))); if (jjktask == null) { var jjkloc = locRepository.FindFirst(f => f.down_code == "FJXL-JJK001" || f.upper_code == "FJSL-JJK001"); var jjkiswork = zagvplc.ReadValue(ConveyorLineInfoDBName.R_Location_iswork.ToString(), "FJXL-JJK001").ToString(); if (jjkloc.location_state == LocationStateEnum.LocationState_Empty.ToString() && jjkiswork == "1") { lock (requestFJJK) { responseContent = locRepository.DbContextBeginTransaction(() => { //调用大及卷库出库需求接口 dt_agvtask agvtask = new dt_agvtask { agv_materbarcode = "daiding", agv_barcode = "", agv_code = "负极1号AGV", agv_createtime = DateTime.Now, agv_fromaddress = "nou", agv_grade = 1, agv_materielid = batchNo, agv_qty = 1, // agv_tasknum = "KH-" + tasknumber.GetTaskNumber(tasknumberRep), agv_tasknum = "KH-" + tasknumber.GetTaskNumber(tasknumberRep) + "-" + processName.Split('-')[1], agv_taskstate = "WaitStockOut", agv_tasktype = "TaskType_Outbound", agv_toaddress = emptyHCJ[0], agv_userid = "WCS", agv_worktype = 1 }; //if (emptyHCJ.Count()==2&&bool.Parse(isSBWork)) //{ // agvtask.agv_toaddress = plc.PLCDescroption; //}else //{ // agvtask.agv_toaddress = emptyHCJ[0]; //} //向MES申请要料 MESback WMSbackresult = MESAPIInvoke.OutNeedStosk(agvtask.agv_tasknum, null, 2, batchNo, processName, plc.PLCDescroption); WriteLog.Info($"{TBSB}上料").Write($"MES返回数据:{JsonConvert.SerializeObject(WMSbackresult)},时间:" + DateTime.Now + " ----------", $"{TBSB}上料"); if (WMSbackresult == null) { return WebResponseContent.Instance.Error("负极大极卷库不通过要料申请"); } jjkloc.location_state = LocationStateEnum.LocationState_Lock.ToString(); locRepository.Update(jjkloc, true); if (agvtask.agv_toaddress.Contains("HCJ")) { var tbloc = locRepository.FindFirst(f => f.down_code == emptyHCJ[0] || f.upper_code == emptyHCJ[0]); tbloc.location_state = LocationStateEnum.LocationState_Lock.ToString(); locRepository.Update(tbloc, true); } agvRepository.Add(agvtask, true); WriteLog.Info("F_TBSB_UpTask").Write("F_TBSB_UpTask" + agvtask.agv_tasknum + DateTime.Now, "F_TBSB_UpTask"); return WebResponseContent.Instance.OK(); }); continue; } } } } else if (bool.Parse(oneside)) { //规格 string specifications = plc.ReadValue(ConveyorLineInfoDBName.R_TBSB_Specifications.ToString(), plc.PLCDescroption).ToString(); WriteLog.Info($"{TBSB}上料").Write($"规格:{specifications},时间:" + DateTime.Now + " ----------", $"{TBSB}上料"); if (string.IsNullOrEmpty(specifications)) { continue; } //厚度 string um = specifications.Split('*')[0]; //宽度 string mm = specifications.Split('*')[1]; var rou = routingRepository.Find(f => f.route_end == emptyHCJ[0]).Select(s => s.route_began).ToList(); WriteLog.Info($"{TBSB}上料").Write($"rou:{JsonConvert.SerializeObject(rou)},时间:" + DateTime.Now + " ----------", $"{TBSB}上料"); List CBJstocks = new List(); //循环去找库存里物料类型与MES的物料类型一致的物料并且location_id是拆包间的 for (int i = 0; i < rou.Count(); i++) { var location = locRepository.FindFirst(f => f.upper_code == rou[i] || f.down_code == rou[i]); var st = groupRepository.FindFirst(f => f.MaterialType == batchNo && f.location_id == location.id && f.Remark2 == um && f.Remark3 == mm); if (st == null) { continue; } CBJstocks.Add(st); } WriteLog.Info($"{TBSB}上料").Write($"CBJstocks:{JsonConvert.SerializeObject(CBJstocks)},时间:" + DateTime.Now + " ----------", $"{TBSB}上料"); if (CBJstocks.Count == 0) { continue; } //把CBJstocks通过批次号进行降序排列然后取第一条 var CBJstock = CBJstocks.OrderByDescending(o => o.BarCode).First(); //去货位表找对应的location_id var islocation = locRepository.FindFirst(f => f.id == CBJstock.location_id); if (islocation.location_state == LocationStateEnum.LocationState_Stored.ToString()) { responseContent = locRepository.DbContextBeginTransaction(() => { dt_agvtask agvtask = new dt_agvtask { agv_materbarcode = CBJstock.BarCode, agv_barcode = "", agv_code = "负极1号AGV", agv_createtime = DateTime.Now, agv_fromaddress = islocation.down_code, agv_grade = 1, agv_materielid = batchNo, agv_qty = 1, agv_tasknum = "KH-" + tasknumber.GetTaskNumber(tasknumberRep), agv_taskstate = "Create", agv_tasktype = "TaskType_Outbound", agv_toaddress = emptyHCJ[0], agv_userid = "WCS", agv_worktype = 1 }; //if (emptyHCJ.Count()==2&&bool.Parse(isSBWork)) //{ // agvtask.agv_toaddress = plc.PLCDescroption; //}else //{ // agvtask.agv_toaddress = emptyHCJ[0]; //} agvRepository.Add(agvtask, true); WriteLog.Info("F_TBSB_UpTask").Write("F_TBSB_UpTask" + agvtask.agv_tasknum + CBJstock.BarCode + DateTime.Now, "F_TBSB_UpTask"); islocation.location_state = LocationStateEnum.LocationState_Lock.ToString(); locRepository.Update(islocation, true); var loc = locRepository.FindFirst(f => f.upper_code == emptyHCJ[0] || f.down_code == emptyHCJ[0]); loc.location_state = LocationStateEnum.LocationState_Lock.ToString(); locRepository.Update(loc, true); return WebResponseContent.Instance.OK(); }); break; } } } if (storedHCJ.Count() > 0) { if (bool.Parse(isSBWork)) { if (storedHCJ.Count() == 2) { List TBstocks = new List(); var stocks = new bill_group_stock(); dt_agvtask agvtask = new dt_agvtask(); var fromaddress = new base_ware_location(); for (int i = 0; i < storedHCJ.Count(); i++) { var location = locRepository.FindFirst(f => f.upper_code == storedHCJ[i] || f.down_code == storedHCJ[i]); stocks = groupRepository.FindFirst(f => f.MaterialType == batchNo && f.location_id == location.id); if (stocks == null) { continue; } TBstocks.Add(stocks); } if (TBstocks.Count() > 0) { var TBstock = TBstocks.OrderByDescending(o => o.BarCode).First(); fromaddress = locRepository.FindFirst(f => f.id == TBstock.location_id); agvtask.agv_materbarcode = TBstock.BarCode; agvtask.agv_fromaddress = fromaddress.upper_code; } else { //zagvplc.WriteValue(ConveyorLineInfoDBName.MaterNG.ToString(), fromlocation.upper_code, 1); // break; } agvtask.agv_barcode = ""; agvtask.agv_code = "负极1号AGV"; agvtask.agv_createtime = DateTime.Now; agvtask.agv_grade = 1; agvtask.agv_materielid = batchNo; agvtask.agv_qty = 1; agvtask.agv_tasknum = "KH-" + tasknumber.GetTaskNumber(tasknumberRep); agvtask.agv_taskstate = "Create"; agvtask.agv_tasktype = "TaskType_Outbound"; agvtask.agv_toaddress = plc.PLCDescroption; agvtask.agv_userid = "WCS"; agvtask.agv_worktype = 1; agvRepository.Add(agvtask, true); WriteLog.Info("F_TBSB_UpTask").Write("F_TBSB_UpTask" + agvtask.agv_tasknum + "\t" + DateTime.Now, "F_TBSB_UpTask"); fromaddress.location_state = LocationStateEnum.LocationState_Lock.ToString(); locRepository.Update(fromaddress, true); //写入请求上料响应信号 //char[] batchnos = new char[100]; //string materialtype = TBstocks[0].BarCode.Split('*')[0]; //for (int i = 0; i < materialtype.Length; i++) //{ // batchnos[i] = materialtype[i]; //} //string ismateriala = plc.WriteValue(ConveyorLineInfoDBName.W_TBSB_BatchNo.ToString(), plc.PLCDescroption, batchnos).ToString(); //WriteLog.Info("W_TBSB_BatchNo").Write("W_TBSB_BatchNo" + agvtask.agv_tasknum + materialtype + DateTime.Now, "W_TBSB_BatchNo"); break; } else if (storedHCJ.Count() == 1) { var stocks = new bill_group_stock(); var location = locRepository.FindFirst(f => f.upper_code == storedHCJ[0] || f.down_code == storedHCJ[0]); stocks = groupRepository.FindFirst(f => f.MaterialType == batchNo && f.location_id == location.id); if (stocks != null) { dt_agvtask agvtask = new dt_agvtask { agv_materbarcode = stocks.BarCode, agv_barcode = "", agv_code = "负极1号AGV", agv_createtime = DateTime.Now, agv_fromaddress = storedHCJ[0], agv_grade = 1, agv_materielid = batchNo, agv_qty = 1, agv_tasknum = "KH-" + tasknumber.GetTaskNumber(tasknumberRep), agv_taskstate = "Create", agv_tasktype = "TaskType_Outbound", agv_toaddress = plc.PLCDescroption, agv_userid = "WCS", agv_worktype = 1 }; //写入请求上料响应信号 //char[] batchnos = new char[100]; //string materialtype = stocks.BarCode.Split('*')[0]; //for (int i = 0; i < materialtype.Length; i++) //{ // batchnos[i] = materialtype[i]; //} //string ismateriala = plc.WriteValue(ConveyorLineInfoDBName.W_TBSB_BatchNo.ToString(), plc.PLCDescroption, batchnos).ToString(); //WriteLog.Info("W_TBSB_BatchNo").Write("W_TBSB_BatchNo" + agvtask.agv_tasknum + materialtype + DateTime.Now, "W_TBSB_BatchNo"); //修改起点货位状态 agvRepository.Add(agvtask, true); WriteLog.Info("F_TBSB_UpTask").Write("F_TBSB_UpTask" + agvtask.agv_tasknum + "\t" + DateTime.Now, "F_TBSB_UpTask"); location.location_state = LocationStateEnum.LocationState_Lock.ToString(); locRepository.Update(location, true); break; } else { //zagvplc.WriteValue(ConveyorLineInfoDBName.MaterNG.ToString(), storedHCJ[0],1); //break; } } } } } catch (Exception ex) { StackTrace stackTrace = new StackTrace(); StackFrame[] stackFrames = stackTrace.GetFrames(); string str = ""; foreach (var item in stackFrames) { str += "方法名:" + item.GetMethod().Name + ",行号:" + item.GetFileLineNumber() + ",文件名:" + item.GetFileName() + Environment.NewLine; } WIDESEA_Common.Tools.WriteLog.GetLog($"{TBSB}上料").Write($"错误信息:{ex.Message},{str}", $"{TBSB}上料"); } WriteLog.Info($"{TBSB}上料").Write($"{TBSB}结束,时间:" + DateTime.Now + $" ----------{Environment.NewLine}", $"{TBSB}上料"); } } catch (Exception ex) { WriteLog.Info("F_TBSB_UpTask").Write("F_TBSB_UpTask" + ex.Message + DateTime.Now, "F_TBSB_UpTask"); StackTrace stackTrace = new StackTrace(); StackFrame[] stackFrames = stackTrace.GetFrames(); string str = ""; foreach (var item in stackFrames) { str += "方法名:" + item.GetMethod().Name + ",行号:" + item.GetFileLineNumber() + ",文件名:" + item.GetFileName() + Environment.NewLine; } WIDESEA_Common.Tools.WriteLog.GetLog("涂布设备上料").Write($"错误信息:{ex.Message},{str}", "涂布设备上料"); } finally { Interlocked.Exchange(ref _readTBUPSignalso, 0); } } } } }