using HH.WCS.Mobox3.NFLZ.device;
|
using HH.WCS.Mobox3.NFLZ.process;
|
using HH.WCS.Mobox3.NFLZ.util;
|
using HH.WCS.Mobox3.NFLZ.wms;
|
using System;
|
using System.Collections.Generic;
|
using System.Configuration;
|
using System.Linq;
|
using System.Text;
|
using System.Threading;
|
using System.Threading.Tasks;
|
using static HH.WCS.Mobox3.NFLZ.wms.WMSHelper.AddChangeModel;
|
using static System.Runtime.CompilerServices.RuntimeHelpers;
|
|
namespace HH.WCS.Mobox3.NFLZ.core
|
{
|
/// <summary>
|
/// 定时轮询任务
|
/// </summary>
|
internal class Monitor
|
{
|
internal static void CheckThirdOutWork() {
|
//第三方读中间表
|
//var db= new SqlHelper<object>().GetInstance("中间表的sql连接字符串");
|
// db.Queryable<object>
|
|
//读到了出库单,插入到我们的表
|
|
|
}
|
|
internal static void CheckOutWork() {
|
//读自己的中间表,我们自己的表有表有个字段计数,计数小于最大值,继续出库,一次生成一条任务
|
|
}
|
|
|
internal static void CheckDevice() {
|
//检测输送线状态
|
|
S7Helper.ReadStr("plc1", 100, 1, 8);
|
S7Helper.ReadBit("plc1", 101, 1, 2);
|
S7Helper.ReadInt("plc1", 102, 1, 6);
|
//1 设备plc的ip deviceNo 自动建立连接
|
//2 设备对应的通讯项和线体类型(输送线入口、输送线出口、提升机的入口。。。。)起始读的偏移地址,写的偏移地址
|
//{ "deviceNo":"5","code":"9001","location":"F1CJ-SSX1-01","writeAddr900":0,"writeAddr905":-1,"writeAddr710":0,"readAddr901":2,"readAddr902":0,"lineType":1},
|
//3 通讯项自动读plc,读到的数据根据lineType做处理,自动创建任务或者更新任务状态(创建一个设备动作或任务动作,如果是任务动作有个线程去读)
|
}
|
|
/// <summary>
|
/// 转运任务
|
/// </summary>
|
internal static void BottleBlankTransportation()
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
#region 瓶盖满托入库
|
var areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶盖入库接驳" && a.enable == 1).FirstOrDefault();
|
if (areaInfo != null)
|
{
|
var locInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE == "无").Includes(a => a.LocCntrRel).First();
|
if (locInfo != null)
|
{
|
LogHelper.Info($"【瓶盖满托转运】瓶坯接驳位查询到需入库的瓶坯,货位编码:{locInfo.S_CODE}");
|
string cntrCode = getCntrCode(db, locInfo);
|
if (string.IsNullOrEmpty(cntrCode))
|
{
|
//创建作业
|
WMSHelper.CreateOpTask(locInfo.S_CODE, "", "入库", "接驳位入库", cntrCode, "瓶盖");
|
}
|
else
|
{
|
LogHelper.Info($"【瓶盖满托转运】当前货位未绑定托盘码,货位编码:{locInfo.S_CODE}");
|
}
|
}
|
}
|
else
|
{
|
LogHelper.Info("【瓶盖满托转运】瓶盖入库接驳 未配置");
|
}
|
#endregion
|
|
#region 瓶盖空托入库
|
areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶盖非即产空框" && a.enable == 1).FirstOrDefault();
|
if(areaInfo != null)
|
{
|
var locInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM == a.N_CAPACITY && a.S_LOCK_STATE == "无").First();
|
if(locInfo != null)
|
{
|
string cntrCode = getCntrCode(db, locInfo);
|
if (string.IsNullOrEmpty(cntrCode))
|
{
|
//创建作业
|
WMSHelper.CreateOpTask(locInfo.S_CODE, "", "入库", "瓶盖空托入库", cntrCode, "瓶盖");
|
}
|
else
|
{
|
LogHelper.Info($"【瓶盖空托转运】当前货位未绑定托盘码,货位编码:{locInfo.S_CODE}");
|
}
|
}
|
}
|
else
|
{
|
LogHelper.Info("【瓶盖空托转运】瓶盖非即产空框 未配置");
|
}
|
#endregion
|
|
#region 瓶坯满托入库
|
areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶坯入库接驳" && a.enable == 1).FirstOrDefault();
|
if (areaInfo != null)
|
{
|
var locInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM == a.N_CAPACITY && a.S_LOCK_STATE == "无").First();
|
if (locInfo != null)
|
{
|
string cntrCode = getCntrCode(db, locInfo);
|
if (!string.IsNullOrEmpty(cntrCode))
|
{
|
//创建作业
|
WMSHelper.CreateOpTask(locInfo.S_CODE, "", "入库", "接驳位入库", cntrCode, "瓶坯");
|
}
|
else
|
{
|
LogHelper.Info($"【瓶坯满托转运】当前货位未绑定托盘码,货位编码:{locInfo.S_CODE}");
|
}
|
}
|
}
|
else
|
{
|
LogHelper.Info("【瓶坯满托转运】瓶坯入库接驳 未配置");
|
}
|
|
#endregion
|
}
|
|
/// <summary>
|
/// 瓶坯翻斗机非急产满框区补满托
|
/// </summary>
|
internal static void PPFDFullIn()
|
{
|
//产线号 : 农夫林芝-1号瓶坯翻斗机
|
var db = new SqlHelper<object>().GetInstance();
|
var bcpWorkList = db.Queryable<LinZhiBCPWorkOrder>().Where(a => a.S_PLineNo.Contains("瓶坯翻斗机") && a.S_UsingNow == "N" && a.S_WorkState == "执行中").ToList();
|
if(bcpWorkList.Count > 0)
|
{
|
bcpWorkList.ForEach(a =>
|
{
|
string areaName = a.S_PLineNo.Split('-')[1].Substring(0, 1) + "号瓶坯翻斗机非即产满框";
|
LogHelper.Info($"PPFDFullIn area:{areaName}");
|
var areaInfo = Settings.areaInfos.Where(b => b.areaName == areaName && b.enable == 1).FirstOrDefault();
|
if(areaInfo != null)
|
{
|
var locInfo = db.Queryable<Location>().Where(b => b.S_AREA_CODE == areaInfo.areaCode && b.N_CURRENT_NUM == 0 && b.S_LOCK_STATE == "无").First();
|
if(locInfo != null)
|
{
|
//生成任务
|
Location location = TaskProcess.BCPInOrOut(db, false, "瓶坯库区", a.S_ItemCode);
|
if(location != null)
|
{
|
string cntrCode = getCntrCode(db,location);
|
//创建作业
|
WMSHelper.CreateOpTask(location.S_CODE, locInfo.S_CODE, "入库", "瓶坯非急产补满框", cntrCode, "瓶坯");
|
}
|
}
|
}
|
else
|
{
|
LogHelper.Info($"{areaName}未配置");
|
}
|
});
|
}
|
}
|
|
private static string getCntrCode(SqlSugar.SqlSugarClient db, Location location)
|
{
|
string cntr = "";
|
var cntrList = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == location.S_CODE).OrderBy(a => a.T_CREATE).ToList();
|
if(cntrList.Count > 0)
|
{
|
foreach(var a in cntrList)
|
{
|
cntr = cntr + a.S_CNTR_CODE + ",";
|
}
|
}
|
cntr = cntr.TrimEnd(',');
|
return cntr;
|
}
|
|
internal static void PGFDFullIn()
|
{
|
//产线号 : 农夫林芝-1号瓶盖翻斗机
|
//瓶盖翻斗机共用一个库区,需要区分几种情况(注:现场已确认,三个翻斗机不会有三种物料)
|
//1、如果三个翻斗机物料相同,则 瓶盖非即产满框 有空货位就补
|
//2、如果三个翻斗机有两种不同的物料,则 瓶盖非即产满框 有空位的补充 改库区没有的物料
|
var db = new SqlHelper<object>().GetInstance();
|
string itemList = "";
|
var bcpWorkList = db.Queryable<LinZhiBCPWorkOrder>().Where(a => a.S_PLineNo.Contains("瓶盖翻斗机") && a.S_UsingNow == "N" && a.S_WorkState == "执行中").ToList();
|
if (bcpWorkList.Count > 0)
|
{
|
bcpWorkList.ForEach(a =>
|
{
|
if (string.IsNullOrEmpty(itemList))
|
{
|
itemList = itemList + a.S_ItemCode + ",";
|
}
|
else
|
{
|
if (!itemList.Contains(a.S_ItemCode))
|
{
|
itemList = itemList + a.S_ItemCode + ",";
|
}
|
}
|
});
|
}
|
if (!string.IsNullOrEmpty(itemList))
|
{
|
itemList = itemList.TrimEnd(',');
|
List<string> itemCount = itemList.Split(',').ToList();
|
if(itemCount.Count > 0)
|
{
|
var areaInfo = Settings.areaInfos.Where(b => b.areaName == "瓶盖非即产满框" && b.enable == 1).FirstOrDefault();
|
if (areaInfo != null)
|
{
|
var locInfo = db.Queryable<Location>().Where(b => b.S_AREA_CODE == areaInfo.areaCode && b.N_CURRENT_NUM == 0 && b.S_LOCK_STATE == "无").First();
|
if (locInfo != null)
|
{
|
if (itemCount.Count == 1)
|
{
|
//只有一种物料
|
//生成任务
|
Location location = TaskProcess.BCPInOrOut(db, false, "瓶盖库区", itemCount[0]);
|
if (location != null)
|
{
|
string cntrCode = getCntrCode(db, location);
|
//创建作业
|
WMSHelper.CreateOpTask(location.S_CODE, locInfo.S_CODE, "入库", "瓶盖非急产补满框", cntrCode, "瓶盖");
|
}
|
}
|
if (itemCount.Count == 2)
|
{
|
//两种物料
|
|
//判断库区是否有货位数量大于0或者有入库锁的,如果有,则判断物料,如果没有,则生成第一个物料的任务
|
var locInfo2 = db.Queryable<Location>().Where(b => b.S_AREA_CODE == areaInfo.areaCode && (b.N_CURRENT_NUM > 0 || b.S_LOCK_STATE == "入库锁")).First();
|
if(locInfo2 != null)
|
{
|
string itemCode = "";
|
if(locInfo2.N_CURRENT_NUM > 0)
|
{
|
var cntrInfo = db.Queryable<LocCntrRel>().Where(b => b.S_LOC_CODE == locInfo2.S_CODE).First();
|
if(cntrInfo != null)
|
{
|
var itemInfo = db.Queryable<CntrItemRel>().Where(b => b.S_CNTR_CODE == cntrInfo.S_CNTR_CODE).First();
|
if(itemInfo != null)
|
{
|
itemCode = itemInfo.S_ITEM_CODE;
|
}
|
}
|
}
|
if(locInfo2.S_LOCK_STATE == "入库锁")
|
{
|
var taskInfo = db.Queryable<WMSTask>().Where(b => b.S_END_LOC == locInfo2.S_CODE && b.S_STATE != "完成" && b.S_STATE != "取消").First();
|
if(taskInfo != null)
|
{
|
string cntrCode = taskInfo.S_CNTR_CODE.Split(',')[0];
|
var itemInfo = db.Queryable<CntrItemRel>().Where(b => b.S_CNTR_CODE == cntrCode).First();
|
if (itemInfo != null)
|
{
|
itemCode = itemInfo.S_ITEM_CODE;
|
}
|
}
|
}
|
|
if (itemCode != "")
|
{
|
itemCode = itemCode == itemCount[0] ? itemCount[1] : itemCount[0];
|
Location location = TaskProcess.BCPInOrOut(db, false, "瓶盖库区", itemCode);
|
if (location != null)
|
{
|
string cntrCode = getCntrCode(db, location);
|
//创建作业
|
WMSHelper.CreateOpTask(location.S_CODE, locInfo.S_CODE, "入库", "瓶盖非急产补满框", cntrCode, "瓶盖");
|
}
|
}
|
}
|
else
|
{
|
Location location = TaskProcess.BCPInOrOut(db, false, "瓶盖库区", itemCount[0]);
|
if (location != null)
|
{
|
string cntrCode = getCntrCode(db, location);
|
//创建作业
|
WMSHelper.CreateOpTask(location.S_CODE, locInfo.S_CODE, "入库", "瓶盖非急产补满框", cntrCode, "瓶盖");
|
}
|
}
|
}
|
}
|
}
|
else
|
{
|
LogHelper.Info($"瓶盖非即产满框 未配置");
|
}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 瓶坯非即产即用库托库区补空托
|
/// </summary>
|
internal static void PPFDFullInEmpty()
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var workInfo = db.Queryable<LinZhiBCPWorkOrder>().Where(a => a.S_PLineNo == "农夫林芝-瓶坯机" && a.S_UsingNow == "N" && a.S_WorkState == "执行中").First();
|
if(workInfo != null)
|
{
|
var areaInfo = Settings.areaInfos.Where(a => a.areaName == "瓶坯非即产空框" && a.enable == 1).FirstOrDefault();
|
if(areaInfo != null)
|
{
|
var locInfo = db.Queryable<Location>().Where(a => a.S_AREA_CODE == areaInfo.areaCode && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE == "无").First();
|
if(locInfo != null)
|
{
|
//生成任务
|
Location location = TaskProcess.BCPInOrOut(db, false, "瓶坯库区", "");
|
if (location != null)
|
{
|
string cntrCode = getCntrCode(db, location);
|
//创建作业
|
WMSHelper.CreateOpTask(location.S_CODE, locInfo.S_CODE, "入库", "瓶坯非急产补空框", cntrCode, "瓶坯");
|
}
|
}
|
}
|
else
|
{
|
LogHelper.Info("瓶坯非即产空框 未配置");
|
}
|
}
|
}
|
}
|
}
|