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;
}
}
}
}
}
}
}
}