using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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 _readFQXUPSignalso = 0;
///
/// 清洗设备上料逻辑
///
///
public static void F_QXSB_UpTask()
{
if (Interlocked.Exchange(ref _readFQXUPSignalso, 1) == 0)
{
try
{
VOLContext Context = new VOLContext();
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 QXSBS = new List { "负极清洗机" };
PLCClient zagvplc = WCSService.Clients.Find(v => v.PLCName == "负极1号AGV");
foreach (var QXSB in QXSBS)
{
PLCClient plc = WCSService.Clients.Find(v => v.PLCName == QXSB);
if (plc == null) { continue; }
//启用工单
string IsBatchNo = plc.ReadValue(ConveyorLineInfoDBName.R_QXSB_IsWorkBatchNo.ToString(), plc.PLCDescroption).ToString();
if (IsBatchNo == "False") { GetEquipmentInfo(plc.PLCDescroption, "", "启用工单为:" + IsBatchNo, "", ""); continue; }
//当前设备有没有上料请求
string isSBWork = plc.ReadValue(ConveyorLineInfoDBName.R_QXSB_UPrequest.ToString(), plc.PLCDescroption).ToString();
//读取设备的工单号
string batchNo = plc.ReadValue(ConveyorLineInfoDBName.R_QXSB_UPbatchNo.ToString(), plc.PLCDescroption).ToString();
if (batchNo == null) { GetEquipmentInfo(plc.PLCDescroption, "", batchNo, "", ""); continue; }
//工序名
string processName = plc.ReadValue(ConveyorLineInfoDBName.R_QXSB_GXbatchNo.ToString(), plc.PLCDescroption).ToString();
var SBtask = agvRepository.FindFirst(f => f.agv_toaddress == plc.PLCDescroption || f.agv_fromaddress == plc.PLCDescroption);
if (SBtask != null) { continue; }
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);
lock (requestFJJK)
{
if (iswork == "1" && fromaddress.location_state == LocationStateEnum.LocationState_Empty.ToString())
{
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")
{
//调用大及卷库出库需求接口
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))
{
agvtask.agv_toaddress = plc.PLCDescroption;
}
else
{
agvtask.agv_toaddress = route.route_began;
}
//向MES申请要料
MESback WMSbackresult = MESAPIInvoke.OutNeedStosk(agvtask.agv_tasknum, null, 2, batchNo, processName, plc.PLCDescroption);
if (WMSbackresult == null) { continue; }
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("F_QXSB_UpTask").Write("F_QXSB_UpTask" + agvtask.agv_tasknum + DateTime.Now, "F_QXSB_UpTask");
break;
}
}
}
}
if (bool.Parse(isSBWork))
{
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
};
////修改起点货位状态
agvRepository.Add(agvtask, true);
WriteLog.Info("F_QXSB_UpTask").Write("F_QXSB_UpTask" + agvtask.agv_tasknum + DateTime.Now, "F_QXSB_UpTask");
fromaddress.location_state = LocationStateEnum.LocationState_Lock.ToString();
locRepository.Update(fromaddress, true);
break;
}
else
{
//zagvplc.WriteValue(ConveyorLineInfoDBName.MaterNG.ToString(), route.route_began, 1);
}
}
}
}
catch (Exception)
{
}
finally
{
Interlocked.Exchange(ref _readFQXUPSignalso, 0);
}
}
}
}
}