pengmn
2025-05-28 382c009ba2bb04374468e9584f262d6682841d9b
HH.WCS.Mobox3.HangYang/wms/WMSHelper.cs
@@ -11,6 +11,7 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IdentityModel.Protocols.WSTrust;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
@@ -635,7 +636,15 @@
            }
            catch (Exception ex)
            {
                LogHelper.Error("创建入库单失败", ex, "杭氧");
                var sugarEx = ex as SqlSugar.SqlSugarException;
                if (sugarEx != null)
                {
                    LogHelper.Error($"创建入库单SQL错误: {sugarEx.Sql}", sugarEx, "杭氧");
                }
                else
                {
                    LogHelper.Error($"创建入库单失败:{ex.Message}", ex, "杭氧");
                }
                return false;
            }
@@ -664,7 +673,7 @@
            }
            catch (Exception ex)
            {
                LogHelper.Error("创建出库单失败", ex, "杭氧");
                LogHelper.Error($"创建出库单失败:{ex.Message}", ex, "杭氧");
                return false;
            }
@@ -730,6 +739,28 @@
        }
        /// <summary>
        /// 根据托盘查询货位明细
        /// </summary>
        /// <param name="trayCode">托盘号</param>
        /// <returns></returns>
        internal static LocCntrRel GetCntrLoc(string trayCode)
        {
            var db = new SqlHelper<object>().GetInstance();
            var locCntr = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE.Trim() == trayCode).First();
            var locList = db.Queryable<Location>().Where(p => p.S_CODE == locCntr.S_LOC_CODE
            && p.N_CURRENT_NUM == p.N_CAPACITY
            && p.S_LOCK_STATE.Trim() == "无"
            && p.S_AREA_CODE == "JXHCQ").First();
            if (locList == null)
            {
                return null;
            }
            return locCntr;
        }
        /// <summary>
        /// 任务状态转换
        /// </summary>
        /// <param name="state">状态号</param>
@@ -755,28 +786,48 @@
        /// </summary>
        /// <param name="state">配盘单状态</param>
        /// <returns></returns>
        internal static List<DistributionCntr> GetPickingListByState(string state)
        internal static List<DistributionCntr> GetPickingListByState(int state)
        {
            var db = new SqlHelper<object>().GetInstance();
            var distributionCntr = db.Queryable<DistributionCntr>().Where(a => a.S_B_STATE.Trim() == state).ToList();
            var distributionCntr = db.Queryable<DistributionCntr>().Where(a => a.N_B_STATE == state).ToList();
            return distributionCntr;
        }
        /// <summary>
        /// 配盘单状态转换
        /// </summary>
        /// <param name="state">状态号</param>
        /// <returns></returns>
        internal static string GetDistributionStateStr(int state)
        {
            var status = "";
            switch (state)
            {
                case 1: status = "已配货"; break;
                case 2: status = "出库中"; break;
                case 3: status = "已出库"; break;
                case 4: status = "分拣完成 "; break;
            }
            return status;
        }
        /// <summary>
        /// 修改配盘单状态
        /// </summary>
        /// <param name="taskState">作业状态</param>
        /// <param name="state">状态</param>
        /// <param name="trayCode">托盘号</param>
        /// <returns></returns>
        internal static bool UpdateDistributionCntrState(string state,string trayCode)
        internal static bool UpdateDistributionCntrState(int taskState,int state,string trayCode)
        {
            var db = new SqlHelper<object>().GetInstance();
            var distributionCntr = db.Queryable<DistributionCntr>().Where(a => a.S_B_STATE.Trim() == "配货完成" && a.S_CNTR_CODE == trayCode ).First();
            var distributionCntr = db.Queryable<DistributionCntr>().Where(a => a.N_B_STATE == taskState && a.S_CNTR_CODE == trayCode ).First();
            if (distributionCntr != null)
            {
                distributionCntr.S_B_STATE = state;
                distributionCntr.N_B_STATE = 2;
                distributionCntr.N_B_STATE = state;
                distributionCntr.S_B_STATE = GetDistributionStateStr(state);
                return db.Updateable<DistributionCntr>(distributionCntr).UpdateColumns(it => new { it.S_B_STATE, it.N_B_STATE }).ExecuteCommand() > 0;
            }
            return false;
@@ -888,7 +939,7 @@
            {
                var db = new SqlHelper<object>().GetInstance();
                var locations = db.Queryable<Location>().Where(a => a.S_AREA_CODE == inbound.areaCode).ToList();
                if(!string.IsNullOrEmpty(inbound.roadWay.ToString()))
                if(inbound.roadWay != 0)
                {
                    locations.RemoveAll(s => s.N_ROADWAY != inbound.roadWay);
                }
@@ -1129,14 +1180,16 @@
                                else continue;
                            }
                            //else
                            //{
                            //    //货位为空直接生成出库任务
                            //    tasks.Add(CreateOutboundTask(targetLoc, outboundItem));
                            //}
                        }
                            else
                            {
                                //货位为空直接生成出库任务
                                tasks.Add(CreateOutboundTask(targetLoc,outboundItem));
                            continue;
                            }
                        }
                        else continue;
                        // 2.2 生成出库任务(深位)
                        tasks.Add(CreateOutboundTask(targetLoc, outboundItem));
                    }
