杨前锦
2025-07-07 c8f338feee0b6003d8f069b1d37fd9b90dd1b7f4
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/wms/WMSHelper.cs
@@ -1,4 +1,5 @@
using HH.WCS.Mobox3.YNJT_BZP.api;
using HH.WCS.Mobox3.YNJT_BZP.dispatch;
using HH.WCS.Mobox3.YNJT_BZP.models;
using HH.WCS.Mobox3.YNJT_BZP.models.other;
using HH.WCS.Mobox3.YNJT_BZP.util;
@@ -6,6 +7,7 @@
using NLog.Fluent;
using SqlSugar;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
@@ -419,25 +421,37 @@
            return result;
        }
       /// <summary>
       /// 获取空托开始货位
       /// </summary>
       /// <param name="trayType"></param>
       /// <returns></returns>
        public static Location GetEmptyTrayStartLoc(int trayType)
        /// <summary>
        /// 获取空托开始货位
        /// </summary>
        /// <param name="trayType"></param>
        /// <param name="exclude">是否排除母拖缓存位 0.不排除 1.排除</param>
        /// <returns></returns>
        public static Location GetEmptyTrayStartLoc(int trayType ,int exclude = 1)
        {
            Location result = null;
            try
            {
                // 1、查询当前库区-排-物料 有托盘的货位
                var db = new SqlHelper<object>().GetInstance();
                result = db.Queryable<Location>()
                var query = 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.S_AREA_CODE == Settings.storeAreaCode && (trayType == 0 && a.N_CURRENT_NUM == 1 || trayType > 0 && a.N_CURRENT_NUM > 0) && a.N_LOCK_STATE == 0 && (a.C_ENABLE != "禁用" && a.C_ENABLE != "N") && c.N_TYPE == trayType && d.S_ITEM_CODE == null)
                     .OrderByDescending((a, b, c, d) => a.N_LAYER)
                     .First();
                     .LeftJoin<CntrItemRel>((a, b, c, d) => c.S_CODE == d.S_CNTR_CODE)
                     .Where((a, b, c, d) => a.S_AREA_CODE == Settings.storeAreaCode && (trayType == 0 && a.N_CURRENT_NUM == 1 || trayType > 0 && a.N_CURRENT_NUM > 0) && a.N_LOCK_STATE == 0 && (a.C_ENABLE != "禁用" && a.C_ENABLE != "N") && c.N_TYPE == trayType && d.S_ITEM_CODE == null);
                if (exclude == 1)
                {
                    List<string> bufferInLocs = Settings.baseTrayBufferLocList.Select(a => a.bufferInLoc).ToList();
                    query = query.Where((a, b, c, d) =>  !bufferInLocs.Contains(a.S_CODE));
                }
                else
                {
                    List<string> bufferInLocs = Settings.baseTrayBufferLocList.Select(a => a.bufferInLoc).ToList();
                    query = query.OrderByDescending((a, b, c, d) => bufferInLocs.Contains(a.S_CODE));
                }
                result = query.OrderByDescending((a, b, c, d) => a.N_LAYER).First();
            }
            catch (Exception ex)
            {
@@ -488,8 +502,9 @@
        /// </summary>
        /// <param name="itemCode"></param>
        /// <param name="jbLoc"></param>
        /// <param name="trayCode"></param>
        /// <returns></returns>
        public static Location GetoutStockStartLoc(string itemCode ,string jbLoc = null)
        public static Location GetoutStockStartLoc(string itemCode ,string trayCode = null ,string jbLoc = null)
        {
            LogHelper.Info("【获取出库开始货位】", "WMS");
            var db = new SqlHelper<object>().GetInstance();
@@ -510,6 +525,11 @@
                                    && c.S_EFFECTIVE_TIME != null
                                    && c.S_EXPIRATION_TIME != null
                                    );
                if (trayCode != null)
                {
                    query = query.Where((a, b, c) => c.S_CNTR_CODE == trayCode);
                }
                if (jbLoc != null) 
                {
@@ -534,12 +554,16 @@
        /// <summary>
        /// 获取入库终点货位
        /// 入库策略
        /// 1.巷道均衡
        /// 2.物料均衡
        /// </summary>
        /// <param name="locCode"></param>
        /// <param name="trayType"></param>
        /// <param name="inWay">入库方式 1.自动入库 2.人工入库</param>
        /// <param name="itemCode">物料编码</param>
        /// <returns></returns>
        public static Location GetInstockEndLoc(int trayType , string locCode = null , int inWay = 1)
        public static Location GetInstockEndLoc(int trayType , string locCode = null , int inWay = 1 ,string itemCode = null)
        {
            LogHelper.Info("【获取入库终点货位】开始获取入库终点货位", "WMS");
            var db = new SqlHelper<object>().GetInstance();
@@ -604,7 +628,6 @@
                    LogHelper.Info($"【获取入库终点货位】满足条件的空货位数量:{locList.Count}", "WMS");
                }
                LogHelper.Info($"【获取入库终点货位】开始查询巷道的容积率", "WMS");
                var roadwayVolumeList = db.Queryable<Location>()
                    .Where(a =>  a.N_CURRENT_NUM == 0 && a.S_AREA_CODE == Settings.storeAreaCode && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y" && roadwayList.Contains(a.N_ROADWAY) && layerList.Contains(a.N_LAYER))
@@ -612,21 +635,39 @@
                    .Select(a => new { roadway = a.N_ROADWAY , num = SqlFunc.AggregateDistinctCount(a.S_CODE)})
                    .OrderBy(a => a.num)
                    .ToList();
                LogHelper.Info($"【获取入库终点货位】查询巷道的容积率,并按从大到小排序:{JsonConvert.SerializeObject(roadwayVolumeList)}", "WMS");
                LogHelper.Info($"【获取入库终点货位】查询巷道的容积率,并按从小到大排序:{JsonConvert.SerializeObject(roadwayVolumeList)}", "WMS");
                Dictionary<int,int> roadwayDic = new Dictionary<int,int>();
                foreach (var item in roadwayVolumeList)
                {
                    roadwayDic.Add(item.roadway, item.num);
                }
                LogHelper.Info($"【获取入库终点货位】开始查询巷道的同物料数量", "WMS");
                var roadwayItemNumList = db.Queryable<Location>()
                    .LeftJoin<LocCntrRel>((a,b) => a.S_CODE == b.S_LOC_CODE)
                    .LeftJoin<CntrItemRel>((a,b,c) => b.S_CNTR_CODE == c.S_CNTR_CODE )
                    .Where((a, b, c) => a.S_AREA_CODE == Settings.storeAreaCode && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y" && roadwayList.Contains(a.N_ROADWAY) && layerList.Contains(a.N_LAYER))
                    .GroupBy((a, b, c) => a.N_ROADWAY)
                    .Select((a, b, c) => new { roadway = a.N_ROADWAY, volumNum = SqlFunc.AggregateDistinctCount(c.S_ITEM_CODE == itemCode) })
                    .ToList();
                LogHelper.Info($"【获取入库终点货位】查询巷道的同物料数量,并按从小到到排序:{JsonConvert.SerializeObject(roadwayItemNumList)}", "WMS");
                roadwayItemNumList = roadwayItemNumList.OrderBy(a => a.volumNum).ThenBy(a => roadwayDic[a.roadway]).ToList();
                if (inWay == 1)
                {
                    LogHelper.Info($"【获取入库终点货位】开始循环查询巷道对应接驳位的状态", "WMS");
                    foreach (var roadwayVolume in roadwayVolumeList)
                    foreach (var roadwayVolume in roadwayItemNumList)
                    {
                        int roadway = 0;
                        if (roadwayVolume != null)
                        {
                            roadway = roadwayVolume.roadway;
                        }
                        int roadway = roadwayVolume.roadway;
                        LogHelper.Info($"【获取入库终点货位】查询巷道内堆垛机的设备状态", "WMS");
                        var agvJbLocList = Settings.getAgvJBLocList(inWay, roadway, 1);
                        List<string> deviceNos = new List<string>() { roadway.ToString()};
                        LogHelper.Info($"调用WCS的设备状态查询接口,参数:{deviceNos}", "WMS");
                        var deviceStatuses = WCSDispatch.getDeviceStatus(deviceNos);
                        var agvJbLocList = Settings.getAgvJBLocList( roadway, 1);
                        if (agvJbLocList.Count > 0)
                        {
                            foreach (var agvLocCode in agvJbLocList)
@@ -691,6 +732,12 @@
            return db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.errorBufferArea && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First();
        }
        /// <summary>
        /// 获取库区排的货位列表
        /// </summary>
        /// <param name="area"></param>
        /// <param name="row"></param>
        /// <returns></returns>
        public static List<Location> GetLocationList(string area , int row) { 
            List<Location> result = new List<Location> ();
            try {
@@ -702,8 +749,6 @@
            }
            return result;
        }
        public static bool updateShiftOrderDetail(TN_YiKuDetail detail) {
            bool result = false;
@@ -727,6 +772,42 @@
        }
        /// <summary>
        ///获取空托缓存信号列表
        /// </summary>
        /// <returns></returns>
        public static List<EmptyTrayBuffer> getEmptyTrayBufferList()
        {
            var db = new SqlHelper<object>().GetInstance();
            return db.Queryable<EmptyTrayBuffer>().Where(a => a.IS_CREATED == "N").ToList();
        }
        /// <summary>
        /// 添加空托缓存信号
        /// </summary>
        /// <param name="emptyTrayBuffer"></param>
        /// <returns></returns>
        public static bool addEmptyTrayBuffer(EmptyTrayBuffer emptyTrayBuffer)
        {
            bool result = true;
            var db = new SqlHelper<object>().GetInstance();
            result = db.Insertable<EmptyTrayBuffer>(emptyTrayBuffer).ExecuteCommand() > 0;
            return result;
        }
        /// <summary>
        /// 更新空托缓存信号
        /// </summary>
        /// <param name="emptyTrayBuffer"></param>
        /// <returns></returns>
        public static bool updateEmptyTrayBuffer(EmptyTrayBuffer emptyTrayBuffer)
        {
            bool result = true;
            var db = new SqlHelper<object>().GetInstance();
            result = db.Updateable<EmptyTrayBuffer>(emptyTrayBuffer).ExecuteCommand() > 0;
            return result;
        }
        /// <summary>
        /// 批量添加物料条码信息
        /// </summary>
        /// <returns></returns>
@@ -737,22 +818,22 @@
            try
            {
                db.BeginTran();
                itemBarcodeInfos.ForEach(a => {
                    var bo = db.Insertable<ItemBarcodeInfo>(a).ExecuteCommand() > 0;
                    if (!bo)
                    {
                        result = false;
                        LogHelper.Info($"添加物料条码信息失败,物料条码信息:{JsonConvert.SerializeObject(a)}", "GT");
                    }
                });
                if (result)
                if (itemBarcodeInfos.Count > 0)
                {
                    db.CommitTran();
                    itemBarcodeInfos.ForEach(item => {
                        var itemBarcodeInfo = db.Queryable<ItemBarcodeInfo>().Where(a => a.S_BC_ENTRIED == item.S_BC_ENTRIED).First();
                        if (itemBarcodeInfo == null)
                        {
                            var bo = db.Insertable<ItemBarcodeInfo>(item).ExecuteCommand() == 0;
                            if (bo)
                            {
                                result = false;
                                LogHelper.Info($"添加物料条码信息失败,物料条码信息:{JsonConvert.SerializeObject(item)}", "GT");
                            }
                        }
                    });
                }
                else
                {
                    db.RollbackTran();
                }
                db.CommitTran();
            }
            catch (Exception ex) 
            {
@@ -760,6 +841,62 @@
                db.RollbackTran();
            }
           return result;
        }
        /// <summary>
        /// 同步条码状态表
        /// </summary>
        /// <returns></returns>
        public static bool synBarcodeStatus(List<iWMS_semi_bld_BCstatus> model)
        {
            bool result = true;
            var db = new SqlHelper<object>().GetInstance();
            try
            {
                db.BeginTran();
                if (model.Count > 0)
                {
                    model.ForEach(update => {
                        db.Insertable(update).ExecuteCommand();
                    });
                }
                db.CommitTran();
            }
            catch (Exception ex)
            {
                LogHelper.Info($"同步条码状态表错误,错误信息:{ex.Message}", "GT");
                db.RollbackTran();
                result = false;
            }
            return result;
        }
        /// <summary>
        /// 同步抽检状态表
        /// </summary>
        /// <returns></returns>
        public static bool synSamplingStatus(List<iWMS_semi_bld_BCsample> model)
        {
            bool result = true;
            var db = new SqlHelper<object>().GetInstance();
            try
            {
                db.BeginTran();
                if (model.Count > 0)
                {
                    model.ForEach(update => {
                        db.Insertable(update).ExecuteCommand();
                    });
                }
                db.CommitTran();
            }
            catch (Exception ex)
            {
                LogHelper.Info($"同步抽检状态表错误,错误信息:{ex.Message}", "GT");
                db.RollbackTran();
                result = false;
            }
            return result;
        }
        /// <summary>
@@ -773,112 +910,31 @@
            try
            {
                db.BeginTran();
                updateMatlStatuses.ForEach(update => {
                    var bo = db.Updateable<CntrItemRel>().SetColumns(a => new CntrItemRel() { S_ITEM_STATE = update.jdge }).Where(a => a.S_CG_ID == update.bc_entried).ExecuteCommand() > 0;
                    if (!bo)
                    {
                        result = false;
                        LogHelper.Info($"批量更新物料状态失败,物料条码信息:{JsonConvert.SerializeObject(update)}", "GT");
                    }
                });
                if (result)
                if (updateMatlStatuses.Count > 0)
                {
                    db.CommitTran();
                    updateMatlStatuses.ForEach(update => {
                        var itemBarcodeInfo = db.Queryable<ItemBarcodeInfo>().Where(a => a.S_BC_ENTRIED == update.bc_entried).First();
                        if (itemBarcodeInfo != null)
                        {
                            itemBarcodeInfo.S_JDGE = update.jdge;
                            db.Updateable(itemBarcodeInfo).ExecuteCommand();
                            var cntrItemRel = db.Queryable<CntrItemRel>().Where(a => a.S_CG_ID == update.bc_entried).First();
                            if (cntrItemRel != null)
                            {
                                db.Updateable<CntrItemRel>().SetColumns(a => new CntrItemRel() { S_ITEM_STATE = update.jdge }).Where(a => a.S_CG_ID == update.bc_entried).ExecuteCommand();
                            }
                        }
                    });
                }
                else
                {
                    db.RollbackTran();
                }
                db.CommitTran();
            }
            catch (Exception ex)
            {
                LogHelper.Info($"批量更新物料状态错误,错误信息:{ex.Message}", "GT");
                db.RollbackTran();
                result = false;
            }
            return result;
        }
        /// <summary>
        /// 批量更新物料状态
        /// </summary>
        /// <returns></returns>
        public static bool batchUpdateMatlTimeConfig(List<Overage> overages)
        {
            bool result = true;
            var db = new SqlHelper<object>().GetInstance();
            try
            {
                db.BeginTran();
                foreach (Overage overage in overages)
                {
                    bool bo = false;
                    var overage1 = db.Queryable<Overage>().Where(a => a.MCNGRP == overage.MCNGRP && a.ITEMPATT == overage.ITEMPATT).First();
                    if (overage1 != null)
                    {
                        overage1.OVERAGE = overage.OVERAGE;
                        overage1.MINHOUR = overage.MINHOUR;
                        overage1.FLAG_STS = overage.FLAG_STS;
                        bo = db.Updateable(overage1).ExecuteCommand() > 0;
                    }
                    else
                    {
                        overage1 = new Overage()
                        {
                            MCNGRP = overage.MCNGRP,
                            ITEMPATT = overage.ITEMPATT,
                            OVERAGE = overage.OVERAGE,
                            MINHOUR = overage.MINHOUR,
                            FLAG_STS = overage.FLAG_STS
                        };
                        bo = db.Insertable(overage1).ExecuteCommand() > 0;
                    }
                    if (!bo)
                    {
                        result = false;
                        LogHelper.Info($"批量更新物料存放时间配置信息失败,配置信息:{JsonConvert.SerializeObject(overage)}", "GT");
                        break;
                    }
                }
                if (result)
                {
                    db.CommitTran();
                }
                else
                {
                    db.RollbackTran();
                }
            }
            catch (Exception ex)
            {
                LogHelper.Info($"批量更新物料存放时间配置信息错误,错误信息:{ex.Message}", "GT");
                db.RollbackTran();
            }
            return result;
        }
        /// <summary>
        /// 查询物料存放时间配置信息
        /// </summary>
        /// <param name="bc_entried"></param>
        /// <returns></returns>
        public static Overage getOverage(string bc_entried)
        {
            Overage overage = null;
            var db = new SqlHelper<object>().GetInstance();
            overage = db.Queryable<Overage>().Where(a => a.ITEMPATT == bc_entried && a.MCNGRP == "1").First();
            if (overage == null)
            {
                string sub = bc_entried.Substring(0, 3);
                overage = db.Queryable<Overage>().Where(a => a.ITEMPATT.Contains(sub) && a.MCNGRP == "1").First();
            }
            if (overage == null)
            {
                string sub = bc_entried.Substring(0, 7);
                overage = db.Queryable<Overage>().Where(a => a.ITEMPATT.Contains(sub) && a.MCNGRP == "1").First();
            }
            return overage;
        }
        /// <summary>
@@ -893,7 +949,18 @@
            try
            {
                db.BeginTran();
                result = db.Insertable(record).ExecuteCommand()> 0;
                var synDataTimeRecord = db.Queryable<SynDataTimeRecord>().Where(a => a.S_SYN_TIME == record.S_SYN_TIME && a.RECORD_TABLE == record.RECORD_TABLE).First();
                if (synDataTimeRecord == null)
                {
                    result = db.Insertable(record).ExecuteCommand() > 0;
                }
                else
                {
                    synDataTimeRecord.N_SYN_NUM = record.N_SYN_NUM;
                    synDataTimeRecord.S_SYN_TIME = record.S_SYN_TIME;
                    result = db.Updateable(synDataTimeRecord).ExecuteCommand() > 0;
                }
                if (result)
                {
                    db.CommitTran();
@@ -905,7 +972,7 @@
            }
            catch (Exception ex)
            {
                LogHelper.Info($"添加同步数据时间记录错误,错误信息:{ex.Message}", "GT");
                LogHelper.Info($"添加数据同步时间记录错误,错误信息:{ex.Message}", "GT");
                db.RollbackTran();
            }
            return result;
@@ -914,12 +981,25 @@
        /// <summary>
        /// 查询上一次的同步时间
        /// </summary>
        /// <param name="recordTable"></param>
        /// <param name="tableType"></param>
        /// <returns></returns>
        public static SynDataTimeRecord getLastDataSynTime(string recordTable)
        public static string getDataLastSynTime(int tableType)
        {
            var db = new SqlHelper<object>().GetInstance();
            return db.Queryable<SynDataTimeRecord>().Where(a => a.RECORD_TABLE == recordTable).OrderByDescending(a => a.T_CREATE).First();
            string lastTime = null;
            if (tableType == 1)
            {
                lastTime = db.Queryable<ItemBarcodeInfo>().OrderByDescending(a => a.LAST_MODIFY_TIME).Select(a => a.LAST_MODIFY_TIME).First();
            }
            else if (tableType == 2)
            {
            }
            else if (tableType == 3)
            {
            }
            return lastTime;
        }
    }    
}