using Microsoft.CodeAnalysis; using Microsoft.EntityFrameworkCore; using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical; using System; using System.Collections.Generic; 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.IRepositories; using WIDESEA_Services.Repositories; using WIDESEA_Services.Services; using WIDESEA_WCS.JobsPart.Public; using WIDESEA_WCS.WCSClient; namespace WIDESEA_WCS { public partial class StackerExecutor { public static object requestQJ = new object();//requestZJJK private static int _readQJSignalso = 0;//_readZTBUPSignalso /// /// 切卷自动回空 /// /// public static void QJ_ZDHK(PLCClient client) { if (Interlocked.Exchange(ref _readQJSignalso, 1) == 0) { try { string[] zfqjhcj = { "ZJ-QJHCJ", "FJ-QJHCJ" }; foreach (var item in zfqjhcj) { ZFQJHLclass(item); } } catch (Exception) { throw; } finally { Interlocked.Exchange(ref _readQJSignalso, 0); } } } public static void ZFQJHLclass(string hcjtype) { 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); Idt_agvtaskRepository agvRepository = new dt_agvtaskRepository(Context); Idt_agvtask_htyRepository agvhtyRepository = new dt_agvtask_htyRepository(Context); List base_Ware_Location = locRepository.Find(d => d.upper_code.Contains(hcjtype) && d.location_state == "LocationState_Stored" && d.gd1 == 0 && d.gd2 == 0 && d.gd3 == 0 && d.gd4 == 0 && d.tpgd == 1 && d.status == 1 && d.task == 2).ToList(); if (base_Ware_Location.Count > 0) { foreach (var item in base_Ware_Location) { List routing_table = routingRepository.Find(v => v.route_began == item.upper_code && v.route_end.Contains("GFHCJ")).ToList(); foreach (var item1 in routing_table) { //切卷空托盘回流到辊分下料缓存架 base_ware_location ware_Location = locRepository.FindFirst(d => d.upper_code == item1.route_end && d.location_state == "LocationState_Empty" && d.tpgd == 0 && d.gd1 == 0 && d.gd2 == 0 && d.gd3 == 0 && d.gd4 == 0 && d.status == 1 && d.task == 2); if (ware_Location != null) { dt_agvtask dt_Agvtask = agvRepository.FindFirst(d => d.agv_toaddress == ware_Location.upper_code); if (dt_Agvtask != null) { continue; } //延时10秒实时检测 int index = 0; int b = 10; DateTime time = DateTime.Now; Double STAMP = 0; do { DateTime time2 = DateTime.Now; STAMP = (time2 - time).TotalSeconds; base_ware_location DSLocation = locRepository.FindFirst(d => d.upper_code == item.upper_code && d.location_state == LocationStateEnum.LocationState_Stored.ToString() && d.tpgd == 1 && d.task == 2 && d.gd1 == 0 && d.gd2 == 0 && d.gd3 == 0 && d.gd4 == 0 && d.status == 1); if (DSLocation == null) { index = 3; break; } } while (STAMP < b); if (index == 3) { break; } //dt_agvtask_hty agvtask_Hty = agvhtyRepository.Find(d => d.agv_toaddress == ware_Location1.upper_code).OrderByDescending(d => d.agv_finishedtime).FirstOrDefault(); //bool interval = (DateTime.Now - agvtask_Hty.agv_finishedtime).Value.TotalSeconds < 120; //if (interval) //{ // continue; //} base_ware_location ware_Location1 = locRepository.FindFirst(d => d.upper_code == item.upper_code && d.location_state == LocationStateEnum.LocationState_Stored.ToString() && d.gd1 == 0 && d.gd2 == 0 && d.gd3 == 0 && d.gd4 == 0 && d.tpgd == 1 && d.status == 1 && d.task == 2); if (ware_Location1 == null) { continue; } dt_agvtask agvtask = new dt_agvtask(); agvtask.agv_id = Guid.NewGuid(); agvtask.agv_tasknum = "KH-" + IdenxManager.GetTaskNo(); agvtask.agv_fromaddress = ware_Location1.upper_code; agvtask.agv_toaddress = ware_Location.upper_code; agvtask.agv_code = "组装AGV调度"; agvtask.agv_remark = "切卷上料回空"; agvtask.agv_taskstate = AGVTaskStateEnum.Create.ToString(); agvtask.agv_tasktype = AGVTaskTypeEnum.TaskType_Outbound.ToString(); agvtask.agv_worktype = 1;//工作类型 agvtask.agv_materielid = ""; agvtask.agv_qty = 1; agvtask.agv_createtime = DateTime.Now; agvtask.agv_grade = 0;//任务优先级 agvtask.agv_userid = "WCS"; ware_Location1.task = 1; var entry = locRepository.DbContext.ChangeTracker.Entries().FirstOrDefault(); if (entry != null) { entry.State = EntityState.Detached; } int begin = locRepository.Update(ware_Location1, d => new { d.task }, true); ware_Location.task = 1; var entry2 = locRepository.DbContext.ChangeTracker.Entries().FirstOrDefault(); if (entry2 != null) { entry2.State = EntityState.Detached; } int end = locRepository.Update(ware_Location, d => new { d.task }, true); if (begin == 1 && end == 1) { WCSCommon.freeDB.Add(agvtask); } break; } } //判断还有多余未进行回流的切卷空托盘进行回流到极库 base_ware_location Location = locRepository.FindFirst(d => d.upper_code == item.upper_code && d.location_state == LocationStateEnum.LocationState_Stored.ToString() && d.gd1 == 0 && d.gd2 == 0 && d.gd3 == 0 && d.gd4 == 0 && d.tpgd == 1 && d.status == 1 && d.task == 2); if (Location == null) { return; } //切卷空托盘回流到极库 List routing_table1 = routingRepository.Find(v => v.route_end == item.upper_code).ToList(); foreach (var item1 in routing_table1) { base_ware_location ware_Location = locRepository.FindFirst(d => d.upper_code == item1.route_began && d.location_state == "LocationState_Empty" && d.tpgd == 0 && d.status == 1 && d.task == 2); if (ware_Location != null) { dt_agvtask dt_Agvtask = agvRepository.FindFirst(d => d.agv_toaddress == ware_Location.upper_code); if (dt_Agvtask != null) { continue; } int index = 0; int b = 10; DateTime time = DateTime.Now; Double STAMP = 0; do { DateTime time2 = DateTime.Now; STAMP = (time2 - time).TotalSeconds; base_ware_location DSLocation = locRepository.FindFirst(d => d.upper_code == item.upper_code && d.location_state == LocationStateEnum.LocationState_Stored.ToString() && d.gd1 == 0 && d.gd2 == 0 && d.gd3 == 0 && d.gd4 == 0 && d.tpgd == 1 && d.status == 1 && d.task == 2); if (DSLocation == null) { index = 3; break; } } while (STAMP < b); if (index == 3) { break; } //切卷空托回流到极库空位架 base_ware_location dwLocation = locRepository.FindFirst(d => d.upper_code == item1.route_began && d.location_state == "LocationState_Empty" && d.tpgd == 0 && d.status == 1 && d.task == 2); dt_agvtask_hty agvtask_Hty = agvhtyRepository.Find(d => d.agv_toaddress == dwLocation.upper_code).OrderByDescending(d => d.agv_finishedtime).FirstOrDefault(); if (agvtask_Hty != null) { bool interval = (DateTime.Now - agvtask_Hty.agv_finishedtime).Value.TotalSeconds < 60; if (interval) { continue; } } if (dwLocation == null) { continue; } dt_agvtask agvtask = new dt_agvtask(); agvtask.agv_id = Guid.NewGuid(); agvtask.agv_tasknum = "KH-" + IdenxManager.GetTaskNo(); agvtask.agv_fromaddress = Location.upper_code; agvtask.agv_toaddress = dwLocation.upper_code; agvtask.agv_code = "组装AGV调度"; agvtask.agv_remark = "切卷上料回空"; agvtask.agv_taskstate = AGVTaskStateEnum.Create.ToString(); agvtask.agv_tasktype = AGVTaskTypeEnum.TaskType_Outbound.ToString(); agvtask.agv_worktype = 1;//工作类型 agvtask.agv_materielid = ""; agvtask.agv_qty = 1; agvtask.agv_createtime = DateTime.Now; agvtask.agv_grade = 0;//任务优先级 agvtask.agv_userid = "WCS"; Location.task = 1; var entry = locRepository.DbContext.ChangeTracker.Entries().FirstOrDefault(); if (entry != null) { entry.State = EntityState.Detached; } int begin = locRepository.Update(Location, d => new { d.task }, true); dwLocation.task = 1; var entry2 = locRepository.DbContext.ChangeTracker.Entries().FirstOrDefault(); if (entry2 != null) { entry2.State = EntityState.Detached; } int end = locRepository.Update(dwLocation, d => new { d.task }, true); if (begin == 1 && end == 1) { WCSCommon.freeDB.Add(agvtask); } break; } } } } else //从极卷库回空托到辊分下料空位缓存架 { List base_Ware_GFLocation = locRepository.Find(d => d.upper_code.Contains("GFHCJ") && d.location_state == "LocationState_Empty" && d.gd1 == 0 && d.gd2 == 0 && d.gd3 == 0 && d.gd4 == 0 && d.tpgd == 0 && d.status == 1 && d.task == 2).ToList(); if (base_Ware_GFLocation.Count > 0) { foreach (var item in base_Ware_GFLocation) { List routing_table1 = routingRepository.Find(v => v.route_began == item.upper_code).ToList(); foreach (var item1 in routing_table1) { base_ware_location ware_Location = locRepository.FindFirst(d => d.upper_code == item1.route_end && d.location_state == "LocationState_Stored" && d.tpgd == 1 && d.geartype == "暂无" && d.status == 1 && d.task == 2); if (ware_Location != null) { int index = 0; int b = 10; DateTime time = DateTime.Now; Double STAMP = 0; do { DateTime time2 = DateTime.Now; STAMP = (time2 - time).TotalSeconds; base_ware_location DSLocation = locRepository.FindFirst(d => d.upper_code == item.upper_code && d.location_state == "LocationState_Empty" && d.gd1 == 0 && d.gd2 == 0 && d.gd3 == 0 && d.gd4 == 0 && d.tpgd == 0 && d.status == 1 && d.task == 2); if (DSLocation == null) { index = 3; break; } } while (STAMP < b); if (index == 3) { break; } base_ware_location dwLocation = locRepository.FindFirst(d => d.upper_code == item1.route_end && d.location_state == "LocationState_Stored" && d.tpgd == 1 && d.geartype == "暂无" && d.status == 1 && d.task == 2); if (dwLocation == null) { continue; } dt_agvtask dt_Agvtask = agvRepository.FindFirst(d => d.agv_toaddress == item.upper_code); if (dt_Agvtask != null) { continue; } //dt_agvtask_hty agvtask_Hty = agvhtyRepository.Find(d => d.agv_fromaddress == dwLocation.upper_code).OrderByDescending(d => d.agv_finishedtime).FirstOrDefault(); //bool interval = (DateTime.Now - agvtask_Hty.agv_finishedtime).Value.TotalSeconds < 120; //if (interval) //{ // continue; //} dt_agvtask agvtask = new dt_agvtask(); agvtask.agv_id = Guid.NewGuid(); agvtask.agv_tasknum = "KH-" + IdenxManager.GetTaskNo(); agvtask.agv_fromaddress = dwLocation.upper_code; agvtask.agv_toaddress = item.upper_code; agvtask.agv_code = "组装AGV调度"; agvtask.agv_remark = "极库空托回空"; agvtask.agv_taskstate = AGVTaskStateEnum.Create.ToString(); agvtask.agv_tasktype = AGVTaskTypeEnum.TaskType_Outbound.ToString(); agvtask.agv_worktype = 1;//工作类型 agvtask.agv_materielid = ""; agvtask.agv_qty = 1; agvtask.agv_createtime = DateTime.Now; agvtask.agv_grade = 0;//任务优先级 agvtask.agv_userid = "WCS"; item.task = 1; var entry = locRepository.DbContext.ChangeTracker.Entries().FirstOrDefault(); if (entry != null) { entry.State = EntityState.Detached; } int begin = locRepository.Update(item, d => new { d.task }, true); dwLocation.task = 1; var entry2 = locRepository.DbContext.ChangeTracker.Entries().FirstOrDefault(); if (entry2 != null) { entry2.State = EntityState.Detached; } int end = locRepository.Update(dwLocation, d => new { d.task }, true); if (begin == 1 && end == 1) { WCSCommon.freeDB.Add(agvtask); } break; } } } } } } } }