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(); }
算法需求
(2)订单数<库存数总和 则 适配数 = 任意库位的数量的分配(必须=订单数)
(3)库存量大的库位优先适配;同等数量的库位,库位编号小的优先适配策略
PDA库位商品出库适配算法的更多相关文章
- ERP库位分布看板(库位管理)
客户正在使用的看板管理,根据厂家需求,做的二次开发. 一:看板效果 二:客户需求 1.客户需求:XX是一家汽车零部件(胶管,硅胶管等)的生产厂家,因此对原料,半成品的有效期有严格的要求. 多次调研得知 ...
- 127_Power Pivot&Power BI DAX计算订单商品在库时间(延伸订单仓储费用)
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 前面已经写过一个先进先出的库龄案例,在业务发生又有这样一个需求:先进先出前提,需要按照订单计算每个商品在库时间, ...
- 关于推荐库位 java前端与SQL语句后面的结合
----------------------------------------------------------------------------------- select a1.id,a1. ...
- k3 cloud成本调整单提示期末余额不存在调整单分录的维度,请先出库核算确认是否存在核算维度的数据
成本调整单提示期末余额不存在调整单分录的维度,请先出库核算确认是否存在核算维度的数据,如下图所示: 解决办法:先做出库核算,然后做成本调整单,再做出库核算(出库成本核算)
- 用友CDM系统“货位间商品移库单(一步)”表体增加“货位可用数量”字段,根据表头的选择的货位自动带出数值
系统控制台——业务单据定制——货位间商品移库单(一步) 明细字段——增加“可销数量”字段. 然后修改明细字段的“商品编号”自定义查询方案. 增加自定义资料检索方案hwyksp SQL: select ...
- PHP实现打印出库单,有没有实现过?
https://mp.weixin.qq.com/s/X3JldplICRq7KR0HNFcpuw 背景 有时候你在实现一个出库订单之类的功能模块,这里也有可能要你的站点也实现相应的打印出库单预览,今 ...
- SAP 出库单新版
*&---------------------------------------------------------------------* *& Report ZSDR045 ...
- ABAP 出库单打印 产品 A搭A A搭B显示方式
*&---------------------------------------------------------------------* *& Report *& ...
- SQL用先进先出存储过程求出库数量
create table t( id ,), name ),--商品名称 j int, --入库数量 c int, --出库数量 jdate datetime --入库时间 ) ,,'2007-12- ...
随机推荐
- HTML输出 一 控制列背景颜色
#将需要读取的域名和端口列表保存在名为ports01.txt.ports02的文件中,文件与脚本位于相同目录下$CurrentPath = $MyInvocation.MyCommand.Path.s ...
- 从零开始学习Hadoop--第2章 第一个MapReduce程序
1.Hadoop从头说 1.1 Google是一家做搜索的公司 做搜索是技术难度很高的活.首先要存储很多的数据,要把全球的大部分网页都抓下来,可想而知存储量有多大.然后,要能快速检索网页,用户输入几个 ...
- 转自邓凡平 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第七章 深入理解Wi-Fi P2P部分节选
本章主要内容: 介绍Wi-Fi P2P相关知识: 介绍Android中WifiP2pService.wpa_supplicant的相关代码. 7.1 概述 承接第6章介绍的WSC,本章将继续介绍Wi ...
- [AngularJS] Html ngSanitize, $sce
Safely render arbitrary HTML snippets by using ngSanitize and $sce. By default angularJS consider us ...
- 和Timesten有个约会--Timesten技术专栏系列(一)
作者: 三十而立 时间:2009年10月03日 12:08:42 本文出自 “inthirties(三十而立)”博客,转载请务必注明作者和保留出处http://blog.csdn.net/inthir ...
- Haproxy+MYSQL 负载均衡 原创
[root@monitor app1]# yum install haproxy Loaded plugins: security : epel | : epel/primary_db | : ext ...
- 文本编辑器Nano实用快捷键
一.复制.剪切和粘贴文本 1.行复制.剪切和粘贴 Alt+6:复制光标所在行. Ctrl+K:剪切光标所在行. Ctrl+U:粘贴. 2.自由复制.剪切和粘贴 自由复制: Ctrl+6:设置复制文本的 ...
- 目录操作函数opendir、readdir和closedir
首先,明确一个类型DIR的含义: #include <dirent.h> DIR A type representing a directory stream. DIR是在目录项格式 ...
- 解决Kscope中文乱码问题
当安装Kscope完成后,然后配置以下三个路径:Cscope path:/usr/bin/cscopeCtags path:/usr/bin/ctagsDot path:/usr/bin/dot 对于 ...
- android-partition分析
转载请注明来源:cuixiaolei的技术博客 这里讲下android的分区.具体的使用在另一片文章中介绍,这里只是把它拿出来介绍. android的存储分为两种 一种叫做RAM,如emmc标准的dd ...