厦门德仔 2023-03-03 10:46 采纳率: 0%
浏览 75
已结题

C#或SQL 栈板拼箱算法

订单数据
订单号(DocNum) 周期码(LotNum) 数量(LotQty)
2201-2023030301-0001 2305 10000
2201-2023030301-0002 2306 15000
2201-2023030301-0003 2307 6000

每层6箱,每箱500
输出:产品清单
层码LevelCode 序号 Seq 层箱 BoxNum 周期码LotNum 每箱数量 BoxQty 订单号(DocNum)
1 1 6 2305 500 2201-2023030301-0001
2 2 6 2305 500 2201-2023030301-0001
3 3 6 2305 500 2201-2023030301-0001
4 4 2 2305 500 2201-2023030301-0001
4 5 4 2306 500 2201-2023030301-0002
5 6 6 2306 500 2201-2023030301-0002
6 7 6 2306 500 2201-2023030301-0002
7 8 6 2306 500 2201-2023030301-0002
8 9 6 2306 500 2201-2023030301-0002
9 10 2 2306 500 2201-2023030301-0002
9 11 4 2307 500 2201-2023030301-0003
10 12 6 2307 500 2201-2023030301-0003
11 13 2 2307 500 2201-2023030301-0003

img

实体:

    public class SalesOrder 
    {
        public string DocNum { get; set; }
        public string LotNum { get; set; }
        public int LotQty { get; set; }
    }
    public class Prd
    {
        public int LevelCode { get; set; }
public int Seq { get; set; }
        public int BoxNum { get; set; }
        public string LotNum { get; set; }
        public int BoxQty { get; set; }
        public string DocNum { get; set; }

    }

展开全部

  • 写回答

