1. 功能描述
  2. 代码实现
  3. 算法需求

功能描述

  
 
  在PDA上面,通过扫描订单号,查询该商品的款号,尺码,订单数;同时适配仓库库位商品【SKU】,显示该商品所在库位,库存数量,适配数。
  因为PDA界面小,所以对表格拆分显示为俩个,代码也相应复杂一些。
 
 
 

代码实现

  

        /// <summary>
        /// 读头数据处理
        /// </summary>
        private void HandleData(Symbol.Barcode.ReaderData TheReaderData)
        {
              //定单适配
            )
            {
                txtWmsNo.Text = TheReaderData.Text;

                BindOrderDetailGrid(txtWmsNo.Text.Trim());
                btnAdaptor_Click(null, null);
            }
        }    
     private void BindOrderDetailGrid(string wmsID)
        {
            lv_Order.Items.Clear();

            try
            {
                _allOrderDetail = _repository.GetOrderDetail(wmsID);
                if (_allOrderDetail.Any())
                {
                    foreach (OrderDetail detail in _allOrderDetail)
                    {
                        ListViewItem item = new ListViewItem();
                        item.SubItems[].Text = detail.StyleNo;
                        item.SubItems.Add(detail.Size);
                        item.SubItems.Add(detail.OrderNum.ToString());//订单数
                        lv_Order.Items.Add(item);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("查询出错:" + ex.Message);
                btnExit_Click(null, null);
            }
        }
     //批量适配
        private void btnAdaptor_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtWmsNo.Text.Trim()) || txtWmsNo.Text == "扫描WMS单号…")
            {
                MessageBox.Show("请先扫描wmsID。", "操作提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1);
                return;
            }
            if (_repository.ExitsWmsID(txtWmsNo.Text.Trim()))
            {
                DialogResult result = MessageBox.Show("该单号已经适配过了,是否继续?", "操作提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1);
                if (result != DialogResult.OK)
                {
                    lv_Adaptor.Items.Clear();
                    return;
                }
            }

            _differenceQty = ;
            _list.Clear();

            try{
                _goodList = _repository.GetGoodsList(string.Join(",",_allOrderDetail.Select(c=>"'"+c.StyleNo+"'").ToArray()));
             }
            catch (Exception ex)
            {
                MessageBox.Show("查询出错:" + ex.Message);
                btnExit_Click(null, null);
            }

            if (_goodList.Any())
            {
                _allOrderDetail.ForEach(order => BindAdaptorGrid(_goodList.Where(c => c.StyleNo == order.StyleNo).ToList(), order.Size, order.OrderNum, false));
            }

            if (_list.Any())
            {
                _list.ForEach(o => lv_Adaptor.Items.Add(o));

                btnSave.Enabled = true;
                lbl_difNum.Text = "总差异数:" + _differenceQty;
                lblMsg.Text = "适配成功,请保存!";
            }
            else
            {
                btnSave.Enabled = false;
                lblMsg.Text = "适配失败,请先维护库存!";
            }
        }
        /// <summary>
        /// 绑定适配表
        /// 如果数量相等,则按照库位匹配
        /// </summary>
        /// <param name="orderNum">订单数</param>
        /// <param name="isSingle">是否单款</param>
        private void BindAdaptorGrid(List<PDA_TGoods> goodsByStyleNo,string size,int orderNum,bool isSingle)
        {
            lv_Adaptor.Items.Clear();
            lblMsg.Text = string.Empty;

            _orderNum = orderNum;

            List<GoodsSummary> summary_goods = GetGoodsSummary(goodsByStyleNo);

            if (summary_goods.Any())
            {
                int stockSumNum = goodsByStyleNo.Count();        //库存数总和
                bool isBreak = false;

                //差异数算法:[订单数>=库存数总和-->差异数=订单数-库存数;订单数<库存数总和-->差异数=0]
                );
                _differenceQty += singleDifNum;
                if (isSingle)
                    lbl_difNum.Text = "单款差异:" + singleDifNum;

                foreach (var g in summary_goods)
                {
                    ListViewItem item = new ListViewItem();
                    item.SubItems[].Text = g.StyleNo;      //库位
                    item.SubItems.Add(g.StockNo.ToString()); //库存数
                    item.SubItems.Add(g.SkuNum.ToString()); //库存数   

                    //适配数算法:
                    //(1)订单数>=库存数总和-->适配数=库存数;
                    //(2)订单数<库存数总和-->适配数=任意库位的数量的分配(必须=订单数)
                    ;
                    if (_orderNum >= stockSumNum)
                        adaptorNum = g.SkuNum;
                    else
                        adaptorNum = GetAdaptorNum(_orderNum, g.SkuNum, out isBreak);  

                    item.SubItems.Add(adaptorNum.ToString());
                    //item.SubItems.Add(g.Sku);         //条码[不可见]
                    item.SubItems.Add(size);          //尺码[不可见]

                    if (isSingle)
                       lv_Adaptor.Items.Add(item);
                    else
                        _list.Add(item);

                    if (isBreak) break;//适配到,则不再进行其他库位的适配
                }
            }
        }

        //计算适配数
        private int GetAdaptorNum(int orderNum, int stockNum,out bool isBreak)
        {
            ;
            if (orderNum >= stockNum)
            {
                adptorNum = stockNum;
                isBreak = false;
            }
            else
            {
                adptorNum = _orderNum;
                isBreak = true;
            }

            _orderNum = _orderNum - stockNum;

            )
                isBreak = true;

            return adptorNum;
        }
     /// <summary>
        /// 按款汇总商品总数,并做排序
        /// </summary>
        /// <param name="PDA_TGoods"></param>
        /// <returns></returns>
        private static List<GoodsSummary> GetGoodsSummary(List<PDA_TGoods> goods)
        {
            List<GoodsSummary> summary_goods = new List<GoodsSummary>();
            foreach (var g in goods.GroupBy(o => new { o.StockNo, o.StyleNo }))
            {
                GoodsSummary gt = new GoodsSummary();
                gt.SkuNum = g.Count();
                gt.StockNo = g.First().StockNo;
                gt.StyleNo = g.First().StyleNo;
                summary_goods.Add(gt);
            }

            //库存量大优先;同等数量,库位优先策略
            return summary_goods.OrderByDescending(o => o.SkuNum).ThenBy(o => o.StockNo).ToList();
        }
 

