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 _readZTBUPSignalso = 0;
|
|
/// <summary>
|
/// 涂布设备上料逻辑
|
/// </summary>
|
/// <returns></returns>
|
public static void Z_TBSB_UpTask()
|
{
|
if (Interlocked.Exchange(ref _readZTBUPSignalso, 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);
|
List<string> TBSBS = new List<string> { "正极1号涂布机", "正极2号涂布机", "正极3号涂布机" };
|
PLCClient zagvplc = WCSService.Clients.Find(v => v.PLCName == "正极1号AGV");
|
foreach (var TBSB in TBSBS)
|
{
|
WriteLog.Info($"{TBSB}上料").Write($"{TBSB}开始,时间:" + DateTime.Now + " ----------", $"{TBSB}上料");
|
PLCClient plc = WCSService.Clients.Find(v => v.PLCName == TBSB);
|
if (plc == null) { continue; }
|
var SBtask = agvRepository.FindFirst(f => f.agv_toaddress == plc.PLCDescroption || f.agv_fromaddress == plc.PLCDescroption);
|
if (SBtask != null) { continue; }
|
WriteLog.Info($"{TBSB} 上料").Write($"SBtask:{SBtask}", $"{TBSB}上料");
|
//启用工单
|
string IsBatchNo = plc.ReadValue(ConveyorLineInfoDBName.R_TBSB_IsWorkBatchNo.ToString(), plc.PLCDescroption).ToString();
|
if (IsBatchNo == "False") { GetEquipmentInfo(plc.PLCDescroption, "", "启用工单为:" + IsBatchNo, "", ""); continue; }
|
WriteLog.Info($"{TBSB}上料").Write($"IsBatchNo:{IsBatchNo}", $"{TBSB}上料");
|
//当前设备有没有上料请求
|
string isSBWork = plc.ReadValue(ConveyorLineInfoDBName.R_TBSB_UPrequest.ToString(), plc.PLCDescroption).ToString();
|
//读取设备的工单号
|
string batchNo = plc.ReadValue(ConveyorLineInfoDBName.R_TBSB_UPbatchNo.ToString(), plc.PLCDescroption).ToString();
|
if (batchNo == null) { GetEquipmentInfo(plc.PLCDescroption, "", batchNo, "", ""); continue; }
|
WriteLog.Info($"{TBSB}上料").Write($"batchNo:{batchNo}", $"{TBSB}上料");
|
//上工序名
|
string processName = plc.ReadValue(ConveyorLineInfoDBName.R_TBSB_TBbatchNo.ToString(), plc.PLCDescroption).ToString();
|
if (string.IsNullOrEmpty(processName)) { GetEquipmentInfo(plc.PLCDescroption, "", "", processName, ""); continue; }
|
WriteLog.Info($"{TBSB}上料").Write($"processName:{processName}", $"{TBSB}上料");
|
//单面涂布模式
|
string oneside = plc.ReadValue(ConveyorLineInfoDBName.R_TBSB_OneSide.ToString(), plc.PLCDescroption).ToString();
|
WriteLog.Info($"{TBSB}上料").Write($"oneside:{oneside}", $"{TBSB}上料");
|
//双面涂布模式
|
string twoside = plc.ReadValue(ConveyorLineInfoDBName.R_TBSB_TwoSide.ToString(), plc.PLCDescroption).ToString();
|
WriteLog.Info($"{TBSB}上料").Write($"twoside:{twoside}", $"{TBSB}上料");
|
var route = routingRepository.Find(f => f.route_end == plc.PLCDescroption);
|
List<string> storedHCJ = new List<string>();
|
List<string> emptyHCJ = new List<string>();
|
var iswork = "";
|
foreach (var r in route)
|
{
|
var taska = agvRepository.FindFirst(f => f.agv_toaddress == r.route_began);
|
if (taska != null) { continue; }
|
var fromaddress = locRepository.FindFirst(f => f.upper_code == r.route_began || f.down_code == r.route_began);
|
iswork = zagvplc.ReadValue(ConveyorLineInfoDBName.R_Location_iswork.ToString(), r.route_began).ToString();
|
//if (iswork == "2" && fromaddress.location_state == LocationStateEnum.LocationState_Stored.ToString()) { storedHCJ.Add(r.route_began); }
|
//else if (iswork == "1" && fromaddress.location_state == LocationStateEnum.LocationState_Empty.ToString()) { emptyHCJ.Add(r.route_began); }
|
if (iswork == "2") { storedHCJ.Add(r.route_began); }
|
else if (iswork == "1") { emptyHCJ.Add(r.route_began); }
|
}
|
GetEquipmentInfo(plc.PLCDescroption, isSBWork, batchNo, processName + "单面模式:" + oneside + "双面模式" + twoside, "有货的缓存架数量是" + storedHCJ.Count() + ";" + "空的缓存架数量是" + emptyHCJ.Count());
|
|
WriteLog.Info($"{TBSB}上料").Write($"{processName} + \"单面模式:\" + {oneside} + \"双面模式\" + {twoside}, \"有货的缓存架数量是\" + {storedHCJ.Count()} + \";\" + \"空的缓存架数量是\" + {emptyHCJ.Count()}", $"{TBSB}上料");
|
if (emptyHCJ.Count() > 0)
|
{
|
WriteLog.Info("Z_TBSB_UpTask").Write("Z_TBSB_UpTask" + TBSB+"1", "Z_TBSB_UpTask");
|
if (bool.Parse(twoside))
|
{
|
WriteLog.Info("Z_TBSB_UpTask").Write("Z_TBSB_UpTask" + TBSB + "2", "Z_TBSB_UpTask");
|
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_TBSB_UpTask").Write("Z_TBSB_UpTask" + TBSB + "3", "Z_TBSB_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_TBSB_UpTask").Write("Z_TBSB_UpTask" + TBSB + "4", "Z_TBSB_UpTask");
|
lock (requestJJK)
|
{
|
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_tasknum = "KH-" + tasknumber.GetTaskNumber(tasknumberRep) + "-" + processName.Split('-')[1],
|
agv_taskstate = "WaitStockOut",
|
agv_tasktype = "TaskType_Outbound",
|
agv_toaddress = emptyHCJ[0],
|
agv_userid = "WCS",
|
agv_worktype = 1
|
};
|
//if (emptyHCJ.Count()==2&&bool.Parse(isSBWork))
|
//{
|
// agvtask.agv_toaddress = plc.PLCDescroption;
|
//}else
|
//{
|
// agvtask.agv_toaddress = emptyHCJ[0];
|
//}
|
//向MES申请要料
|
MESback WMSbackresult = MESAPIInvoke.OutNeedStosk(agvtask.agv_tasknum, null, 1, batchNo, processName, plc.PLCDescroption);
|
if (WMSbackresult == null) { return WebResponseContent.Instance.Error("正极大极卷库不通过要料申请"); }
|
WriteLog.Info($"{TBSB}上料").Write($"emptyHCJ,MES返回数据:{JsonConvert.SerializeObject(WMSbackresult)}", $"{TBSB}上料");
|
jjkloc.location_state = LocationStateEnum.LocationState_Lock.ToString();
|
locRepository.Update(jjkloc, true);
|
if (agvtask.agv_toaddress.Contains("HCJ"))
|
{
|
var tbloc = locRepository.FindFirst(f => f.down_code == emptyHCJ[0] || f.upper_code == emptyHCJ[0]);
|
tbloc.location_state = LocationStateEnum.LocationState_Lock.ToString();
|
locRepository.Update(tbloc, true);
|
}
|
agvRepository.Add(agvtask, true);
|
WriteLog.Info("Z_TBSB_UpTask").Write("Z_TBSB_UpTask" + agvtask.agv_tasknum + DateTime.Now, "Z_TBSB_UpTask");
|
return WebResponseContent.Instance.OK();
|
});
|
continue;
|
}
|
}
|
}
|
}
|
else if (bool.Parse(oneside))
|
{
|
//规格
|
string specifications = plc.ReadValue(ConveyorLineInfoDBName.R_TBSB_Specifications.ToString(), plc.PLCDescroption).ToString();
|
if (string.IsNullOrEmpty(specifications))
|
{
|
continue;
|
}
|
//厚度
|
string um = specifications.Split('*')[0];
|
//宽度
|
string mm = specifications.Split('*')[1];
|
var rou = routingRepository.Find(f => f.route_end == emptyHCJ[0]).Select(s => s.route_began).ToList();
|
List<bill_group_stock> CBJstocks = new List<bill_group_stock>();
|
//循环去找库存里物料类型与MES的物料类型一致的物料并且location_id是拆包间的
|
for (int i = 0; i < rou.Count(); i++)
|
{
|
var location = locRepository.FindFirst(f => f.upper_code == rou[i] || f.down_code == rou[i]);
|
var st = groupRepository.FindFirst(f => f.MaterialType == batchNo && f.location_id == location.id && f.Remark2 == um && f.Remark3 == mm);
|
if (st == null) { continue; }
|
CBJstocks.Add(st);
|
}
|
if (CBJstocks.Count == 0) { continue; }
|
//把CBJstocks通过批次号进行降序排列然后取第一条
|
var CBJstock = CBJstocks.OrderByDescending(o => o.BarCode).First();
|
//去货位表找对应的location_id
|
var islocation = locRepository.FindFirst(f => f.id == CBJstock.location_id);
|
if (islocation.location_state == LocationStateEnum.LocationState_Stored.ToString())
|
{
|
responseContent = locRepository.DbContextBeginTransaction(() =>
|
{
|
dt_agvtask agvtask = new dt_agvtask
|
{
|
agv_materbarcode = CBJstock.BarCode,
|
agv_barcode = "",
|
agv_code = "正极1号AGV",
|
agv_createtime = DateTime.Now,
|
agv_fromaddress = islocation.down_code,
|
agv_grade = 1,
|
agv_materielid = batchNo,
|
agv_qty = 1,
|
agv_tasknum = "KH-" + tasknumber.GetTaskNumber(tasknumberRep),
|
agv_taskstate = "Create",
|
agv_tasktype = "TaskType_Outbound",
|
agv_toaddress = emptyHCJ[0],
|
agv_userid = "WCS",
|
agv_worktype = 1
|
};
|
//if (emptyHCJ.Count()==2&&bool.Parse(isSBWork))
|
//{
|
// agvtask.agv_toaddress = plc.PLCDescroption;
|
//}else
|
//{
|
// agvtask.agv_toaddress = emptyHCJ[0];
|
//}
|
agvRepository.Add(agvtask, true);
|
WriteLog.Info("Z_TBSB_UpTask").Write("Z_TBSB_UpTask" + agvtask.agv_tasknum + CBJstock.BarCode + DateTime.Now, "Z_TBSB_UpTask");
|
islocation.location_state = LocationStateEnum.LocationState_Lock.ToString();
|
locRepository.Update(islocation, true);
|
var loc = locRepository.FindFirst(f => f.upper_code == emptyHCJ[0] || f.down_code == emptyHCJ[0]);
|
loc.location_state = LocationStateEnum.LocationState_Lock.ToString();
|
locRepository.Update(loc, true);
|
return WebResponseContent.Instance.OK();
|
});
|
break;
|
}
|
}
|
}
|
if (storedHCJ.Count() > 0)
|
{
|
if (bool.Parse(isSBWork))
|
{
|
if (storedHCJ.Count() == 2)
|
{
|
List<bill_group_stock> TBstocks = new List<bill_group_stock>();
|
var stocks = new bill_group_stock();
|
dt_agvtask agvtask = new dt_agvtask();
|
var fromaddress = new base_ware_location();
|
for (int i = 0; i < storedHCJ.Count(); i++)
|
{
|
var location = locRepository.FindFirst(f => f.upper_code == storedHCJ[i] || f.down_code == storedHCJ[i]);
|
stocks = groupRepository.FindFirst(f => f.MaterialType == batchNo && f.location_id == location.id);
|
if (stocks == null) { continue; }
|
TBstocks.Add(stocks);
|
}
|
if (TBstocks.Count() > 0)
|
{
|
var TBstock = TBstocks.OrderByDescending(o => o.BarCode).First();
|
fromaddress = locRepository.FindFirst(f => f.id == TBstock.location_id);
|
agvtask.agv_materbarcode = TBstock.BarCode;
|
agvtask.agv_fromaddress = fromaddress.upper_code;
|
}
|
else
|
{
|
//zagvplc.WriteValue(ConveyorLineInfoDBName.MaterNG.ToString(), fromlocation.upper_code, 1);
|
continue;
|
}
|
agvtask.agv_barcode = "";
|
agvtask.agv_code = "正极1号AGV";
|
agvtask.agv_createtime = DateTime.Now;
|
agvtask.agv_grade = 1;
|
agvtask.agv_materielid = batchNo;
|
agvtask.agv_qty = 1;
|
agvtask.agv_tasknum = "KH-" + tasknumber.GetTaskNumber(tasknumberRep);
|
agvtask.agv_taskstate = "Create";
|
agvtask.agv_tasktype = "TaskType_Outbound";
|
agvtask.agv_toaddress = plc.PLCDescroption;
|
agvtask.agv_userid = "WCS";
|
agvtask.agv_worktype = 1;
|
agvRepository.Add(agvtask, true);
|
WriteLog.Info("Z_TBSB_UpTask").Write("Z_TBSB_UpTask" + agvtask.agv_tasknum + "\t" + DateTime.Now, "Z_TBSB_UpTask");
|
fromaddress.location_state = LocationStateEnum.LocationState_Lock.ToString();
|
locRepository.Update(fromaddress, true);
|
break;
|
}
|
else if (storedHCJ.Count() == 1)
|
{
|
var stocks = new bill_group_stock();
|
var location = locRepository.FindFirst(f => f.upper_code == storedHCJ[0] || f.down_code == storedHCJ[0]);
|
stocks = groupRepository.FindFirst(f => f.MaterialType == batchNo && f.location_id == location.id);
|
if (stocks != null)
|
{
|
dt_agvtask agvtask = new dt_agvtask
|
{
|
agv_materbarcode = stocks.BarCode,
|
agv_barcode = "",
|
agv_code = "正极1号AGV",
|
agv_createtime = DateTime.Now,
|
agv_fromaddress = storedHCJ[0],
|
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("Z_TBSB_UpTask").Write("Z_TBSB_UpTask" + agvtask.agv_tasknum + "\t" + DateTime.Now, "Z_TBSB_UpTask");
|
location.location_state = LocationStateEnum.LocationState_Lock.ToString();
|
locRepository.Update(location, true);
|
break;
|
}
|
else
|
{
|
//zagvplc.WriteValue(ConveyorLineInfoDBName.MaterNG.ToString(), storedHCJ[0],1);
|
//break;
|
}
|
}
|
}
|
}
|
WriteLog.Info($"{TBSB}上料").Write($"{TBSB}结束,时间:" + DateTime.Now + $" ----------{Environment.NewLine}", $"{TBSB}上料");
|
}
|
|
|
List<string> HCJnos = new List<string> {"ZJSL-FQHCJ001","ZJSL-TBHCJ007","ZJSL-TBHCJ008","ZJSL-TBHCJ009","ZJSL-TBHCJ010","ZJSL-TBHCJ011","ZJSL-TBHCJ012",
|
"ZJSL-TBHCJ001","ZJSL-TBHCJ002","ZJSL-TBHCJ003","ZJSL-TBHCJ004","ZJSL-TBHCJ005","ZJSL-TBHCJ006",
|
"ZJSL-QXHCJ001","ZJSL-QXHCJ002", "ZJSL-GYHCJ001", "ZJSL-GYHCJ002", "ZJSL-GYHCJ003","ZJSL-FQHCJ002"};
|
PLCClient plca = null;
|
string toadd = "";
|
var task = 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 (task != null)
|
{
|
WriteLog.Info("ZF_InOut_Djjk").Write("正极大极卷库有正在执行的任务" + DateTime.Now, "ZF_InOut_Djjk");
|
return;
|
}
|
foreach (var hcj in HCJnos)
|
{
|
toadd = "ZJXL-JJK001";
|
plca = WCSService.Clients.Find(v => v.PLCName == "正极1号AGV");
|
if (plca == null)
|
continue;
|
var iswork = plca.ReadValue(ConveyorLineInfoDBName.R_Location_iswork.ToString(), toadd).ToString();
|
if (iswork == "2")
|
continue;
|
|
//读取有货无货信号
|
var isemptyorwork = plca.ReadValue(ConveyorLineInfoDBName.R_Location_iswork.ToString(), hcj).ToString();
|
GetEquipmentInfo(toadd, hcj + "的货位状态是" + isemptyorwork, "", "", iswork);
|
if (isemptyorwork == "1")
|
continue;
|
var location = locRepository.FindFirst(v => v.upper_code == hcj);
|
var stock = groupRepository.Find(v => v.location_id == location.id).OrderByDescending(v => v.created_time).FirstOrDefault();
|
var loc = locRepository.FindFirst(f => f.upper_code == "ZJSL-JJK001" && f.down_code == "ZJXL-JJK001");
|
if (stock == null)
|
continue;
|
//判断当前状态是否有更新
|
if (hcj.Contains("QX") && hcj.Contains("ZJ"))
|
{
|
if (string.IsNullOrEmpty(stock.TB_Status))
|
{
|
continue;
|
}
|
}
|
else if (hcj.Contains("TB") && hcj.Contains("ZJ"))
|
{
|
if (string.IsNullOrEmpty(stock.TB_Status))
|
{
|
continue;
|
}
|
}
|
else if (hcj.Contains("FQ") && hcj.Contains("ZJ"))
|
{
|
if (string.IsNullOrEmpty(stock.GY_Status))
|
{
|
continue;
|
}
|
}
|
else if (hcj.Contains("GY") && hcj.Contains("ZJ"))
|
{
|
if (string.IsNullOrEmpty(stock.QX_Status))
|
{
|
continue;
|
}
|
}
|
lock (requestJJK)
|
{
|
if (loc.location_state == LocationStateEnum.LocationState_Empty.ToString() && location.location_state == LocationStateEnum.LocationState_Stored.ToString() && stock.BarCode != null && stock.MaterialStatus != null)
|
{
|
responseContent = locRepository.DbContextBeginTransaction(() =>
|
{
|
MESback WMSbackresult = MESAPIInvoke.PreTask(1);
|
if (WMSbackresult == null) { return WebResponseContent.Instance.Error("正极大极卷库不通过入库申请"); }
|
dt_agvtask agvtask = new dt_agvtask
|
{
|
agv_materbarcode = stock.BarCode,
|
agv_barcode = "",
|
agv_code = plca.PLCName,
|
agv_createtime = DateTime.Now,
|
agv_fromaddress = hcj,
|
agv_grade = 1,
|
agv_materielid = stock.MaterialType,
|
agv_qty = 1,
|
agv_tasknum = "KH-" + tasknumber.GetTaskNumber(tasknumberRep),
|
agv_taskstate = "Create",
|
agv_tasktype = "TaskType_Outbound",
|
agv_toaddress = toadd,
|
agv_userid = "WCS",
|
agv_worktype = 1
|
};
|
agvRepository.Add(agvtask, true);
|
WriteLog.Info("ZF_InOut_Djjk").Write("ZF_InOut_Djjk" + agvtask.agv_tasknum + stock.BarCode + DateTime.Now, "ZF_InOut_Djjk");
|
location.location_state = LocationStateEnum.LocationState_Lock.ToString();
|
loc.location_state = LocationStateEnum.LocationState_Lock.ToString();
|
locRepository.Update(loc, true);
|
locRepository.Update(location, true);
|
return WebResponseContent.Instance.OK();
|
});
|
}
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
WriteLog.Info("Z_TBSB_UpTask").Write("Z_TBSB_UpTask" + ex.Message + "\t" + DateTime.Now, "Z_TBSB_UpTask");
|
}
|
finally
|
{
|
Interlocked.Exchange(ref _readZTBUPSignalso, 0);
|
}
|
}
|
}
|
}
|
}
|