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;
|
|
/// <summary>
|
/// 分切设备上料逻辑
|
/// </summary>
|
/// <returns></returns>
|
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<string> FQSBS = new List<string> { "正机1号分切机", "正机2号分切机5010" };
|
//List<string> FQSBS = new List<string> { "正机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");
|
}
|
finally
|
{
|
Interlocked.Exchange(ref _readZFQUPSignalso, 0);
|
}
|
}
|
}
|
}
|
}
|