using HH.WCS.QingXigongchang.device;
|
using HH.WCS.QingXigongchang.dispatch;
|
using HH.WCS.QingXigongchang.util;
|
using HH.WCS.QingXigongchang.wms;
|
using Newtonsoft.Json;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Threading;
|
using static HH.WCS.QingXigongchang.api.ApiModel;
|
using Monitor = HH.WCS.QingXigongchang.core.Monitor;
|
|
namespace HH.WCS.QingXigongchang.process
|
{
|
internal class TaskProcess
|
{
|
private static HttpHelper apiHelper = new HttpHelper();
|
|
public const bool UPFule = false;
|
#region 任务相关
|
//--------------------------------------------------任务相关--------------------------------------------------
|
/// <summary>
|
/// 取货卸货完成,缓存位状态更新
|
/// </summary>
|
/// <param name="mst"></param>
|
/// <param name="v"></param>
|
internal static void CacheBitUpdate(WMSTask mst, bool load, string desc = "")
|
{
|
var trayCarryCount = mst.N_CNTR_COUNT > 0 ? mst.N_CNTR_COUNT : 1;
|
if (load)
|
{
|
Console.WriteLine($"任务{mst.S_TASK_NO} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTRS}");
|
LogHelper.Info($"任务{mst.S_TASK_NO} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTRS}");
|
LocationHelper.UnBindingLoc(mst.S_START_LOC, mst.S_CNTRS.Split(',').ToList());
|
}
|
else
|
{
|
Console.WriteLine($"任务{mst.S_TASK_NO} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTRS}");
|
LogHelper.Info($"任务{mst.S_TASK_NO} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTRS}-{desc}");
|
LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTRS.Split(',').ToList(), desc);
|
}
|
}
|
|
|
|
/// <summary>
|
/// 任务取消,缓存位状态更新
|
/// </summary>
|
/// <param name="mst"></param>
|
internal static void CacheBitCancelUpdate(WMSTask mst, out ReturnResult r, bool BeenOver = false)
|
{
|
r = new ReturnResult();
|
//任务取消,取货完成前的,起点的loadingCount和终点unLoadingCount都清除,取货完成的只处理终点
|
bool bbbbbbb = TaskHelper.CheckActionRecordExist(mst.S_TASK_NO, "4"); //取货完成后 取消/ 强制完成信号。 强制完成必须取货后
|
|
if (BeenOver)
|
{
|
if (!bbbbbbb)
|
{
|
if (TaskHelper.CheckActionRecordExist(mst.S_TASK_NO, "6"))
|
{
|
r = new ReturnResult()
|
{
|
ResultCode = -1,
|
ResultMsg = "任务已经卸货,不能强制完成。"
|
};
|
return;
|
}
|
r = new ReturnResult()
|
{
|
ResultCode = -1,
|
ResultMsg = "任务还没有取货,不能强制完成。"
|
};
|
return;
|
}
|
}
|
|
if (bbbbbbb)
|
{
|
bbbbbbb = false;
|
//UpdateElevatorTask(mst);
|
//todo: 如果是电梯卸货任务电梯任务中间表状态,如
|
//bbbbbbb = TaskHelper.CheckActionRecordExist(mst.S_TASK_NO, "5");
|
if (BeenOver || (mst.S_TYPE.Contains("成品满框") && bbbbbbb))
|
{
|
//if (mst.S_TYPE.Trim().Contains("翻斗机叫满"))
|
//{
|
// LocationHelper.UnLockLoc(mst.S_END_LOC);
|
|
//}
|
//else
|
OperateStatus(mst, 6);
|
#region oooooo
|
|
////终点绑定
|
//CacheBitUpdate(mst, false);
|
//if (mst.S_TYPE.Trim() == "满瓶坯-入库")
|
//{
|
// //LocationHelper.UnLockLoc(mst.S_START_LOC.Trim());
|
// //LocationHelper.UnLockLoc(mst.S_END_LOC.Trim());
|
// //if (BeenOver)
|
// //{
|
// LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_END_LOC.Trim(), x =>
|
// {
|
// x.N_CURRENT_NUM = 1;
|
// });
|
// //取货后完成的 - 直接完成。 这里要按照卸货处理 - 生成搬运空托到任务起点。
|
// LocationHelper.TakeEmptyToBottleBoyd(mst.S_START_LOC.Trim());
|
// //}
|
//}
|
//else if (mst.S_TYPE.Trim() == "空瓶坯-出库")
|
//{
|
// //LocationHelper.UnLockLoc(mst.S_END_LOC.Trim());
|
// //if (BeenOver)
|
// //{
|
// LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x =>
|
// {
|
// x.N_CURRENT_NUM = 1;
|
// x.T_FULL_TIME = DateTime.Now;
|
// });
|
// //}
|
//}
|
#endregion
|
}
|
else
|
{
|
LocationHelper.UnLockLoc(mst.S_END_LOC);
|
}
|
}
|
else
|
{
|
//电梯卸货任务表直接删除
|
//DeleteElevatorTask(mst);
|
//起点终点解锁
|
if (mst.S_TYPE.Trim() == "满瓶坯-入库" || mst.S_TYPE.Contains("空瓶坯-出库"))//|| mst.S_TYPE.Trim().Contains("瓶盖-满下线"))
|
{
|
//LocationHelper.SetT_FULL_TIME(mst.S_START_LOC.Trim(), null);
|
//LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x =>
|
//{
|
// x.N_CURRENT_NUM = 0;
|
// x.T_FULL_TIME = null;
|
//});
|
//var _r = LocationHelper.DoAction(db =>
|
// {
|
// return db.Deleteable<LocCntrRel>().Where(x => x.S_LOC_CODE == mst.S_START_LOC.Trim()).ExecuteCommand() > 0;
|
// });
|
var loc = mst.S_TYPE.Trim() == "满瓶坯-入库" ? mst.S_START_LOC.Trim() : mst.S_END_LOC.Trim();
|
var plc = Settings.GetDeviceInfoList().Where(a => a.location.Contains(loc) && a.enable == 1).FirstOrDefault();
|
if (plc != null)
|
{
|
if (plc.deviceType == 8)
|
for (var i = 0; i < plc.location.Length; i++)
|
{
|
if (loc == plc.location[i])
|
{
|
LogHelper.Info($"重置信号位置。 " + loc);
|
PlcHelper.SendHex(plc.address, "3F00" + (i + 1) + "0" + "0d0a");
|
break;
|
}
|
}
|
}
|
//ApiHelper.unOutgo3("------", mst.S_START_LOC);
|
}
|
else if (mst.S_TYPE.Trim() == "瓶盖非即产线边" || mst.S_TYPE.Contains("瓶盖即产转翻斗机线边") || mst.S_TYPE.Contains("注塑即产空筐上线") || mst.S_TYPE.Contains("注塑库存空筐上线"))//|| mst.S_TYPE.Trim().Contains("瓶盖-满下线"))
|
{
|
//LocationHelper.SetT_FULL_TIME(mst.S_START_LOC.Trim(), null);
|
//LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x =>
|
//{
|
// x.N_CURRENT_NUM = 0;
|
// x.T_FULL_TIME = null;
|
//});
|
//var _r = LocationHelper.DoAction(db =>
|
// {
|
// return db.Deleteable<LocCntrRel>().Where(x => x.S_LOC_CODE == mst.S_START_LOC.Trim()).ExecuteCommand() > 0;
|
// });
|
var loc = (mst.S_TYPE.Trim() == "瓶盖非即产线边" || mst.S_TYPE.Contains("瓶盖即产转翻斗机线边")) ? mst.S_START_LOC.Trim() : mst.S_END_LOC.Trim();
|
var plc = Settings.GetDeviceInfoList().Where(a => a.location.Contains(loc) && a.enable == 1).FirstOrDefault();
|
if (plc != null)
|
{
|
if (plc.deviceType == 2 || plc.deviceType == 3)
|
for (var i = 0; i < plc.location.Length; i++)
|
{
|
if (loc == plc.location[i])
|
{
|
LogHelper.Info($"重置信号位置。 " + loc);
|
PlcHelper.SendHex(plc.address, "3F00" + (i + 1) + "0" + "0d0a");
|
break;
|
}
|
}
|
}
|
//ApiHelper.unOutgo3("------", mst.S_START_LOC);
|
}
|
else if (mst.S_TYPE.Contains("库存盖坯出库"))
|
CancelckLingItem(mst);
|
#region 注释行
|
|
//if (mst.S_TYPE.Trim().Contains("瓶盖-满下线"))
|
//{
|
// //LocationHelper.SetT_FULL_TIME(mst.S_START_LOC.Trim(), null);
|
// LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x =>
|
// {
|
// x.N_CURRENT_NUM = 0;
|
// x.T_FULL_TIME = null;
|
// });
|
// var _r = LocationHelper.DoAction(db =>
|
// {
|
// return db.Deleteable<LocCntrRel>().Where(x => x.S_LOC_CODE == mst.S_START_LOC.Trim()).ExecuteCommand() > 0;
|
// });
|
// LogHelper.Info($"重置起点位置。 {_r}");
|
// //ApiHelper.unOutgo3("------", mst.S_START_LOC);
|
//}
|
#endregion
|
LocationHelper.UnLockLoc(mst.S_START_LOC);
|
LocationHelper.UnLockLoc(mst.S_END_LOC);
|
//todo: 如果是电梯卸货任务取消删除,如果是电梯取货任务取消修改任务状态
|
//var cntrs = mst.S_CNTRS.Split(',').ToList();
|
//没有取货完成的任务,如果是清洁位补空类型任务,需要将托盘状态还原成已清洁
|
//if (Settings.GetInStockCacheList().Count(a => (a.locationType == 1 || a.locationType == 3 || a.locationType == 4) && a.location == mst.S_START_LOC) > 0)
|
//{
|
// ContainerHelper.UpdateCntr(cntrs, "", "", "已清洁");
|
//}
|
////临时库-翻斗机线边取消,还原托盘信息
|
//if (mst.S_TYPE.Trim() == "临时库-线边")
|
//{
|
// var startInfo = Settings.GetTipperCacheList().Where(a => a.location.Contains(mst.S_START_LOC)).FirstOrDefault();
|
// if (startInfo != null)
|
// {
|
// ContainerHelper.UpdateCntr(cntrs, startInfo.deviceName, "");
|
// }
|
//}
|
////瓶盖库-临时库
|
//if (mst.S_TYPE.Trim() == "瓶盖库-临时库")
|
//{
|
// ContainerHelper.UpdateCntr(cntrs, "", "");
|
//}
|
|
}
|
}
|
|
static void CancelckLingItem(WMSTask mst)
|
{
|
if (!TaskProcess.UPFule) return;
|
if (string.IsNullOrEmpty(mst.S_SRC_NO)) return;
|
LingItemOrder od = null;
|
|
var wod = WCSHelper.GetWorkOrder(mst.S_SRC_NO);
|
var plc = Settings.GetDeviceInfoList().Find(x => x.deviceName == wod?.SQL_PLineNo);
|
|
if (plc != null)
|
LocationHelper.DoAction(db =>
|
{
|
od = db.Queryable<LingItemOrder>().Where(it => plc.FuLeLineNo.Contains(it.DeviceNo) && it.State == "执行").First();
|
return true;
|
});
|
if (od != null)
|
{
|
int current = 0;
|
foreach (var item in mst.S_CNTRS.Split(','))
|
{
|
var cntrs = ContainerHelper.GetCntrItemRel(item)?.FirstOrDefault();
|
current += cntrs.qty;
|
}
|
od.AllocQTY -= current; //取消扣除分配量。。 强制完成会走信号6 这里不需要
|
LocationHelper.DoAction(db =>
|
{
|
db.Updateable<LingItemOrder>(od).UpdateColumns(it => new { it.AllocQTY }).ExecuteCommand();
|
return true;
|
});
|
}
|
}
|
|
/// <summary>
|
/// 安全请求
|
/// </summary>
|
/// <param name="no"></param>
|
/// <param name="state"></param>
|
/// <param name="forkliftNo"></param>
|
/// <param name="extData"></param>
|
internal static void OperateReq(string no, int state, string forkliftNo, string extData)
|
{
|
|
}
|
|
/// <summary>
|
/// 任务拦截
|
/// </summary>
|
/// <param name="task"></param>
|
/// <returns></returns>
|
internal static bool Intercept(WMSTask mst)
|
{
|
var result = false;
|
//翻斗机叠空框
|
//电梯任务不推送,单独处理
|
if (mst.S_TYPE.Contains("-电梯"))
|
{
|
result = true;
|
}
|
if (mst.S_TYPE.Trim() == "翻斗机叠空框" && mst.N_PRIORITY == 90)
|
{
|
//判断相同终点的叠托任务是否存在,是否取货完成
|
var list = TaskHelper.GetTaskByEnd(mst.S_END_LOC);
|
var otherTask = list.Where(a => a.N_PRIORITY == 99).FirstOrDefault();
|
if (otherTask != null && !TaskHelper.CheckActionRecordExist(otherTask.S_TASK_NO, "4"))
|
{
|
TaskHelper.UpdateStatus(mst, "未执行");
|
result = true;
|
}
|
|
}
|
return result;
|
}
|
|
|
/// <summary>
|
/// 任务状态更新处理
|
/// </summary>
|
/// <param name="mst"></param>
|
/// <param name="state"></param>
|
internal static ReturnResult OperateStatus(WMSTask mst, int state)
|
{
|
ReturnResult r = new ReturnResult();
|
if (state == 4)
|
{
|
if (!mst.S_TYPE.Trim().Contains("自由点对点"))
|
CacheBitUpdate(mst, load: true);
|
if (mst.S_TYPE.Trim().Contains("满瓶坯-入库") || mst.S_TYPE.Trim().Contains("空瓶坯-出库") || mst.S_TYPE.Trim().Contains("瓶盖-满下线"))
|
{
|
LocationHelper.lOCReSetValue((Location x) => x.S_LOC_CODE == mst.S_START_LOC.Trim(), delegate (Location x)
|
{
|
if (x.N_CURRENT_NUM > 0)
|
x.N_CURRENT_NUM--;
|
else x.N_CURRENT_NUM = 0;
|
});
|
}
|
else if (mst.S_TYPE.Trim().Contains("上线满出库") || mst.S_TYPE.Trim().Contains("仓空转下空"))
|
{
|
LocationHelper.lOCReSetValue((Location x) => x.S_LOC_CODE == mst.S_START_LOC.Trim(), delegate (Location x)
|
{
|
if (x.N_CURRENT_NUM == 0)
|
x.S_NOTE = "";
|
});
|
}
|
if (mst.S_TYPE.Contains("Fu成品满框-入库"))
|
{
|
var plc = Settings.GetDeviceInfoList().Where(a => a.location.Contains(mst.S_START_LOC.Trim()) && a.enable == 1).FirstOrDefault();
|
if (plc != null)
|
{
|
if (plc.deviceType == 9)
|
{
|
PlcHelper.SendHex(plc.address, "3F00" + "10" + "0d0a");
|
}
|
}
|
|
LocationHelper.DoAction(db =>
|
{
|
var fulectlist = LocationHelper.GetFuLeTrayCodeList(f => mst.S_CNTRS.Contains(f.trayCode.Trim()));
|
LogHelper.Info("Fu成品取货" + mst.S_CNTRS + "--<>--" + JsonConvert.SerializeObject(fulectlist));
|
if (fulectlist.Any())
|
db.Updateable<FuLeTrayCode>(fulectlist).ReSetValue(it => { it.SQL_State = "完成"; }).ExecuteCommand();
|
return true;
|
});
|
}
|
if (mst.S_TYPE.Contains("翻斗机即产满筐上线(瓶盖)") || mst.S_TYPE.Contains("翻斗机库存满筐上线(瓶盖)") || mst.S_TYPE.Contains("翻斗机叫满") || mst.S_TYPE.Contains("中转去"))
|
{
|
//写入 入库排锁 - 记录 在入库。 如果排满了,就歇菜。 清除 放在 线程里。
|
var loc = LocationHelper.GetLoc(mst.S_START_LOC);
|
var db = new SqlHelper<object>().GetInstance();
|
var row = db.Queryable<RowLock>().Where(x => x.S_AREA_CODE == loc.S_AREA_CODE && loc.N_ROW == x.N_ROW && x.S_LOCK_STATE == "出库锁").First();
|
if (row == null)
|
{
|
db.Insertable<RowLock>(new RowLock { S_AREA_CODE = loc.S_AREA_CODE, N_ROW = loc.N_ROW, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "出库锁" }).ExecuteCommand();
|
}
|
//if (loc.N_CURRENT_NUM > 0)
|
//{
|
// if (row == null)
|
// {
|
// db.Insertable<RowLock>(new RowLock { S_AREA_CODE = loc.S_AREA_CODE, N_ROW = loc.N_ROW, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "出库锁" }).ExecuteCommand();
|
// }
|
//}
|
//else
|
//{
|
// var haslast = LocationHelper.GetLocList(x => x.S_AREA_CODE == loc.S_AREA_CODE && x.N_ROW == loc.N_ROW && x.N_CURRENT_NUM > 0 && x.S_LOCK_STATE != "报废");
|
// if (!haslast.Any())
|
// db.Deleteable<RowLock>().Where(x => x.S_AREA_CODE == loc.S_AREA_CODE && x.N_ROW == loc.N_ROW).ExecuteCommand();
|
// else if (row == null)
|
// db.Insertable<RowLock>(new RowLock { S_AREA_CODE = loc.S_AREA_CODE, N_ROW = loc.N_ROW, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "出库锁" }).ExecuteCommand();
|
//}
|
}
|
|
//终点货位为 YWLT1TSJCD 或者 YWLT2TSJCD 的 要取货完成解锁起点,解绑起点,绑定终点,卸货完成,解锁终点 2025年6月10日 Plg
|
//if (mst.S_END_LAREA?.Trim() == "YWLT1TSJCD" || mst.S_END_LAREA?.Trim() == "YWLT2TSJCD")
|
//{
|
// //解绑起点
|
// CacheBitUpdate(mst, load: true);
|
// //绑定终点
|
// CacheBitUpdate(mst, load: false);
|
//}
|
LocationHelper.UnLockLoc(mst.S_START_LOC.Trim());
|
}
|
//new List<string> { "成品满框-入库", "" }
|
if (state == 6 || state == 5)
|
{
|
|
LogHelper.Info($"任务类型:{mst.S_TYPE}- 动作:{state}. 是否5算6?{mst.S_TYPE.Contains("成品满框") || mst.S_TYPE.Contains("备货")} ");
|
if (mst.S_TYPE.Contains("备货"))
|
{
|
if (state == 6) goto vvv;
|
}
|
else if (state == 5)
|
{
|
///只需要释放货位就行了
|
//if (mst.S_END_LAREA?.Trim() == "YWLT1TSJCD" || mst.S_END_LAREA?.Trim() == "YWLT2TSJCD")
|
//{
|
// LocationHelper.UnLockLoc(mst.S_END_LOC.Trim());
|
// return r;
|
//}
|
goto vvv;
|
}
|
|
if (mst.S_TYPE.Trim() == "J空瓶坯-出库")
|
{
|
mst.S_CNTRS = "J" + Settings.GetTimeStamp();
|
}
|
|
if (mst.S_TYPE.Trim() == "F空瓶坯-出库")
|
{
|
mst.S_CNTRS = "F" + Settings.GetTimeStamp();
|
}
|
|
//成品空框 不需要绑筐
|
if (!mst.S_TYPE.Trim().Contains("成品-空托上线")
|
&& mst.S_TYPE.Trim() != "满瓶坯-入库"
|
&& mst.S_TYPE.Trim() != "瓶盖入库-J2"
|
&& mst.S_TYPE.Trim() != "瓶盖空筐转运-J2"
|
&& mst.S_TYPE.Trim() != "青溪纸箱搬运物料"
|
&& !mst.S_TYPE.Trim().Contains("自由点对点"))
|
{
|
CacheBitUpdate(mst, load: false, mst.S_NOTE);
|
}
|
|
|
if (mst.S_TYPE.Trim().Contains("成品-空托上线"))
|
{
|
LocationHelper.lOCReSetValue((Location x) => x.S_LOC_CODE == mst.S_END_LOC.Trim(), delegate (Location x)
|
{
|
x.S_LOCK_STATE = "无";
|
x.N_CURRENT_NUM = 1;
|
x.T_FULL_TIME = DateTime.Now;
|
});
|
var plc = Settings.GetDeviceInfoList().Where(a => a.location.Contains(mst.S_START_LOC.Trim()) && a.enable == 1).FirstOrDefault();
|
if (plc != null)
|
{
|
if (plc.deviceType == 9)
|
for (int i = 0; i < plc.location.Length; i++)
|
{
|
if (plc.location[i] == mst.S_END_LOC.Trim())
|
//foreach (var _i in new int[] { 1, 2, 3 })
|
{
|
PlcHelper.SendHex(plc.address, "3F00" + (i + 1) + "0" + "0d0a");
|
}
|
}
|
}
|
}
|
|
if (mst.S_TYPE.Contains("备货"))
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var to = db.Queryable<TurnWorkOrder>().Where(x => x.S_ID == mst.S_SRC_NO).First();
|
if (to != null)
|
{
|
// to.AlQty += mst.S_CNTRS.Split(',').Length;// mst.S_CNTRS.Substring(1).Split('v').Length;
|
to.AlQty += mst.S_CNTRS.Substring(1).Split('v').Length;
|
db.Updateable(to).UpdateColumns(it => new { it.AlQty }).ExecuteCommand();
|
}
|
}
|
else if (mst.S_TYPE.Contains("原物料搬运"))
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var to = db.Queryable<YWLWorkOrder>().Where(x => x.SQL_WorkNo == mst.S_SRC_NO).First();
|
if (to != null)
|
{
|
// to.AlQty += mst.S_CNTRS.Split(',').Length;// mst.S_CNTRS.Substring(1).Split('v').Length;
|
to.OutNum -= mst.S_CNTRS.Split(',').Length;
|
db.Updateable(to).UpdateColumns(it => new { it.OutNum }).ExecuteCommand();
|
}
|
}
|
|
if (mst.S_TYPE.Trim().Contains("空瓶坯-出库") || mst.S_TYPE.Trim().Contains("瓶盖-空上机") || mst.S_TYPE.Trim().Contains("翻斗机叫满"))
|
{
|
//LocationHelper.UnLockLoc(mst.S_END_LOC.Trim());
|
//LogHelper.Info("该点位的托盘数量" + mst.S_END_LOC.Trim() + (LocationHelper.GetLocation(mst.S_END_LOC.Trim())?.N_CURRENT_NUM).ToString());
|
LocationHelper.lOCReSetValue((Location x) => x.S_LOC_CODE == mst.S_END_LOC.Trim(), delegate (Location x)
|
{
|
x.S_LOCK_STATE = "无";
|
x.N_CURRENT_NUM = 1;
|
x.T_FULL_TIME = DateTime.Now;
|
});
|
}
|
if (mst.S_TYPE.Contains("瓶盖非即产线边") || mst.S_TYPE.Contains("瓶盖即产转翻斗机线边") || mst.S_TYPE.Contains("中转去") || mst.S_TYPE.Contains("满瓶坯"))
|
{
|
//写入 入库排锁 - 记录 在入库。 如果排满了,就歇菜。 清除 放在 线程里。
|
var loc = LocationHelper.GetLoc(mst.S_END_LOC);
|
var db = new SqlHelper<object>().GetInstance();
|
var row = db.Queryable<RowLock>().Where(x => x.S_AREA_CODE == loc.S_AREA_CODE && loc.N_ROW == x.N_ROW && x.S_LOCK_STATE == "入库锁").First();
|
if (row == null)
|
{
|
db.Insertable<RowLock>(new RowLock { S_AREA_CODE = loc.S_AREA_CODE, N_ROW = loc.N_ROW, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "入库锁" }).ExecuteCommand();
|
}
|
//if (loc.N_CURRENT_NUM < loc.N_CAPACITY)
|
//{
|
// if (row == null)
|
// {
|
// db.Insertable<RowLock>(new RowLock { S_AREA_CODE = loc.S_AREA_CODE, N_ROW = loc.N_ROW, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "入库锁" }).ExecuteCommand();
|
// }
|
//}
|
//else
|
//{
|
// var haslast = LocationHelper.GetLocList(x => x.S_AREA_CODE == loc.S_AREA_CODE && x.N_ROW == loc.N_ROW && x.S_LOCK_STATE != "报废");
|
// if (haslast.Find(x => x.N_COL > loc.N_COL && x.N_CURRENT_NUM < x.N_CAPACITY) == null)
|
// db.Deleteable<RowLock>().Where(x => x.S_AREA_CODE == loc.S_AREA_CODE && x.N_ROW == loc.N_ROW).ExecuteCommand();
|
// else if (row == null)
|
// db.Insertable<RowLock>(new RowLock { S_AREA_CODE = loc.S_AREA_CODE, N_ROW = loc.N_ROW, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "入库锁" }).ExecuteCommand();
|
//}
|
}
|
|
if (mst.S_TYPE.Trim() == "满瓶坯-入库")
|
{
|
//LocationHelper.TakeEmptyToBottleBoyd(mst);
|
//LogHelper.Info("");
|
string desc = "";
|
//Settings.deviceInfo startloc = (from x in Settings.GetDeviceInfoList()
|
// where x.location.Contains(mst.S_START_LOC.Trim())
|
// select x).FirstOrDefault();
|
//if (startloc != null && string.IsNullOrEmpty(mst.S_SRC_NO))
|
//{
|
// var order = WCSHelper.GetWorkOrder(x => mst.S_SRC_NO.Trim() == x.SQL_PLineNo).FirstOrDefault();
|
// desc = order?.SQL_PLineNo + ">" + order?.SQL_ItemCode;
|
//}
|
var order = WCSHelper.GetWorkOrder(x => mst.S_SRC_NO.Trim() == x.SQL_WorkNo).FirstOrDefault();
|
desc = order == null ? "" : order?.SQL_PLineNo + ">" + order?.SQL_ItemCode;
|
CacheBitUpdate(mst, load: false, desc);
|
LocationHelper.UnLockLoc(mst.S_END_LOC.Trim());
|
// TAKE OUT 2 ZZQ 出库区 转 中转区
|
string ppp = "";
|
if (!string.IsNullOrEmpty(desc))
|
ppp = order.SQL_PLineNo.Contains("注塑机3") ? "注塑机3" : (order.SQL_PLineNo.Contains("注塑机4") ? "注塑机4" : "");
|
Monitor.B7(true, ppp);
|
if (false)
|
if (!string.IsNullOrEmpty(desc))
|
{
|
var areaList = "";
|
if (order.SQL_PLineNo.Contains("注塑机3"))
|
areaList = "PPTMKZZ";
|
if (order.SQL_PLineNo.Contains("注塑机4"))
|
areaList = "PPFMKZZ";
|
if (!string.IsNullOrEmpty(areaList))
|
{
|
LogHelper.Info($"计算{mst.S_TASK_NO} - {mst.S_SRC_NO} 对应的{order.SQL_PLineNo} 中转区任务");
|
var loclist__ = LocationHelper.GetAreaNormalLocList(areaList, false);
|
//if (loclist__.Find(x => x.S_LOCK_STATE.Trim() == "入库锁" /*|| x.S_LOCK_STATE.Trim() == "出库锁"*/) != null)
|
//{
|
// LogHelper.Info($"{mst.S_TASK_NO} - 中转区有入库任务,不进行中转");
|
//}
|
//else
|
{
|
|
var rs = order.S_ROW1.Split('=');
|
int[] rows = Array.ConvertAll(rs[rs.Length - 1].Trim().Split('-'), Convert.ToInt32);
|
|
Location strBit = null;
|
Location endBit = null;
|
LocCntrRel crl = null;
|
var outlocs = LocationHelper.GetAreaNormalLocList("PPMKCK");
|
if (rs[0] != "PPMKCK")
|
{
|
rows = new int[] { };
|
}
|
foreach (var item in outlocs.GroupBy(x => x.N_ROW).OrderBy(x => rows.Contains(x.Key) ? 0 : 1).ThenBy(x => x.Count(y => y.N_CURRENT_NUM > 0)))
|
{
|
var e = item.OrderByDescending(x => x.N_COL).ToList().Find(x => x.N_CURRENT_NUM > 0);
|
if (e != null)
|
{
|
var rel = LocationHelper.GetLocCntrRel(e.S_LOC_CODE);
|
if (rel.Any() && (rel.FirstOrDefault().S_TYPE.Contains($"{order?.SQL_PLineNo}>{order?.SQL_ItemCode}") || rel.FirstOrDefault().S_TYPE.Contains($"{order?.SQL_PLineNo}>{order?.SQL_ItemName}")))
|
{
|
crl = rel.FirstOrDefault();
|
strBit = e;
|
break;
|
}
|
}
|
}
|
if (strBit != null)
|
{
|
LogHelper.Info($"{mst.S_TASK_NO} - 去中转区,找到出库区位置{strBit.S_LOC_CODE}-{crl.S_CNTR_CODE}");
|
loclist__ = LocationHelper.GetAreaNormalLocList(areaList);
|
foreach (var _rl in loclist__.GroupBy(x => x.N_ROW).OrderByDescending(x => x.Count(y => y.N_CURRENT_NUM > 0)))
|
{
|
var rowLsit = _rl.OrderByDescending(x => x.N_COL).ToList();
|
var e = rowLsit.Find(x => x.N_CURRENT_NUM > 0);
|
if (e == null)
|
{
|
endBit = rowLsit.LastOrDefault();
|
if (endBit != null)
|
break;
|
}
|
else
|
{
|
var rel = LocationHelper.GetLocCntrRel(e.S_LOC_CODE);
|
if (rel.Any() && (rel.FirstOrDefault().S_TYPE.Contains($"{order?.SQL_PLineNo}>{order?.SQL_ItemCode}") || rel.FirstOrDefault().S_TYPE.Contains($"{order?.SQL_PLineNo}>{order?.SQL_ItemName}")))
|
{
|
if (e.N_CURRENT_NUM < e.N_CAPACITY)
|
{
|
endBit = e;
|
break;
|
}
|
else
|
{
|
rowLsit.Reverse();
|
endBit = rowLsit.FindAll(x => x.N_COL > e.N_COL).OrderBy(x => x.N_COL).FirstOrDefault();
|
if (endBit != null)
|
break;
|
}
|
}
|
}
|
}
|
if (endBit != null)
|
{
|
LogHelper.Info($"{mst.S_TASK_NO} - 去中转区,找到位置{endBit.S_LOC_CODE}");
|
bool bb = CreateTransport(order.SQL_WorkNo, strBit.S_LOC_CODE, endBit.S_LOC_CODE, order.SQL_PLineNo + "中转去", new List<string> { crl.S_CNTR_CODE }, strBit.N_CURRENT_NUM, endBit.N_CURRENT_NUM++, 1, 50, crl.S_TYPE);
|
LogHelper.Info($"{mst.S_TASK_NO},任务卸货,创建去{order.SQL_PLineNo}中转区的任务{(bb ? "成功" : "失败")}");
|
}
|
//, ctrs.FirstOrDefault().S_TYPE
|
}
|
}
|
}
|
}
|
}
|
else if (mst.S_SRC_NO.Contains("LIOauto"))//mst.S_TYPE.Trim() == "青溪纸箱搬运物料" || mst.S_TYPE.Trim().Contains("出库提升机接驳位"))
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var alrs = db.Queryable<LingItemOrder>().Where(x => x.WorkNo == mst.S_SRC_NO).First();
|
if (alrs != null)
|
{
|
alrs.OutCurrentNum = (alrs.current + mst.S_CNTRS.Split(',').Length) + "";
|
if (alrs.current >= alrs.AreaNum)
|
alrs.State = "完成";
|
db.Updateable(alrs).UpdateColumns(x => new { x.OutCurrentNum, x.State }).ExecuteCommand();
|
}
|
LocationHelper.UnLockLoc(mst.S_END_LOC.Trim());
|
}
|
else if (mst.S_TYPE.Contains("瓶盖入库"))
|
{
|
var locstart = LocationHelper.GetLoc(mst.S_START_LOC.Trim());
|
var b1 = Settings.GetBolAreaList().Find(x => x.NotUsingBolArea == locstart?.S_AREA_CODE);
|
CacheBitUpdate(mst, load: false, b1?.DeviceName);
|
//入库上报富勒
|
if (UPFule)
|
{
|
var b = false;// 标识 是否需要上报。
|
var dl = new List<dynamic>();
|
WorkOrder od = null;
|
List<CntrItemRel> lcirs = new List<CntrItemRel>();
|
|
foreach (var item in mst.S_CNTRS.Split(','))
|
{
|
var cntrs = ContainerHelper.GetCntrItemRel(item)?.FirstOrDefault();
|
if (cntrs != null && !string.IsNullOrEmpty(cntrs?.S_ORDER_NO) && cntrs.S_ORDER_NO.Trim().EndsWith("_Y"))
|
{
|
if (od == null || od.SQL_WorkNo != cntrs?.S_ORDER_NO.Split('_')[0])
|
{
|
od = WCSHelper.GetWorkOrderByOrderNo(cntrs?.S_ORDER_NO.Split('_')[0]);
|
}
|
lcirs.Add(cntrs);
|
b = true;
|
dl.Add(new
|
{
|
Settings.warehouseId,
|
Settings.customerId,
|
Settings.asnType,
|
docNo = cntrs?.S_ORDER_NO.Split('_')[0],//od.SQL_WorkNo,
|
expectedArriveTime1 = od?.T_MODIFY,
|
sku = cntrs.S_ITEM_CODE,
|
traceId = cntrs.S_CNTR_CODE,
|
toLocation = LocationHelper.GetLoc(mst.S_END_LOC)?.S_Fule_LOC,
|
cntrs.qty
|
});
|
}
|
}
|
if (b)
|
{
|
var req = JsonConvert.SerializeObject(new
|
{
|
from = Settings.fromSystem,
|
list = dl
|
});
|
var feedback = apiHelper.WebPost($"{Settings.FuleServerUrl}/wms/v1/agv/paConfirm", req);
|
LocationHelper.DoAction(db =>
|
{
|
//db.Updateable<CntrItemRel>().UpdateColumns(it => new { In_T = DateTime.Now, In_report = feedback }).Where(it => mst.S_CNTRS.Split(',').Contains(it.S_CNTR_CODE)).ExecuteCommand();
|
db.Updateable(lcirs).ReSetValue(it => { it.In_T = DateTime.Now; it.In_report = feedback; }).ExecuteCommand();
|
return true;
|
});
|
|
}
|
}
|
LocationHelper.UnLockLoc(mst.S_END_LOC.Trim());
|
}
|
else if (mst.S_TYPE.Contains("库存盖坯出库") && UPFule)
|
{
|
var b = false;// 标识 是否需要上报。
|
var dl = new List<dynamic>();
|
LingItemOrder od = null;
|
int current = 0;
|
int cone = 0;
|
List<CntrItemRel> lcirs = new List<CntrItemRel>();
|
{
|
var wod = WCSHelper.GetWorkOrder(mst.S_SRC_NO);
|
var plc = Settings.GetDeviceInfoList().Find(x => x.deviceName == wod?.SQL_PLineNo);
|
|
if (plc != null)
|
LocationHelper.DoAction(db =>
|
{
|
od = db.Queryable<LingItemOrder>().Where(it => plc.FuLeLineNo.Contains(it.DeviceNo) && it.State == "执行").First();
|
return true;
|
});
|
}
|
if (od != null)
|
{// 有领料单 再处理上报问题。 无领料,不上报。 。
|
foreach (var item in mst.S_CNTRS.Split(','))
|
{
|
var cntrs = ContainerHelper.GetCntrItemRel(item)?.FirstOrDefault();
|
if (cntrs != null)
|
{
|
lcirs.Add(cntrs);
|
b = true;
|
dl.Add(new
|
{
|
sku = cntrs.S_ITEM_CODE,
|
traceId = cntrs.S_CNTR_CODE,
|
fmLocation = LocationHelper.GetLoc(mst.S_START_LOC)?.S_Fule_LOC,
|
qtyOrdered = cntrs.qty
|
});
|
current += cntrs.qty;
|
cone = cntrs.qty;
|
}
|
}
|
|
///写领料数据
|
od.OutCurrentNum = (od.current + current) + "";
|
od.AllocQTY = od.AllocQTY - current;
|
LocationHelper.DoAction(db =>
|
{
|
if (od.AreaNum - od.current < cone)
|
od.State = "完成";
|
return db.Updateable(od).UpdateColumns(it => new { it.OutCurrentNum, it.State, it.AllocQTY }).ExecuteCommand() > 0;
|
});
|
}
|
else
|
{
|
LogHelper.Info($" {mst.S_TASK_NO} 任务 所属工单{mst.S_SRC_NO} 没找到领料单");
|
}
|
if (b)
|
{
|
var req = JsonConvert.SerializeObject(new
|
{
|
from = Settings.fromSystem,
|
list = new List<dynamic>
|
{
|
new{
|
warehouseId = Settings.warehouseId,
|
customerId = Settings.customerId,
|
docNo = od.WorkFromNo,
|
details=dl
|
}
|
}
|
});
|
var feedback = apiHelper.WebPost($"{Settings.FuleServerUrl}/wms/v1/agv/shipmentConfirm", req);
|
LocationHelper.DoAction(db =>
|
{
|
db.Updateable(lcirs).ReSetValue(it => { it.Out_T = DateTime.Now; it.Out_report = feedback; it.Out_LingNo = od.WorkFromNo; }).ExecuteCommand();
|
return true;
|
});
|
}
|
}
|
else if (mst.S_TYPE.Trim() == "瓶盖空筐转运-J2")
|
{
|
CacheBitUpdate(mst, load: false, "空框");
|
|
LocationHelper.UnLockLoc(mst.S_END_LOC.Trim());
|
}
|
else if (mst.S_TYPE.Trim().Contains("空入转入库"))
|
{
|
LocationHelper.lOCReSetValue((Location x) => x.S_LOC_CODE == mst.S_END_LOC.Trim(), delegate (Location x)
|
{
|
x.S_LOCK_STATE = "无";
|
x.S_NOTE = "空框";
|
});
|
}
|
else if ((mst.S_TYPE.Contains("瓶盖非即产线边") || mst.S_TYPE.Contains("瓶盖即产转翻斗机线边")) && UPFule)
|
{
|
var jf = mst.S_TYPE.Contains("瓶盖即产转翻斗机线边");
|
var od = WCSHelper.GetWorkOrder(mst.S_SRC_NO);
|
if (od != null && od.FromFuLe == "Y")
|
{
|
var req = JsonConvert.SerializeObject(new
|
{
|
factoryCode = Settings.factoryCode,
|
workOrderCode = od.SQL_WorkNo,
|
materialCode = od.SQL_ItemCode,
|
amount = jf ? od.pcnumusing : od.pcnum,//Convert.ToInt32(string.IsNullOrEmpty(od.SQL_PCNumber) ? "0" : od.SQL_PCNumber),
|
qrCode = mst.S_CNTRS.Split(',').FirstOrDefault(),//LocationHelper.GetLoc(mst.S_END_LOC)?.S_Fule_LOC,
|
connectionLineStatus = jf ? "1" : "2",
|
});
|
|
od.SQL_Current = currentNum(od.SQL_Current, jf ? od.SQL_PCNumber_using : od.SQL_PCNumber) + "";
|
|
var feedback = apiHelper.WebPost($"{Settings.MesServerUrl}/mes/v1/middle/agv/productionReport", req);
|
LocationHelper.DoAction(db =>
|
{
|
db.Updateable<WorkOrder>(od).UpdateColumns(it => new { it.SQL_Current }).ExecuteCommand();
|
db.Updateable<CntrItemRel>().SetColumns(it => new CntrItemRel { Off_T = DateTime.Now, Off_report = feedback }).Where(it => it.S_CNTR_CODE == mst.S_CNTRS.Split(',').FirstOrDefault()).ExecuteCommand();
|
return true;
|
});
|
}
|
|
}
|
else if ((mst.S_TYPE.Contains("翻斗机即产满筐上线(瓶盖)") || mst.S_TYPE.Contains("翻斗机库存满筐上线(瓶盖)")) && UPFule)
|
{
|
var jf = mst.S_TYPE.Contains("翻斗机即产满筐上线(瓶盖)");
|
var od = WCSHelper.GetWorkOrder(mst.S_SRC_NO);
|
if (od != null && od.FromFuLe == "Y")
|
{
|
var req = JsonConvert.SerializeObject(new
|
{
|
factoryCode = Settings.factoryCode,
|
workOrderCode = od.SQL_WorkNo + od.Sign,
|
qrCode = mst.S_CNTRS.Split(',').FirstOrDefault(),
|
connectionLineStatus = jf ? "1" : "2",
|
});
|
|
var feedback = apiHelper.WebPost($"{Settings.MesServerUrl}/mes/v1/middle/agv/doFeedMaterial", req);
|
|
LocationHelper.DoAction(db =>
|
{
|
db.Updateable<CntrItemRel>().SetColumns(it => new CntrItemRel { DoF_T = DateTime.Now, DoF_report = feedback }).Where(it => it.S_CNTR_CODE == mst.S_CNTRS.Split(',').FirstOrDefault()).ExecuteCommand();
|
return true;
|
});
|
}
|
|
}
|
else if (mst.S_TYPE.Trim() == "空瓶坯-出库" || mst.S_TYPE.Trim().Contains("瓶盖-空上机") || mst.S_TYPE.Trim().Contains("翻斗机叫满"))
|
{
|
LogHelper.Info(" 触发信号前 :");
|
LocationHelper.SetT_FULL_TIME(mst.S_END_LOC.Trim(), DateTime.Now, delegate (Settings.deviceInfo plc, string cc)
|
{
|
LogHelper.Info(plc.deviceName + " 触发信号 :" + cc);
|
if (mst.S_TYPE.Trim().Contains("翻斗机叫满"))
|
{
|
if (DeviceProcess.FJD_wwwwFD.ContainsKey(plc.deviceName.Trim()))
|
{
|
DeviceProcess.FJD_wwwwFD[plc.deviceName.Trim()] = 0;
|
}
|
else
|
{
|
DeviceProcess.FJD_wwwwFD.Add(plc.deviceName.Trim(), 0);
|
}
|
//翻斗机
|
// //Task.Run(delegate
|
// //{
|
// //Thread.Sleep(20000);
|
// //PlcHelper.SendHex(plc.address, cc);
|
//DeviceProcess.FDJ_writeFD.Add(plc.deviceName);
|
// //LocationHelper.UnLockLoc(mst.S_END_LOC.Trim());
|
// //});
|
}
|
else
|
{
|
PlcHelper.SendHex(plc.address, cc);
|
LocationHelper.UnLockLoc(mst.S_END_LOC.Trim());
|
}
|
});
|
}
|
else if (mst.S_TYPE.Contains("备货") && !mst.S_CNTRS.StartsWith("TP"))//&& mst.S_CNTRS.StartsWith("F"))
|
{
|
LocationHelper.UnLockLoc(mst.S_END_LOC.Trim());
|
var db = new SqlHelper<object>().GetInstance();
|
var to = db.Queryable<TurnWorkOrder>().Where(x => x.S_ID == mst.S_SRC_NO).First();
|
//if (to != null && !string.IsNullOrEmpty(to.FROM_NO))
|
// goto jumpp;
|
//LocationHelper.GetLocList(x => x.S_AREA_CODE == item.start_area && x.N_ROW == srow).FirstOrDefault(),
|
//LocationHelper.GetLocList(x => x.S_AREA_CODE == item.end_area && x.N_ROW == erow).FirstOrDefault()
|
var req = JsonConvert.SerializeObject(new
|
{
|
repoNo = Settings.repoNo,
|
startAreaNo = LocationHelper.GetLoc(mst.S_START_LOC)?.S_Fule_LOC,
|
trayInfo = mst.S_CNTRS.Substring(1).Split('v').ToList(),
|
// trayInfo = mst.S_CNTRS.Split(',').ToList(),
|
endAreaNo = LocationHelper.GetLoc(mst.S_END_LOC)?.S_Fule_LOC
|
});
|
|
var feedback = new HttpHelper().WebPost($"{Settings.FuleServerUrl}/wms/v1/agv/yikuTaskStatus", req);
|
LogHelper.Info("yikuTaskStatus 移库任务完成回报" + req + ";rrr:" + JsonConvert.SerializeObject(feedback));
|
jumpp:
|
Console.WriteLine("备货 富勒托 ");
|
}
|
else
|
{
|
//Settings.inStockCacheBit startloc = (from x in Settings.GetInStockCacheList()
|
// where (x.locationType == 2 || x.locationType == 1) && x.location.Trim().ToUpper() == mst.S_START_LOC.Trim().ToUpper()
|
// select x).FirstOrDefault();
|
//if (startloc != null)
|
//{
|
// LogHelper.Info("x.S_LOC_CODE ==" + mst.S_END_LOC.Trim());
|
// LocationHelper.lOCReSetValue((Location x) => x.S_LOC_CODE == mst.S_END_LOC.Trim(), delegate (Location x)
|
// {
|
// x.S_NOTE = ((startloc == null) ? "" : startloc.deviceName);
|
// });
|
//}
|
//else
|
//{
|
// //LogHelper.Info("(非错误,仅展示)卸货时找起点瓶盖机类型,没找到 ==" + mst.S_START_LOC.Trim());
|
//}
|
if (mst.S_TYPE.Contains("成品满框-入库") && mst.S_TYPE.StartsWith("Fu"))
|
{
|
var crs = mst.S_CNTRS.Substring(1).Split('v').ToList();
|
//var crs = mst.S_CNTRS.Split(',').ToList();// mst.S_CNTRS.Substring(1).Split('v').ToList();
|
var plcinfo = (from x in Settings.GetDeviceInfoList() where x.location.Contains(mst.S_START_LOC.Trim()) select x).FirstOrDefault();
|
if (plcinfo != null)
|
{
|
//try
|
//{
|
WorkOrder order = null;
|
try
|
{
|
var orderNo = LocationHelper.GetFuLeTrayCodeList(X => X.trayCode == crs.First())?.FirstOrDefault();
|
LogHelper.Info("orderNo:富勒卸货找托盘" + (orderNo == null) + (mst.S_SRC_NO));
|
order = WCSHelper.GetWorkOrder(x => x.SQL_WorkNo == (orderNo.workNo ?? mst.S_SRC_NO)).FirstOrDefault(); ;
|
LogHelper.Info("order2:托盘找工单" + (order == null));
|
}
|
catch (Exception dx)
|
{
|
LogHelper.Info("富勒托盘找工单失败。改为找机器工单。 Exception:" + crs.First() + ";;" + dx.Message);
|
order = WCSHelper.GetWorkOrder(plcinfo.deviceName);
|
}
|
//WCSHelper.GetWorkOrder(plcinfo.deviceName);
|
LogHelper.Info("order " + (order == null));
|
if (order != null)
|
Settings.OrderCaches[plcinfo.deviceName] = order;
|
else
|
{
|
Settings.OrderCaches.TryGetValue(plcinfo.deviceName, out order);
|
}
|
LogHelper.Info("order2 " + (order == null));
|
//var cntrs = mst.S_CNTRS.Substring(1);
|
string flloc = LocationHelper.GetLoc(mst.S_END_LOC)?.S_Fule_LOC;
|
//LogHelper.Info("order3 ");
|
var req = JsonConvert.SerializeObject(new
|
{
|
trayInfo = crs,
|
workNo = order?.SQL_WorkNo,
|
repoNo = Settings.repoNo,
|
areaLoca = flloc
|
});
|
//LogHelper.Info("order4 ");
|
var feedback = new HttpHelper().WebPost($"{Settings.FuleServerUrl}/wms/v1/agv/proTaskStatus", req);
|
|
//}
|
//catch (Exception ex)
|
//{
|
// LogHelper.Error(ex.Message, ex);
|
//}
|
//LocationHelper.DoAction(db =>
|
//{
|
// db.Updateable<FuLeTrayCode>().SetColumns(it => new FuLeTrayCode { }).Where(it => it.S_CNTR_CODE == mst.S_CNTRS.Split(',').FirstOrDefault()).ExecuteCommand();
|
// return true;
|
//});
|
//if (feedback != "")
|
//{
|
// var result = JsonConvert.DeserializeObject<JsonTransitResult>(feedback);
|
//}
|
}
|
|
}
|
|
LocationHelper.UnLockLoc(mst.S_END_LOC.Trim());
|
}
|
vvv:
|
Thread.Sleep(1);
|
}
|
#region throw
|
|
//if (state == 4)
|
//{
|
// CacheBitUpdate(mst, true);
|
// LocationHelper.SetT_FULL_TIME(mst.S_START_LOC.Trim(), null);
|
// //CheckElevator(mst, true);
|
|
// //CheckRawMaterial(mst);
|
// //CheckStackBitLoad(mst.S_CNTRS, mst.S_START_LOC);
|
// //LineCacheLoad(mst.S_CNTRS, mst.S_END_LOC);
|
|
// //CheckBottleCapFullLoad(mst.S_START_LOC, mst.S_CNTRS);
|
// if (mst.S_TYPE.Trim() == "满瓶坯-入库" || mst.S_TYPE.Trim() == "空瓶坯-出库" || mst.S_TYPE.Trim().Contains("瓶盖-满下线"))
|
// {
|
// LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x =>
|
// {
|
// x.N_CURRENT_NUM = 0;
|
// });
|
// }
|
// //if (mst.S_TYPE.Trim() == "瓶盖-空上机")
|
// //{
|
// // LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x =>
|
// // {
|
// // x.N_CURRENT_NUM = x.N_CURRENT_NUM - 1;
|
// // });
|
// //}
|
// //else if (mst.S_TYPE.Trim() == "下线满入库")
|
// //{
|
// // LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x =>
|
// // {
|
// // x.N_CURRENT_NUM = x.N_CURRENT_NUM - mst.S_CNTRS.Split(',').Length;
|
// // });
|
// //}
|
// else
|
// {
|
// //LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x =>
|
// //{
|
// // x.N_CURRENT_NUM = x.N_CURRENT_NUM - mst.S_CNTRS.Split(',').Length;
|
// //});
|
// }
|
|
// LocationHelper.UnLockLoc(mst.S_START_LOC.Trim());
|
//}
|
//if (state == 6)//卸货完成
|
//{
|
// ///下线满入库
|
// ///入空上转下
|
// /// 空入转空出
|
// /// 空入转入库
|
// /// 仓空转下空
|
// ///无菌即满下转上
|
// ///水盖即满下转上
|
// ///即空上转下
|
// //----- 都使用这里绑定托盘就好了。
|
// CacheBitUpdate(mst, false);
|
// //CheckElevator(mst, false);
|
// //if (mst.S_TYPE.Trim() == "满瓶坯-入库" || mst.S_TYPE.Trim() == "空瓶坯-出库")
|
// LocationHelper.UnLockLoc(mst.S_END_LOC.Trim());
|
// if (mst.S_TYPE.Trim() == "满瓶坯-入库"
|
// || mst.S_TYPE.Trim() == "空瓶坯-出库"
|
// || mst.S_TYPE.Trim() == "瓶盖-空上机")
|
// {
|
// LogHelper.Info("该点位的托盘数量" + mst.S_END_LOC.Trim() + (LocationHelper.GetLocation(mst.S_END_LOC.Trim())?.N_CURRENT_NUM));
|
// //LocationHelper.SetT_FULL_TIME(mst.S_START_LOC.Trim(), DateTime.Now);
|
// LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_END_LOC.Trim(), x =>
|
// {
|
// x.N_CURRENT_NUM = 1;
|
// });
|
// }
|
// if (mst.S_TYPE.Trim() == "满瓶坯-入库")
|
// {
|
// LocationHelper.TakeEmptyToBottleBoyd(mst.S_START_LOC.Trim());
|
// }
|
// else if (mst.S_TYPE.Trim().Contains("瓶盖-满下线"))
|
// {
|
// LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_END_LOC.Trim(), x =>
|
// {
|
// //x.N_CURRENT_NUM++;
|
// x.S_NOTE = mst.S_TYPE.Trim().Substring(1, 4);
|
// });
|
// Task.Run(() =>
|
// {
|
// // 送空去吧。 。
|
// LocationHelper.TakeEmptyToBottleBoyd(mst.S_START_LOC.Trim());
|
// });
|
// }
|
// else if (mst.S_TYPE.Trim().Contains("即满下转上") || mst.S_TYPE.Trim().Contains("即空上转下"))
|
// {
|
// //绑定托盘方法已经处理数量和 增删托盘。
|
// //LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_END_LOC.Trim(), x =>
|
// //{
|
// // x.N_CURRENT_NUM = mst.S_CNTRS.Split(',').Length;
|
// //});
|
// }
|
// else if (mst.S_TYPE.Trim() == "空瓶坯-出库" || mst.S_TYPE.Trim() == "瓶盖-空上机")
|
// {
|
// LocationHelper.SetT_FULL_TIME(mst.S_END_LOC.Trim(), DateTime.Now, (plc, cc) =>
|
// {
|
// PlcHelper.SendHex(plc.address, cc);//"3F00100d0a"
|
// });
|
// }
|
// else
|
// {
|
// var startloc = Settings.GetInStockCacheList().Where(x => (x.locationType == 2 || x.locationType == 1) && x.location.Trim().ToUpper() == mst.S_START_LOC.Trim().ToUpper()).FirstOrDefault();
|
// if (startloc != null)
|
// {
|
// LogHelper.Info("x.S_LOC_CODE ==" + mst.S_END_LOC.Trim());
|
// LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_END_LOC.Trim(), x =>
|
// {
|
// //x.N_CURRENT_NUM += mst.S_CNTRS.Split(',').Length;
|
// x.S_NOTE = startloc == null ? "" : startloc.deviceName;
|
// });
|
// }
|
// else LogHelper.Info("(非错误,仅展示)卸货时找起点瓶盖机类型,没找到 ==" + mst.S_START_LOC.Trim());
|
// }
|
//}
|
#endregion
|
if (state == 7)
|
{
|
CacheBitCancelUpdate(mst, out r);
|
}
|
if (state == 8)
|
{
|
CacheBitCancelUpdate(mst, out r, true);
|
}
|
if (state == 9)
|
{
|
CacheBitUpdate(mst, load: true);
|
var g = LocationHelper.UnLockLoc(mst.S_END_LOC.Trim());
|
var T = LocationHelper.UnLockLoc(mst.S_START_LOC.Trim());
|
}
|
return r;
|
}
|
|
|
static int currentNum(string cn, string pn)
|
{
|
if (string.IsNullOrEmpty(cn))
|
cn = "0";
|
return Convert.ToInt32(cn) + Convert.ToInt32(pn);
|
}
|
|
private static object locLocker = new object();
|
|
|
/// <summary>
|
/// 推送任务
|
///
|
/// </summary>
|
/// <param name="mst"></param>
|
internal static bool SendTask(WMSTask mst)
|
{
|
bool result = false;
|
int start = 0;
|
int end = 0;
|
|
string DispInfo = "0";
|
string CtrlVal = "0";
|
string ChgTo = "0";
|
string Flow = "1";
|
string Tlow = "0";
|
|
int TSNo = 1;
|
|
string taskType = mst.S_TYPE.Trim();
|
string taskState = mst.S_B_STATE.Trim();
|
bool flag = taskState == "未执行" || taskState == "待推送";
|
if (flag)
|
{
|
string FRow = mst.N_START_LAYER.ToString();
|
string TRow = mst.N_END_LAYER.ToString();
|
//bool flag2 = start == 0;
|
|
if (taskType.Contains("成品满框-入库") || taskType.Contains("成品-空托上线"))
|
{
|
TSNo = 5;
|
start = LocationHelper.GetAgvSite(mst.S_START_LOC);
|
|
if (taskType.Contains("成品满框-入库"))
|
{
|
switch (mst.S_END_LAREA.Substring(mst.S_END_LAREA.Length - 2))
|
{
|
case "_J": ChgTo = "1"; break;
|
case "_D": ChgTo = "2"; break;
|
case "_X": ChgTo = "3"; break;
|
}
|
|
var spx = mst.S_END_LAREA.Substring(mst.S_END_LAREA.IndexOf("_"));
|
var fromEXT = LocationHelper.GetAgvSite(mst.S_START_LOC, spx);
|
if (fromEXT > 0)
|
{
|
start = fromEXT;
|
}
|
|
var fis = LocationHelper.GetFreeLineList(mst.S_END_LAREA);
|
var locinfo = LocationHelper.GetLoc(mst.S_END_LOC);
|
var f = fis.Find(x => x.row == locinfo.N_ROW && x.minCol <= locinfo.N_COL && locinfo.N_COL <= x.maxCol);
|
end = mst.N_END_LAYER < 2 ? f.bit1 : f.bit2;
|
Tlow = (locinfo.N_COL - f.minCol) + "";
|
//var cr = mst.S_CNTRS.Split(',')[0];
|
//var it = ContainerHelper.GetCntrItemRel(cr);
|
//var item = it?[0]?.S_ITEM_CODE;
|
|
var item = ContainerHelper.GetCntrItemRel(mst.S_CNTRS.Split(',')[0])?.FirstOrDefault();
|
if (item != null)
|
{
|
var item_ = ContainerHelper.GetItem(a => a.S_ITEM_NAME == item.S_ITEM_NAME && a.S_ITEM_CODE == item.S_ITEM_CODE);//item.S_ITEM_CODE);//x => x.S_ITEM_CODE == item.S_ITEM_CODE /*&& x.B_Type == spx && x.ItemLayer == item.ItemLayer*/);
|
//var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item.S_ITEM_CODE && x.B_Type == Settings.areaSuffixR(spx) && x.ItemLayer == item.ItemLayer);
|
//LogHelper.Info($"{mst.S_TASK_NO}发送前 查询物料数据条件x=>S_ITEM_CODE={item.S_ITEM_CODE}/*&&x.B_Type=={spx}&&x.ItemLayer=={item.ItemLayer}*/: item_==null?{item_ == null}");
|
//TRow = item_?.trayHeight + "";
|
//var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item.S_ITEM_CODE && x.B_Type == Settings.areaSuffixR(spx) && x.ItemLayer == item.ItemLayer);
|
LogHelper.Info($"{mst.S_TASK_NO}发送前 查询物料数据条件x=>S_ITEM_CODE={item.S_ITEM_CODE}&&x.B_Type=={Settings.areaSuffixR(spx)}&&x.ItemLayer=={item.ItemLayer}: item_ 是否未找到:{item_ == null}");
|
if (item_ != null)
|
TRow = item_.trayHeight + "";
|
else return false;
|
}
|
}
|
|
if (taskType.Contains("成品-空托上线"))
|
{
|
switch (taskType.Substring(7).Trim())
|
{
|
case "集化板": ChgTo = "1"; break;
|
case "大板": ChgTo = "2"; break;
|
case "小板": ChgTo = "3"; break;
|
}
|
end = LocationHelper.GetAgvSite(mst.S_END_LOC);
|
TRow = "0";
|
}
|
CtrlVal = mst.N_START_LAYER + "" + mst.N_END_LAYER;
|
|
DispInfo = "0";
|
}
|
|
else if (taskType.Contains("备货"))
|
{
|
TSNo = 5;
|
var ctr = LocationHelper.GetList<CntrItemRel>(x => x.S_CNTR_CODE == mst.S_CNTRS).FirstOrDefault()?.B_TYPE;
|
var spx = "";
|
if (ctr == null)
|
spx = mst.S_START_LAREA.Substring(mst.S_START_LAREA.IndexOf("_"));
|
else spx = ctr;
|
switch (mst.S_START_LAREA.Substring(mst.S_START_LAREA.Length - 2))
|
{
|
case "集化板":
|
case "_J": ChgTo = "1"; if (string.IsNullOrEmpty(spx)) spx = "_J"; break;
|
case "大板":
|
case "_D": ChgTo = "2"; if (string.IsNullOrEmpty(spx)) spx = "_D"; break;
|
case "小板":
|
case "_X": ChgTo = "3"; if (string.IsNullOrEmpty(spx)) spx = "_X"; break;
|
}
|
|
var locinfo = LocationHelper.GetLoc(mst.S_START_LOC);
|
if (locinfo.S_AREA_CODE.StartsWith("BHQ-"))
|
{
|
start = LocationHelper.GetAgvSite(mst.S_START_LOC);
|
}
|
else
|
{
|
var fis = LocationHelper.GetFreeLineList(mst.S_START_LAREA);
|
var f = fis.Find(x => x.row == locinfo.N_ROW && x.minCol <= locinfo.N_COL && locinfo.N_COL <= x.maxCol);
|
start = mst.N_START_LAYER < 2 ? f.bit1 : f.bit2;
|
Flow = (locinfo.N_COL - f.minCol) + "";
|
}
|
locinfo = LocationHelper.GetLoc(mst.S_END_LOC);
|
|
if ("YKBH" == locinfo.S_AREA_CODE || locinfo.S_AREA_CODE.StartsWith("BHQ-"))
|
{
|
end = LocationHelper.GetAgvSite(mst.S_END_LOC);
|
if (int.Parse(TRow) > 1)
|
{
|
var e2 = LocationHelper.GetAgvSite(mst.S_END_LOC, TRow);
|
if (e2 > 0)
|
end = e2;
|
}
|
}
|
else
|
{
|
var fis = LocationHelper.GetFreeLineList(mst.S_END_LAREA);
|
var f = fis.Find(x => x.row == locinfo.N_ROW && x.minCol <= locinfo.N_COL && locinfo.N_COL <= x.maxCol);
|
end = mst.N_END_LAYER < 2 ? f.bit1 : f.bit2;
|
Tlow = (locinfo.N_COL - f.minCol) + "";
|
}
|
|
CtrlVal = mst.N_START_LAYER + "" + mst.N_END_LAYER;
|
|
var item = ContainerHelper.GetCntrItemRel(mst.S_CNTRS.Split(',')[0])?.FirstOrDefault();
|
if (item != null)
|
{
|
var item_ = ContainerHelper.GetItem(a => a.S_ITEM_NAME == item.S_ITEM_NAME && a.S_ITEM_CODE == item.S_ITEM_CODE);//ContainerHelper.GetItem(item.S_ITEM_CODE);// x => x.S_ITEM_CODE == item.S_ITEM_CODE /*&& x.B_Type == spx*/ /*&& x.ItemLayer == item.ItemLayer*/);
|
//var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item.S_ITEM_CODE /*&& x.B_Type == spx*/ && x.ItemLayer == item.ItemLayer);
|
//var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item.S_ITEM_CODE && x.B_Type == Settings.areaSuffixR(spx) && x.ItemLayer == item.ItemLayer);
|
LogHelper.Info($"{mst.S_TASK_NO}发送前 查询物料数据条件x=>S_ITEM_CODE={item.S_ITEM_CODE}&&x.B_Type=={Settings.areaSuffixR(spx)}&&x.ItemLayer=={item.ItemLayer}: item_ 是否未找到:{item_ == null}");
|
if (item_ != null)
|
TRow = item_.trayHeight + "";
|
else return false;
|
}
|
DispInfo = "1";
|
}
|
else if (Settings.GetDeviceInfoList().Find(x => x.location.Contains(mst.S_END_LOC))?.deviceType == 13 && mst.S_TYPE.Contains("原物料搬运")
|
//|| ((mst.S_START_LAREA == "WJBQDDKQ" || mst.S_START_LAREA == "SXBQDDKQ") && mst.N_START_LAYER == 2)
|
//|| ((mst.S_END_LAREA == "WJBQDDKQ" || mst.S_END_LAREA == "SXBQDDKQ") && mst.N_END_LAYER == 2)
|
)
|
{
|
// 上 提升机任务。
|
|
if (start == 0)
|
{
|
//bool flag3 = ;
|
if (int.Parse(FRow) > 1)
|
{
|
start = LocationHelper.GetAgvSite(mst.S_START_LOC, "load" + FRow);
|
if (start == 0)
|
start = LocationHelper.GetAgvSite(mst.S_START_LOC, FRow);
|
LogHelper.Info(string.Concat(new string[]
|
{
|
mst.S_TASK_NO,
|
mst.S_START_LOC,
|
"start DD ",
|
start.ToString(),
|
"-",
|
TRow
|
}), "");
|
}
|
else
|
{
|
start = LocationHelper.GetAgvSite(mst.S_START_LOC, "load");
|
if (start == 0)
|
start = LocationHelper.GetAgvSite(mst.S_START_LOC);
|
LogHelper.Info(string.Concat(new string[]
|
{
|
mst.S_TASK_NO,
|
mst.S_START_LOC,
|
"start agv点",
|
start.ToString(),
|
"-",
|
TRow
|
}), "");
|
}
|
}
|
if (end == 0)
|
{
|
end = LocationHelper.GetAgvSite(mst.S_END_LOC);
|
LogHelper.Info($"{mst.S_TASK_NO} {mst.S_END_LOC} end a1 {end.ToString()}- {TRow}");
|
if (int.Parse(TRow) > 1)
|
{
|
end = LocationHelper.GetAgvSite(mst.S_END_LOC, TRow);
|
LogHelper.Info($"{mst.S_TASK_NO} {mst.S_END_LOC} end a2 {end.ToString()}- {TRow}");
|
}
|
}
|
TSNo = 5;
|
TRow = "1";
|
FRow = "1";
|
CtrlVal = mst.N_START_LAYER + "" + mst.N_END_LAYER;
|
DispInfo = mst.N_START_LAYER - 1 + "";
|
|
var item = ContainerHelper.GetCntrItemRel(mst.S_CNTRS.Split(',')[0])?.FirstOrDefault();
|
if (item != null)
|
{
|
var item_ = ContainerHelper.GetItem(a => a.S_ITEM_NAME == item.S_ITEM_NAME && a.S_ITEM_CODE == item.S_ITEM_CODE);//ContainerHelper.GetItem(item.S_ITEM_CODE);// x => x.S_ITEM_CODE == item.S_ITEM_CODE /*&& x.B_Type == spx*/ /*&& x.ItemLayer == item.ItemLayer*/);
|
//var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item.S_ITEM_CODE /*&& x.B_Type == spx*/ && x.ItemLayer == item.ItemLayer);
|
//var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item.S_ITEM_CODE && x.B_Type == Settings.areaSuffixR(spx) && x.ItemLayer == item.ItemLayer);
|
LogHelper.Info($"{mst.S_TASK_NO}发送前 查询物料数据条件x=>S_ITEM_CODE={item.S_ITEM_CODE}&&x.S_ITEM_NAME=={item.S_ITEM_NAME}: item_ 是否未找到:{item_ == null}");
|
if (item_ != null)
|
TRow = item_.trayHeight + "";
|
else return false;
|
}
|
}
|
//else if (taskType.Contains("收缩膜叉运-入库") || taskType.Contains("收缩膜叉运-入库") || taskType.Contains("收缩膜叉运-货架出提升机"))
|
//{
|
// var ts = 5;
|
// start = LocationHelper.GetAgvSite(mst.S_START_LOC);//起点站点
|
// end = LocationHelper.GetAgvSite(mst.S_END_LOC);//终点站点
|
// var dic = new Dictionary<string, string>();
|
// dic.Add("From", start.ToString());
|
// dic.Add("To", end.ToString());
|
// dic.Add("FUNC", "0");
|
// dic.Add("DATA", "0");
|
// int height = 0;
|
// var itemcode = "";
|
// var ItemLayer = 0;
|
// var db = new SqlHelper<object>().GetInstance();
|
// var cirs = ContainerHelper.GetCntrItemRel(mst.S_CNTRS.Split(',').ToList().FirstOrDefault()).First();
|
// LogHelper.Info($"原物料 收缩膜叉运 容器物料表数据{JsonConvert.SerializeObject(cirs)}", "HosttoagvTask");
|
// if (cirs != null)
|
// {
|
// var ItemF = db.Queryable<ItemInfo>().Where(a => a.S_ITEM_CODE == cirs.S_ITEM_CODE).First();
|
// itemcode = ItemF.S_ITEM_CODE;
|
// ItemLayer = ItemF.ItemLayer;
|
// if (mst.N_START_LAYER < 3 || mst.N_END_LAYER < 3)
|
// {
|
// height = ItemF.trayHeight;
|
// }
|
// else
|
// {
|
// height = ItemF.trayHeight1;
|
// }
|
// }
|
// dic.Add("ItemHeight", height.ToString());
|
// dic.Add("StaItemHeight", "0");
|
// dic.Add("TrayType", $"{mst.N_START_LAYER}{mst.N_END_LAYER}");
|
// var ggh = NDC.AddTaskNew(ts, mst.N_PRIORITY, mst.S_TASK_NO, dic);
|
// if (ggh)
|
// {
|
// TaskHelper.UpdateStatus(mst, "已推送");
|
// result = true;
|
// GeneralInterFaceFunc(mst, 8 + "");
|
// }
|
//}
|
|
//else if ( mst.S_END_LAREA == "WJBQDDKQ" || mst.S_END_LAREA == "SXBQDDKQ"|| mst.S_START_LAREA == "WJBQDDKQ" ||mst.S_START_LAREA == "SXBQDDKQ" )
|
//{
|
// if (start == 0)
|
// {
|
// //bool flag3 = ;
|
// if (int.Parse(FRow) > 1)
|
// {
|
// start = LocationHelper.GetAgvSite(mst.S_START_LOC, "load" + FRow);
|
// if (start == 0)
|
// start = LocationHelper.GetAgvSite(mst.S_START_LOC, FRow);
|
// LogHelper.Info(string.Concat(new string[]
|
// {
|
// mst.S_TASK_NO,
|
// mst.S_START_LOC,
|
// "start DD ",
|
// start.ToString(),
|
// "-",
|
// TRow
|
// }), "");
|
// }
|
// else
|
// {
|
// start = LocationHelper.GetAgvSite(mst.S_START_LOC, "load");
|
// if (start == 0)
|
// start = LocationHelper.GetAgvSite(mst.S_START_LOC);
|
// LogHelper.Info(string.Concat(new string[]
|
// {
|
// mst.S_TASK_NO,
|
// mst.S_START_LOC,
|
// "start agv点",
|
// start.ToString(),
|
// "-",
|
// TRow
|
// }), "");
|
// }
|
// }
|
// if (end == 0)
|
// {
|
// end = LocationHelper.GetAgvSite(mst.S_END_LOC);
|
// LogHelper.Info($"{mst.S_TASK_NO} {mst.S_END_LOC} end a1 {end.ToString()}- {TRow}");
|
// if (int.Parse(TRow) > 1)
|
// {
|
// end = LocationHelper.GetAgvSite(mst.S_END_LOC, TRow);
|
// LogHelper.Info($"{mst.S_TASK_NO} {mst.S_END_LOC} end a2 {end.ToString()}- {TRow}");
|
// }
|
// }
|
|
// TSNo = 5;
|
// TRow = "1";
|
// FRow = "1";
|
// CtrlVal = mst.N_START_LAYER + "" + mst.N_END_LAYER;
|
// DispInfo = mst.N_START_LAYER - 1 + "";
|
|
// var item = ContainerHelper.GetCntrItemRel(mst.S_CNTRS.Split(',')[0])?.FirstOrDefault();
|
// if (item != null)
|
// {
|
// var item_ = ContainerHelper.GetItem(a => a.S_ITEM_NAME == item.S_ITEM_NAME && a.S_ITEM_CODE == item.S_ITEM_CODE);//ContainerHelper.GetItem(item.S_ITEM_CODE);// x => x.S_ITEM_CODE == item.S_ITEM_CODE /*&& x.B_Type == spx*/ /*&& x.ItemLayer == item.ItemLayer*/);
|
// //var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item.S_ITEM_CODE /*&& x.B_Type == spx*/ && x.ItemLayer == item.ItemLayer);
|
// //var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item.S_ITEM_CODE && x.B_Type == Settings.areaSuffixR(spx) && x.ItemLayer == item.ItemLayer);
|
// LogHelper.Info($"{mst.S_TASK_NO}发送前 查询物料数据条件x=>S_ITEM_CODE={item.S_ITEM_CODE}&&x.S_ITEM_NAME=={item.S_ITEM_NAME}: item_ 是否未找到:{item_ == null}");
|
// if (item_ != null)
|
// TRow = item_.trayHeight + "";
|
// else return false;
|
// }
|
//}
|
else
|
{
|
|
if (start == 0)
|
{
|
//bool flag3 = ;
|
if (int.Parse(FRow) > 1)
|
{
|
start = LocationHelper.GetAgvSite(mst.S_START_LOC, "load" + FRow);
|
if (start == 0)
|
start = LocationHelper.GetAgvSite(mst.S_START_LOC, FRow);
|
LogHelper.Info(string.Concat(new string[]
|
{
|
mst.S_TASK_NO,
|
mst.S_START_LOC,
|
"start DD ",
|
start.ToString(),
|
"-",
|
TRow
|
}), "");
|
}
|
else
|
{
|
start = LocationHelper.GetAgvSite(mst.S_START_LOC, "load");
|
if (start == 0)
|
start = LocationHelper.GetAgvSite(mst.S_START_LOC);
|
LogHelper.Info(string.Concat(new string[]
|
{
|
mst.S_TASK_NO,
|
mst.S_START_LOC,
|
"start agv点",
|
start.ToString(),
|
"-",
|
TRow
|
}), "");
|
}
|
}
|
if (end == 0)
|
{
|
end = LocationHelper.GetAgvSite(mst.S_END_LOC);
|
LogHelper.Info($"{mst.S_TASK_NO} {mst.S_END_LOC} end a1 {end.ToString()}- {TRow}");
|
if (int.Parse(TRow) > 1)
|
{
|
end = LocationHelper.GetAgvSite(mst.S_END_LOC, TRow);
|
LogHelper.Info($"{mst.S_TASK_NO} {mst.S_END_LOC} end a2 {end.ToString()}- {TRow}");
|
}
|
}
|
|
FRow = "1";
|
TRow = "0";
|
bool flag6 = taskType.Contains("即满下转上") || taskType.Contains("即空上转下") || taskType.Contains("即空上入库") || taskType.Contains("下线满入库");
|
if (flag6)
|
{
|
start = LocationHelper.GetAgvSite(mst.S_START_LOC, "load");
|
}
|
bool flag7 = taskType.Contains("即满下转上") || taskType.Contains("即空上转下") || taskType.Contains("即空仓转下") || taskType.Contains("上线满出库");
|
if (flag7)
|
{
|
end = LocationHelper.GetAgvSite(mst.S_END_LOC, "load");
|
}
|
|
if (taskType.Contains("入空上转下"))
|
{
|
start = LocationHelper.GetAgvSite(mst.S_START_LOC, "load");
|
var _llll = Settings.GetInStockCacheList().Find(x => x.location.Trim() == mst.S_END_LOC.Trim());
|
if (_llll != null && _llll.locationType == 34)
|
end = LocationHelper.GetAgvSite(mst.S_END_LOC, "load");
|
}
|
else if (taskType.Contains("仓空转下空"))
|
{
|
end = LocationHelper.GetAgvSite(mst.S_END_LOC, "load");
|
}
|
|
//if (taskType.Trim() != "即满瓶盖-空上机" && (taskType.Contains("即") || taskType.Trim().StartsWith("J")))
|
//{
|
// FRow = "2";
|
//}
|
//else
|
//{
|
// FRow = "1";
|
//}
|
|
}
|
|
if (mst.S_TYPE.Contains("-J2"))
|
{
|
start = LocationHelper.GetAgvSite(mst.S_START_LOC.Trim(), "load");
|
}
|
if (mst.S_TYPE.Contains("-2J"))
|
{
|
end = LocationHelper.GetAgvSite(mst.S_END_LOC, "load");
|
}
|
{
|
var list_ = Settings.GetMoreBits();
|
if (list_.Find(x => x.Location == mst.S_START_LOC.Trim()) != null)
|
{
|
start = list_.Find(x => x.Location == mst.S_START_LOC.Trim()).StartBit;
|
}
|
else if (mst.S_TYPE.Contains("退库") && list_.Find(x => x.Location == mst.S_START_LOC.Trim() + "&BACK") != null)
|
{
|
start = list_.Find(x => x.Location == mst.S_START_LOC.Trim() + "&BACK").StartBit;
|
}
|
|
if (list_.Find(x => x.Location == mst.S_END_LOC.Trim()) != null)
|
{
|
end = list_.Find(x => x.Location == mst.S_END_LOC.Trim()).EndBit;
|
}
|
else if (mst.S_TYPE.Contains("退库") && list_.Find(x => x.Location == mst.S_END_LOC.Trim() + "&BACK") != null)
|
{
|
end = list_.Find(x => x.Location == mst.S_END_LOC.Trim() + "&BACK").EndBit;
|
}
|
}
|
|
//if (Settings.GetDeviceInfoList().Find(x => x.location.Contains(mst.S_END_LOC))?.deviceType == 13 && mst.S_TYPE.Contains("收缩膜叉运"))
|
//{
|
// end = 7027;
|
//}
|
|
LogHelper.Info("SendTask " + mst.S_TASK_NO);
|
Console.WriteLine("start=" + start.ToString());
|
Console.WriteLine("end= " + end.ToString());
|
NDC.AGVResult res = NDC.AddNewOrder(TSNo, new Dictionary<string, string>
|
{
|
{
|
"Pri",
|
mst.N_PRIORITY.ToString()
|
},
|
{
|
"From",
|
start.ToString()
|
},
|
{
|
"To",
|
end.ToString()
|
},
|
{
|
"FRow",
|
FRow
|
},
|
{
|
"TRow",
|
TRow
|
},
|
{
|
"DispInfo",
|
DispInfo
|
},
|
{
|
"CtrlVal",
|
CtrlVal
|
},
|
{
|
"ChgTo",
|
ChgTo
|
},
|
{
|
"Flow",
|
Flow
|
},
|
{
|
"Tlow",
|
Tlow
|
},
|
{
|
"No",
|
mst.S_TASK_NO.Trim()
|
}
|
});
|
bool flag8 = res != null && (res.Res.ErrCode == 0 || res.Res.ErrCode == 50009);
|
if (flag8)
|
{
|
TaskHelper.UpdateStatus(mst, "已推送");
|
result = true;
|
GeneralInterFaceFunc(mst, 8 + "");
|
}
|
}
|
else
|
{
|
result = true;
|
}
|
return result;
|
}
|
|
/// <summary>
|
/// 创建搬运任务
|
/// </summary>
|
/// <param name="start"></param>
|
/// <param name="end"></param>
|
/// <param name="taskType"></param>
|
/// <param name="cntrs"></param>
|
/// <param name="startLayer"></param>
|
/// <param name="endLayer"></param>
|
/// <param name="trayCarryCount"></param>
|
/// <param name="priority"></param>
|
/// <returns></returns>
|
public static bool CreateTransport(string wWorkNo, string start, string end, string taskType, List<string> cntrs, int startLayer, int endLayer, int trayCarryCount = 1, int priority = 1, string note = "", string TwoEndLoc = "")
|
{
|
if (string.IsNullOrEmpty(start) || string.IsNullOrEmpty(end))
|
return false;
|
|
var result = false;
|
//批次号存托盘号,1~3个托盘
|
var trayCodes = string.Join(",", cntrs);
|
var taskNo = DateTime.Now.Ticks.ToString();
|
|
LogHelper.Info($"CreateTransport- " + $"{taskNo}-{start}-{end}-{taskType}");
|
|
var res = TaskHelper.CreateTask(wWorkNo, start.Trim(), end.Trim(), taskType, priority, trayCodes, trayCarryCount, startLayer, endLayer, note, lockLoc: true, TwoEndLoc);
|
if (res)
|
{
|
result = true;
|
//任务创建成功,起点货位出库锁定,终点货位入库锁定
|
//LocationHelper.LockLoc(start, "出库锁");
|
//LocationHelper.LockLoc(end, "入库锁");
|
}
|
return result;
|
}
|
/// <summary>
|
/// 返回任务号。创建的是管控任务。
|
/// </summary>
|
/// <param name="wWorkNo"></param>
|
/// <param name="start"></param>
|
/// <param name="end"></param>
|
/// <param name="taskType"></param>
|
/// <param name="cntrs"></param>
|
/// <param name="startLayer"></param>
|
/// <param name="endLayer"></param>
|
/// <param name="trayCarryCount"></param>
|
/// <param name="priority"></param>
|
/// <returns></returns>
|
public static string CreateTransport2(string wWorkNo, string start, string end, string taskType, List<string> cntrs, int startLayer, int endLayer, int trayCarryCount = 1, int priority = 1)
|
{
|
var result = "";
|
//批次号存托盘号,1~3个托盘
|
var trayCodes = string.Join(",", cntrs);
|
//var taskNo = DateTime.Now.Ticks.ToString();
|
|
var taskNo = TaskHelper.GenerateTaskNo();
|
LogHelper.Info($"CreateTransport- " + $"{taskNo}-{start}-{end}-{taskType}");
|
|
//var res = TaskHelper.CreateTask(wWorkNo, start.Trim(), end.Trim(), taskType, priority, trayCodes, trayCarryCount, startLayer, endLayer);
|
var fromLoc = LocationHelper.GetLocation(start.Trim());
|
var endLoc = LocationHelper.GetLocation(end.Trim());
|
|
WMSTask wmsTask = new WMSTask()
|
{
|
S_TASK_NO = taskNo,
|
S_START_LAREA = fromLoc.S_AREA_CODE,
|
S_END_LAREA = endLoc.S_AREA_CODE,
|
S_DEPART_NAME = TaskHelper.GetDeptName(taskType),
|
S_START_LOC = start.Trim(),
|
S_END_LOC = end.Trim(),
|
S_TYPE = taskType,
|
S_SRC_NO = wWorkNo,
|
N_PRIORITY = 60,
|
S_WORK_MODE = "agv",
|
S_B_STATE = "待审核",//"未执行",
|
S_CNTRS = trayCodes,
|
N_START_LAYER = startLayer,
|
N_END_LAYER = endLayer,
|
N_CNTR_COUNT = trayCarryCount
|
};
|
|
LogHelper.Info($"CreateTransport- CreateTask" + $"{JsonConvert.SerializeObject(wmsTask)}");
|
var res = TaskHelper.CreateTask(wmsTask);
|
|
if (res)
|
{
|
result = taskNo;
|
//任务创建成功,起点货位出库锁定,终点货位入库锁定
|
LocationHelper.LockLoc(start, "出库锁");
|
LocationHelper.LockLoc(end, "入库锁");
|
}
|
return result;
|
}
|
#endregion
|
|
|
|
|
#region 翻斗机转运流程
|
//--------------------------------------------------翻斗机转运流程--------------------------------------------------
|
|
|
|
/// <summary>
|
/// 任务信息接口--汉和任务每个状态进行实时上传(包括任务创建时,上报 8)
|
/// </summary>
|
/// <param name="wmsTask"></param>
|
internal static void GeneralInterFaceFunc(WMSTask wmsTask, string taskStatus)
|
{
|
var _loc = LocationHelper.GetLoc(wmsTask.S_START_LOC);
|
if (_loc == null)
|
{
|
return;
|
}
|
|
string msg = "";
|
var req = new SimpleResult();
|
var db = new SqlHelper<object>().GetInstance();
|
if (TaskHelper.CheckActionRecordExist(wmsTask.S_TASK_NO, "4") && taskStatus == "7") taskStatus = "2";
|
try
|
{
|
//获取上报接口的URL
|
var url = $"{Settings.TaskReportUrl}/proxy/v1/generalInterface";
|
LogHelper.Info($"任务上报:任务号:{wmsTask.S_TASK_NO},任务状态:{taskStatus},获取URL:{url}");
|
//任务类型数据处理
|
string taskType = wmsTask.S_TYPE.Replace("-J2", "").Replace("-2J", "");
|
|
LogHelper.Info($"任务上报:任务号:{wmsTask.S_TASK_NO},任务类型:{taskType}");
|
var taskTypeInfo = db.Queryable<TaskTypeConvTable>().Where(a => a.taskTypeName == taskType).First();
|
if (taskTypeInfo != null) taskType = taskTypeInfo.taskType;
|
else
|
{
|
LogHelper.Info($"●●●●●:任务号:{wmsTask.S_TASK_NO},任务类型对接没配置, 终止上报。");
|
return;
|
}
|
LogHelper.Info($"任务上报:任务号:{wmsTask.S_TASK_NO},任务状态:{taskStatus},任务类型数据处理:{taskType}");
|
|
//托盘物料数据处理mst.S_CNTRS.Substring(1).
|
List<string> cntrList = new List<string>(wmsTask.S_CNTRS.Substring(1).Split('v'));//获取托盘数据
|
|
//string itemCode = "";//物料编码
|
GeneralInterFaceGetItemCodeFunc(wmsTask, db, cntrList, out string itemCode);
|
LogHelper.Info($"任务上报:任务号:{wmsTask.S_TASK_NO},任务状态:{taskStatus},物料编码:{itemCode}");
|
List<asnReferenceDModel> asnReferenceList = new List<asnReferenceDModel> { };//托码数组
|
GeneralInterFaceGetTrayCodeFunc(wmsTask, db, asnReferenceList, cntrList); //
|
LogHelper.Info($"任务上报:任务号:{wmsTask.S_TASK_NO},任务状态:{taskStatus},获取托盘数据:{JsonConvert.SerializeObject(asnReferenceList)}");
|
|
//AGV设备信息处理
|
string equipmentCode = "";
|
string orgCode = "";
|
string orgName = "";
|
string proxyInterfaceCode = "0050";
|
GeneralInterFaceGetAgvDeviceInfoFunc(wmsTask, db, ref equipmentCode, ref orgCode, ref orgName, ref proxyInterfaceCode);
|
|
//if (string.IsNullOrEmpty(equipmentCode))
|
//{
|
// LogHelper.Info($"{Settings.FactoryCode}+{wmsTask.S_EQ_NO} 未找到车子, 可能是一厂任务,取消上报。");
|
// return;
|
//}
|
|
LogHelper.Info($"任务上报:任务号:{wmsTask.S_TASK_NO},任务状态:{taskStatus},equipmentCode:{equipmentCode},orgCode:{orgCode},orgName:{orgName},proxyInterfaceCode:{proxyInterfaceCode}");
|
|
DateTime dateTime = taskStatus == "1" ? Convert.ToDateTime(wmsTask.T_START_TIME).AddHours(-8) : taskStatus == "2" || taskStatus == "7" ? Convert.ToDateTime(wmsTask.T_END_TIME).AddHours(-8) : taskStatus == "8" ? Convert.ToDateTime(wmsTask.T_CREATE).AddHours(-8) : DateTime.UtcNow;
|
string createTime = GetTimeStamp(wmsTask.T_CREATE.AddHours(-8), 1, 2);
|
string startTime = "";
|
//在C#中,使用DateTimeOffset.UtcNow.ToUnixTimeSeconds()方法获取Unix时间戳时,可能会多出一个毫秒。这是因为Unix时间戳是以秒为单位的,而DateTimeOffset.UtcNow返回的是UTC时间,其精度为100纳秒。
|
if (wmsTask.S_WORK_MODE != "agv" && !string.IsNullOrEmpty(wmsTask.S_WORK_MODE)) startTime = wmsTask.S_WORK_MODE;
|
else
|
{
|
startTime = wmsTask.T_START_TIME == null ? null : GetTimeStamp(Convert.ToDateTime(wmsTask.T_START_TIME).AddHours(-8), 1, 2);
|
if (startTime != null)
|
{
|
wmsTask.S_WORK_MODE = startTime;
|
db.Updateable(wmsTask).UpdateColumns(a => new { a.S_WORK_MODE }).ExecuteCommand();
|
}
|
//else startTime = GetTimeStamp(DateTime.Now.AddHours(-8), 1, 2);
|
}
|
|
string endTime = wmsTask.T_END_TIME == null ? null : GetTimeStamp(Convert.ToDateTime(wmsTask.T_END_TIME).AddHours(-8), 1, 2);
|
//if (endTime == null)
|
// endTime = GetTimeStamp(DateTime.Now.AddHours(-8), 1, 2);
|
|
string businessTime = taskStatus == "1" ? startTime : taskStatus == "2" || taskStatus == "7" ? endTime : taskStatus == "8" ? createTime : GetTimeStamp(dateTime, 1, 2);
|
LogHelper.Info($"任务上报:任务号:{wmsTask.S_TASK_NO},任务状态:{taskStatus},任务开始时间:{wmsTask.T_START_TIME},转换后时间:{startTime}");
|
|
string sendMsg = JsonConvert.SerializeObject(new
|
{
|
taskCode = wmsTask.S_TASK_NO,//任务编码
|
taskStatus = taskStatus,//任务状态-任务创建成功传输 8
|
taskType = taskType,//任务类型-需要根据 配置表数据进行转换,转换为MES的任务类型
|
createTime = createTime,//需转换为 时间戳 wmsTask.T_CREATE
|
startTime = startTime,//需转换为 时间戳 wmsTask.T_START_TIME
|
endTime = endTime,//需转换为 时间戳 wmsTask.T_END_TIME
|
businessTime = businessTime,//当前任务时间-需转换为 时间戳 DateTime.Now
|
startAddress = wmsTask.S_START_LOC,//起点
|
endAddress = wmsTask.S_END_LOC,//终点 BindingLoc
|
equipmentNo = wmsTask.S_EQ_NO,//车辆编号
|
equipmentCode = equipmentCode,//车辆铭牌-需要根据 配置表数据,通过 车辆编号以及工厂编码 查询对应车辆铭牌
|
orgCode = Settings.FactoryCode,//工厂编码
|
orgName = Settings.FactoryName,//工厂名称
|
sku = string.IsNullOrEmpty(itemCode) ? null : itemCode,//物料编码
|
asnReferenceDList = asnReferenceList,//托码数组 此次叉车叉的托盘喷码, 一次叉辆车,有两个编码 产线下线且非无码模式时传输
|
appliactionId = "MOBOX"
|
//proxyInterfaceCode = proxyInterfaceCode //接口唯一标识码 固定值:0050
|
});
|
//http://yst-open-zuul-qa.idc.yst.com.cn/proxy/v1/
|
var feedback = new HttpHelper().WebPost(url, sendMsg); ;//YKRWSD AreaRowLockState
|
LogHelper.Info("任务状态上报" + req + ";rrr:" + JsonConvert.SerializeObject(feedback));
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error(ex.Message, ex);
|
msg = $"任务上报 Error:TaskInfo:{JsonConvert.SerializeObject(wmsTask)},TaskState:{taskStatus},ErrorMsg:{ex.Message}";
|
}
|
|
LogHelper.Info(msg);
|
}
|
/// <summary>
|
/// FuLeWebPost
|
/// </summary>
|
/// <param name="param">发送内容</param>
|
/// <param name="postName">接口名称</param>
|
/// <param name="Par1">扩展参数</param>
|
/// <returns></returns>
|
|
public static string GetTimeStamp(DateTime dateTime, int DataBitType, int TimeType)
|
{
|
string timeStamp = "";
|
|
//时间戳打印
|
TimeSpan ts = dateTime - new DateTime(1970, 1, 1, 0, 0, 0, 0);//时间戳获取
|
double tsTime = TimeType == 1 ? ts.TotalSeconds : ts.TotalMilliseconds;//秒级|毫秒级时间获取
|
|
string TimeTypeInfo = TimeType == 1 ? "秒级" : "毫秒级";
|
timeStamp = DataBitType == 32 ? Convert.ToInt32(tsTime).ToString() : Convert.ToInt64(tsTime).ToString();
|
|
//double result = 0;
|
//result = DataBitType == 32 ? Convert.ToInt32(tsTime) : Convert.ToInt64(tsTime);
|
|
return timeStamp;
|
}
|
/// <summary>
|
/// 任务信息接口--获取物料编码
|
/// </summary>
|
/// <param name="wmsTask"></param>
|
private static string GeneralInterFaceGetItemCodeFunc(WMSTask wmsTask, SqlSugarClient db, List<string> cntrList, out string itemCode)
|
{
|
itemCode = "";
|
if (cntrList.Count > 0)
|
{
|
string SrcNo = wmsTask.S_SRC_NO?.Trim();
|
if (!string.IsNullOrEmpty(SrcNo))
|
{
|
var workInfo = db.Queryable<WorkOrder>().Where(a => a.SQL_WorkNo == SrcNo).First();
|
if (workInfo != null && workInfo?.FromFuLe?.Trim() == "Y") itemCode = workInfo.SQL_ItemCode;
|
}
|
}
|
if (!string.IsNullOrEmpty(itemCode))
|
{
|
itemCode = ContainerHelper.GetItem(itemCode)?.S_ITEM_CODE ?? null;
|
}
|
|
return itemCode;
|
}
|
|
public class asnReferenceDModel
|
{
|
public string asnReferenceD { get; set; }
|
}
|
/// <summary>
|
/// 任务信息接口--获取托盘数据
|
/// </summary>
|
/// <param name="wmsTask"></param>
|
private static void GeneralInterFaceGetTrayCodeFunc(WMSTask wmsTask, SqlSugarClient db, List<asnReferenceDModel> asnReferenceList, List<string> cntrList)
|
{
|
string SrcNo = wmsTask.S_SRC_NO?.Trim();
|
|
//根据任务中存放的工单号,获取工单类型--因为淳安 满托下线任务包含 下线 值,因此多判断一步,减少工单表的查询
|
if (!string.IsNullOrEmpty(SrcNo))
|
{
|
var workInfo = db.Queryable<WorkOrder>().Where(a => a.SQL_WorkNo == SrcNo).First();
|
if (workInfo != null)
|
{
|
if (workInfo.FromFuLe == "Y")
|
{
|
if (cntrList.Count > 0)
|
{
|
cntrList.ForEach(a =>
|
{
|
if (!string.IsNullOrEmpty(a))
|
asnReferenceList.Add(new asnReferenceDModel { asnReferenceD = a });
|
});
|
}
|
}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 任务信息接口--获取AGV设备信息数据
|
/// </summary>
|
/// <param name="wmsTask"></param>
|
/// <param name="db"></param>
|
/// <param name="equipmentCode"></param>
|
/// <param name="orgCode"></param>
|
/// <param name="orgName"></param>
|
/// <param name="proxyInterfaceCode"></param>
|
private static void GeneralInterFaceGetAgvDeviceInfoFunc(WMSTask wmsTask, SqlSugarClient db, ref string equipmentCode, ref string orgCode, ref string orgName, ref string proxyInterfaceCode)
|
{
|
if (!string.IsNullOrEmpty(wmsTask.S_EQ_NO))
|
{
|
var agvDeviceInfo = db.Queryable<AGVDeviceDataTable>().Where(a => a.equipmentNo == wmsTask.S_EQ_NO && a.orgCode == Settings.FactoryCode).First();
|
if (agvDeviceInfo != null)
|
{
|
equipmentCode = agvDeviceInfo.equipmentCode;
|
orgCode = agvDeviceInfo.orgCode;
|
orgName = agvDeviceInfo.orgName;
|
proxyInterfaceCode = agvDeviceInfo.proxyInterfaceCode;
|
}
|
}
|
}
|
|
|
#endregion
|
|
|
|
|
|
#region 瓶盖区 - 总 - 线程
|
|
/// <summary>
|
/// 这里只支持 即产满空公用位是一层。
|
/// </summary>
|
/// <param name="plc"></param>
|
/// <param name="workOrder"></param>
|
/// <returns></returns>
|
public static bool FDJTakeEmpyt2(Settings.deviceInfo plc, WorkOrder workOrder)
|
{
|
var isUsing = workOrder.SQL_UsingNow.Trim() == "Y";
|
//LogHelper.Info("TakeEmpyt212 翻斗鸡取空筐。");
|
Location startbit = LocationHelper.GetLoc(plc.location[0]);
|
var location = startbit.S_LOC_CODE;
|
var hasin = false;
|
LocationHelper.GetT_FULL_ready.TryGetValue(location, out hasin);
|
if (hasin)
|
{
|
LogHelper.Info($"{location} 翻斗机取空 流程 已在筛选中。");
|
return false;
|
}
|
else
|
{
|
if (LocationHelper.GetT_FULL_ready.ContainsKey(location))
|
LocationHelper.GetT_FULL_ready[location] = true;
|
else
|
LocationHelper.GetT_FULL_ready.Add(location, true);
|
}
|
|
var botf = false;
|
|
Location endbit = null;
|
int endLayer = 1;
|
//List<Settings.inStockCacheBit> bits = (from x in Settings.GetInStockCacheList()
|
// where x.locationType == (isUsing ? 12 : 11)
|
// select x).ToList();
|
|
//List<Location> locs = LocationHelper.GetLocList((Location x) => bits.Select((Settings.inStockCacheBit y) => y.location.Trim().ToUpper()).Contains(x.S_LOC_CODE.Trim().ToUpper())).ToList();
|
//var locs = LocationHelper.GetAllLocListByAreaCode(isUsing?workOrder.SQL_Area:"")
|
var _locrel = LocationHelper.GetLocCntrRel(startbit.S_LOC_CODE);
|
if (_locrel.Count == 0)
|
{
|
LogHelper.Info("TakeEmpyt212 翻斗鸡取空筐。没有筐");
|
goto label__end;
|
}
|
var b = _locrel.FirstOrDefault().S_CNTR_CODE.Contains("J");
|
var areaList = new List<string> { b ? "JCJYKK" : "PPKK" };
|
|
if (!b)
|
{
|
if (plc.deviceName.Contains("3线翻斗机"))
|
{
|
botf = true;
|
areaList = new List<string> { "PPTKK", "PPFKK", "PPKK" };
|
}
|
else if (plc.deviceName.Contains("4线翻斗机"))
|
{
|
botf = true;
|
areaList = new List<string> { "PPFKK", "PPTKK", "PPKK" };
|
}
|
}
|
|
ballllll:
|
var _areaCode = areaList.FirstOrDefault();
|
areaList.Remove(_areaCode);
|
var locs = LocationHelper.GetAllLocListByAreaCode(_areaCode, 0, 0);
|
if (locs.Count > 0)
|
{
|
locs.RemoveAll(x => x.S_LOCK_STATE == "报废");
|
|
var _temp = locs.FindAll(x => x.S_LOCK_STATE.Trim() != "无").ToList();
|
if (_temp.Any())
|
{
|
_temp.ForEach(y =>
|
{
|
locs.RemoveAll((Location x) => y.S_AREA_CODE.Trim() == x.S_AREA_CODE.Trim() && y.N_ROW == x.N_ROW);
|
});
|
}
|
//locs = locs?.OrderBy(X => X.N_ROW).ThenBy(X => X.N_COL).ToList();
|
//var locs2 = locs.FindAll(x => x.N_CURRENT_NUM < x.N_CAPACITY);//locs.FindAll(x => x.N_CURRENT_NUM < x.N_CAPACITY);
|
//endbit = locs?.OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).ToList().Find(x => x.N_CURRENT_NUM > 0 && x.N_CURRENT_NUM < x.N_CAPACITY);
|
//if (locs2.Count() == 0)
|
//{
|
// LogHelper.Info("没有可用的" + (isUsing ? "即产" : "入库") + (b) + "空筐终点");
|
// goto label__end;
|
//}
|
//var _loc = locs2;//.OrderByDescending(x => x.N_CURRENT_NUM).FirstOrDefault();
|
if (endbit == null)
|
foreach (IGrouping<int, Location> item in locs.GroupBy(x => x.N_ROW).OrderByDescending(x => x.Count(y => y.N_CURRENT_NUM > 0)).ThenBy(x => x.Key))
|
{
|
List<Location> _cols = item.OrderBy(x => x.N_COL).ToList();
|
Location e = _cols.FindAll((Location x) => x.N_CURRENT_NUM > 0).LastOrDefault();//从左往右最后一个满位。
|
if (e != null && e.N_CURRENT_NUM < e.N_CAPACITY)
|
{
|
endbit = e;
|
}
|
else
|
{
|
var empT = _cols.FindAll(x => x.N_CURRENT_NUM == 0).FirstOrDefault();//从左往右d位
|
if (empT != null)
|
endbit = empT;
|
}
|
if (endbit != null)
|
break;
|
}
|
if (endbit == null)
|
{
|
LogHelper.Info(_areaCode + "没有可用的" + (b ? "即产" : "入库") + "空筐终点");
|
if (areaList.Count > 0)
|
goto ballllll;
|
goto label__end;
|
}
|
//if (_loc != null)
|
//{
|
// if (_loc.N_CURRENT_NUM > 0)//不满
|
// {
|
// endbit = _loc;
|
// endLayer = _loc.N_CURRENT_NUM + 1;
|
// }
|
// else//空位要按顺序了。
|
// {
|
// var _llll = locs2.OrderBy(x => x.N_COL).GroupBy(x => x.N_COL).FirstOrDefault().OrderBy(x => x.N_ROW).ToList();
|
// endbit = _llll.LastOrDefault();
|
// endLayer = endbit.N_CURRENT_NUM + 1;
|
// }
|
//}
|
}
|
else
|
{
|
LogHelper.Info(_areaCode + (b ? "即产" : "入库") + "空筐区 没配置。 ");
|
if (areaList.Count > 0)
|
goto ballllll;
|
}
|
|
if (startbit != null && endbit != null)
|
{
|
List<LocCntrRel> ctrs = LocationHelper.GetLocCntrRel(startbit.S_LOC_CODE);
|
List<string> carryCntrs = ctrs.Select((LocCntrRel x) => x.S_CNTR_CODE).ToList();
|
bool bb = CreateTransport(workOrder.SQL_WorkNo, startbit.S_LOC_CODE, endbit.S_LOC_CODE, "翻斗机取空到" + (b ? "即产" : "入库"), carryCntrs, 1, endLayer, 1, 60);
|
LogHelper.Info("翻斗机取空到" + (b ? "即产" : "入库") + string.Format("起点:{0} 终点:{1} 托盘:{2} {3}", startbit.S_LOC_CODE, endbit.S_LOC_CODE, JsonConvert.SerializeObject(carryCntrs), bb ? "任务创建成功" : "任务创建失败。"));
|
//return bb;
|
//goto label__end;
|
LocationHelper.GetT_FULL_ready[location] = false;
|
return bb;
|
}
|
|
label__end:
|
if (botf)
|
{
|
//生成转筐
|
//算了。 用线程吧
|
}
|
LocationHelper.GetT_FULL_ready[location] = false;
|
return false;
|
}
|
|
public static void TakeFull2FDJ(Settings.deviceInfo plc, WorkOrder workOrder)
|
{
|
var isUsing = workOrder.SQL_UsingNow.Trim() == "Y";
|
//}
|
|
//LogHelper.Info("TakeFull2FDJ 翻斗鸡 叫满框");
|
string location = plc.location[0];
|
|
var hasin = false;
|
LocationHelper.GetT_FULL_ready.TryGetValue(location, out hasin);
|
if (hasin)
|
{
|
LogHelper.Info($"{location} 翻斗机送满 流程 已在筛选中。");
|
goto label__end;
|
}
|
else
|
{
|
if (LocationHelper.GetT_FULL_ready.ContainsKey(location))
|
LocationHelper.GetT_FULL_ready[location] = true;
|
else
|
LocationHelper.GetT_FULL_ready.Add(location, true);
|
}
|
Location endbit = LocationHelper.GetLoc(plc.location[0]);
|
|
/// 这里是查看之前的任务在哪一步了。2024年9月9日 13:56:07 要求取消任务完成后呼叫
|
//var ret = false;
|
//LocationHelper.DoAction(db =>
|
//{
|
// var tasks = db.Queryable<WMSTask>().Where(x => x.S_START_LOC == endbit.S_LOC_CODE && "取货完成,开始卸货,卸货完成".Contains(x.S_B_STATE)).ToList();
|
// if (tasks.Any())
|
// {
|
// LogHelper.Info($"{endbit.S_LOC_CODE} 的下线任务还没完成。 等待完成后 在呼叫任务。-- 2024年8月30日 10:27:14 现场要求");
|
// ret = true;
|
// }
|
// return true;
|
//});
|
//if (ret)
|
// goto label__end;
|
|
Location startbit = null;
|
int startlayer = 1;
|
LogHelper.Info(plc.deviceName + "工单链接区域->" + workOrder.SQL_Area + " 。翻斗指定出库库区排>" + workOrder.S_ROW1);
|
var lineTo = (workOrder.SQL_LinkLineNO?.Trim() ?? "") + ">";
|
List<Location> locs = LocationHelper.GetAllLocListByAreaCode(workOrder.SQL_Area, 0, 0);
|
locs.RemoveAll(x => x.S_LOCK_STATE == "报废");
|
string _type = "翻斗机叫满" + (isUsing ? "即产" : "出库");
|
string desc = "";
|
if (isUsing)
|
{
|
if (locs.Count > 0)
|
{
|
List<int> _temp = (from x in locs.FindAll((Location x) => x.S_LOCK_STATE.Trim() != "无")
|
select x.N_ROW).Distinct().ToList();
|
if (_temp.Any())
|
{
|
locs.RemoveAll((Location x) => _temp.Contains(x.N_ROW));
|
}
|
//locs = locs.FindAll(x => x.N_CURRENT_NUM > 0 && x.S_LOCK_STATE.Trim() == "无");
|
|
var loc_list_PEM = new List<Location>();
|
foreach (var item1 in locs)
|
{
|
var _ctrl = LocationHelper.GetLocCntrRel(item1.S_LOC_CODE);
|
//if (_ctrl.Count > 0 && _ctrl.FirstOrDefault().S_CNTR_CODE.Contains("J"))
|
if (_ctrl.Count > 0 && _ctrl.FirstOrDefault().S_TYPE.Contains(workOrder.SQL_ItemCode))
|
{
|
loc_list_PEM.Add(item1);
|
break;
|
}
|
}
|
|
var _loc = loc_list_PEM?.OrderBy(x => x.T_FULL_TIME).FirstOrDefault();//.Find(x => x.S_NOTE == workOrder.SQL_ItemCode);
|
if (loc_list_PEM.Count == 0 || _loc == null)
|
{
|
LogHelper.Info("满筐区 没有可用的即产满筐 - 切筐");
|
//var Turn_ready = LocationHelper.Turn_ready;
|
//转筐
|
DateTime dateTime = DateTime.Now;
|
if (LocationHelper.Turn_ready.TryGetValue(endbit.S_LOC_CODE, out dateTime))
|
{
|
if (DateTime.Now.Subtract(dateTime).TotalMinutes > plc.EmptyWait)
|
{
|
LocationHelper.Turn_ready.Remove(endbit.S_LOC_CODE);
|
desc = "切出库";
|
goto Label_noUsing;
|
}
|
}
|
else
|
{
|
LocationHelper.Turn_ready.Add(endbit.S_LOC_CODE, DateTime.Now);
|
}
|
|
goto label__end;
|
}
|
|
//if (_loc.N_CURRENT_NUM == _loc.N_CAPACITY)
|
//{
|
// _loc = loc_list_PEM.FindAll(x => x.S_NOTE == workOrder.SQL_ItemCode).OrderBy(x => x.T_FULL_TIME).FirstOrDefault();
|
//}
|
|
startbit = _loc;
|
startlayer = _loc.N_CURRENT_NUM;
|
goto Label_Task;
|
}
|
else
|
{
|
LogHelper.Info("" + (isUsing ? "即产" : "出库") + "满筐区 没配置。 ");
|
goto label__end;
|
}
|
}
|
Label_noUsing:
|
{
|
var areaList = "";
|
if (plc.deviceName.Contains("3线翻斗机"))
|
areaList = "PPTMKZZ";
|
if (plc.deviceName.Contains("4线翻斗机"))
|
areaList = "PPFMKZZ";
|
BBBBBBL:
|
if (string.IsNullOrEmpty(areaList))
|
{
|
if (string.IsNullOrEmpty(workOrder.S_ROW1))
|
{
|
goto label__end;
|
}
|
var rs = workOrder.S_ROW1.Split('=');
|
var rows = Array.ConvertAll(rs[rs.Length - 1].Split('-'), Convert.ToInt32);
|
|
locs = LocationHelper.GetAreaNormalLocList(rs[0]).FindAll(x => rows.Contains(x.N_ROW));
|
}
|
else
|
{
|
locs = LocationHelper.GetAreaNormalLocList(areaList);
|
}
|
//locs = LocationHelper.GetAllLocListByAreaCode("PPMKCK", 0, 0);
|
//locs.RemoveAll(x => x.S_LOCK_STATE == "报废");
|
//var _temp = locs.FindAll(x => x.S_LOCK_STATE.Trim() != "无").ToList();
|
//if (_temp.Any())
|
//{
|
// _temp.ForEach(y =>
|
// {
|
// locs.RemoveAll((Location x) => y.S_AREA_CODE.Trim() == x.S_AREA_CODE.Trim() && y.N_ROW == x.N_ROW);
|
// });
|
//}
|
if (false)
|
{
|
//1 找半满位
|
//locs = locs?.OrderBy(x => x.N_ROW).ThenByDescending(x => x.N_COL).ToList();
|
startbit = locs?.OrderBy(x => x.N_ROW).ThenByDescending(x => x.N_COL).ToList().Find(x => x.N_CURRENT_NUM > 0);
|
//startbit = locs?.Find(x => x.N_CURRENT_NUM > 0 && x.N_CURRENT_NUM < x.N_CAPACITY);
|
//if (startbit == null)
|
//{
|
// //没有不满的。 找满货位。
|
// startbit = locs?.Find(x => x.N_CURRENT_NUM > 0); //locs?.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).GroupBy(x => x.N_COL).FirstOrDefault()?.OrderBy(x => x.N_ROW).FirstOrDefault();
|
//}
|
}
|
else
|
{
|
var rowlist = LocationHelper.GetRowLock(locs.FirstOrDefault().S_AREA_CODE);
|
foreach (IGrouping<int, Location> item in locs.GroupBy(x => x.N_ROW).OrderBy(y => rowlist.Find(x => x.S_LOCK_STATE == "出库锁" && x.N_ROW == y.Key)?.T_CREATE ?? DateTime.Now).ThenBy(x => x.ToList().FindAll(y => y.N_CURRENT_NUM > 0).Count))
|
{
|
var tnotnull = rowlist.Find(x => x.S_LOCK_STATE == "入库锁" && x.N_ROW == item.Key);
|
if (tnotnull != null) continue;
|
|
List<Location> _cols = item.OrderBy(x => x.N_COL).ToList();
|
Location e = _cols.FindAll((Location x) => x.N_CURRENT_NUM > 0).LastOrDefault();//从左往右最后一个满位。
|
if (e != null)
|
{
|
var rel = LocationHelper.GetLocCntrRel(e.S_LOC_CODE);
|
if (rel.Any() && (rel.FirstOrDefault().S_TYPE.Contains($"{lineTo}{workOrder.SQL_ItemCode}") || rel.FirstOrDefault().S_TYPE.Contains($"{lineTo}{workOrder.SQL_ItemName}")))
|
{
|
startbit = e;
|
break;
|
}
|
else
|
{
|
LogHelper.Info($"{e.S_LOC_CODE} 位置的 物料{rel.FirstOrDefault()?.S_TYPE} 与本次上{lineTo}{workOrder.SQL_ItemCode} 不符。 筛选下一排");
|
continue;
|
}
|
}
|
}
|
}
|
if (startbit != null)
|
startlayer = startbit.N_CURRENT_NUM;
|
else
|
{
|
LogHelper.Info("没有符合条件的起点出库满框");
|
if (!string.IsNullOrEmpty(areaList) && areaList.Contains("MKZZ"))
|
{
|
areaList = "";
|
goto BBBBBBL;
|
}
|
goto label__end;
|
}
|
}
|
Label_Task:
|
LogHelper.Info($"Label_Task=>startbit{JsonConvert.SerializeObject(startbit)} endbit{JsonConvert.SerializeObject(endbit)} ");
|
if (startbit != null && endbit != null)
|
{
|
List<LocCntrRel> ctrs = LocationHelper.GetLocCntrRel(startbit.S_LOC_CODE);
|
List<string> carryCntrs = ctrs.Select((LocCntrRel x) => x.S_CNTR_CODE.Trim()).Take(1).ToList();
|
bool bb = CreateTransport(workOrder.SQL_WorkNo, startbit.S_LOC_CODE, endbit.S_LOC_CODE, "翻斗机叫满" + (isUsing ? "即产" : "出库") + desc, carryCntrs, startlayer, 1, 1, 60);
|
LogHelper.Info("翻斗机叫满" + (isUsing ? "即产" : "出库") + string.Format(".起点:{0} 终点:{1} 托盘:{2} {3}", startbit.S_LOC_CODE, endbit.S_LOC_CODE, JsonConvert.SerializeObject(carryCntrs), bb ? "任务创建成功" : "任务创建失败。"));
|
}
|
|
label__end:
|
LocationHelper.GetT_FULL_ready[location] = false;
|
}
|
|
#endregion
|
|
|
|
|
}
|
}
|