using HH.WCS.Mobox3.FJJF.models;
|
using HH.WCS.Mobox3.FJJT.models;
|
using HH.WCS.Mobox3.FJJT.models.other;
|
using HH.WCS.Mobox3.FJJT.util;
|
using Newtonsoft.Json;
|
using NLog.Fluent;
|
using SqlSugar;
|
using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
using System.Globalization;
|
using System.Linq;
|
using System.Linq.Expressions;
|
using System.Reflection;
|
using System.Runtime.ConstrainedExecution;
|
using System.Threading.Tasks;
|
using System.Web.UI.WebControls;
|
using static HH.WCS.Mobox3.FJJT.api.ApiModel;
|
using static HH.WCS.Mobox3.FJJT.util.Settings;
|
|
namespace HH.WCS.Mobox3.FJJT.wms {
|
/// <summary>
|
/// wms管到作业
|
/// </summary>
|
internal class WMSHelper {
|
internal static string GenerateTaskNo() {
|
var id = SYSHelper.GetSerialNumber("作业号", "OP");
|
var date = DateTime.Now.ToString("yyMMdd");
|
return $"OP{date}{id.ToString().PadLeft(4, '0')}";
|
}
|
internal static string GenerateSortingNo() {
|
var id = SYSHelper.GetSerialNumber("分拣单", "SO");
|
var date = DateTime.Now.ToString("yyMMdd");
|
return $"SO{date}{id.ToString().PadLeft(4, '0')}";
|
}
|
|
internal static string GenerateAlarmNo()
|
{
|
var id = SYSHelper.GetSerialNumber("报警记录单", "AL");
|
var date = DateTime.Now.ToString("yyMMdd");
|
return $"AL{date}{id.ToString().PadLeft(4, '0')}";
|
}
|
internal static string GenerateTempCntrNo()
|
{
|
var id = SYSHelper.GetSerialNumber("临时容器号", "CN");
|
var date = DateTime.Now.ToString("yyMMdd");
|
return $"CN{date}{id.ToString().PadLeft(4, '0')}";
|
}
|
internal static List<WMSTask> GetOperationListByState(string state) {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<WMSTask>().Where(a => a.S_B_STATE == state && a.S_FACTORY == Settings.FacCode).ToList();
|
}
|
internal static List<WMSTask> GetOperationListByState(int state) {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<WMSTask>().Where(a => a.N_B_STATE == state && a.S_FACTORY == Settings.FacCode).ToList();
|
}
|
internal static List<WMSTask> GetWaitingOperationList() {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<WMSTask>().Where(a => (a.N_B_STATE == 0 || a.N_B_STATE == 3) && a.S_FACTORY == Settings.FacCode).ToList();
|
}
|
|
internal static bool CreateWmsTask(WMSTask wmsTask) {
|
try {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Insertable<WMSTask>(wmsTask).ExecuteCommand() > 0;
|
}
|
catch (Exception ex) {
|
Console.WriteLine(ex.Message);
|
throw;
|
}
|
}
|
|
internal static bool DeleteWmsTask(string code)
|
{
|
try
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Deleteable<WMSTask>().Where(a => a.S_CODE == code).ExecuteCommand() > 0;
|
}
|
catch (Exception ex)
|
{
|
Console.WriteLine(ex.Message);
|
throw;
|
}
|
}
|
|
internal static WMSTask GetAwaitWmsTaskByMaterialCode(string materialCode) {
|
WMSTask wmsTask = null;
|
var db = new SqlHelper<object>().GetInstance();
|
var wmsTaskList = db.Queryable<WMSTask>()
|
.LeftJoin<CntrItemRel>((a,b) => a.S_CNTR_CODE == b.S_CNTR_CODE)
|
.Where((a, b) => a.N_B_STATE == 1 && b.S_ITEM_CODE.Trim() == materialCode && a.S_TYPE.Trim() == "叫料出库任务").ToList();
|
foreach (var task in wmsTaskList)
|
{
|
var result = db.Queryable<WCSTask>().Where(a => a.S_OP_CODE == task.S_CODE && a.N_B_STATE > 0).Count() == 0;
|
if (result)
|
{
|
wmsTask = task;
|
return wmsTask;
|
}
|
}
|
return wmsTask;
|
}
|
|
internal static WMSTask GetWmsTaskByCntr(string cntr, bool active = true)
|
{
|
WMSTask result = null;
|
var db = new SqlHelper<object>().GetInstance();
|
if (active)
|
{
|
result = db.Queryable<WMSTask>().Where(a => a.S_CNTR_CODE.Contains(cntr) && a.N_B_STATE < 2).First();
|
}
|
else
|
{
|
result = db.Queryable<WMSTask>().Where(a => a.S_CNTR_CODE.Contains(cntr)).First();
|
}
|
return result;
|
}
|
|
internal static Location GetEnd(WMSTask a) {
|
throw new NotImplementedException();
|
}
|
|
internal static Location GetStart(WMSTask a) {
|
throw new NotImplementedException();
|
}
|
|
internal static void UpdateTaskState(WMSTask task) {
|
var db = new SqlHelper<object>().GetInstance();
|
task.T_MODIFY = DateTime.Now;
|
task.S_B_STATE = WMSTask.GetStateStr(task.N_B_STATE);
|
db.Updateable<WMSTask>(task).UpdateColumns(a => new { a.N_TYPE,a.N_B_STATE, a.S_B_STATE, a.T_MODIFY,a.T_END_TIME }).ExecuteCommand();
|
}
|
|
|
internal static bool UpdateTaskEnd(WMSTask a) {
|
var db = new SqlHelper<object>().GetInstance();
|
a.T_MODIFY = DateTime.Now;
|
return db.Updateable<WMSTask>(a).UpdateColumns(it => new { it.S_TYPE,it.S_END_LOC,it.S_END_AREA, it.T_MODIFY }).ExecuteCommand() > 0;
|
}
|
|
internal static WMSTask GetWmsTask(string code) {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<WMSTask>().Where(a => a.S_CODE.Trim() == code).First();
|
}
|
|
internal static WMSTask GetWmsTaskByEnd(string endLoc)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<WMSTask>().Where(a => a.S_END_LOC.Trim() == endLoc && a.N_B_STATE < 2).First();
|
}
|
|
internal static WMSTask GetWmsTaskByStart(string startLoc)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<WMSTask>().Where(a => a.S_START_LOC.Trim() == startLoc && a.N_B_STATE < 2).First();
|
}
|
|
internal static bool isFinishTask(string wmsTaskNo)
|
{
|
bool result = false;
|
var db = new SqlHelper<object>().GetInstance();
|
result = db.Queryable<WCSTask>().Where(a => a.S_OP_CODE.Trim() == wmsTaskNo && a.N_B_STATE < 3).Count() == 0;
|
return result;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="locCode"></param>
|
/// <returns></returns>
|
public static string getReturnMaterialLocCode(string locCode)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var returnMaterialLoc = db.Queryable<SideLocConfig>().Where(a => a.S_LOC_CODE.Trim() == locCode).First();
|
if (returnMaterialLoc != null) {
|
return returnMaterialLoc.S_RETURN_LOC_CODE;
|
}
|
return null;
|
}
|
// --------------------------------------------------------福建佳通-----------------------------------------
|
|
|
/// <summary>
|
/// 查询逻辑配置表
|
/// </summary>
|
/// <param name="taskType">任务类型</param>
|
/// <returns></returns>
|
internal static List<LogicConfig> getLogicConfigByTaskType(string taskType)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var logicConfigList = db.Queryable<LogicConfig>()
|
.Where(a => a.S_TASK_TYPE.Trim() == taskType && a.S_ENABLE.Trim() == "是")
|
.OrderBy(a => a.S_PRI)
|
.ToList();
|
return logicConfigList;
|
}
|
|
/// <summary>
|
/// 查询逻辑配置表
|
/// </summary>
|
/// <param name="hcLocCode">补空缓存位</param>
|
/// <returns></returns>
|
internal static LogicConfig getLogicConfigByHcLoc(string hcLocCode)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var logicConfig = db.Queryable<LogicConfig>()
|
.Where(a => a.S_LKBKHCLOC.Trim() == hcLocCode && a.S_ENABLE.Trim() == "是")
|
.OrderBy(a => a.S_PRI)
|
.First();
|
return logicConfig;
|
}
|
|
/// <summary>
|
/// 查询逻辑配置表
|
/// </summary>
|
/// <param name="mtjbLoc">满料接驳位</param>
|
/// <returns></returns>
|
internal static LogicConfig getLogicConfigByMtjbLoc(string mtjbLoc)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var logicConfig = db.Queryable<LogicConfig>()
|
.Where(a => a.S_MTJBLOC.Trim() == mtjbLoc && a.S_ENABLE.Trim() == "是")
|
.OrderBy(a => a.S_PRI)
|
.First();
|
return logicConfig;
|
}
|
|
/// <summary>
|
/// 查询逻辑配置表
|
/// </summary>
|
/// <param name="jtCode"></param>
|
/// <returns></returns>
|
internal static LogicConfig getLogicConfigByJtCode(string jtCode)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var logicConfig = db.Queryable<LogicConfig>()
|
.Where(a => a.S_JT_CODE.Trim() == jtCode && a.S_ENABLE.Trim() == "是")
|
.OrderBy(a => a.S_PRI)
|
.First();
|
return logicConfig;
|
}
|
|
/// <summary>
|
/// 查询出库开始起点
|
/// 注:需过滤堆垛机故障的巷道
|
/// </summary>
|
/// <param name="areaCode"></param>
|
/// <param name="traySatus">0.默认、1.异常</param>
|
/// <param name="materialCode"></param>
|
/// <param name="trayCode"></param>
|
/// <returns></returns>
|
internal static Location getOutStockStartLoc(string areaCode ,string materialCode,int traySatus = 0, string trayCode = "")
|
{
|
Location loc = null;
|
var db = new SqlHelper<object>().GetInstance();
|
|
var queryable = db.Queryable<Location>()
|
.LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE)
|
.LeftJoin<Container>((a, b, c) => b.S_CNTR_CODE == c.S_CODE)
|
.LeftJoin<CntrItemRel>((a, b, c, d) => c.S_CODE == d.S_CNTR_CODE)
|
.Where((a, b, c, d) => a.N_CURRENT_NUM > 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE.Trim() == "Y" );
|
|
if (areaCode != null && areaCode != "")
|
{
|
queryable = queryable.Where((a, b, c, d ) => a.S_AREA_CODE.Trim() == areaCode);
|
}
|
if (traySatus == 0)
|
{
|
queryable = queryable.Where((a, b, c, d) => c.N_E_STATE == 0);
|
}
|
else if (traySatus == 1)
|
{
|
queryable = queryable.Where((a, b, c, d) => c.N_E_STATE != 0);
|
}
|
if (materialCode != null && materialCode != "")
|
{
|
queryable = queryable.Where((a, b, c, d) => d.S_ITEM_CODE.Trim() == materialCode);
|
}
|
else
|
{
|
queryable = queryable.Where((a, b, c, d) => d.S_ITEM_CODE == null);
|
}
|
if (trayCode != null && trayCode != "")
|
{
|
queryable = queryable.Where((a, b, c, d) => b.S_CNTR_CODE.Trim() == trayCode);
|
}
|
|
loc = queryable.OrderBy((a, b, c, d) => d.T_INBOUND_TIME).First();
|
return loc;
|
}
|
|
/// <summary>
|
/// 查询入库终点货位
|
/// </summary>
|
/// <param name="areaCode"></param>
|
/// <param name="trayStatus">0.空车 1.满车 </param>
|
/// <param name="trayType"></param>
|
/// <returns></returns>
|
internal static Location getInStockEndLoc(string areaCode,int trayStatus, int trayType = 0)
|
{
|
LogHelper.Info("开始查询立库终点货位", "WMS");
|
Location location = null;
|
var db = new SqlHelper<object>().GetInstance();
|
try
|
{
|
string S_ZONE_CLS_CODE = "";
|
if (trayStatus == 0)
|
{
|
S_ZONE_CLS_CODE = "KGZ";
|
}
|
else if (trayStatus == 1)
|
{
|
S_ZONE_CLS_CODE = "ML";
|
}
|
|
if (areaCode == null)
|
{
|
if (trayType != 0)
|
{
|
// 根据托盘类型查询对应的立库编码
|
List<string> areaCodes = Settings.getCntrAreaList(trayType);
|
LogHelper.Info($"托盘类型对应的库区:{JsonConvert.SerializeObject(areaCodes)}", "WMS");
|
|
// 计算立库的容积率,取容积率最大的库区
|
var areaList = db.Queryable<Location>()
|
.LeftJoin<ZoneLoc>((a, b) => a.S_CODE == b.S_LOC_CODE)
|
.LeftJoin<Zone>((a, b, c) => b.S_ZONE_CODE == c.S_CODE)
|
.Where((a, b, c) => areaCodes.Contains(a.S_AREA_CODE.Trim()) && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y" && c.S_ZONE_CLS_CODE.Trim() == S_ZONE_CLS_CODE)
|
.GroupBy((a, b, c) => a.S_AREA_CODE)
|
.Select((a, b, c) => new
|
{
|
S_AREA_CODE = a.S_AREA_CODE,
|
num = SqlFunc.AggregateCount(a.S_CODE)
|
})
|
.MergeTable()
|
.OrderByDescending(s => s.num)
|
.ToList();
|
LogHelper.Info($"按容积率排序的库区:{JsonConvert.SerializeObject(areaList)}", "WMS");
|
|
foreach (var item in areaList)
|
{
|
location = db.Queryable<Location>()
|
.LeftJoin<ZoneLoc>((a, b) => a.S_CODE == b.S_LOC_CODE)
|
.LeftJoin<Zone>((a, b, c) => b.S_ZONE_CODE == c.S_CODE)
|
.Where((a, b, c) => a.S_AREA_CODE.Trim() == item.S_AREA_CODE.Trim() && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y" && c.S_ZONE_CLS_CODE.Trim() == S_ZONE_CLS_CODE)
|
.OrderBy((a, b, c) => a.N_LAYER)
|
.First();
|
if (location != null)
|
{
|
return location;
|
}
|
}
|
}
|
|
// 库区安全库存监测,并报警
|
/* var safety_Inventory = getSafetyInventory(areaCode,null, trayType.ToString());
|
if (safety_Inventory != null)
|
{
|
|
}*/
|
}
|
else
|
{
|
location = db.Queryable<Location>()
|
.LeftJoin<ZoneLoc>((a, b) => a.S_CODE == b.S_LOC_CODE)
|
.LeftJoin<Zone>((a, b, c) => b.S_ZONE_CODE == c.S_CODE)
|
.Where((a, b, c) => a.S_AREA_CODE.Trim() == areaCode && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y" && c.S_ZONE_CLS_CODE == S_ZONE_CLS_CODE)
|
.OrderBy((a, b, c) => a.N_LAYER)
|
.First();
|
}
|
LogHelper.Info($"查询结束,立库终点货位:{location}","WMS");
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Info($"WMS内部错误:查询入库终点货位(getInStockEndLoc)错误,错误原因:{ex.Message}", "WMS");
|
throw ex;
|
}
|
return location;
|
}
|
|
public static bool addAlarmRecord(string alarmType , string alarmLevel ,string alarmMsg ,string logSite = "WMS") {
|
var db = new SqlHelper<object>().GetInstance();
|
LogHelper.Info(alarmMsg, logSite);
|
AlarmRecord alarmRecord = new AlarmRecord() {
|
S_ALARM_CODE = GenerateAlarmNo(),
|
S_ALARM_TYPE = alarmType,
|
S_ALARM_LEVEL = alarmLevel,
|
S_ALARM_MSG = alarmMsg,
|
S_FILE_NAME = logSite,
|
};
|
return db.Insertable<AlarmRecord>(alarmRecord).ExecuteCommand()>0;
|
}
|
|
/// <summary>
|
/// 查询成型机线边
|
/// </summary>
|
/// <param name="locCode"></param>
|
/// <returns></returns>
|
public static SideLocConfig GetLineSideLoc(string locCode)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<SideLocConfig>().Where(a => a.S_LOC_CODE.Trim() == locCode).First();
|
}
|
|
/// <summary>
|
/// 获取异常库货位
|
/// </summary>
|
/// <param name="areaCode"></param>
|
/// <returns></returns>
|
public static Location getAbnormalAreaLoc(string areaCode)
|
{
|
Location loc = null;
|
var db = new SqlHelper<object>().GetInstance();
|
loc = db.Queryable<Location>()
|
.LeftJoin<AbnormalAreaConfig>((a, b) => a.S_AREA_CODE == b.S_SUP_AREA)
|
.Where((a, b) => a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y" && b.S_AREA_CODE.Trim() == areaCode)
|
.First();
|
return loc;
|
}
|
|
/// <summary>
|
/// 查询接驳位关联属性
|
/// </summary>
|
/// <param name="locCode"></param>
|
/// <returns></returns>
|
public static TransfeRelevance GetTransfeRelevance(string locCode) {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<TransfeRelevance>().Where(a => a.S_LOC_CODE.Trim() == locCode).First();
|
}
|
|
/// <summary>
|
/// 查询接驳位关联属性
|
/// 注:
|
/// 1.查询异常区货位
|
/// </summary>
|
/// <param name="areaCode">库区</param>
|
/// <param name="type">类型 1.立库接驳位 2.缓存位</param>
|
/// <param name="property">货位属性(1.直连 2.非直连 3.人工 4.固定站台)</param>
|
/// <param name="actType">动作类型(0.默认 1.入库 2.出库)</param>
|
/// <returns></returns>
|
public static Location GetTransfeRelevanceLoc(string areaCode , string type ,string actType = "0" ,string property = "2" )
|
{
|
Location loc = null;
|
var db = new SqlHelper<object>().GetInstance();
|
loc = db.Queryable<Location>()
|
.LeftJoin<TransfeRelevance>((a,b)=> a.S_CODE == b.S_LOC_CODE)
|
.Where((a, b) => b.S_RELE_AREA.Trim() == areaCode && b.S_TYPE.Trim() == type && b.S_PROPERTY == property && b.S_ACT_TYPE == actType && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y")
|
.First();
|
return loc;
|
}
|
|
/// <summary>
|
/// 查询接驳位关联属性
|
/// </summary>
|
/// <param name="locCode"></param>
|
/// <param name="property">货位属性 (1.直连 2.非直连、3.人工 、4.固定站台)</param>
|
/// <returns></returns>
|
public static bool updateTransfeLocProperty(string locCode ,string property)
|
{
|
bool result = false;
|
var db = new SqlHelper<object>().GetInstance();
|
result = db.Updateable<TransfeRelevance>().SetColumns(a => new TransfeRelevance() { S_PROPERTY = property } ).Where(a => a.S_LOC_CODE.Trim() == locCode).ExecuteCommand() > 0;
|
return result;
|
}
|
|
/// <summary>
|
/// 查询立库接驳位
|
/// 注:查询任务最少的接驳位
|
/// </summary>
|
/// <param name="areaCode">库区</param>
|
/// <param name="property">货位属性 (1.直连 2.非直连、3.人工 、4.固定站台)</param>
|
/// <param name="type">类型 1.立库接驳位 2.缓存位 3.机台下线位 4.异常库位</param>
|
/// <param name="actType">动作类型 1.入库 2.出库</param>
|
/// <returns></returns>
|
public static Location GetMinTaskTransfeLoc(string areaCode , string type ,string actType, string property = "2")
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var loc = db.Queryable<Location>()
|
.LeftJoin<TransfeRelevance>((a,b) => a.S_CODE == b.S_LOC_CODE)
|
.LeftJoin<WCSTask>((a,b,c) => a.S_CODE == c.S_END_LOC && c.N_B_STATE < 3)
|
.Where((a, b, c) => b.S_RELE_AREA.Trim() == areaCode && b.S_TYPE.Trim() == type && b.S_ACT_TYPE.Trim() == actType && b.S_PROPERTY.Trim() == property && a.N_LOCK_STATE < 3 && a.C_ENABLE == "Y")
|
.GroupBy((a, b, c) => a.S_CODE)
|
.Select((a, b, c) => new {
|
count = SqlFunc.AggregateCount(c.S_END_LOC),
|
code = a.S_CODE.Trim()
|
})
|
.MergeTable() //需要加MergeTable才能排序统计过的列
|
.OrderBy(it => it.count)
|
.First();
|
if (loc != null)
|
{
|
return LocationHelper.GetLoc(loc.code);
|
}
|
return null;
|
}
|
|
/// <summary>
|
/// 查询物料信息
|
/// </summary>
|
/// <param name="materialCode"></param>
|
/// <returns></returns>
|
public static TN_Material GetMaterial(string materialCode) {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<TN_Material>().Where(a => a.S_ITEM_CODE.Trim() == materialCode).First();
|
}
|
|
/// <summary>
|
/// 查询安全库存
|
/// </summary>
|
public static Safety_Inventory getSafetyInventory(string areaCode, string materialCode ,string trayType)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var query = db.Queryable<Safety_Inventory>().Where(a => a.S_AREA_CODE.Trim() == areaCode);
|
if (materialCode != null)
|
{
|
query = query.Where(a => a.S_MATERIAL_CODE == materialCode);
|
}
|
if (trayType != null)
|
{
|
query = query.Where(a => a.S_PALLET_TYPE == trayType);
|
}
|
return query.First();
|
}
|
|
//------------------------------------------------MES中间表-----------------------------------------------
|
|
|
/// <summary>
|
/// 读取MES下料任务
|
/// 1.备份容器物料信息
|
/// 2.更新中间表状态为已读
|
/// </summary>
|
/// <param name="taskNo"></param>
|
/// <param name="id"></param>
|
/// <returns></returns>
|
internal static LjMesTask readLjMesOffItemTask(string taskNo , int id)
|
{
|
LogHelper.Info($"查询到MES下发WMS任务,mesTaskId:{id},任务号:{taskNo}" , "WMS");
|
var db = new SqlHelper<object>().GetInstance();
|
try
|
{
|
db.BeginTran();
|
// 1.查询MES任务表
|
var mesTask = db.Queryable<LjMesTask>().Where(a => a.ID == id && a.RECEIVE_FLAG.Trim() == "PENDING" ).OrderByDescending(a => a.T_CREATE).First();
|
if (mesTask != null)
|
{
|
// 重置空工装信息
|
ContainerHelper.AddContainer(mesTask.PALLET_ID, int.Parse(mesTask.PALLET_TYPE),mesTask.QTY == 0 ? 0 : 1);
|
|
mesTask.AGVORDER_ID = taskNo;
|
mesTask.RETURN_CODE = "1";
|
mesTask.RECEIVE_FLAG = "COMPLETE";
|
mesTask.RECEIVE_DATE = DateTime.Now.ToString("yyyy-MM-dd");
|
db.Updateable(mesTask).ExecuteCommand();
|
}
|
else
|
{
|
LogHelper.Info("未查询到MES下发WMS任务", "WMS");
|
}
|
db.CommitTran();
|
return mesTask;
|
}
|
catch (Exception ex)
|
{
|
db.RollbackTran();
|
LogHelper.Info($"读取MES下发任务失败,错误原因:{ex.Message}" , "WMS");
|
WMSHelper.addAlarmRecord("系统错误", "高", $"读取MES下发任务失败,错误原因:{ex.Message}");
|
}
|
return null;
|
}
|
|
/// <summary>
|
/// 更新托盘物料信息
|
/// </summary>
|
public static void updatePalletAndMateral()
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var lotCarrierList = db.Queryable<LjLotCarrier>().Where(a => a.RECEIVE_FLAG.Trim() == "PENDING").ToList();
|
foreach (var lotCarrier in lotCarrierList)
|
{
|
CntrItemRel cntrItemRel = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == lotCarrier.PALLET_ID).First();
|
|
if (cntrItemRel != null)
|
{
|
cntrItemRel.S_CNTR_CODE = lotCarrier.PALLET_ID;
|
cntrItemRel.S_BATCH_NO = lotCarrier.LOT_NAME;
|
cntrItemRel.S_SERIAL_NO = lotCarrier.YCL_BATCH;
|
cntrItemRel.S_ITEM_CODE = lotCarrier.MATERIALCODE;
|
cntrItemRel.F_QTY = lotCarrier.QTY;
|
cntrItemRel.D_PRD_DATE = lotCarrier.PRODUCTION_DATE;
|
cntrItemRel.S_ITEM_STATE = lotCarrier.QC_STATUS;
|
cntrItemRel.D_EXP_DATE = lotCarrier.SHELFLIFE_DATE;
|
cntrItemRel.D_EXP_DATE1 = lotCarrier.MINSHELFLIFE_DATE;
|
db.Updateable(cntrItemRel).ExecuteCommand();
|
}
|
else
|
{
|
cntrItemRel = new CntrItemRel()
|
{
|
S_CNTR_CODE = lotCarrier.PALLET_ID,
|
S_BATCH_NO = lotCarrier.LOT_NAME,
|
S_SERIAL_NO = lotCarrier.YCL_BATCH,
|
S_ITEM_CODE = lotCarrier.MATERIALCODE,
|
F_QTY = lotCarrier.QTY,
|
D_PRD_DATE = lotCarrier.PRODUCTION_DATE,
|
S_ITEM_STATE = lotCarrier.QC_STATUS,
|
D_EXP_DATE = lotCarrier.SHELFLIFE_DATE,
|
D_EXP_DATE1 = lotCarrier.MINSHELFLIFE_DATE,
|
};
|
db.Insertable(cntrItemRel).ExecuteCommand();
|
}
|
|
lotCarrier.RECEIVE_FLAG = "COMPLETE";
|
lotCarrier.RECEIVE_DATE = DateTime.Now.ToString("yyyy-MM-dd");
|
db.Updateable(lotCarrier).UpdateColumns(a => new { a.RECEIVE_FLAG, a.RECEIVE_DATE }).ExecuteCommand();
|
}
|
}
|
|
/// <summary>
|
/// 更新物料信息
|
/// </summary>
|
public static void updateMateral()
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var materialList = db.Queryable<LjItem>().Where(a => a.RECEIVE_FLAG.Trim() == "PENDING").ToList();
|
foreach (var item in materialList)
|
{
|
TN_Material material = db.Queryable<TN_Material>().Where(a => a.S_ITEM_CODE == item.MATERIAL_CODE).First();
|
|
if (material != null)
|
{
|
material.S_ITEM_CODE = item.MATERIAL_CODE;
|
material.S_ITEM_NAME = item.MATERIAL_NAME;
|
material.S_SPEC = item.SPEC;
|
material.S_MODEL = item.MODEL;
|
material.S_UNIT = item.UNIT;
|
material.S_MEMO = item.MEMO;
|
db.Updateable(material).ExecuteCommand();
|
}
|
else
|
{
|
material = new TN_Material()
|
{
|
S_ITEM_CODE = item.MATERIAL_CODE,
|
S_ITEM_NAME = item.MATERIAL_NAME,
|
S_SPEC = item.SPEC,
|
S_MODEL = item.MODEL,
|
S_UNIT = item.UNIT,
|
S_MEMO = item.MEMO,
|
};
|
db.Insertable(material).ExecuteCommand();
|
}
|
|
item.RECEIVE_FLAG = "COMPLETE";
|
item.RECEIVE_DATE = DateTime.Now.ToString("yyyy-MM-dd");
|
db.Updateable(item).ExecuteCommand();
|
}
|
}
|
|
/// <summary>
|
/// 查询托盘物料信息
|
/// </summary>
|
/// <param name="trayNo"></param>
|
/// <returns></returns>
|
internal static LjLotCarrier getLjCntrMaterial(string trayNo)
|
{
|
// 1.查询MES任务表
|
var db = new SqlHelper<object>().GetInstance();
|
var lotCarrier = db.Queryable<LjLotCarrier>().Where(a => a.PALLET_ID.Trim() == trayNo).First();
|
return lotCarrier;
|
}
|
|
|
/// <summary>
|
/// 查询MES反料任务
|
/// </summary>
|
/// <param name="cntrCode"></param>
|
/// <returns></returns>
|
internal static LjMesTask getLjMesTaskByCntr(string cntrCode)
|
{
|
// 1.查询MES任务表
|
var db = new SqlHelper<object>().GetInstance();
|
var mesTask = db.Queryable<LjMesTask>().Where(a => a.PALLET_ID.Trim() == cntrCode && a.RECEIVE_FLAG.Trim() == "PENDING").OrderByDescending(a => a.T_CREATE).First();
|
return mesTask;
|
}
|
|
/// <summary>
|
/// 查询MES叫料任务
|
/// </summary>
|
/// <param name="positionId"></param>
|
/// <returns></returns>
|
internal static LjMesTask getLjMesTaskByLoc(string positionId)
|
{
|
// 1.查询MES任务表
|
var db = new SqlHelper<object>().GetInstance();
|
var mesTask = db.Queryable<LjMesTask>().Where(a => a.POSITION_ID.Trim() == positionId && a.RECEIVE_FLAG.Trim() == "PENDING").OrderByDescending(a => a.T_CREATE).First();
|
return mesTask;
|
}
|
|
/// <summary>
|
/// 更新MES任务中间表
|
/// </summary>
|
/// <param name="mesTask"></param>
|
/// <returns></returns>
|
internal static bool updateLjMesTask(LjMesTask mesTask)
|
{
|
bool result = false;
|
var db = new SqlHelper<object>().GetInstance();
|
mesTask.RECEIVE_FLAG = "COMPLETE";
|
mesTask.RECEIVE_DATE = DateTime.Now.ToString("yyyy-MM-dd");
|
result = db.Updateable(mesTask).ExecuteCommand() > 0;
|
return result;
|
}
|
|
/// <summary>
|
/// 读取MES叫料任务
|
/// 1.备份容器物料信息
|
/// 2.更新中间表状态为已读
|
/// </summary>
|
/// <param name="taskNo"></param>
|
/// <param name="id"></param>
|
/// <returns></returns>
|
internal static bool readLjMesCallItemTask(string taskNo, int id)
|
{
|
LogHelper.Info( $"读取MES叫料任务,任务号:{taskNo},MES下发任务ID:{id}", "WMS");
|
bool result = false;
|
var db = new SqlHelper<object>().GetInstance();
|
try
|
{
|
db.BeginTran();
|
var mesTask = db.Queryable<LjMesTask>().Where(a => a.ID == id ).OrderByDescending(a => a.T_CREATE).First();
|
if (mesTask != null)
|
{
|
mesTask.AGVORDER_ID = taskNo;
|
mesTask.RETURN_CODE = "1";
|
mesTask.RECEIVE_FLAG = "COMPLETE";
|
mesTask.RECEIVE_DATE = DateTime.Now.ToString("yyyy-MM-dd");
|
result = db.Updateable(mesTask).ExecuteCommand() > 0;
|
}
|
else
|
{
|
LogHelper.Info("未查询到MES下发WMS任务", "WMS");
|
}
|
db.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
db.RollbackTran();
|
LogHelper.Error("读取MES叫料任务,ERROR_MSG:" + ex.Message, ex, "WMS");
|
}
|
return result;
|
}
|
|
/// <summary>
|
/// 查询MES任务表
|
/// </summary>
|
/// <param name="taskNo"></param>
|
/// <returns></returns>
|
public static LjMesTask GetLjMesTaskByAgvorderId(string taskNo) {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<LjMesTask>().Where(a => a.AGVORDER_ID.Trim() == taskNo).First();
|
}
|
|
/// <summary>
|
/// 查询MES任务表
|
/// </summary>
|
/// <param name="mesTaskId"></param>
|
/// <returns></returns>
|
public static LjMesTask GetLjMesTaskById(int mesTaskId)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<LjMesTask>().Where(a => a.ID == mesTaskId).First();
|
}
|
|
/// <summary>
|
/// 查询MES任务表
|
/// </summary>
|
/// <param name="receiveFlag">已读标识</param>
|
/// <returns></returns>
|
public static List<LjMesTask> GetLjMesTaskList(string receiveFlag )
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<LjMesTask>().Where(a => a.RECEIVE_FLAG.Trim() == receiveFlag ).ToList();
|
}
|
|
/// <summary>
|
/// 更新MES任务状态
|
/// </summary>
|
/// <param name="taskNo"></param>
|
/// <param name="status">0:默认值 1:任务已生成 2:任务运行中 3:任务完成 4:任务失败 5:任务取消 6:其他错误 等</param>
|
/// <param name="msg"></param>
|
/// <returns></returns>
|
public static bool updateMesTaskStatus(string taskNo, string status, string msg = "")
|
{
|
bool result = false;
|
var db = new SqlHelper<object>().GetInstance();
|
result = db.Updateable<LjMesTask>().SetColumns(a => new LjMesTask() { RETURN_CODE = status , RECEIVE_MSG = msg}).Where(a => a.AGVORDER_ID.Trim() == taskNo).ExecuteCommand() > 0;
|
return result;
|
}
|
|
/// <summary>
|
/// 更新出库任务中间表状态
|
/// </summary>
|
/// <param name="taskNo"></param>
|
/// <param name="status">1:执行中,2:完成 等</param>
|
/// <returns></returns>
|
public static bool updateMesOutTaskStatus(int taskNo, string status)
|
{
|
bool result = false;
|
var db = new SqlHelper<object>().GetInstance();
|
result = db.Updateable<LjLotOutTask>().SetColumns(a => new LjLotOutTask() { TASK_STATUS = status }).Where(a => a.ID == taskNo).ExecuteCommand() > 0;
|
return result;
|
}
|
|
/// <summary>
|
/// 添加库存表
|
/// </summary>
|
/// <param name="ljLotOnhand"></param>
|
/// <returns></returns>
|
public static bool addLjLotOnhand(LjLotOnhand ljLotOnhand) {
|
bool result = false;
|
var db = new SqlHelper<object>().GetInstance();
|
ljLotOnhand.CREATION_DATE = DateTime.Now;
|
result = db.Insertable<LjLotOnhand>(ljLotOnhand).ExecuteCommand()>0;
|
return result;
|
}
|
|
/// <summary>
|
/// 添加出库任务记录
|
/// </summary>
|
/// <param name="locCode"></param>
|
/// <returns></returns>
|
public static bool addLotOutTask(string locCode) {
|
bool result = false;
|
var db = new SqlHelper<object>().GetInstance();
|
var locCntrs = LocationHelper.GetLocCntr(locCode);
|
if (locCntrs != null && locCntrs.Count > 0)
|
{
|
LjLotOutTask ljLotOutTask = new LjLotOutTask()
|
{
|
PALLET_ID = locCntrs[0].S_CNTR_CODE,
|
POSITION_ID = locCntrs[0].S_LOC_CODE,
|
CREATION_DATE = DateTime.Now.ToString("yyyy-MM-dd"),
|
TASK_STATUS = "1" // 1.执行中
|
};
|
|
var cntrItems = ContainerHelper.GetCntrItemRel(locCntrs[0].S_CNTR_CODE);
|
if (cntrItems != null && cntrItems.Count > 0)
|
{
|
ljLotOutTask.MATERIAL_CODE = cntrItems[0].S_ITEM_CODE;
|
ljLotOutTask.LOT_NAME = cntrItems[0].S_BATCH_NO;
|
ljLotOutTask.QC_STATUS = cntrItems[0].S_ITEM_STATE;
|
ljLotOutTask.UNIT = cntrItems[0].S_UOM;
|
ljLotOutTask.QTY = (int)cntrItems[0].F_QTY;
|
}
|
result = db.Insertable<LjLotOutTask>(ljLotOutTask).ExecuteCommand() > 0;
|
}
|
return result;
|
}
|
|
/// <summary>
|
/// 更新出库任务记录
|
/// </summary>
|
/// <param name="cntrCode"></param>
|
/// <param name="status"></param>
|
/// <returns></returns>
|
public static bool updateLotOutTask(string cntrCode,string status)
|
{
|
bool result = false;
|
var db = new SqlHelper<object>().GetInstance();
|
var ljLotOutTask = db.Queryable<LjLotOutTask>().Where(a => a.PALLET_ID == cntrCode && a.TASK_STATUS == "1").OrderByDescending(a => a.T_CREATE).First();
|
if (ljLotOutTask != null) {
|
ljLotOutTask.TASK_STATUS = status;
|
result = db.Updateable<LjLotOutTask>(ljLotOutTask).ExecuteCommand()>0;
|
}
|
return result;
|
}
|
|
// -----------------------------------------斜裁中间表----------------------------------------------
|
|
|
/// <summary>
|
/// 下发XC任务
|
/// </summary>
|
/// <param name="mesTaksId"></param>
|
/// <returns></returns>
|
public static bool addLjXcTask(int mesTaksId)
|
{
|
bool result = false;
|
var db = new SqlHelper<object>().GetInstance();
|
var ljMesTask = GetLjMesTaskById(mesTaksId);
|
if (ljMesTask != null) {
|
LjXcTask ljXcTask = new LjXcTask() {
|
ID = ljMesTask.ID,
|
POSITION_ID = ljMesTask.POSITION_ID,
|
RETURN_CODE = ljMesTask.RETURN_CODE,
|
MSG_TYPE = ljMesTask.MSG_TYPE,
|
PALLET_TYPE = ljMesTask.PALLET_TYPE,
|
MATERIAL_NAME = ljMesTask.MATERIAL_NAME,
|
MATERIAL_CODE = ljMesTask.MATERIAL_CODE,
|
QTY = ljMesTask.QTY,
|
YCL_BATCH = ljMesTask.YCL_BATCH,
|
PALLET_ID = ljMesTask.PALLET_ID,
|
AGVORDER_ID = ljMesTask.AGVORDER_ID,
|
CREATION_DATE = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
RECEIVE_FLAG = ljMesTask.RECEIVE_FLAG,
|
EQP = ljMesTask.EQP,
|
PLAN_ID = ljMesTask.PLAN_ID
|
};
|
result = db.Insertable<LjXcTask>(ljXcTask).ExecuteCommand() > 0;
|
}
|
return result;
|
}
|
|
|
/// <summary>
|
/// 查询斜裁任务表
|
/// </summary>
|
/// <param name="mesTaskId"></param>
|
/// <returns></returns>
|
public static LjXcTask GetLjXcTaskById(int mesTaskId)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<LjXcTask>().Where(a => a.ID == mesTaskId).First();
|
}
|
|
/// <summary>
|
/// 查询斜裁出库任务表
|
/// </summary>
|
/// <param name="taskStatus"></param>
|
/// <param name="receiveFlag"></param>
|
/// <returns></returns>
|
public static List<LjXcOutTask> getLjXcOutTask(string receiveFlag ,string taskStatus)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<LjXcOutTask>().Where(a => a.RECEIVE_FLAG == receiveFlag && a.TASK_STATUS == taskStatus).ToList();
|
}
|
|
}
|
}
|