杨前锦
2025-06-19 d42ad8b01195def2a9309930e14f90ff13ad47b1
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/WMSHelper.cs
@@ -33,6 +33,10 @@
            var date = DateTime.Now.ToString("yyMMdd");
            return $"SO{date}{id.ToString().PadLeft(4, '0')}";
        }
        internal static int GenerateStockRecordNo()
        {
            return SYSHelper.GetSerialNumber("库存记录号", "SR");
        }
        internal static string GenerateAlarmNo()
        {
@@ -165,18 +169,39 @@
        }
        /// <summary>
        ///
        /// 查询成型机返料货位
        /// </summary>
        /// <param name="locCode"></param>
        /// <returns></returns>
        public static string getReturnMaterialLocCode(string locCode)
        public static SideLocConfig 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 db.Queryable<SideLocConfig>().Where(a => a.S_LOC_CODE.Trim() == locCode).First();
        }
        /// <summary>
        /// 查询成型机叫料位
        /// </summary>
        /// <param name="jtNo"></param>
        /// <returns></returns>
        public static Location getCallMaterialLocCode(string jtNo)
        {
            var db = new SqlHelper<object>().GetInstance();
            Location loc = null;
            var returnMaterialLocs = db.Queryable<SideLocConfig>().Where(a => a.EQP.Trim() == jtNo).ToList();
            if (returnMaterialLocs.Count > 0)
            {
                foreach (var item in returnMaterialLocs)
                {
                    loc = LocationHelper.GetLoc(item.S_LOC_CODE);
                    if (loc.N_CURRENT_NUM == 0 && loc.N_LOCK_STATE == 0)
                    {
                        break;
                    }
                }
            }
            return null;
            return loc;
        }
        // --------------------------------------------------------福建佳通-----------------------------------------
@@ -239,6 +264,34 @@
                .OrderBy(a => a.S_PRI)
                .First();
            return logicConfig;
        }
        /// <summary>
        /// 查询某个物料在中转库的库存信息
        /// </summary>
        /// <param name="itemCode"></param>
        /// <returns></returns>
        public static List<CntrItemRel> getZZKInventoryInfo(string itemCode)
        {
            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>()
                    .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)
                    .Where((a, b, c, d) => c.S_AREA_CODE == areaCode
                                            && c.N_CURRENT_NUM == 1
                                            && c.N_LOCK_STATE == 0
                                            && a.S_ITEM_CODE == itemCode
                                            && d.N_E_STATE == 0             // 托盘正常
                    )
                    .OrderBy((a, b, c, d) => a.T_INBOUND_TIME)
                    .ToList();
            }
            return cntrItemRels;
        }
        /// <summary>
@@ -307,7 +360,7 @@
                string S_ZONE_CLS_CODE = "";
                if (trayStatus == 0)
                {
                    S_ZONE_CLS_CODE = "KGZ";
                    S_ZONE_CLS_CODE = "KT";
                }
                else if (trayStatus == 1)
                {
@@ -346,10 +399,6 @@
                              .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;
                            }
                        }
                    }
@@ -369,7 +418,7 @@
                                 .OrderBy((a, b, c) => a.N_LAYER)
                                 .First();
                }
                LogHelper.Info($"查询结束,立库终点货位:{location}","WMS");
                LogHelper.Info($"查询结束,立库终点货位:{JsonConvert.SerializeObject(location)}","WMS");
            }
            catch (Exception ex) 
            {
@@ -381,26 +430,52 @@
        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);
            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;
            var alarmRecord = db.Queryable<AlarmRecord>().Where(a => a.N_IS_READ == 0 && a.S_ALARM_MSG == alarmMsg).First();
            if (alarmRecord == null)
            {
                alarmRecord = new AlarmRecord()
                {
                    S_ALARM_CODE = GenerateAlarmNo(),
                    S_ALARM_TYPE = alarmType,
                    S_ALARM_LEVEL = alarmLevel,
                    S_ALARM_MSG = alarmMsg,
                    S_FILE_NAME = logSite,
                };
                result = db.Insertable<AlarmRecord>(alarmRecord).ExecuteCommand() > 0;
            }
            else
            {
                alarmRecord.T_MODIFY = DateTime.Now;
                result = db.Updateable<AlarmRecord>(alarmRecord).ExecuteCommand() > 0;
            }
            return result;
        }
        public static bool addRfidAnomalyRecord(string rfid ,int anomalyType ,string locCode ,string taskNo)
        {
            var db = new SqlHelper<object>().GetInstance();
            RfidAnomalyRecord anomalyRecord = new RfidAnomalyRecord()
            {
                S_RFID = rfid,
                N_ANOMALY_TYPE = anomalyType,
                S_ANOMALY_TYPE = RfidAnomalyRecord.getAnomalyType(anomalyType),
                S_LOC_CODE = locCode,
                S_TASK_NO = taskNo
            };
            return db.Insertable<RfidAnomalyRecord>(anomalyRecord).ExecuteCommand() > 0;
        }
        /// <summary>
        /// 查询成型机线边
        /// </summary>
        /// <param name="locCode"></param>
        /// <param name="jtNo"></param>
        /// <returns></returns>
        public static SideLocConfig GetLineSideLoc(string locCode)
        public static SideLocConfig GetLineSideLoc(string jtNo)
        {
            var db = new SqlHelper<object>().GetInstance();
            return db.Queryable<SideLocConfig>().Where(a => a.S_LOC_CODE.Trim() == locCode).First();
            return db.Queryable<SideLocConfig>().Where(a => a.EQP.Trim() == jtNo).First();
        }
        /// <summary>
