杨前锦
2025-07-07 c8f338feee0b6003d8f069b1d37fd9b90dd1b7f4
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/WMSHelper.cs
@@ -11,6 +11,7 @@
using System.Globalization;
using System.Linq;
using System.Linq.Expressions;
using System.Numerics;
using System.Reflection;
using System.Runtime.ConstrainedExecution;
using System.Threading.Tasks;
@@ -135,7 +136,13 @@
            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 void UpdateWmsTask(WMSTask task)
        {
            var db = new SqlHelper<object>().GetInstance();
            task.T_MODIFY = DateTime.Now;
            db.Updateable<WMSTask>(task).ExecuteCommand();
        }
        internal static bool UpdateTaskEnd(WMSTask a) {
            var db = new SqlHelper<object>().GetInstance();
@@ -271,14 +278,14 @@
        /// </summary>
        /// <param name="itemCode"></param>
        /// <returns></returns>
        public static List<CntrItemRel> getZZKInventoryInfo(string itemCode)
        public static DateTime getZZKInventoryInfo(string itemCode)
        {
            DateTime inboundTime = DateTime.MinValue;
            var db = new SqlHelper<object>().GetInstance();
            List < CntrItemRel > cntrItemRels = new List<CntrItemRel>();
            string areaCode = Settings.areaPropertyList.Where(a => a.areaName.Contains("中转库")).Select(a => a.areaCode).FirstOrDefault();
            if (areaCode != null) 
            {
                cntrItemRels = db.Queryable<CntrItemRel>()
                    inboundTime = db.Queryable<CntrItemRel>()
                    .LeftJoin<LocCntrRel>((a, b) => a.S_CNTR_CODE == b.S_CNTR_CODE)
                    .LeftJoin<Location>((a, b, c) => b.S_LOC_CODE == c.S_CODE)
                    .LeftJoin<Container>((a, b, c, d) => a.S_CNTR_CODE == d.S_CODE)
@@ -289,9 +296,10 @@
                                            && d.N_E_STATE == 0             // 托盘正常
                    )
                    .OrderBy((a, b, c, d) => a.T_INBOUND_TIME)
                    .ToList();
                    .Select((a, b, c, d) => a.T_INBOUND_TIME)
                    .First();
            }
            return cntrItemRels;
            return inboundTime;
        }
        /// <summary>
