经典的出入库算法(C#实现)

  在一般的仓储系统,我们常常有个表是存放物品信息的,常见的属性有grid,layer,注意:这个属性是最大索引表示,也就是这个格子最大的储存数量,然后在物品明细中,我们会单个存放其中的粒子属性,所以我们就要去遍历了。算法如下。其中的剩余货架就是我们可用的货架隔层,这是最基本的出入库算法。

复制代码
public class STORE_goods_Detail
    {
        public static List<CanIn> GetCanInList(string Line_Code,List<XModel.STORE_SHELVE> list)
        {
            #region 1.先查询这个line里的所有货架
            List<XModel.STORE_SHELVE> shelveList = list; //最大索引
            List<CanIn> detailList = new List<CanIn>();//单个粒子
            List<CanIn> surplusList = new List<CanIn>();//剩余货架
            
            #endregion
            #region 2.根据这些货架的代码去关联详情表然后看看里面的列和行有没有被占用
            foreach (XModel.STORE_SHELVE item in shelveList)
            {
                string shelve_code = item.Shelve_code;
                //在每个货架中来循环看看详情表
                string sql = $"select * from STORE_GOODS_DETAIL where shelve_code = '{shelve_code}' and sout_code is null";//查询这个货架未出库的
                SqlDataReader DetailReader = XTools.XDB.SQLHelper.GetReader(sql);
                if (DetailReader != null)
                {
                    while (DetailReader.Read())
                    {
                        detailList.Add(new CanIn()
                        {
                            shelve_code = DetailReader["shelve_code"].ToString(),
                            shelve_grid = DetailReader["shelve_grid"].ToString(),
                            shelve_layer = DetailReader["shelve_layer"].ToString()
                        });
                    }
                }
            }
            #endregion
            #region 3.查询剩余的货架粒子
            for (int i = 0; i < shelveList.Count; i++)//循环每个货架
            {
                for (int g = 1; g <= Convert.ToInt32(shelveList[i].Shelve_grid); g++)
                {
                    for (int l = 1; l <= Convert.ToInt32(shelveList[i].Shelve_layer); l++)
                    {
                        //如果未出库的里没有这个 那就可以添加
                        if (detailList.FirstOrDefault(a => a.shelve_grid == g.ToString()
                                    && a.shelve_code == shelveList[i].Shelve_code
                                    && a.shelve_layer == l.ToString()) == null)
                        {
                            surplusList.Add(new CanIn()
                            {
                                shelve_grid = g.ToString(),
                                shelve_layer = l.ToString(),
                                shelve_code = shelveList[i].Shelve_code,
                                shelve_name = shelveList[i].Shelve_name
                            });
                        }
                    }
                }
            }
            #endregion
            return surplusList;
        }
        public static int Add(XModel.STORE_GOODS_DETAIL model)
        {
            string sql = @"INSERT INTO [STORE_GOODS_DETAIL]
           (gdetail_code,goods_code,gdetail_index,sin_code
           ,shelve_code,shelve_layer,shelve_grid
           ,gdtail_build,create_time,del_status)
     VALUES ('@gdetail_code','@goods_code','@gdetail_index','@sin_code'
           ,'@shelve_code','@shelve_layer','@shelve_grid','@gdtail_build'
           ,'@create_time','@del_status')";
            SqlParameter[] paras ={
                XTools.XDB.SQLHelper.GetParameter("@gdetail_code",model.Gdetail_code,SqlDbType.Char,32),
                XTools.XDB.SQLHelper.GetParameter("@goods_code",model.Goods_code,SqlDbType.Char,32),
                XTools.XDB.SQLHelper.GetParameter("@gdetail_index",model.Gdetail_code,SqlDbType.VarChar,18),
                XTools.XDB.SQLHelper.GetParameter("@sin_code",model.Sin_code,SqlDbType.Char,32),
                XTools.XDB.SQLHelper.GetParameter("@shelve_code",model.Shelve_code,SqlDbType.Char,32),
                XTools.XDB.SQLHelper.GetParameter("@shelve_layer",model.Shelve_layer,SqlDbType.Int,32),
                XTools.XDB.SQLHelper.GetParameter("@shelve_grid",model.Shelve_grid,SqlDbType.Int,32),
                XTools.XDB.SQLHelper.GetParameter("@gdtail_build",model.Gdtail_build,SqlDbType.DateTime,255),
                XTools.XDB.SQLHelper.GetParameter("@create_time",model.Create_time,SqlDbType.DateTime,255),
                XTools.XDB.SQLHelper.GetParameter("@del_status",model.Del_status,SqlDbType.Int,4),
            };
            return XTools.XDB.SQLHelper.ExecuteSQL(sql, paras);


        }
    }
    public class CanIn
    {
        public string shelve_layer { get; set; }
        public string shelve_grid { get; set; }
        public string shelve_code { get; set; }
        public string shelve_name { get; set; }
    }
复制代码

 

 这个最近做的项目sql。保留下。

  

posted @   ZaraNet  阅读(1989)  评论(2编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示