杨前锦
2025-06-06 16d2162a833cebeae72c363962917bb9da8145ef
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;
@@ -440,11 +442,13 @@
                if (exclude == 1)
                {
                    query = query.Where((a, b, c, d) => a.S_CODE != Settings.baseTrayInBufferLoc);
                    List<string> bufferInLocs = Settings.baseTrayBufferLocList.Select(a => a.bufferInLoc).ToList();
                    query = query.Where((a, b, c, d) =>  !bufferInLocs.Contains(a.S_CODE));
                }
                else
                else
                {
                    query = query.OrderByDescending((a, b, c, d) => a.S_CODE == Settings.baseTrayInBufferLoc);
                    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();
@@ -550,12 +554,15 @@
        /// <summary>
        /// 获取入库终点货位
        /// 入库策略
        /// 1.巷道均衡
        /// 2.物料均衡
        /// </summary>
        /// <param name="locCode"></param>
        /// <param name="trayType"></param>
        /// <param name="inWay">入库方式 1.自动入库 2.人工入库</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();
@@ -620,7 +627,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))
@@ -628,21 +634,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)
@@ -707,6 +731,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 {
@@ -718,8 +748,6 @@
            }
            return result;
        }
        public static bool updateShiftOrderDetail(TN_YiKuDetail detail) {
            bool result = false;
@@ -739,6 +767,42 @@
            if(completeResult) {
                result = db.Updateable<TN_YiKuOrder>().SetColumns(a => new TN_YiKuOrder() { S_B_STATE = "完成" }).Where(a => a.S_NO == detail.S_NO).ExecuteCommand() > 0;
            }
            return result;
        }
        /// <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;
        }
@@ -879,18 +943,14 @@
            var sql1 = "SELECT get_minhour_bar(@barcode, @mcngrp) AS overage_value";
            // 使用匿名对象传递参数
            var ovg_bar = db.Ado.SqlQuery<int>(sql, new { barcode = bc_entried, mcngrp = "1"});
            var minhour_bar = db.Ado.SqlQuery<float>(sql1, new { barcode = bc_entried, mcngrp = "1"});
            if (ovg_bar.Count > 0 && minhour_bar.Count > 0)
            var ovg_bar = db.Ado.SqlQuery<int>(sql, new { barcode = bc_entried, mcngrp = "1"}).First();
            var minhour_bar = db.Ado.SqlQuery<float>(sql1, new { barcode = bc_entried, mcngrp = "1"}).First();
            Overage overage = new Overage()
            {
                Overage overage = new Overage()
                {
                    MINHOUR = minhour_bar[0],
                    OVERAGE = ovg_bar[0]
                };
                return overage;
            }
            return null;
                MINHOUR = minhour_bar,
                OVERAGE = ovg_bar
            };
            return overage;
        }
        /// <summary>