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- ...
随机推荐
- C# 函数覆盖总结学习
覆盖类成员:通过new关键字修饰虚函数表示覆盖该虚函数.一个虚函数被覆盖后,任何父类变量都不能访问该虚函数的具体实现.public virtual void IntroduceMyself(){... ...
- Select模型原理
Select模型原理 利用select函数,推断套接字上是否存在数据,或者是否能向一个套接字写入数据.目的是防止应用程序在套接字处于锁定模式时,调用recv(或send)从没有数据的套接字上接收数据, ...
- Android apk的安装、卸载、更新升级(通过Eclipse实现静默安装)
一.通过Intent消息机制发送消息,调用系统应用进行,实现apk的安装/卸载 . (1) 调用系统的安装应用,让系统自动进行apk的安装 String fileName = "/data/ ...
- 2.目录:疯子讲iOS课程
目录:疯子讲iOS课程 写这个目录让我纠结好几天,一是我在考虑要不要从Objective-c基础开始讲,是否要使用ARC的方式讲,二是本人的游戏这几天正在封测,时间也比较紧张.纠结于有些朋友可能还不了 ...
- 【Android】利用服务Service创建标题栏通知
创建标题栏通知的核心代码 public void CreateInform() { //定义一个PendingIntent,当用户点击通知时,跳转到某个Activity(也可以发送广播等) Inten ...
- javaio学习笔记-字符流类(1)
1.java.io包中的字符流类-BufferedReader和BufferedWriter: BufferedReader:缓存的输入字符流; BufferedWriter:缓存的输出字符流; In ...
- Online Schema Upgrade in MySQL Galera Cluster using TOI Method
http://severalnines.com/blog/online-schema-upgrade-mysql-galera-cluster-using-toi-method As a fo ...
- Sharepoint 2010 根据用户权限隐藏Ribbon菜单(利用css)
本文介绍的是根据用户权限隐藏整个Ribbon菜单项. 操作环境:Windows Server 2008 r2+ SharePoint 2010 1.关于SharePoint 权限详细请参考:http ...
- Oralce_语法
Oracle内建数据类型 一. 字符数据 1. char(size) 2. varchar2(size) 最常用,最大长度4000字节 3. nvhar(size).nvarchar(size) 4. ...
- 读logback源码系列文章(五)——Appender --转载
原文地址:http://kyfxbl.iteye.com/blog/1173788 明天要带老婆出国旅游几天,所以这段时间暂时都更新不了博客了,临走前再最后发一贴 上一篇我们说到Logger类的inf ...