@@ -314,9 +322,14 @@
                .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 != "")
            if (areaCode != null && areaCode != "")
            {
                queryable = queryable.Where((a, b, c, d ) => a.S_AREA_CODE.Trim() == areaCode);
                queryable = queryable.Where((a, b, c, d) => a.S_AREA_CODE.Trim() == areaCode);
            }
            else
            {
                List<string> areaCodes = Settings.areaPropertyList.Select(a => a.areaCode).ToList();
                queryable = queryable.Where((a, b, c, d) => areaCodes.Contains(a.S_AREA_CODE.Trim()));
            }
            if (traySatus == 0)
            {
@@ -428,7 +441,7 @@
            return location;
        }
        public static bool addAlarmRecord(string alarmType , string alarmLevel ,string alarmMsg ,string logSite = "WMS") {
        public static bool addAlarmRecord(string alarmType  , string alarmLevel ,string alarmMsg ,string logSite = "WMS") {
            var db = new SqlHelper<object>().GetInstance();
            bool result = true;
            LogHelper.Info(alarmMsg, logSite);
@@ -506,26 +519,6 @@
        /// <summary>
        /// 查询接驳位关联属性
        /// 注:
        /// 1.查询异常区货位
        /// </summary>
        /// <param name="areaCode">库区</param>
        /// <param name="property">货位属性(1.直连 2.非直连)</param>
        /// <param name="type">动作类型(0.人工接驳位 1.入库接驳位 2.出库接驳位)</param>
        /// <returns></returns>
        public static Location GetTransfeRelevanceLoc(string areaCode  ,int type ,int property )
        {
            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.N_PROPERTY == property && b.N_TYPE == type && 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="isManual">货位属性 (0.非人工 1.人工)</param>
@@ -543,16 +536,15 @@
        /// 注:查询任务最少的接驳位
        /// </summary>
        /// <param name="areaCode">库区</param>
        /// <param name="property">货位属性 ( 1.直连 2.非直连)</param>
        /// <param name="type">动作类型 (1.入库接驳位  2.出库接驳位)</param>
        /// <returns></returns>
        public static Location GetMinTaskTransfeLoc(string areaCode ,int type, int property)
        public static Location GetMinTaskTransfeLoc(string areaCode ,int type)
        {
            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.N_TYPE == type && b.N_PROPERTY == property  && a.N_LOCK_STATE < 3 && a.C_ENABLE == "Y")
                .Where((a, b, c) => b.S_RELE_AREA.Trim() == areaCode  && b.N_TYPE == type && 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),
@@ -601,46 +593,140 @@
        /// <summary>
        /// 读取MES下料任务
        /// 1.备份容器物料信息
        /// 2.更新中间表状态为已读
        /// 1.读取MES下发任务表
        /// 2.读取托盘物料信息表
        /// 3.读取基础物料信息表
        /// </summary>
        /// <param name="taskNo"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        internal static LjMesTask readLjMesOffItemTask(string taskNo , int id)
        internal static bool readLjMesOffItemTask(string taskNo , int id)
        {
            bool res = true;
            LogHelper.Info($"查询到MES下发WMS任务,mesTaskId:{id},任务号:{taskNo}"  , "WMS");
            var db = new SqlHelper<object>().GetInstance();
            try
            {
                db.BeginTran();
                // 1.查询MES任务表
                // 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();
                    // 2.读取托盘物料信息表
                    res = updateCarrier(mesTask.PALLET_ID);
                    if (res)
                    {
                        mesTask.AGVORDER_ID = taskNo;
                        mesTask.RETURN_CODE = "1";
                        mesTask.RECEIVE_FLAG = "COMPLETE";
                        mesTask.RECEIVE_DATE = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                        db.Updateable(mesTask).ExecuteCommand();
                    }
                }
                else 
                {
                    LogHelper.Info("未查询到MES下发WMS任务", "WMS");
                    WMSHelper.addAlarmRecord("流程异常", "中", $"未查询到MES下发的任务,MES任务ID:{id}");
                }
                db.CommitTran();
                return mesTask;
            }
            catch (Exception ex)
            {
                res = false;
                db.RollbackTran();
                LogHelper.Info($"读取MES下发任务失败,错误原因:{ex.Message}" , "WMS");
                WMSHelper.addAlarmRecord("系统错误", "高", $"读取MES下发任务失败,错误原因:{ex.Message}");
            }
            return null;
            return res;
        }
        public static bool updateCarrier(string palletId)
        {
            bool res = true;
            var db = new SqlHelper<object>().GetInstance();
            var container = ContainerHelper.GetCntr(palletId);
            if (container != null)
            {
                // 1.读取托盘物料信息表
                var lotCarrier = db.Queryable<LjLotCarrier>().Where(a => a.RECEIVE_FLAG.Trim() == "PENDING" && a.PALLET_ID == palletId).OrderByDescending(a => a.CREATION_DATE).First();
                if (lotCarrier != null)
                {
                    CntrItemRel cntrItemRel = db.Queryable<CntrItemRel>().Where(a => a.S_CNTR_CODE == palletId).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();
                    // 读取基础物料信息表
                    var material = db.Queryable<LjItem>().Where(a => a.RECEIVE_FLAG.Trim() == "PENDING" && a.MATERIAL_CODE == lotCarrier.MATERIALCODE).OrderByDescending(a => a.CREATION_DATE).First();
                    if (material != null)
                    {
                        TN_Material tn_material = db.Queryable<TN_Material>().Where(a => a.S_ITEM_CODE == material.MATERIAL_CODE).First();
                        if (tn_material != null)
                        {
                            tn_material.S_ITEM_CODE = material.MATERIAL_CODE;
                            tn_material.S_ITEM_NAME = material.MATERIAL_NAME;
                            tn_material.S_SPEC = material.SPEC;
                            tn_material.S_MODEL = material.MODEL;
                            tn_material.S_UNIT = material.UNIT;
                            tn_material.S_MEMO = material.MEMO;
                            db.Updateable(material).ExecuteCommand();
                        }
                        else
                        {
                            tn_material = new TN_Material()
                            {
                                S_ITEM_CODE = material.MATERIAL_CODE,
                                S_ITEM_NAME = material.MATERIAL_NAME,
                                S_SPEC = material.SPEC,
                                S_MODEL = material.MODEL,
                                S_UNIT = material.UNIT,
                                S_MEMO = material.MEMO,
                            };
                            db.Insertable(material).ExecuteCommand();
                        }
                        material.RECEIVE_FLAG = "COMPLETE";
                        material.RECEIVE_DATE = DateTime.Now.ToString("yyyy-MM-dd");
                        db.Updateable(material).ExecuteCommand();
                    }
                }
            }
            else
            {
                WMSHelper.addAlarmRecord("流程异常", "中", $"未在WMS系统中查询到容器信息,容器编码:{palletId}");
                res = false;
            }
            return res;
        }
        /// <summary>
@@ -652,6 +738,7 @@
            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)
@@ -738,7 +825,6 @@
        /// <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;
@@ -869,6 +955,28 @@
        }
        /// <summary>
        /// 查询MES任务表(环带)
        /// </summary>
        /// <returns></returns>
        public static List<LjMesTask> GetLjMesTaskListHD()
        {
            var db = new SqlHelper<object>().GetInstance();
            return db.Queryable<LjMesTask>().Where(a => (a.PALLET_TYPE == "5" || a.PALLET_TYPE == "6") && (a.RETURN_CODE.Trim() == "0" || a.RETURN_CODE.Trim() == "1" || a.RETURN_CODE.Trim() == "2")).ToList();
        }
        /// <summary>
        /// 更新MES任务状态
        /// </summary>
        /// <returns></returns>
        public static bool updateMesTaskStatus(LjMesTask mesTask)
        {
            bool result = false;
            var db = new SqlHelper<object>().GetInstance();
            result = db.Updateable<LjMesTask>(mesTask).ExecuteCommand() > 0;
            return result;
        }
        /// <summary>
        /// 更新MES任务状态
        /// </summary>
        /// <param name="taskNo"></param>