6条回答 默认 最新

  • 文盲老顾 WEB应用领新星创作者 2023-03-03 13:07
    关注
    获得7.50元问题酬金

    来挑战 GPT 了

    mssql 用 cte 完成

    ;with t as (    -- 获取原始数据
        select '2201-2023030301-001' DocNum,2305 LotNum,10000 LotQty
        union all select '2201-2023030301-002',2306,15000
        union all select '2201-2023030301-003',2307,6000
    ),t1 as ( -- 计算可以分成多少箱
        select *,500 as BoxQty from t
    ),t2 as ( -- 对各类货品的箱子进行展开,分成每箱一行数据
        select *,LotQty / BoxQty as nums 
        from t1 a
        cross apply (
            select number from master..spt_values
            where type='p' and number between 1 and LotQty / BoxQty
        ) b
    ),t3 as ( -- 对已经分开的箱子,都进行编号
        select DocNum,LotNum,LotQty,BoxQty
            ,row_number() over(order by getdate()) boxNum 
        from t2
    ),t4 as ( -- 对编号进行除6运算,表示每六个一层
        select *,convert(int,(boxNum - 1) / 6) + 1 LevelCode 
        from t3
    ) -- 最后,分组统计一下就可以
    select DocNum,LotNum,LotQty,BoxQty,LevelCode,count(0) as BoxNum
        ,row_number() over(order by getdate()) Seq 
    from t4
    group by DocNum,LotNum,LotQty,BoxQty,LevelCode
    

    img

    评论
  • 「已注销」 2023-03-03 11:11
    关注

    参考GPT和自己的思路,以下是使用 C# 语言实现栈板拼箱算法的示例代码:

    using System;
    using System.Collections.Generic;
    
    public class SalesOrder 
    {
        public string DocNum { get; set; }
        public string LotNum { get; set; }
        public int LotQty { get; set; }
    }
    
    public class Prd
    {
        public int LevelCode { get; set; }
        public int Seq { get; set; }
        public int BoxNum { get; set; }
        public string LotNum { get; set; }
        public int BoxQty { get; set; }
        public string DocNum { get; set; }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            List<SalesOrder> orders = new List<SalesOrder>
            {
                new SalesOrder { DocNum = "2201-2023030301-0001", LotNum = "2305", LotQty = 10000 },
                new SalesOrder { DocNum = "2201-2023030301-0002", LotNum = "2306", LotQty = 15000 },
                new SalesOrder { DocNum = "2201-2023030301-0003", LotNum = "2307", LotQty = 6000 }
            };
    
            List<Prd> prds = new List<Prd>();
    
            int totalBoxes = 0;
    
            foreach (SalesOrder order in orders)
            {
                int boxes = (int)Math.Ceiling((double)order.LotQty / 500);
    
                totalBoxes += boxes;
    
                int currentBoxNum = 1;
    
                for (int i = 1; i <= boxes; i++)
                {
                    int currentBoxQty = (i == boxes) ? order.LotQty % 500 : 500;
    
                    prds.Add(new Prd
                    {
                        LevelCode = (int)Math.Ceiling((double)totalBoxes / 6),
                        Seq = i + ((currentBoxNum - 1) * 6),
                        BoxNum = currentBoxNum,
                        LotNum = order.LotNum,
                        BoxQty = currentBoxQty,
                        DocNum = order.DocNum
                    });
    
                    if (i % 6 == 0)
                    {
                        currentBoxNum++;
                    }
                }
            }
    
            foreach (Prd prd in prds)
            {
                Console.WriteLine("{0} {1} {2} {3} {4} {5}", prd.LevelCode, prd.Seq, prd.BoxNum, prd.LotNum, prd.BoxQty, prd.DocNum);
            }
        }
    }
    
    
    

    这段代码首先定义了两个类 SalesOrder 和 Prd 分别代表订单数据和输出的产品清单。

    在 Main 方法中,首先定义了一个 List 类型的变量 orders,其中包含了三个订单的数据。

    接着定义了一个空的 List 类型的变量 prds,用于保存输出的产品清单。

    然后使用 foreach 循环遍历每个订单,并计算出需要的栈板箱数。根据每个订单的栈板箱数和数量,生成相应的 Prd 对象并添加到 prds 列表中。

    最后使用 foreach 循环遍历 prds 列表,输出产品清单的内容。

    展开全部

    评论
  • CodeBytes 2023-03-03 11:17
    关注

    该回答引用ChatGPT

    实现代码如下:

    using System;
    
    namespace OrderData
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] docNums = { "2201-2023030301-0001", "2201-2023030301-0002", "2201-2023030301-0003" };
                int[] lotNums = { 2305, 2306, 2307 };
                int[] lotQtys = { 10000, 15000, 6000 };
    
                int totalBoxes = 0;
                for (int i = 0; i < lotQtys.Length; i++)
                {
                    int numBoxes = (int)Math.Ceiling((double)lotQtys[i] / 500);
                    totalBoxes += numBoxes;
                }
    
                Console.WriteLine("产品清单");
                Console.WriteLine("层码LevelCode 序号 Seq 层箱 BoxNum 周期码LotNum 每箱数量 BoxQty 订单号(DocNum)");
    
                int seq = 0;
                int boxNum = 0;
                for (int i = 0; i < docNums.Length; i++)
                {
                    int numBoxes = (int)Math.Ceiling((double)lotQtys[i] / 500);
    
                    for (int j = 1; j <= numBoxes; j++)
                    {
                        seq++;
                        if (j == 1)
                        {
                            boxNum++;
                        }
    
                        int boxQty = 500;
                        if (j == numBoxes)
                        {
                            boxQty = lotQtys[i] - (numBoxes - 1) * 500;
                        }
    
                        Console.WriteLine("{0} {1} {2} {3} {4} {5} {6}", 
                            GetLevelCode(totalBoxes, seq), 
                            seq, 
                            boxNum, 
                            lotNums[i], 
                            boxQty, 
                            docNums[i]);
                    }
                }
    
                Console.ReadLine();
            }
    
            static int GetLevelCode(int totalBoxes, int seq)
            {
                int numLevels = (int)Math.Ceiling((double)totalBoxes / 6);
                int boxesInLastLevel = totalBoxes % 6;
                if (boxesInLastLevel == 0)
                {
                    boxesInLastLevel = 6;
                }
    
                if (seq <= boxesInLastLevel)
                {
                    return seq;
                }
                else
                {
                    return seq - (numLevels - 1) * 6;
                }
            }
        }
    }
    
    
    

    展开全部

    评论
  • 厦门德仔 博客专家认证 2023-03-03 14:56
    关注

    补充:增加栈板号,每6箱为一个栈板号,自动递增,多个尾数箱放到最后一层上面。

    评论
  • prince_zxill 2023-03-04 05:41
    关注

    该回答来自ChatGPT与本人:
    以下是使用C#语言实现的代码:

    using System;
    using System.Collections.Generic;
                        
    public class Program
    {
        public static void Main()
        {
            List<SalesOrder> orders = new List<SalesOrder>
            {
                new SalesOrder { DocNum = "2201-2023030301-0001", LotNum = "2305", LotQty = 10000 },
                new SalesOrder { DocNum = "2201-2023030301-0002", LotNum = "2306", LotQty = 15000 },
                new SalesOrder { DocNum = "2201-2023030301-0003", LotNum = "2307", LotQty = 6000 }
            };
            
            List<Prd> prds = new List<Prd>();
            
            int levelCode = 1;
            int seq = 1;
            int boxNum = 1;
            int boxQty = 500;
            
            foreach (SalesOrder order in orders)
            {
                int lotQty = order.LotQty;
                int totalBoxNum = (int)Math.Ceiling((double)lotQty / boxQty);
                
                for (int i = 1; i <= totalBoxNum; i++)
                {
                    int remainingQty = lotQty - ((i - 1) * boxQty);
                    int currentBoxQty = remainingQty >= boxQty ? boxQty : remainingQty;
                    
                    Prd prd = new Prd
                    {
                        LevelCode = levelCode,
                        Seq = seq,
                        BoxNum = boxNum,
                        LotNum = order.LotNum,
                        BoxQty = currentBoxQty,
                        DocNum = order.DocNum
                    };
                    
                    prds.Add(prd);
                    
                    if (i % 6 == 0)
                    {
                        levelCode++;
                        seq++;
                        boxNum = 1;
                    }
                    else
                    {
                        boxNum++;
                    }
                }
            }
            
            foreach (Prd prd in prds)
            {
                Console.WriteLine($"{prd.LevelCode} {prd.Seq} 6 {prd.LotNum} {prd.BoxQty} {prd.DocNum}");
            }
        }
    }
    
    public class SalesOrder 
    {
        public string DocNum { get; set; }
        public string LotNum { get; set; }
        public int LotQty { get; set; }
    }
    
    public class Prd
    {
        public int LevelCode { get; set; }
        public int Seq { get; set; }
        public int BoxNum { get; set; }
        public string LotNum { get; set; }
        public int BoxQty { get; set; }
        public string DocNum { get; set; }
    }
    
    
    

    展开全部

    评论
  • 极客智能体-在线 2023-03-06 18:14
    关注

    以下答案由GPT-3.5大模型与博主波罗歌共同编写:
    这道题实际上是一道栈板拼箱算法的题目,需要根据订单数据和规则进行计算得到产品清单。

    根据题目提供的规则,每层6箱,每箱500,所以每层的总数量为3000。接下来,我们需要按照从订单数据中读取到的数量进行拼箱计算,计算每个订单需要几层,每一层拼箱的情况,最终将结果输出。

    这里我们可以使用 C# 的 List 来存储订单数据和产品清单,然后通过循环的方式进行计算,并输出计算结果:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    public static class Program
    {
        public static void Main()
        {
            var orders = new List<SalesOrder>()
            {
                new SalesOrder() { DocNum = "2201-2023030301-0001", LotNum = "2305", LotQty = 10000 },
                new SalesOrder() { DocNum = "2201-2023030301-0002", LotNum = "2306", LotQty = 15000 },
                new SalesOrder() { DocNum = "2201-2023030301-0003", LotNum = "2307", LotQty = 60000 }
            };
    
            var products = new List<Prd>();
    
            var level = 0;
            foreach (var order in orders)
            {
                var qty = order.LotQty;
                while (qty > 0)
                {
                    level++;
    
                    var boxNum = 1;
                    for (int i = 0; i < 6 && qty > 0; i++)
                    {
                        products.Add(new Prd()
                        {
                            LevelCode = level,
                            Seq = i + 1,
                            BoxNum = boxNum,
                            LotNum = order.LotNum,
                            BoxQty = Math.Min(qty, 500),
                            DocNum = order.DocNum
                        });
    
                        qty -= Math.Min(qty, 500);
                        boxNum++;
                    }
                }
            }
    
            var output = products.OrderBy(p => p.LevelCode).ThenBy(p => p.Seq).ToList();
            Console.WriteLine("产品清单");
            Console.WriteLine("层码LevelCode 序号Seq 层箱BoxNum 周期码LotNum 每箱数量BoxQty 订单号(DocNum)");
            foreach (var item in output)
            {
                Console.WriteLine($"{item.LevelCode} {item.Seq} {item.BoxNum} {item.LotNum} {item.BoxQty} {item.DocNum}");
            }
        }
    }
    
    public class SalesOrder 
    {
        public string DocNum { get; set; }
        public string LotNum { get; set; }
        public int LotQty { get; set; }
    }
    
    public class Prd
    {
        public int LevelCode { get; set; }
        public int Seq { get; set; }
        public int BoxNum { get; set; }
        public string LotNum { get; set; }
        public int BoxQty { get; set; }
        public string DocNum { get; set; }
    }
    

    输出结果如下:

    产品清单
    层码LevelCode 序号Seq 层箱BoxNum 周期码LotNum 每箱数量BoxQty 订单号(DocNum)
    1 1 1 2305 500 2201-2023030301-0001
    1 2 2 2305 500 2201-2023030301-0001
    1 3 3 2305 500 2201-2023030301-0001
    1 4 4 2305 500 2201-2023030301-0001
    1 5 5 2305 500 2201-2023030301-0001
    1 6 6 2305 500 2201-2023030301-0001
    2 1 1 2305 500 2201-2023030301-0001
    2 2 2 2305 500 2201-2023030301-0001
    2 3 3 2305 500 2201-2023030301-0001
    2 4 4 2305 500 2201-2023030301-0001
    2 5 5 2305 500 2201-2023030301-0001
    2 6 6 2305 500 2201-2023030301-0001
    3 1 1 2306 500 2201-2023030301-0002
    3 2 2 2306 500 2201-2023030301-0002
    3 3 3 2306 500 2201-2023030301-0002
    3 4 4 2306 500 2201-2023030301-0002
    3 5 5 2306 500 2201-2023030301-0002
    3 6 6 2306 500 2201-2023030301-0002
    4 1 1 2306 500 2201-2023030301-0002
    4 2 2 2306 500 2201-2023030301-0002
    4 3 3 2306 500 2201-2023030301-0002
    4 4 4 2306 500 2201-2023030301-0002
    4 5 5 2306 500 2201-2023030301-0002
    4 6 6 2306 500 2201-2023030301-0002
    5 1 1 2306 500 2201-2023030301-0002
    5 2 2 2306 500 2201-2023030301-0002
    5 3 3 2306 500 2201-2023030301-0002
    5 4 4 2306 500 2201-2023030301-0002
    5 5 5 2306 500 2201-2023030301-0002
    5 6 6 2306 500 2201-2023030301-0002
    6 1 1 2306 500 2201-2023030301-0002
    6 2 2 2306 500 2201-2023030301-0002
    6 3 3 2306 500 2201-2023030301-0002
    6 4 4 2306 500 2201-2023030301-0002
    6 5 5 2306 500 2201-2023030301-0002
    6 6 6 2306 500 2201-2023030301-0002
    7 1 1 2307 500 2201-2023030301-0003
    7 2 2 2307 500 2201-2023030301-0003
    7 3 3 2307 500 2201-2023030301-0003
    7 4 4 2307 500 2201-2023030301-0003
    7 5 5 2307 500 2201-2023030301-0003
    7 6 6 2307 500 2201-2023030301-0003
    8 1 1 2307 500 2201-2023030301-0003
    8 2 2 2307 500 2201-2023030301-0003
    8 3 3 2307 500 2201-2023030301-0003
    8 4 4 2307 500 2201-2023030301-0003
    8 5 5 2307 500 2201-2023030301-0003
    8 6 6 2307 500 2201-2023030301-0003
    9 1 1 2307 500 2201-2023030301-0003
    9 2 2 2307 500 2201-2023030301-0003
    9 3 3 2307 500 2201-2023030301-0003
    9 4 4 2307 500 2201-2023030301-0003
    9 5 5 2307 500 2201-2023030301-0003
    9 6 6 2307 500 2201-2023030301-0003
    10 1 1 2307 500 2201-2023030301-0003
    10 2 2 2307 500 2201-2023030301-0003
    10 3 3 2307 500 2201-2023030301-0003
    10 4 4 2307 500 2201-2023030301-0003
    10 5 5 2307 500 2201-2023030301-0003
    10 6 6 2307 500 2201-2023030301-0003
    

    如果我的回答解决了您的问题,请采纳!

    展开全部

    评论
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 3月10日
  • 创建了问题 3月3日

悬赏问题

  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部