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; namespace WIDESEA_WCS.Jobs { public partial class EquipmentExecutor : SchedulerExecuteBase { private static int _readJRSignalso2 = 0; /// /// 格林晟卷绕机请求上料 /// public static void JRSB_UpTask_New() { if (Interlocked.Exchange(ref _readJRSignalso2, 1) == 0) { try { List JRSBS = new List { "格林晟1号卷绕机", "格林晟2号卷绕机", "格林晟3号卷绕机", "格林晟4号卷绕机", "格林晟5号卷绕机", "格林晟6号卷绕机", "格林晟7号卷绕机", "格林晟8号卷绕机", "格林晟9号卷绕机", "格林晟10号卷绕机" }; JRSB_UpTask_Run(JRSBS, "FJ"); JRSB_UpTask_Run(JRSBS, "ZJ"); } catch (Exception ex) { WriteLog.Info("JRSB_UpTask").Write("JRSB_UpTask" + ex.Message, "JRSB_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; } WriteLog.GetLog("格林晟卷绕机").Write($"错误信息:{ex.Message},{str}", "格林晟卷绕机"); } finally { Interlocked.Exchange(ref _readJRSignalso2, 0); } } } /// /// 运行方法 /// /// 卷绕设备集合 /// 正极或负极 private static void JRSB_UpTask_Run(List JRSBS, string ZFType) { VOLContext Context = new VOLContext(); IJROutBindRepository jrRepository = new JROutBindRepository(Context); Idt_agvtaskRepository agvRepository = new dt_agvtaskRepository(Context); //卷绕机任务 var jrTaskList = agvRepository.Find(v => v.agv_toaddress.StartsWith(ZFType) && v.agv_toaddress.Contains("JR")).OrderBy(t => t.agv_createtime).ToList(); bool needCallMES = jrTaskList.Count() == 0; //MES到达信息 string materiel = needCallMES ? "" : jrTaskList[0].agv_materielid; JROutBind bind = jrRepository.Find(f => f.sum > 0 && f.materialtype == materiel && f.barcode.Substring(0, 2)/*正负极标识*/ == ZFType).FirstOrDefault(); if (!needCallMES) { WriteLog.Info($"卷绕机上料请求").Write($"{DateTime.Now}--{jrTaskList[0].agv_tasknum},请求上料\n", $"卷绕机上料请求"); } try { #region 遍历设备请求 for (int i = 0; i < JRSBS.Count; i++) { string eqName = JRSBS[i]; var indexRange = ZFType == "FJ" ? new int[] { 1, 2 } : new int[] { 3, 4 }; //1、2负极口。3、4正极口 for (int stationIndex = indexRange[0]; stationIndex <= indexRange[1]; stationIndex++) { var plcClient = WCSService.Clients.Find(v => v.PLCName == eqName); if (plcClient != null) { //请求上料 var requestIn = bool.Parse(plcClient.ReadValue($"R_GLSJRSB{stationIndex}_UPrequest", eqName).ToString()); if (requestIn) { //工单号 string batchNo = plcClient.ReadValue(ConveyorLineInfoDBName.R_JRSB_UPbatchNo.ToString(), eqName).ToString(); WriteLog.Info($"卷绕机上料请求").Write($"{DateTime.Now}--{eqName},{stationIndex}口,请求上料,工单号:{batchNo}\n", $"卷绕机上料请求"); if (string.IsNullOrEmpty(batchNo)) continue; string stationNum = (stationIndex + i * 4).ToString().PadLeft(3, '0'); //1、2口负极。3、4口正极 string stationAddress = stationIndex <= 2 ? $"FJSL-JRSB{stationNum}-B" : $"ZJSL-JRSB{stationNum}-B"; if (needCallMES) { AddWaitTask(batchNo, stationAddress); //只创建一个待下发任务 return; } else if (!needCallMES && batchNo == materiel) { if (bind == null) return; //MES未送达,直接退出 if (bind.useNum < bind.sum) { //MES送达 UpdateWaitTask(bind, ZFType, stationAddress); } } } } } } #endregion } catch (Exception ex) { string msg = ex.Message; WriteLog.Info($"卷绕机上料请求").Write($"{DateTime.Now}--error,{msg}\n\n", $"卷绕机上料请求"); } if (bind != null) { //更新该任务是最后取料的标识 var lastTsak = agvRepository.Find(t => t.agv_tasknum == bind.taskid).FirstOrDefault(); if (lastTsak != null) { lastTsak.agv_remark = "true"; agvRepository.Update(lastTsak, true); } //复位绑定数据 bind.sum = 0; bind.barcode = ""; bind.materialtype = ""; bind.taskid = ""; bind.barcodes = ""; bind.size = "-1"; jrRepository.Update(bind, true); } } /// /// 创建和更新任务状态 /// /// MES到位信息 /// 正极或负极 /// 工单号 /// 入料口地址 private static void UpdateWaitTask(JROutBind bind, string ZFType, string stationAddress) { VOLContext Context = new VOLContext(); Idt_agvtaskRepository agvRepository = new dt_agvtaskRepository(Context); Idt_task_numberRepository tasknumberRep = new dt_task_numberRepository(Context); dt_task_numberService tasknumber = new dt_task_numberService(tasknumberRep); int useNum = bind.useNum;//当前取的第几个 //等待下发的那条 var wiatTask = agvRepository.Find(v => v.agv_toaddress.StartsWith(ZFType) && v.agv_toaddress.Contains("JR") && v.agv_taskstate == "WaitStockOut").OrderBy(t => t.agv_createtime).FirstOrDefault(); if (wiatTask != null) { wiatTask.agv_fromaddress = bind.Devid; wiatTask.agv_taskstate = "Create"; wiatTask.agv_materbarcode = GetBarcode(bind.barcodes, useNum); wiatTask.agv_materielid = bind.materialtype; wiatTask.size = bind.size; wiatTask.JRunm = (bind.sum - useNum) + ";" + bind.size;//剩余卷数;料卷宽度 agvRepository.Update(wiatTask, true); bind.taskid = wiatTask.agv_tasknum; bind.useNum++; } else { //直接添加 var haveTask = agvRepository.FindFirst(f => f.agv_toaddress == stationAddress); if (haveTask == null) { dt_agvtask agvtask = new dt_agvtask(); agvtask.agv_fromaddress = bind.Devid; agvtask.agv_toaddress = stationAddress; agvtask.agv_taskstate = "Create"; agvtask.agv_barcode = ""; agvtask.agv_code = "负极2号AGV"; agvtask.agv_createtime = DateTime.Now; agvtask.agv_grade = 1; agvtask.agv_materbarcode = GetBarcode(bind.barcodes, useNum); agvtask.agv_qty = 1; agvtask.agv_tasknum = "KH-" + tasknumber.GetTaskNumber(tasknumberRep); agvtask.agv_tasktype = "TaskType_Outbound"; agvtask.agv_userid = "WCS"; agvtask.agv_worktype = 1; agvtask.agv_materielid = bind.materialtype; agvtask.size = bind.size; if (useNum > 0) { agvtask.JRunm = (bind.sum - useNum) + ";" + bind.size;//剩余卷数;料卷宽度 } agvRepository.Add(agvtask, true); bind.taskid = agvtask.agv_tasknum; bind.useNum++; } } WriteLog.Info($"卷绕叫料MES到位").Write($"{DateTime.Now}--任务号:{bind.taskid}\t工单:{bind.materialtype}\tuseNum:{useNum}\t{wiatTask == null}\n\n", $"卷绕叫料MES到位"); } /// /// 添加卷绕机待下发任务 /// /// 工单号 /// 设备口地址 /// 设备口1-4 private static void AddWaitTask(string batchNo, string stationAddress) { 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); Idt_agvtaskRepository agvRepository = new dt_agvtaskRepository(Context); IJROutBindRepository jrRepository = new JROutBindRepository(Context); var haveTask = agvRepository.FindFirst(f => f.agv_toaddress == stationAddress); if (haveTask == null) { dt_agvtask agvtask = new dt_agvtask(); agvtask.agv_toaddress = stationAddress; agvtask.agv_barcode = ""; agvtask.agv_code = "负极2号AGV"; agvtask.agv_createtime = DateTime.Now; agvtask.agv_fromaddress = "nou"; agvtask.agv_grade = 1; agvtask.agv_materbarcode = "daiding"; agvtask.agv_qty = 1; agvtask.agv_tasknum = "KH-" + tasknumber.GetTaskNumber(tasknumberRep); agvtask.agv_taskstate = "WaitStockOut"; agvtask.agv_tasktype = "TaskType_Outbound"; agvtask.agv_userid = "WCS"; agvtask.agv_worktype = 1; agvtask.agv_materielid = batchNo; //请求MES送料 List StockList = new List { "FJXL-FBT001", "FJXL-FBT002" }; MESback WMSbackresult = MESAPIInvoke.OutNeedStosk(agvtask.agv_tasknum, StockList, 4, agvtask.agv_materielid, "", agvtask.agv_toaddress); WriteLog.Info("请求MES送料111").Write($"{agvtask.agv_tasknum}请求送料,MES返回数据:{JsonConvert.SerializeObject(WMSbackresult)},时间:" + DateTime.Now + " ----------\n", $"请求MES送料111"); if (WMSbackresult?.Code == 0) { agvRepository.Add(agvtask, true); } } } /// /// 获取物料号 /// /// /// /// private static string GetBarcode(string barcode, int useNum) { if (string.IsNullOrEmpty(barcode)) { return ""; } var barcodes = barcode.Split(','); if (barcodes.Length - 1 >= useNum) { return barcodes[useNum]; } else { return "index_out"; } } } }