@@ -963,9 +1071,20 @@
        // -----------------------------------------斜裁中间表----------------------------------------------
        /// <summary>
        /// 更新MES任务状态
        /// </summary>
        /// <returns></returns>
        public static bool updateXcTaskStatus(LjXcTask xcTask)
        {
            bool result = false;
            var db = new SqlHelper<object>().GetInstance();
            result = db.Updateable<LjXcTask>(xcTask).ExecuteCommand() > 0;
            return result;
        }
        /// <summary>
        /// 下发XC任务
        /// 将MES下发任务、托盘物料信息 转发给斜裁
        /// </summary>
        /// <param name="mesTask"></param>
        /// <returns></returns>
@@ -974,6 +1093,37 @@
            bool result = false;
            var db = new SqlHelper<object>().GetInstance();
            if (mesTask != null) {
                if (mesTask.MSG_TYPE == "1")
                {
                    // 转发托盘物料信息
                    var ljLotCarrier = db.Queryable<LjLotCarrier>().Where(a => a.PALLET_ID == mesTask.PALLET_ID && a.RECEIVE_FLAG == "PENDING").OrderByDescending(a => a.CREATION_DATE).First();
                    if (ljLotCarrier != null)
                    {
                        LjXcCarrier ljXcCarrier = new LjXcCarrier()
                        {
                            ID = ljLotCarrier.ID,
                            PALLET_ID = ljLotCarrier.PALLET_ID,
                            LOT_NAME = ljLotCarrier.LOT_NAME,
                            YCL_BATCH = ljLotCarrier.YCL_BATCH,
                            MATERIALCODE = ljLotCarrier.MATERIALCODE,
                            QTY = ljLotCarrier.QTY,
                            PRODUCTION_DATE = ljLotCarrier.PRODUCTION_DATE,
                            QC_STATUS = ljLotCarrier.QC_STATUS,
                            SHELFLIFE_DATE = ljLotCarrier.SHELFLIFE_DATE,
                            MINSHELFLIFE_DATE = ljLotCarrier.MINSHELFLIFE_DATE,
                            CREATION_DATE = ljLotCarrier.CREATION_DATE,
                            RECEIVE_FLAG = ljLotCarrier.RECEIVE_FLAG,
                        };
                        var bo = db.Insertable<LjXcCarrier>(ljXcCarrier).ExecuteCommand() > 0;
                        if (bo)
                        {
                            ljLotCarrier.RECEIVE_FLAG = "COMPLETE";
                            ljLotCarrier.RECEIVE_DATE = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                            db.Updateable<LjLotCarrier>(ljLotCarrier).ExecuteCommand();
                        }
                    }
                }
                LjXcTask ljXcTask = new LjXcTask() { 
                    ID = mesTask.ID,
                    POSITION_ID = mesTask.POSITION_ID,
@@ -992,6 +1142,13 @@
                    PLAN_ID = mesTask.PLAN_ID
                };
                result = db.Insertable<LjXcTask>(ljXcTask).ExecuteCommand() > 0;
                if (result)
                {
                    mesTask.RETURN_CODE = "1";
                    mesTask.RECEIVE_FLAG = "COMPLETE";
                    mesTask.RECEIVE_DATE = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    db.Updateable<LjMesTask>(mesTask).ExecuteCommand();
                }
            }
            return result;
        }