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 _readZFQUPSignalso = 0; /// /// 分切设备上料逻辑 /// /// public static void Z_FQSB_UpTask() { if (Interlocked.Exchange(ref _readZFQUPSignalso, 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); Idt_agvtask_htyRepository agvtask_HtyRepository = new dt_agvtask_htyRepository(Context); List FQSBS = new List { "正机1号分切机", "正机2号分切机5010" }; //List FQSBS = new List { "正机2号分切机5010" }; PLCClient zagvplc = WCSService.Clients.Find(v => v.PLCName == "正极1号AGV"); foreach (var FQSB in FQSBS) { WriteLog.Info($"{FQSB}上料").Write($"{FQSB}开始,时间:" + DateTime.Now + " ----------", $"{FQSB}上料"); PLCClient plc = WCSService.Clients.Find(v => v.PLCName == FQSB); if (plc == null) { continue; } var SBtask = agvRepository.FindFirst(f => f.agv_toaddress == plc.PLCDescroption); if (SBtask != null) { continue; } WriteLog.Info($"{FQSB}上料").Write($"SBtask:{SBtask},时间:" + DateTime.Now + " ----------", $"{FQSB}上料"); //启用工单 string IsBatchNo = plc.ReadValue(ConveyorLineInfoDBName.R_FQSB_IsWorkBatchNo.ToString(), plc.PLCDescroption).ToString(); WriteLog.Info("Z_FQSB_UpTask").Write("Z_FQSB_UpTask" + "1" + IsBatchNo, "Z_FQSB_UpTask"); if (IsBatchNo == "False") { GetEquipmentInfo(plc.PLCDescroption, "", "启用工单为:" + IsBatchNo, "", ""); continue; } WriteLog.Info($"{FQSB}上料").Write($"IsBatchNo:{IsBatchNo},时间:" + DateTime.Now + " ----------", $"{FQSB}上料"); //读取历史任务5分钟之后在读取设备上料请求 var taskthy = agvtask_HtyRepository.Find(f => f.agv_toaddress == plc.PLCDescroption && f.agv_operatetype != "ManualDeletion").OrderByDescending(o => o.agv_finishedtime).First(); string isSBWork = "False"; if ((DateTime.Now - Convert.ToDateTime(taskthy.agv_finishedtime)).Minutes > 5) { isSBWork = plc.ReadValue(ConveyorLineInfoDBName.R_FQSB_UPrequest.ToString(), plc.PLCDescroption).ToString(); } WriteLog.Info($"{FQSB}上料").Write($"isSBWork:{isSBWork},时间:" + DateTime.Now + " ----------", $"{FQSB}上料"); WriteLog.Info("Z_FQSB_UpTask").Write("Z_FQSB_UpTask" + "2", "Z_FQSB_UpTask"); //读取设备的工单号 string batchNo = plc.ReadValue(ConveyorLineInfoDBName.R_FQSB_UPbatchNo.ToString(), plc.PLCDescroption).ToString(); WriteLog.Info($"{FQSB}上料").Write($"batchNo:{batchNo},时间:" + DateTime.Now + " ----------", $"{FQSB}上料"); WriteLog.Info("Z_FQSB_UpTask").Write("Z_FQSB_UpTask" + "3" + batchNo, "Z_FQSB_UpTask"); if (batchNo == null) { GetEquipmentInfo(plc.PLCDescroption, "", batchNo, "", ""); continue; } //工序名 string processName = plc.ReadValue(ConveyorLineInfoDBName.R_FQSB_GXbatchNo.ToString(), plc.PLCDescroption).ToString(); WriteLog.Info("Z_FQSB_UpTask").Write("Z_FQSB_UpTask" + "4" + processName, "Z_FQSB_UpTask"); var route = routingRepository.FindFirst(f => f.route_end == plc.PLCDescroption); var fromaddress = locRepository.FindFirst(f => f.upper_code == route.route_began || f.down_code == route.route_began); var iswork = zagvplc.ReadValue(ConveyorLineInfoDBName.R_Location_iswork.ToString(), route.route_began).ToString(); GetEquipmentInfo(plc.PLCDescroption, isSBWork, batchNo, processName, iswork); WriteLog.Info($"{FQSB}上料").Write($"SBtask:{SBtask},IsBatchNo:{IsBatchNo},isSBWork:{isSBWork},batchNo:{batchNo},processName:{processName},iswork:{iswork},时间:" + DateTime.Now + " ----------", $"{FQSB}上料"); lock (requestJJK) { if (iswork == "1" && fromaddress.location_state == LocationStateEnum.LocationState_Empty.ToString()) { var jjktask = agvRepository.FindFirst(f => (f.agv_toaddress.Contains("JJK") && f.agv_fromaddress.Contains("ZJ")) || (f.agv_fromaddress == "nou" && f.agv_toaddress.Contains("HCJ") && f.agv_toaddress.Contains("ZJ"))); if (jjktask == null) { WriteLog.Info("Z_FQSB_UpTask").Write("Z_FQSB_UpTask" + FQSB + "2" + iswork, "Z_FQSB_UpTask"); var jjkloc = locRepository.FindFirst(f => f.down_code == "ZJXL-JJK001" || f.upper_code == "ZJSL-JJK001"); var jjkiswork = zagvplc.ReadValue(ConveyorLineInfoDBName.R_Location_iswork.ToString(), "ZJXL-JJK001").ToString(); if (jjkloc.location_state == LocationStateEnum.LocationState_Empty.ToString() && jjkiswork == "1") { WriteLog.Info("Z_FQSB_UpTask").Write("Z_FQSB_UpTask" + FQSB + "3" + iswork, "Z_FQSB_UpTask"); 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_taskstate = "WaitStockOut", agv_tasktype = "TaskType_Outbound", // agv_toaddress = route.route_began, agv_userid = "WCS", agv_worktype = 1 }; if (bool.Parse(isSBWork) && SBtask == null) { agvtask.agv_toaddress = plc.PLCDescroption; } else { agvtask.agv_toaddress = route.route_began; } //向MES申请要料 MESback WMSbackresult = MESAPIInvoke.OutNeedStosk(agvtask.agv_tasknum, null, 1, batchNo, processName, plc.PLCDescroption); WriteLog.Info($"{FQSB}上料").Write($"MES返回数据:{JsonConvert.SerializeObject(WMSbackresult)},时间:" + DateTime.Now + "", $"{FQSB}上料"); if (WMSbackresult == null) { //plc.WriteValue(ConveyorLineInfoDBName.isitem.ToString(), plc.PLCDescroption, true).ToString(); return WebResponseContent.Instance.Error("正极大极卷库不通过要料申请"); } // plc.WriteValue(ConveyorLineInfoDBName.isitem.ToString(), plc.PLCDescroption, false).ToString(); jjkloc.location_state = LocationStateEnum.LocationState_Lock.ToString(); locRepository.Update(jjkloc, true); if (agvtask.agv_toaddress.Contains("HCJ")) { fromaddress.location_state = LocationStateEnum.LocationState_Lock.ToString(); locRepository.Update(fromaddress, true); } agvRepository.Add(agvtask, true); WriteLog.Info("Z_FQSB_UpTask").Write("Z_FQSB_UpTask接口调用结束" + FQSB + agvtask.agv_tasknum + DateTime.Now, "Z_FQSB_UpTask"); return WebResponseContent.Instance.OK(); }); break; } } } } if (bool.Parse(isSBWork) && SBtask == null) { var locstock = groupRepository.Find(f => f.location_id == fromaddress.id).OrderByDescending(o => o.created_time).First(); if (fromaddress.location_state == LocationStateEnum.LocationState_Stored.ToString() && locstock.MaterialType == batchNo) { dt_agvtask agvtask = new dt_agvtask { agv_materbarcode = locstock.BarCode, agv_barcode = "", agv_code = "正极1号AGV", agv_createtime = DateTime.Now, agv_fromaddress = route.route_began, 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 }; ////清空20个字符的写入的地址 //plc.WriteValue(ConveyorLineInfoDBName.W_FQSB_BatchNo.ToString(), plc.PLCDescroption, " ").ToString(); ////写入请求上料响应信号 //string materialtype = locstock.BarCode.Split('*')[0]; //string ismateriala = plc.WriteValue(ConveyorLineInfoDBName.W_FQSB_BatchNo.ToString(), plc.PLCDescroption, materialtype).ToString(); //WriteLog.Info("W_FQSB_BatchNo").Write("W_FQSB_BatchNo" + agvtask.agv_tasknum + materialtype + DateTime.Now, "W_FQSB_BatchNo"); agvRepository.Add(agvtask, true); WriteLog.Info("Z_FQSB_UpTask").Write("Z_FQSB_UpTask" + agvtask.agv_tasknum + DateTime.Now, "Z_FQSB_UpTask"); //修改起点货位状态 fromaddress.location_state = LocationStateEnum.LocationState_Lock.ToString(); locRepository.Update(fromaddress, true); break; } else { //zagvplc.WriteValue(ConveyorLineInfoDBName.MaterNG.ToString(), route.route_began, 1); } } WriteLog.Info($"{FQSB}上料").Write($"{FQSB}结束,时间:" + DateTime.Now + $" ----------{Environment.NewLine}", $"{FQSB}上料"); } } catch (Exception ex) { WriteLog.Info("Z_FQSB_UpTask").Write("Z_FQSB_UpTask" + ex.Message + DateTime.Now, "Z_FQSB_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 _readZFQUPSignalso, 0); } } } } }