@@ -435,17 +510,16 @@
        /// 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>
        /// <param name="property">货位属性(1.直连 2.非直连)</param>
        /// <param name="type">动作类型(0.人工接驳位 1.入库接驳位 2.出库接驳位)</param>
        /// <returns></returns>
        public static Location GetTransfeRelevanceLoc(string areaCode , string type ,string actType = "0" ,string property = "2" )
        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.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")
                .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;
        }
@@ -454,13 +528,13 @@
        /// 查询接驳位关联属性
        /// </summary>
        /// <param name="locCode"></param>
        /// <param name="property">货位属性 (1.直连 2.非直连、3.人工 、4.固定站台)</param>
        /// <param name="isManual">货位属性 (0.非人工 1.人工)</param>
        /// <returns></returns>
        public static bool updateTransfeLocProperty(string locCode ,string property)
        public static bool updateTransfeLocProperty(string locCode ,int isManual)
        {
            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;
            result = db.Updateable<TransfeRelevance>().SetColumns(a => new TransfeRelevance() { N_IS_MANUAL = isManual } ).Where(a => a.S_LOC_CODE.Trim() == locCode).ExecuteCommand() > 0;
            return result;
        }
@@ -469,17 +543,16 @@
        /// 注:查询任务最少的接驳位
        /// </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>
        /// <param name="property">货位属性 ( 1.直连 2.非直连)</param>
        /// <param name="type">动作类型 (1.入库接驳位  2.出库接驳位)</param>
        /// <returns></returns>
        public static Location GetMinTaskTransfeLoc(string areaCode , string type ,string actType, string property = "2")
        public static Location GetMinTaskTransfeLoc(string areaCode ,int type, int property)
        {
            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")
                .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")
                .GroupBy((a, b, c) => a.S_CODE)
                .Select((a, b, c) => new {
                    count = SqlFunc.AggregateCount(c.S_END_LOC),
@@ -686,7 +759,20 @@
        }
        /// <summary>
        /// 查询MES叫料任务
        /// 根据机台号查询MES任务
        /// </summary>
        /// <param name="jtNo"></param>
        /// <returns></returns>
        internal static LjMesTask getLjMesTaskByJtNo(string jtNo)
        {
            // 1.查询MES任务表
            var db = new SqlHelper<object>().GetInstance();
            var mesTask = db.Queryable<LjMesTask>().Where(a => a.EQP.Trim() == jtNo && a.RECEIVE_FLAG.Trim() == "PENDING").OrderByDescending(a => a.T_CREATE).First();
            return mesTask;
        }
        /// <summary>
        /// 根据点位编号查询MES叫料任务
        /// </summary>
        /// <param name="positionId"></param>
        /// <returns></returns>
@@ -707,8 +793,6 @@
        {
            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;
        }
@@ -883,30 +967,29 @@
        /// <summary>
        /// 下发XC任务
        /// </summary>
        /// <param name="mesTaksId"></param>
        /// <param name="mesTask"></param>
        /// <returns></returns>
        public static bool addLjXcTask(int mesTaksId)
        public static bool addLjXcTask(LjMesTask mesTask)
        {
            bool result = false;
            var db = new SqlHelper<object>().GetInstance();
            var ljMesTask = GetLjMesTaskById(mesTaksId);
            if (ljMesTask != null) {
            if (mesTask != 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,
                    ID = mesTask.ID,
                    POSITION_ID = mesTask.POSITION_ID,
                    RETURN_CODE = mesTask.RETURN_CODE,
                    MSG_TYPE = mesTask.MSG_TYPE,
                    PALLET_TYPE = mesTask.PALLET_TYPE,
                    MATERIAL_NAME = mesTask.MATERIAL_NAME,
                    MATERIAL_CODE = mesTask.MATERIAL_CODE,
                    QTY = mesTask.QTY,
                    YCL_BATCH = mesTask.YCL_BATCH,
                    PALLET_ID = mesTask.PALLET_ID,
                    AGVORDER_ID = mesTask.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
                    RECEIVE_FLAG = mesTask.RECEIVE_FLAG,
                    EQP = mesTask.EQP,
                    PLAN_ID = mesTask.PLAN_ID
                };
                result = db.Insertable<LjXcTask>(ljXcTask).ExecuteCommand() > 0;
            }