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;
namespace WIDESEA_WCS.Jobs
{
public partial class EquipmentExecutor : SchedulerExecuteBase
{
private static int _readJRSignalso2 = 0;
///
/// 格林晟卷绕机请求上料
///
public static void JRSB_UpTask_New()
{
if (Interlocked.Exchange(ref _readJRSignalso2, 1) == 0)
{
try
{
List JRSBS = new List { "格林晟1号卷绕机", "格林晟2号卷绕机", "格林晟3号卷绕机", "格林晟4号卷绕机", "格林晟5号卷绕机", "格林晟6号卷绕机", "格林晟7号卷绕机", "格林晟8号卷绕机", "格林晟9号卷绕机", "格林晟10号卷绕机" };
JRSB_UpTask_Run(JRSBS, "FJ");
JRSB_UpTask_Run(JRSBS, "ZJ");
}
catch (Exception ex)
{
WriteLog.Info("JRSB_UpTask").Write("JRSB_UpTask" + ex.Message, "JRSB_UpTask");
StackTrace stackTrace = new StackTrace();
StackFrame[] stackFrames = stackTrace.GetFrames();
string str = "";
foreach (var item in stackFrames)
{
str += "方法名:" + item.GetMethod().Name + ",行号:" + item.GetFileLineNumber() + ",文件名:" + item.GetFileName() + Environment.NewLine;
}
WriteLog.GetLog("格林晟卷绕机").Write($"错误信息:{ex.Message},{str}", "格林晟卷绕机");
}
finally
{
Interlocked.Exchange(ref _readJRSignalso2, 0);
}
}
}
///
/// 运行方法
///
/// 卷绕设备集合
/// 正极或负极
private static void JRSB_UpTask_Run(List JRSBS, string ZFType)
{
VOLContext Context = new VOLContext();
IJROutBindRepository jrRepository = new JROutBindRepository(Context);
Idt_agvtaskRepository agvRepository = new dt_agvtaskRepository(Context);
//卷绕机任务
var jrTaskList = agvRepository.Find(v => v.agv_toaddress.StartsWith(ZFType) && v.agv_toaddress.Contains("JR")).OrderBy(t => t.agv_createtime).ToList();
bool needCallMES = jrTaskList.Count() == 0;
//MES到达信息
string materiel = needCallMES ? "" : jrTaskList[0].agv_materielid;
JROutBind bind = jrRepository.Find(f => f.sum > 0 && f.materialtype == materiel && f.barcode.Substring(0, 2)/*正负极标识*/ == ZFType).FirstOrDefault();
if (!needCallMES)
{
WriteLog.Info($"卷绕机上料请求").Write($"{DateTime.Now}--{jrTaskList[0].agv_tasknum},请求上料\n", $"卷绕机上料请求");
}
try
{
#region 遍历设备请求
for (int i = 0; i < JRSBS.Count; i++)
{
string eqName = JRSBS[i];
var indexRange = ZFType == "FJ" ? new int[] { 1, 2 } : new int[] { 3, 4 };
//1、2负极口。3、4正极口
for (int stationIndex = indexRange[0]; stationIndex <= indexRange[1]; stationIndex++)
{
var plcClient = WCSService.Clients.Find(v => v.PLCName == eqName);
if (plcClient != null)
{
//请求上料
var requestIn = bool.Parse(plcClient.ReadValue($"R_GLSJRSB{stationIndex}_UPrequest", eqName).ToString());
if (requestIn)
{
//工单号
string batchNo = plcClient.ReadValue(ConveyorLineInfoDBName.R_JRSB_UPbatchNo.ToString(), eqName).ToString();
WriteLog.Info($"卷绕机上料请求").Write($"{DateTime.Now}--{eqName},{stationIndex}口,请求上料,工单号:{batchNo}\n", $"卷绕机上料请求");
if (string.IsNullOrEmpty(batchNo)) continue;
string stationNum = (stationIndex + i * 4).ToString().PadLeft(3, '0');
//1、2口负极。3、4口正极
string stationAddress = stationIndex <= 2 ? $"FJSL-JRSB{stationNum}-B" : $"ZJSL-JRSB{stationNum}-B";
if (needCallMES)
{
AddWaitTask(batchNo, stationAddress);
//只创建一个待下发任务
return;
}
else if (!needCallMES && batchNo == materiel)
{
if (bind == null) return; //MES未送达,直接退出
if (bind.useNum < bind.sum)
{
//MES送达
UpdateWaitTask(bind, ZFType, stationAddress);
}
}
}
}
}
}
#endregion
}
catch (Exception ex)
{
string msg = ex.Message;
WriteLog.Info($"卷绕机上料请求").Write($"{DateTime.Now}--error,{msg}\n\n", $"卷绕机上料请求");
}
if (bind != null)
{
//更新该任务是最后取料的标识
var lastTsak = agvRepository.Find(t => t.agv_tasknum == bind.taskid).FirstOrDefault();
if (lastTsak != null)
{
lastTsak.agv_remark = "true";
agvRepository.Update(lastTsak, true);
}
//复位绑定数据
bind.sum = 0;
bind.barcode = "";
bind.materialtype = "";
bind.taskid = "";
bind.barcodes = "";
bind.size = "-1";
jrRepository.Update(bind, true);
}
}
///
/// 创建和更新任务状态
///
/// MES到位信息
/// 正极或负极
/// 工单号
/// 入料口地址
private static void UpdateWaitTask(JROutBind bind, string ZFType, string stationAddress)
{
VOLContext Context = new VOLContext();
Idt_agvtaskRepository agvRepository = new dt_agvtaskRepository(Context);
Idt_task_numberRepository tasknumberRep = new dt_task_numberRepository(Context);
dt_task_numberService tasknumber = new dt_task_numberService(tasknumberRep);
int useNum = bind.useNum;//当前取的第几个
//等待下发的那条
var wiatTask = agvRepository.Find(v => v.agv_toaddress.StartsWith(ZFType) && v.agv_toaddress.Contains("JR") && v.agv_taskstate == "WaitStockOut").OrderBy(t => t.agv_createtime).FirstOrDefault();
if (wiatTask != null)
{
wiatTask.agv_fromaddress = bind.Devid;
wiatTask.agv_taskstate = "Create";
wiatTask.agv_materbarcode = GetBarcode(bind.barcodes, useNum);
wiatTask.agv_materielid = bind.materialtype;
wiatTask.size = bind.size;
wiatTask.JRunm = (bind.sum - useNum) + ";" + bind.size;//剩余卷数;料卷宽度
agvRepository.Update(wiatTask, true);
bind.taskid = wiatTask.agv_tasknum;
bind.useNum++;
}
else
{
//直接添加
var haveTask = agvRepository.FindFirst(f => f.agv_toaddress == stationAddress);
if (haveTask == null)
{
dt_agvtask agvtask = new dt_agvtask();
agvtask.agv_fromaddress = bind.Devid;
agvtask.agv_toaddress = stationAddress;
agvtask.agv_taskstate = "Create";
agvtask.agv_barcode = "";
agvtask.agv_code = "负极2号AGV";
agvtask.agv_createtime = DateTime.Now;
agvtask.agv_grade = 1;
agvtask.agv_materbarcode = GetBarcode(bind.barcodes, useNum);
agvtask.agv_qty = 1;
agvtask.agv_tasknum = "KH-" + tasknumber.GetTaskNumber(tasknumberRep);
agvtask.agv_tasktype = "TaskType_Outbound";
agvtask.agv_userid = "WCS";
agvtask.agv_worktype = 1;
agvtask.agv_materielid = bind.materialtype;
agvtask.size = bind.size;
if (useNum > 0)
{
agvtask.JRunm = (bind.sum - useNum) + ";" + bind.size;//剩余卷数;料卷宽度
}
agvRepository.Add(agvtask, true);
bind.taskid = agvtask.agv_tasknum;
bind.useNum++;
}
}
WriteLog.Info($"卷绕叫料MES到位").Write($"{DateTime.Now}--任务号:{bind.taskid}\t工单:{bind.materialtype}\tuseNum:{useNum}\t{wiatTask == null}\n\n", $"卷绕叫料MES到位");
}
///
/// 添加卷绕机待下发任务
///
/// 工单号
/// 设备口地址
/// 设备口1-4
private static void AddWaitTask(string batchNo, string stationAddress)
{
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);
Idt_agvtaskRepository agvRepository = new dt_agvtaskRepository(Context);
IJROutBindRepository jrRepository = new JROutBindRepository(Context);
var haveTask = agvRepository.FindFirst(f => f.agv_toaddress == stationAddress);
if (haveTask == null)
{
dt_agvtask agvtask = new dt_agvtask();
agvtask.agv_toaddress = stationAddress;
agvtask.agv_barcode = "";
agvtask.agv_code = "负极2号AGV";
agvtask.agv_createtime = DateTime.Now;
agvtask.agv_fromaddress = "nou";
agvtask.agv_grade = 1;
agvtask.agv_materbarcode = "daiding";
agvtask.agv_qty = 1;
agvtask.agv_tasknum = "KH-" + tasknumber.GetTaskNumber(tasknumberRep);
agvtask.agv_taskstate = "WaitStockOut";
agvtask.agv_tasktype = "TaskType_Outbound";
agvtask.agv_userid = "WCS";
agvtask.agv_worktype = 1;
agvtask.agv_materielid = batchNo;
//请求MES送料
List StockList = new List { "FJXL-FBT001", "FJXL-FBT002" };
MESback WMSbackresult = MESAPIInvoke.OutNeedStosk(agvtask.agv_tasknum, StockList, 4, agvtask.agv_materielid, "", agvtask.agv_toaddress);
WriteLog.Info("请求MES送料111").Write($"{agvtask.agv_tasknum}请求送料,MES返回数据:{JsonConvert.SerializeObject(WMSbackresult)},时间:" + DateTime.Now + " ----------\n", $"请求MES送料111");
if (WMSbackresult?.Code == 0)
{
agvRepository.Add(agvtask, true);
}
}
}
///
/// 获取物料号
///
///
///
///
private static string GetBarcode(string barcode, int useNum)
{
if (string.IsNullOrEmpty(barcode))
{
return "";
}
var barcodes = barcode.Split(',');
if (barcodes.Length - 1 >= useNum)
{
return barcodes[useNum];
}
else
{
return "index_out";
}
}
}
}