算法需求

    (1)订单数>=库存数总和 则 适配数 = 库存数;

         (2)订单数<库存数总和  则 适配数 = 任意库位的数量的分配(必须=订单数)

        (3)库存量大的库位优先适配;同等数量的库位,库位编号小的优先适配策略

 
 
 
 

PDA库位商品出库适配算法的更多相关文章

  1. ERP库位分布看板(库位管理)

    客户正在使用的看板管理,根据厂家需求,做的二次开发. 一:看板效果 二:客户需求 1.客户需求:XX是一家汽车零部件(胶管,硅胶管等)的生产厂家,因此对原料,半成品的有效期有严格的要求. 多次调研得知 ...

  2. 127_Power Pivot&Power BI DAX计算订单商品在库时间(延伸订单仓储费用)

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 前面已经写过一个先进先出的库龄案例,在业务发生又有这样一个需求:先进先出前提,需要按照订单计算每个商品在库时间, ...

  3. 关于推荐库位 java前端与SQL语句后面的结合

    ----------------------------------------------------------------------------------- select a1.id,a1. ...

  4. k3 cloud成本调整单提示期末余额不存在调整单分录的维度,请先出库核算确认是否存在核算维度的数据

    成本调整单提示期末余额不存在调整单分录的维度,请先出库核算确认是否存在核算维度的数据,如下图所示: 解决办法:先做出库核算,然后做成本调整单,再做出库核算(出库成本核算)

  5. 用友CDM系统“货位间商品移库单(一步)”表体增加“货位可用数量”字段,根据表头的选择的货位自动带出数值

    系统控制台——业务单据定制——货位间商品移库单(一步) 明细字段——增加“可销数量”字段. 然后修改明细字段的“商品编号”自定义查询方案. 增加自定义资料检索方案hwyksp SQL: select ...

  6. PHP实现打印出库单,有没有实现过?

    https://mp.weixin.qq.com/s/X3JldplICRq7KR0HNFcpuw 背景 有时候你在实现一个出库订单之类的功能模块,这里也有可能要你的站点也实现相应的打印出库单预览,今 ...

  7. SAP 出库单新版

    *&---------------------------------------------------------------------* *& Report  ZSDR045 ...

  8. ABAP 出库单打印 产品 A搭A A搭B显示方式

    *&---------------------------------------------------------------------* *& Report   *& ...

  9. SQL用先进先出存储过程求出库数量

    create table t( id ,), name ),--商品名称 j int, --入库数量 c int, --出库数量 jdate datetime --入库时间 ) ,,'2007-12- ...