@@ -1145,6 +1198,7 @@
                        // 3. 非双深位直接出库
                        tasks.Add(CreateOutboundTask(targetLoc, outboundItem));
                    }
                    break;
                }
                // 4. 任务排序:移库任务优先 + 高优先级优先
                return tasks;
@@ -1164,7 +1218,7 @@
                    loc.N_ROADWAY == deepLoc.N_ROADWAY &&
                    loc.N_COL == deepLoc.N_COL &&
                    loc.N_LAYER == deepLoc.N_LAYER &&
                    loc.N_LOCK_STATE == 0
                    loc.N_LOCK_STATE == 0 || loc.N_LOCK_STATE == 5
            );
            private Location FindBestRelocationTarget(Location outerLoc)
@@ -1232,7 +1286,8 @@
                            _allLocations
                                .Where(x => x.S_CODE == outerLoc.S_CODE)
                                .ToList()
                                .ForEach(x => x.N_LOCK_STATE = 3);
                                .ForEach(x => x.N_LOCK_STATE = 5);
                            //标记深位的外侧货位为5
                        }
                    }
                }
@@ -1263,7 +1318,7 @@
        /// 根据任务升量
        /// </summary>
        /// <param name="task"></param>
        internal static void AddChange(WCSTask task)
        internal static bool AddChange(WCSTask task)
        {
            var db = new SqlHelper<object>().GetInstance();
            var result = true;
@@ -1349,34 +1404,36 @@
            catch (Exception ex)
            {
                LogHelper.Error($"仓库升量异常 异常信息={ex.Message}", ex);
                result = false;
            }
            return result;
        }
        /// <summary>
        /// 根据任务降量
        /// </summary>
        /// <param name="task"></param>
        internal static void DeleteChange(WCSTask task)
        internal static bool DeleteChange(WCSTask wmstask)
        {
            var db = new SqlHelper<object>().GetInstance();
            var result = true;
            try
            {
                var wmstask = db.Queryable<WMSTask>().Where(a => a.S_CODE == task.S_OP_CODE).First();
                //var wmstask = db.Queryable<WCSTask>().Where(a => a == task.S_OP_CODE).First();
                if (wmstask != null)
                {
                    var itemlist = db.Queryable<CntrItemDetail>().Where(a => a.S_CNTR_CODE == task.S_CNTR_CODE).ToList();
                    var itemlist = db.Queryable<CntrItemDetail>().Where(a => a.S_CNTR_CODE == wmstask.S_CNTR_CODE).ToList();
                    if (itemlist.Count > 0)
                    {
                        var url = Settings.MoboxSeverUrl + "inventory/AddChange";
                        //仓库量表升量
                        var req = new AddChangeModel { op_type = 4 };
                        //库区量表升量
                        var req2 = new AddChangeModel { op_type = 7 };
                        //仓库量表降量
                        var req = new AddChangeModel { op_type = 8 };
                        //库区量表降量
                        var req2 = new AddChangeModel { op_type = 9 };
                        itemlist.ForEach(a =>
                        {
                            LogHelper.Info($"填充数据");
                            LogHelper.Info($"减仓库量表数据 仓库{task.S_END_WH} 物料编码{a.S_ITEM_CODE} 物料名称{a.S_ITEM_NAME} 数量{a.F_QTY}");
                            LogHelper.Info($"减仓库量表数据 仓库{wmstask.S_START_WH} 物料编码{a.S_ITEM_CODE} 物料名称{a.S_ITEM_NAME} 数量{a.F_QTY}");
                            req.item_info.Add(new AddChangeModel.itemModel
                            {
                                wh_code = wmstask.S_START_WH,
@@ -1384,7 +1441,7 @@
                                item_name = a.S_ITEM_NAME,
                                qty = a.F_QTY
                            });
                            LogHelper.Info($"减库区量表数据 库区{task.S_END_AREA} 物料编码{a.S_ITEM_CODE} 物料名称{a.S_ITEM_NAME} 数量{a.F_QTY}");
                            LogHelper.Info($"减库区量表数据 库区{wmstask.S_START_AREA} 物料编码{a.S_ITEM_CODE} 物料名称{a.S_ITEM_NAME} 数量{a.F_QTY}");
                            req2.item_info.Add(new AddChangeModel.itemModel
                            {
                                wh_code = wmstask.S_START_WH,
@@ -1440,15 +1497,17 @@
                        }
                    }
                    else LogHelper.Info($"托盘{task.S_CNTR_CODE} 在容器货品明细中找不到数据");
                    else LogHelper.Info($"托盘{wmstask.S_CNTR_CODE} 在容器货品明细中找不到数据");
                }
                else LogHelper.Info($"未找到任务{task.S_CODE} 对应的作业");
                else LogHelper.Info($"未找到任务{wmstask.S_CODE} 对应的任务");
            }
            catch (Exception ex)
            {
                LogHelper.Error($"仓库降量异常 异常信息={ex.Message}", ex);
                result = false;
            }
            return result;
        }