随机推荐

  1. python的一些总结5

    上面4都是水的 恩每篇都一点知识点 用来写给不耐烦的人看..哈哈这篇 争取不水. 上面4篇如果 掌握 基本上是 80%常用的代码了. 1.下面讲一下 比较常用的代码: macro(jinja 上的功能 ...

  2. Java模拟登陆新浪微博抓取数据【转载】

    package com.shiyimm.crawler.weibo; import java.io.FileNotFoundException; import java.io.FileReader; ...

  3. PI-webservice06-调用外部webservice过程中注意问题

    1,SAP与.NET系统之间通过webservice来进行数据交互的过程中,格式是有要求的,要求.NET发布出来的webservice中的数据是用list来进行传输的,不能用datatable和lis ...

  4. Uestc_suibian 暑假集训总结

    唉,终于组队了,终于可以只BB了,我就BB,我就不上! 和Xiper以及chenxh组队了- 下面是总结: day1 第一天吃饱喝足,然后就上路了,我一开始就看到了C题大水题,但是我不敢想象这道题居然 ...

  5. c# winform 把彩色图片转换为灰色的图片,变灰,灰度图片,速度很快,safe,unsafe

    把彩色图片转换为灰色的图片,直接用.net接口遍历每个像素点转换的效率非常低,800K的图片65万像素我的电脑要用5分钟,而用了unsafe,速度提高了几千倍,同样的图片只用了0.几秒 附一个常用的遍 ...

  6. c# socket通信较完善方案

    c#的socket通信应用.文件较多.附件为工程.  core   AbstractBytesWorker.cs    字节工作器(基类),用于用于同一不同功能的字节工作器  BinaryHand.c ...

  7. Android - 软件自动更新的实现

    转自:http://blog.csdn.net/wwj_748/article/details/8195565 接触到一个很实用的技术,那就是软件自动更新.一般开发者是通过自行在应用平台添加更新版本的 ...

  8. Android传感器编程带实例

    看了程序人生 网站的 编程高手的编程感悟 深有感触,好像也是一个android 程序员写的,推荐大家也看看.话不多说,还是言归正传吧. 一.前言 我很喜欢电脑,可是笔记本还是太大,笔记本电脑再小还是要 ...

  9. Particle designer 粒子工具中属性对应功能的简单介绍

    粒子配置 Max Particles 粒子的数量  一般而言,我们的目标是用最少的粒子创造出所需的效果.单个粒子的大小对游戏运行效率也有很大的影响——单个粒子越小,性能越高. Lifespan 生命周 ...

  10. cocos2dx libiconv 转码

    iconv下载(Android)已编译完的iconv包(用这个即可) ios自带libiconv,只需#include <iconv.h>即可  步骤 1.libiconv解压文件放置 直 ...