4843 lines
190 KiB
C#
4843 lines
190 KiB
C#
|
||
/// <summary>
|
||
///LOGIC CLASS FOR TABLE t_wmsOutPickRequest
|
||
///By wm with codesmith.
|
||
///on 05/22/2017
|
||
/// </summary>
|
||
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using DeiNiu.wms.Data.Model;
|
||
using System.Data;
|
||
using System.Transactions;
|
||
using DeiNiu.Utils;
|
||
using System.Threading;
|
||
using DeiNiu.Data.BaseObject;
|
||
|
||
namespace DeiNiu.wms.Logical
|
||
{
|
||
[Serializable]
|
||
public class lWmsOutPickRequest : lbase
|
||
{
|
||
WmsOutPickRequest _obj;
|
||
private WmsOutDesk _desk;
|
||
private WmsOutDesk _seedsDesk;
|
||
private WmsOutPickDetail_tmp _outPickTmp;
|
||
private WmsPlate _plate;
|
||
|
||
WmsPlate plate
|
||
{
|
||
get
|
||
{
|
||
if ( _plate == null)
|
||
{
|
||
_plate = new WmsPlate();
|
||
_plate.operater = operId;
|
||
}
|
||
return _plate;
|
||
}
|
||
}
|
||
WmsOutPickRequest outRequest
|
||
{
|
||
get
|
||
{
|
||
if (_outRequest == null)
|
||
{
|
||
_outRequest = new WmsOutPickRequest();
|
||
_outRequest.operater = operId;
|
||
}
|
||
return _outRequest;
|
||
}
|
||
}
|
||
public WmsOutPickDetail_tmp outPickTmp
|
||
{
|
||
get
|
||
{
|
||
if (_outPickTmp == null)
|
||
{
|
||
_outPickTmp = new WmsOutPickDetail_tmp();
|
||
_outPickTmp.operater = operId;
|
||
}
|
||
return _outPickTmp;
|
||
}
|
||
}
|
||
|
||
|
||
WmsStockRecord stkRecord
|
||
{
|
||
get
|
||
{
|
||
if(_stkRecord == null){
|
||
_stkRecord = new WmsStockRecord();
|
||
_stkRecord.operater = operId;
|
||
}
|
||
return _stkRecord;
|
||
}
|
||
|
||
}
|
||
WmsOutPickLable pickLabelDetail {
|
||
|
||
get
|
||
{
|
||
if (_pickLabelDetail == null)
|
||
{
|
||
_pickLabelDetail = new WmsOutPickLable();
|
||
_pickLabelDetail.operater = operId;
|
||
}
|
||
return _pickLabelDetail;
|
||
}
|
||
|
||
}
|
||
WmsOutPickPort outPickPort
|
||
{
|
||
get
|
||
{
|
||
if (_outPickPort == null)
|
||
{
|
||
_outPickPort = new WmsOutPickPort();
|
||
_outPickPort.operater = operId;
|
||
}
|
||
return _outPickPort;
|
||
}
|
||
}
|
||
|
||
WmsOutPickPort _outPickPort;
|
||
|
||
WmsOutPickRequest _outRequest ;
|
||
WmsStockRecord _stkRecord ;
|
||
WmsOutPickLable _pickLabelDetail ;
|
||
|
||
WmsOutDesk desk {
|
||
get
|
||
{
|
||
if (_desk == null)
|
||
{
|
||
_desk = new WmsOutDesk();
|
||
_desk.operater = operId;
|
||
}
|
||
return _desk;
|
||
}
|
||
}
|
||
WmsOutDesk seedsDesk
|
||
{
|
||
get
|
||
{
|
||
if (_seedsDesk == null)
|
||
{
|
||
_seedsDesk = new WmsOutDesk();
|
||
}
|
||
return _seedsDesk;
|
||
}
|
||
}
|
||
public lWmsOutPickRequest()
|
||
{
|
||
initialize();
|
||
}
|
||
|
||
public lWmsOutPickRequest(int p) :base(p)
|
||
{
|
||
initialize();
|
||
}
|
||
|
||
|
||
public WmsOutPickRequest getWmsOutPickRequest
|
||
{
|
||
get
|
||
{
|
||
if (_obj == null)
|
||
{
|
||
_obj = new WmsOutPickRequest();
|
||
}
|
||
return _obj;
|
||
}
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// get all data
|
||
/// </summary>
|
||
public DataSet getAllData()
|
||
{
|
||
return _obj.Query();
|
||
}
|
||
/// <summary>
|
||
///get pick details
|
||
///if no pick data,return order details
|
||
/// </summary>
|
||
public DataSet getPickDetails(string orderNo,bool isPickdetail)
|
||
{
|
||
DataSet ds = ds = _obj.getPickDetailByOrder(orderNo, isPickdetail);
|
||
/*if (orderType == enumOutOrderType.销售订单)
|
||
{
|
||
DataTable dt = ds.Tables[0];
|
||
if (dt.Rows.Count > 0)
|
||
{
|
||
if (string.IsNullOrEmpty(dt.Rows[0]["pickOrderNo"].ToString()))
|
||
{
|
||
WmsOutRequest ord = new WmsOutRequest();
|
||
ord.orderNo = orderNo;
|
||
return ord.getOutDetail();
|
||
}
|
||
}
|
||
|
||
|
||
}*/
|
||
|
||
return ds ;
|
||
}
|
||
/// <summary>
|
||
/// get all data
|
||
/// </summary>
|
||
public DataSet getAllActiveData()
|
||
{
|
||
return _obj.QueryActived();
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// get a record by id
|
||
/// </summary>
|
||
public void initialize(int id)
|
||
{
|
||
_obj = id != 0 ? new WmsOutPickRequest(id) : new WmsOutPickRequest();
|
||
}
|
||
|
||
/// <summary>
|
||
/// get a record by id 0
|
||
/// </summary>
|
||
public void initialize()
|
||
{
|
||
initialize(0);
|
||
}
|
||
|
||
/// <summary>
|
||
/// get a record by id
|
||
/// </summary>
|
||
public void initialize(DataRow dr)
|
||
{
|
||
_obj = new WmsOutPickRequest(dr);
|
||
}
|
||
|
||
protected override DeiNiu.Data.BaseObject.BaseModel getModel()
|
||
{
|
||
return _obj;
|
||
}
|
||
|
||
|
||
//begin cust db operation, query, excute sql etc.
|
||
|
||
|
||
//private static bool _canNewWave = false;
|
||
////Int64 lastWave =0;
|
||
//DateTime lastWave;
|
||
// public bool canNewWave
|
||
// {
|
||
// get
|
||
// {
|
||
|
||
// _canNewWave = _canNewWave || outRequest.canNewWave();
|
||
|
||
// if (_canNewWave)
|
||
// {
|
||
// lastWave = DateTime.Now ;
|
||
// }
|
||
// else
|
||
// {
|
||
// TimeSpan ts = DateTime.Now - lastWave;
|
||
// if (ts.TotalMilliseconds > WmsConstants.MAX_SECONDS_BETWEEN_WAVES) //强制开始新波次,有可能会有再次发送亮灯数据时
|
||
// {
|
||
// _canNewWave = true;
|
||
// lastWave = DateTime.Now;
|
||
// }
|
||
// }
|
||
|
||
|
||
// return _canNewWave ;//|| outRequest.canNewWave() ;//|| true;
|
||
// // return _canNewWave; // pickLabelDetail.getCurrentPickList(enumLabelPickState.notPicked).Tables[0].Rows.Count > 0;
|
||
// }
|
||
// }
|
||
|
||
//static Dictionary<int, List<int>> comLables = new Dictionary<int, List<int>>();
|
||
static List<int> lblist = new List<int>();
|
||
static Dictionary<int, int> comLables = new Dictionary<int,int>();
|
||
|
||
void initialDebugSetting()
|
||
{
|
||
|
||
DataTable dt = new Node().QueryByFlag(10001);
|
||
foreach (DataRow dr in dt.Rows)
|
||
{
|
||
Node node = new Node(dr);
|
||
|
||
if (!node.isOn)
|
||
{
|
||
continue;
|
||
}
|
||
try
|
||
{
|
||
string labels = node.description;
|
||
string[] lbs = labels.Split(',');
|
||
foreach (string s in lbs)
|
||
{
|
||
comLables[Convert.ToInt16(s.Trim())] = Convert.ToInt16(node.name.Trim());
|
||
lblist.Add(Convert.ToInt16(s.Trim()));
|
||
}
|
||
}
|
||
catch
|
||
{
|
||
continue;
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
}
|
||
|
||
private string waveOrder ="";
|
||
private List<WmsOutPickRequest> bulkRequests;
|
||
private static Dictionary<string, DateTime> seedsWaiting = new Dictionary<string, DateTime>();
|
||
private static List<String> noSeeds = new List<string>();
|
||
// public static bool isProcessWaveing = false;
|
||
private static int waveCnt= 0 ;
|
||
|
||
|
||
/// <summary>
|
||
/// 开始新波次
|
||
/// </summary>
|
||
|
||
public void newBulkDPSandSeedsPickWave()
|
||
{
|
||
waveCnt++;
|
||
//播种筛选,
|
||
//适合播种的客户订单合并成一个、多个大订单,统一捡出后进行播种操作
|
||
//1. 单个订单的品种少 、数量少
|
||
//2. 订单数量多
|
||
|
||
//只处理订单零货部分
|
||
//加入播种选项,所有订单零货部分使用摘取+播种方式
|
||
//1.播种点数量可配置, 分别用不同颜色区分
|
||
//2.每个播种点可分播客户的数量配置, 即每个播种点处理零货订单数量( 例如配置成6个,一次捡6个客户的订单零货部分,送由一个播种点播种)
|
||
//3.波次和播种点的对应关系,一个波次只摘取一个播种点的零货,还是多个播种点的数据?
|
||
//4.
|
||
|
||
|
||
//一个波次可以摘取订单数 = 空闲分播台数量*每个分播台可分播客户数, 分播台的订单用颜色区分
|
||
|
||
|
||
|
||
bool isSeedsEnabled = WmsConstants.OUT_BULK_SEEDS_PICK_ON;
|
||
|
||
if (!WmsConstants.OUT_BULK_DESK_CONTROLL)
|
||
{//播种复核台完成复核任务前,复核台不可用,拆零波次不分配给复核台任务
|
||
//播种复核台复位
|
||
desk.restDeskStatus(enumDeskState.空闲);
|
||
desk.restDeskStatus(enumDeskState.空闲, enumDeskType.播种); //播种台状态复位到空闲,
|
||
}
|
||
|
||
_desk = getRandomFreeDesk();
|
||
_seedsDesk = getRandomFreeSeedsDesk();
|
||
if (desk.ID == 0) // no free pick desk
|
||
{
|
||
if (isSeedsEnabled)
|
||
{
|
||
|
||
if (seedsDesk.ID == 0)
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), "开始新波次。。。。。。。。。。。。。。。。。。");
|
||
|
||
// System.Diagnostics.Debug.WriteLine("begin make new wave .....{0}" ,DateTime.Now);
|
||
|
||
// List<WmsOutPickRequest> requests = outRequest.getRequests4Wave(); //.getRequestObjects(enumOutOrderType.拣货单, enumOutStockRequestStatus.波次处理);
|
||
// System.Diagnostics.Debug.WriteLine("begin make new wave .....{0}" ,DateTime.Now);
|
||
WaveRule wr = new WaveRule().getCurrentActiveRule(enumWaveRuleType.DPS灯光波次);
|
||
|
||
DataSet ds = outRequest.getRequests4DpsWave(enumOutOrderType.销售出库, wr);
|
||
|
||
DataTable dtSeeds = ds.Tables[1];
|
||
DataTable dtOne = ds.Tables[0];
|
||
|
||
List<WmsOutPickRequest> requests = new List<WmsOutPickRequest>();
|
||
|
||
foreach (DataRow dr in dtSeeds.Rows)//播种订单
|
||
{
|
||
WmsOutPickRequest wo = new WmsOutPickRequest(dr);
|
||
if (!noSeeds.Contains(wo.pickOrderNo))
|
||
{
|
||
requests.Add(wo);
|
||
}
|
||
}
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("待处理 SEEDS 订单数量:{0}",dtSeeds.Rows.Count));
|
||
|
||
foreach (string order in noSeeds) // 等待播种订单转入摘果
|
||
{
|
||
WmsOutPickRequest wo = new WmsOutPickRequest(order);
|
||
wo.seedsLabelId = 0;
|
||
requests.Add(wo);
|
||
}
|
||
|
||
foreach (DataRow dr in dtOne.Rows) //摘果订单
|
||
{
|
||
requests.Add(new WmsOutPickRequest(dr));
|
||
}
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("待处理 摘果 订单数量:{0}", dtOne.Rows.Count));
|
||
|
||
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("待处理 等待Seeds 订单数量:{0}", noSeeds.Count));
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("待处理订单数量:{0}", requests.Count));
|
||
|
||
if (requests.Count == 0)
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("无订单需要处理,波次结束"));
|
||
checkRepAndNoStockOrders();
|
||
return;
|
||
}
|
||
|
||
int labelMaxInWave = WmsConstants.MAX_LABEL_DATA_IN_A_WAVE; //一个标签一个波次只能存储40条数据
|
||
|
||
#if DEBUG
|
||
// if (lblist.Count == 0)
|
||
{
|
||
lblist.Clear();
|
||
initialDebugSetting();
|
||
}
|
||
lblist.Sort();
|
||
// int minId = lblist[0];
|
||
// int maxId = lblist[lblist.Count - 1];
|
||
// labelMaxInWave = 2;
|
||
#endif
|
||
|
||
|
||
// List<WmsStockRecord> strecs = null;
|
||
waveOrder = Util.getOrderNo(enumCreateOrderType.dpsOrder, _obj.getNextSeq(enumCreateOrderType.dpsOrder));
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("new waveNo {0}", waveOrder));
|
||
|
||
//waveOrder = "WV" + System.DateTime.Now.ToString("yyyyMMddHHmmss");
|
||
int pickDetailMaxInWave = WmsConstants.MAX_CONTROL_DATA_IN_A_WAVE; //一个控制器最大存储1200条
|
||
Dictionary<int, int> labelCnt = new Dictionary<int, int>();
|
||
Dictionary<int, int> comCnt = new Dictionary<int, int>();
|
||
|
||
Dictionary<int, int> tmplabelCnt = new Dictionary<int, int>();
|
||
Dictionary<int, int> tmpcomCnt = new Dictionary<int, int>();
|
||
bool isReachLimit = false;
|
||
|
||
int waveSize = 0;
|
||
//List<WmsOutPickPort> lstPort;
|
||
List<WmsOutPickLable_tmp> lstLabel;
|
||
|
||
|
||
|
||
|
||
//播种常量,达不到最小订单摘取需求的合并成大订单先统一摘取再分播
|
||
|
||
int pickGoodsTypeMin = WmsConstants.OUT_MAX_SEEDS_GOODSTYPE_CNT; //单独摘取订单 最少货物类型
|
||
int pickGoodsCountMin = WmsConstants.OUT_MAX_SEEDS_BULK_CNT_SUM; // 单独摘取订单 最少货物数量
|
||
int seedsCount = seedsDesk.seedsCount; //播种台一次播种订单数量
|
||
decimal sumBulkCnt = 0;
|
||
bool isSeedPickInSameWave = true;
|
||
// bool canSeedPickLessThanseedsCount = false; //单个播种拣选单数量不可少于播种能力
|
||
List<WmsOutPickRequest> seedsRequests = new List<WmsOutPickRequest>();
|
||
Dictionary<string, WmsStockRecord> seedsBulks = new Dictionary<string, WmsStockRecord>();
|
||
List<WmsStockRecord> lstSeedsBulk = new List<WmsStockRecord>(); ;
|
||
|
||
|
||
|
||
//订单充足的情况下,每个波次的拣货负载均衡化,每个波次每个复核台都要最大负载,不空转
|
||
//先满足播种数据,再进行摘果
|
||
|
||
|
||
|
||
|
||
int bulkCnt = 0;
|
||
|
||
|
||
bulkRequests = new List<WmsOutPickRequest>(); //for batch process in a new thread
|
||
|
||
//开始处理有零货的订单
|
||
DateTime d0 = DateTime.Now;
|
||
double totoalTime = 0d;
|
||
string lastAddress = "";
|
||
foreach (WmsOutPickRequest request in requests)
|
||
{
|
||
LogHelper.debug(this.GetType(), string.Format("开始处理零库出库 {0} ------------", request.pickOrderNo));
|
||
|
||
_desk = getRandomFreeDesk();
|
||
if (desk.ID == 0) // no free pick desk
|
||
{
|
||
LogHelper.debug(this.GetType(), " no pick desk available.....");
|
||
if (isSeedsEnabled)
|
||
{
|
||
if (seedsDesk.ID == 0)
|
||
{
|
||
LogHelper.debug(this.GetType(), "no pick no seeds desk ,break 1");
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
if (request.seedsLabelId != WmsConstants.SEEDS_LABLEID_MARK_VALUE)//仅剩下摘果的订单
|
||
{
|
||
LogHelper.debug(this.GetType(), "no pick no seeds order ,break 2");
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (request.seedsLabelId == WmsConstants.SEEDS_LABLEID_MARK_VALUE)//播种的订单
|
||
{
|
||
|
||
if (isSeedsEnabled)
|
||
{
|
||
if (seedsDesk.ID == 0)
|
||
{
|
||
LogHelper.debug(this.GetType(), " no seed desk available.....,continue");
|
||
continue;
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
//确保每个pick order 都进入波次 ,不空耗资源
|
||
|
||
DateTime d00 = DateTime.Now;
|
||
|
||
|
||
|
||
if (request.bulkCnt == 0)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
|
||
DataTable dt = stkRecord.getPickStockRecods(request.pickOrderNo, true).Tables[0];//取出库明细,
|
||
// lstPort = new List<WmsOutPickPort>();
|
||
lstLabel = new List<WmsOutPickLable_tmp>();
|
||
|
||
//开始处理零货出库
|
||
|
||
|
||
DataView dvBulk = new DataView(dt);
|
||
dvBulk.RowFilter = string.Format(" volType in ({0},{1})", (int)enumWhLocVol.零库1, (int)enumWhLocVol.零库);
|
||
|
||
if (bulkCnt + dvBulk.Count >= pickDetailMaxInWave)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
|
||
DateTime d1 = DateTime.Now;
|
||
|
||
List<WmsStockRecord> lstBulk = new List<WmsStockRecord>();
|
||
bulkCnt += dvBulk.Count;
|
||
|
||
|
||
lstBulk = new List<WmsStockRecord>();
|
||
sumBulkCnt = 0;
|
||
int lastId = 0;
|
||
foreach (DataRowView drv in dvBulk)
|
||
{
|
||
WmsStockRecord sr = new WmsStockRecord();
|
||
|
||
sr.ID = Convert.ToInt32(drv["id"].ToString());
|
||
sr.locationId = drv["locationID"].ToString();
|
||
sr.orderDetailId = Convert.ToInt32(drv["orderDetailId"].ToString());
|
||
|
||
if (WmsConstants.OUT_STOCK_DEDUCT)
|
||
{
|
||
sr.count = Convert.ToDecimal(drv["countOuting"].ToString());
|
||
}
|
||
else
|
||
{
|
||
sr.count = Convert.ToDecimal(drv["count"].ToString());
|
||
}
|
||
#if DEBUG
|
||
if (lblist.Count > 0)
|
||
{
|
||
int id = new Random().Next(lblist.Count);
|
||
//#if DEBUG
|
||
sr.location.elabId = lblist[id]; //new Random().Next(minId, maxId + 1); //测试。。。随机分配标签id 为 1-3
|
||
|
||
while (lblist.Count > 1 && lastId == sr.location.elabId)
|
||
{
|
||
id = new Random().Next(lblist.Count);
|
||
sr.location.elabId = lblist[id];
|
||
}
|
||
|
||
lastId = sr.location.elabId;
|
||
//#endif
|
||
}
|
||
#endif
|
||
sumBulkCnt += sr.count;
|
||
lstBulk.Add(sr);
|
||
|
||
|
||
}
|
||
|
||
#region checklabellimit
|
||
foreach (WmsStockRecord rec in lstBulk)//检查电子标签数量是否超过范围
|
||
{
|
||
if (tmplabelCnt.ContainsKey(rec.location.elabId))
|
||
{
|
||
tmplabelCnt[rec.location.elabId]++;
|
||
}
|
||
else
|
||
{
|
||
tmplabelCnt[rec.location.elabId] = 1;
|
||
}
|
||
|
||
if (tmpcomCnt.ContainsKey(rec.location.port))
|
||
{
|
||
tmpcomCnt[rec.location.port] = tmpcomCnt[rec.location.port] + 1;
|
||
}
|
||
else
|
||
{
|
||
tmpcomCnt[rec.location.port] = 1;
|
||
}
|
||
|
||
|
||
if (labelCnt.ContainsKey(rec.location.elabId))
|
||
{
|
||
labelCnt[rec.location.elabId] = labelCnt[rec.location.elabId] + 1;
|
||
if (labelCnt[rec.location.elabId] >= labelMaxInWave)
|
||
{
|
||
isReachLimit = true;
|
||
|
||
foreach (int k in tmplabelCnt.Keys)
|
||
{
|
||
if (labelCnt.ContainsKey(k))
|
||
{
|
||
labelCnt[k] -= tmplabelCnt[k];
|
||
}
|
||
}
|
||
|
||
|
||
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
labelCnt[rec.location.elabId] = 1;
|
||
}
|
||
|
||
if (comCnt.ContainsKey(rec.location.port))
|
||
{
|
||
comCnt[rec.location.port] = comCnt[rec.location.port] + 1;
|
||
if (comCnt[rec.location.port] >= pickDetailMaxInWave)
|
||
{
|
||
isReachLimit = true;
|
||
|
||
foreach (int k in tmpcomCnt.Keys)
|
||
{
|
||
if (comCnt.ContainsKey(k))
|
||
{
|
||
comCnt[k] -= tmpcomCnt[k];
|
||
}
|
||
}
|
||
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
comCnt[rec.location.port] = 1;
|
||
}
|
||
}
|
||
|
||
//TimeSpan ts11 = DateTime.Now - d11;
|
||
//System.Diagnostics.Debug.WriteLine(string.Format(" 检查是否超限完毕 --- cost {0}", ts11.TotalSeconds + " : " + ts11.TotalMilliseconds));
|
||
|
||
if (isReachLimit)
|
||
{
|
||
isReachLimit = false;
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("超过限制,继续下条数据.... "));
|
||
|
||
continue;
|
||
}
|
||
#endregion
|
||
//tsss = DateTime.Now - d2;
|
||
|
||
|
||
tmplabelCnt.Clear();
|
||
tmpcomCnt.Clear();
|
||
|
||
|
||
//DateTime d11 = DateTime.Now;
|
||
//System.Diagnostics.Debug.WriteLine(string.Format(" 开始检查是否超限 --- {0}", d11));
|
||
|
||
if (isSeedsEnabled && request.seedsLabelId==WmsConstants.SEEDS_LABLEID_MARK_VALUE )
|
||
|
||
//订单货品零货数量小
|
||
/*if (isSeedsEnabled
|
||
&& lstBulk.Count < pickGoodsTypeMin //订单货品种类小
|
||
&& sumBulkCnt < pickGoodsCountMin
|
||
&& !noSeeds.Contains(request.pickOrderNo)
|
||
|
||
) */
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("进入播种拣选 seedsRequests.Count:{0} ,_seedsDesk.ID :{1}" +
|
||
",seedsRequests contains {2}: {3}", seedsRequests.Count, _seedsDesk.ID, request.pickOrderNo, seedsRequests.Contains(request)));
|
||
foreach (WmsOutPickRequest wor in seedsRequests)
|
||
{
|
||
if (wor.pickOrderNo == request.pickOrderNo)
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), "seedsRequests.Contains(request): " + seedsRequests.Contains(request));
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), "seedsRequests contains " + request.pickOrderNo);
|
||
continue;
|
||
}
|
||
}
|
||
//播种筛选
|
||
// if (isSeedsEnabled && seedsRequests.Count < seedsCount )//播种能力之内
|
||
// && lstBulk.Count < pickGoodsTypeMin //订单货品种类小
|
||
// && sumBulkCnt < pickGoodsCountMin) //订单货品零货数量小
|
||
|
||
|
||
|
||
if (_seedsDesk.ID > 0) //exist free seeds desk
|
||
{
|
||
|
||
if (seedsRequests.Count < seedsCount)//播种能力之内
|
||
{
|
||
//符合播种条件,整合订单
|
||
seedsRequests.Add(request);
|
||
|
||
//出库明细合并
|
||
foreach (WmsStockRecord wsr in lstBulk)
|
||
{
|
||
if (seedsBulks.ContainsKey(wsr.locationId))
|
||
{
|
||
seedsBulks[wsr.locationId].count += wsr.count;
|
||
seedsBulks[wsr.locationId].countOuting += wsr.countOuting;
|
||
}
|
||
else
|
||
{
|
||
seedsBulks[wsr.locationId] = wsr;
|
||
}
|
||
lstSeedsBulk.Add(wsr);
|
||
}
|
||
|
||
|
||
if (seedsRequests.Count == seedsCount) //生成播种拣选单
|
||
{
|
||
//create seeds pick request
|
||
|
||
//create pick detail WmsOutPickLable_tmp
|
||
createSeedsRequest(seedsRequests, seedsBulks, lstSeedsBulk);
|
||
lstSeedsBulk.Clear();
|
||
seedsRequests.Clear();
|
||
seedsBulks.Clear();
|
||
_seedsDesk = getRandomFreeSeedsDesk(); //重新取可用播种台
|
||
seedsCount = _seedsDesk.seedsCount;
|
||
// continue;
|
||
|
||
|
||
|
||
}
|
||
|
||
|
||
continue;
|
||
}
|
||
|
||
|
||
}
|
||
else //no free seeds desk
|
||
{
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("播种拣选,no free seeds desk"));
|
||
|
||
if (!isSeedPickInSameWave) //播、摘同波次
|
||
{
|
||
break;
|
||
}
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("订单{0} 将进入下一播种波次,开始处理下个订单", request.pickOrderNo));
|
||
continue;
|
||
|
||
}
|
||
|
||
|
||
}
|
||
|
||
else // 非播种拣选
|
||
{
|
||
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" lstBulk.Count:{1},sumBulkCnt:{2}"
|
||
, seedsRequests.Count, lstBulk.Count, sumBulkCnt));
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("进入摘果式拣选"));
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest),
|
||
string.Format("last address: {0},current address: {1}",
|
||
lastAddress, request.customerName + request.custAddress));
|
||
|
||
|
||
//}
|
||
|
||
|
||
|
||
//建立零库电子拣选临时数据 ---摘果
|
||
|
||
if (desk.color == 0)
|
||
{
|
||
break;
|
||
}
|
||
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), " 摘果式 保存整货和零货出库分拣数据");
|
||
|
||
WmsOutPickLable_tmp wpl;
|
||
foreach (WmsStockRecord rec in lstBulk)
|
||
{
|
||
// if (rec.count == 0)
|
||
if (rec.count + rec.countOuting < 1) //不支持小数
|
||
{
|
||
continue;
|
||
}
|
||
wpl = new WmsOutPickLable_tmp();
|
||
wpl.pickOrderNo = request.pickOrderNo;
|
||
wpl.recordId = rec.ID;
|
||
wpl.color = desk.color;
|
||
|
||
wpl.count = rec.count + rec.countOuting;
|
||
wpl.locationId = rec.locationId;
|
||
wpl.elabAddress = rec.location.elabAddress;
|
||
wpl.elabId = rec.location.elabId;
|
||
// wpl.elabId = new Random().Next(1,4); //测试。。。随机分配标签id 为 1-3
|
||
wpl.port = rec.location.port;
|
||
wpl.orderDetailId = rec.orderDetailId;
|
||
//#if DEBUG
|
||
try
|
||
{
|
||
if (comLables.Count > 0)
|
||
{
|
||
wpl.port = comLables[wpl.elabId]; //rec.location.elabId < 4 ?5 :3; //测试。。。 分配标签端口为3
|
||
}
|
||
}
|
||
catch { }
|
||
//#endif
|
||
wpl.dpsOrder = waveOrder;
|
||
wpl.operater = this.operId;
|
||
lstLabel.Add(wpl);
|
||
|
||
}
|
||
|
||
|
||
//保存整货和零货出库分拣数据
|
||
|
||
|
||
|
||
try
|
||
{
|
||
using (TransactionScope scope1 = new TransactionScope())
|
||
{
|
||
foreach (WmsOutPickLable_tmp wp in lstLabel) //建立电子拣选临时数据
|
||
{
|
||
wp.Add();
|
||
|
||
WmsOutPickPort wop = new WmsOutPickPort();// wp.recordId
|
||
wop.getPickPortByRecordId(wp.recordId);
|
||
wop.dpsOrder = waveOrder;
|
||
wop.Update();
|
||
// WmsOutPickDetail pd = new WmsOutPickDetail(wp.orderDetailId);
|
||
// pd.updateErpSaleDetail_deng(true);
|
||
|
||
}
|
||
|
||
// foreach (WmsOutPickPort wop in lstPort) //建立电子拣选临时数据
|
||
// {
|
||
// wop.Add();
|
||
|
||
// }
|
||
|
||
|
||
if (lstLabel.Count > 0)
|
||
{
|
||
request.waveOrder = waveOrder;
|
||
// request.state = (int)enumOutStockRequestStatus.正在分拣;
|
||
request.waveStart = request.getDateTime();
|
||
|
||
request.operater = this.operId;
|
||
request.updateBulkPickStatus(request.pickOrderNo, enumOutStockPickStatus.正在分拣, operId);
|
||
request.desk = desk.color;
|
||
desk.state = (int)enumDeskState.任务中;
|
||
desk.Update();
|
||
request.Update();
|
||
bulkRequests.Add(request);
|
||
int count = outRequest.saveTempData4Validation(waveOrder, request.pickOrderNo);
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), "---------- insert into detail temp data count " + count);
|
||
}
|
||
//if (lstPort.Count > 0)
|
||
// {
|
||
// request.updateBatchPickStatus(request.pickOrderNo, enumOutStockPickStatus.待处理);
|
||
// }
|
||
|
||
|
||
|
||
|
||
waveSize++;
|
||
|
||
scope1.Complete();
|
||
|
||
//TimeSpan ts2 = DateTime.Now - d12;
|
||
//System.Diagnostics.Debug.WriteLine(string.Format(" {1} 保存完毕 {0} cost {2} .....", request.pickOrderNo, DateTime.Now, ts2.TotalSeconds + " : " + ts2.TotalMilliseconds));
|
||
}
|
||
|
||
|
||
//System.Diagnostics.Debug.WriteLine(string.Format("{1} 处理完毕 {0} cost {2} .....", request.pickOrderNo,DateTime.Now, ts.TotalSeconds +" : "+ ts.TotalMilliseconds));
|
||
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LogHelper.WriteLog(typeof(lWmsOutPickRequest), e);
|
||
// System.Diagnostics.Debug.WriteLine(e.Message);
|
||
}
|
||
|
||
|
||
|
||
TimeSpan ts00 = DateTime.Now - d00;
|
||
totoalTime += ts00.TotalSeconds;
|
||
}
|
||
}
|
||
|
||
|
||
/*少于播种台播种订单个数时 ,等待新订单加入后再拣选 或改播种台或改摘果
|
||
*/
|
||
if (isSeedsEnabled && seedsRequests.Count > 0)
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format("not full seeds pool detetcted, size {0}", seedsRequests.Count));
|
||
|
||
if (seedsRequests.Count == seedsCount || seedsRequests.Count >= seedsDesk.seedsMinCount) // || seedsRequests.Count < seedsCount && canSeedPickLessThanseedsCount
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format(" mini seeds cnt meet for seeds desk {0} , size {1}",_seedsDesk.ID, seedsRequests.Count));
|
||
createSeedsRequest(seedsRequests, seedsBulks, lstSeedsBulk);//生成播种拣选单
|
||
|
||
|
||
}
|
||
else
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format(" seedsWaiting size {0} ", seedsWaiting.Count));
|
||
|
||
foreach (WmsOutPickRequest pr in seedsRequests)
|
||
{
|
||
if (!seedsWaiting.Keys.Contains(pr.pickOrderNo))
|
||
{
|
||
seedsWaiting[pr.pickOrderNo] = System.DateTime.Now;
|
||
}
|
||
else
|
||
{
|
||
|
||
DateTime dte = seedsWaiting[pr.pickOrderNo].AddMinutes(WmsConstants.OUT_MAX_SEEDS_WAIT_MINUES);
|
||
if (dte > System.DateTime.Now)
|
||
{
|
||
seedsWaiting.Remove(pr.pickOrderNo);
|
||
noSeeds.Add(pr.pickOrderNo);
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format("pr {0} waited {1},noseeds marked", pr.pickOrderNo, dte.CompareTo(DateTime.Now)));
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
seedsRequests.Clear();
|
||
seedsBulks.Clear();
|
||
|
||
}
|
||
//int count1 = 0;
|
||
try
|
||
{
|
||
// count = outRequest.saveTempData4Validation(waveOrder);
|
||
|
||
}
|
||
catch (Exception er)
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), er.Message);
|
||
|
||
}
|
||
|
||
// LogHelper.debug(typeof(lWmsOutPickRequest), "---------- insert into detail temp data count " + count);
|
||
TimeSpan ts1 = DateTime.Now - d0;
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("{0} 零库处理完毕----- cost {1} .....{2}", DateTime.Now, ts1.TotalSeconds + ":" + ts1.TotalMilliseconds, totoalTime));
|
||
// insert tmp data for validation
|
||
//outRequest.saveTempData4Validation(waveOrder);
|
||
|
||
WmsConstants.WAVE_CURRENT_PICK_STATUS.Clear();
|
||
|
||
|
||
|
||
WmsConstants.WAVE_CURRENT_ORDER = waveOrder;
|
||
|
||
WmsConstants.WAVE_LAST_TIME = DateTime.Now;
|
||
|
||
//检查待补货出货单状态
|
||
Thread stockCheckThread = new Thread(checkRepAndNoStockOrders);
|
||
stockCheckThread.IsBackground = true;
|
||
stockCheckThread.Start();
|
||
|
||
TimeSpan ts0 = DateTime.Now - d0;
|
||
//System.Diagnostics.Debug.WriteLine(string.Format("{0} 全部处理完毕{1} ..", DateTime.Now, ts0.TotalSeconds + " : " + ts0.TotalMilliseconds));
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("{0} 全部处理完毕,耗时{1} ..", DateTime.Now, ts0.TotalSeconds + ":" + ts0.TotalMilliseconds));
|
||
// TaskCallBack();
|
||
try
|
||
{
|
||
outRequest.fixMore();
|
||
}
|
||
catch (Exception er)
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), er.StackTrace.ToString());
|
||
|
||
}
|
||
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), "wave cnt is " + waveCnt);
|
||
foreach(int key in comCnt.Keys)
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format("com {0}, rec cnt {1} ", key, comCnt[key]));
|
||
}
|
||
foreach (int key in labelCnt.Keys)
|
||
{
|
||
if(labelCnt[key]>2)
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format("labelid {0}, rec cnt {1}" , key, labelCnt[key]));
|
||
}
|
||
|
||
|
||
|
||
}
|
||
|
||
|
||
public void newBulkDPSandSeedsPickWave2()
|
||
{
|
||
|
||
//播种筛选,
|
||
//适合播种的客户订单合并成一个、多个大订单,统一捡出后进行播种操作
|
||
//1. 单个订单的品种少 、数量少
|
||
//2. 订单数量多
|
||
|
||
//只处理订单零货部分
|
||
//加入播种选项,所有订单零货部分使用摘取+播种方式
|
||
//1.播种点数量可配置, 分别用不同颜色区分
|
||
//2.每个播种点可分播客户的数量配置, 即每个播种点处理零货订单数量( 例如配置成6个,一次捡6个客户的订单零货部分,送由一个播种点播种)
|
||
//3.波次和播种点的对应关系,一个波次只摘取一个播种点的零货,还是多个播种点的数据?
|
||
//4.
|
||
|
||
|
||
//一个波次可以摘取订单数 = 空闲分播台数量*每个分播台可分播客户数, 分播台的订单用颜色区分
|
||
//
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), "开始新波次。。。。。。。。。。。。。。。。。。");
|
||
|
||
// System.Diagnostics.Debug.WriteLine("begin make new wave .....{0}" ,DateTime.Now);
|
||
|
||
List<WmsOutPickRequest> requests = outRequest.getRequests4Wave(); //.getRequestObjects(enumOutOrderType.拣货单, enumOutStockRequestStatus.波次处理);
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("待处理订单数量:{0}", requests.Count));
|
||
|
||
if (requests.Count == 0)
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("无订单需要处理,波次结束"));
|
||
checkRepAndNoStockOrders();
|
||
return;
|
||
}
|
||
desk.restDeskStatus(enumDeskState.空闲);
|
||
if (!WmsConstants.OUT_BULK_DESK_CONTROLL)
|
||
{//播种复核台完成复核任务前,复核台不可用,拆零波次不分配给复核台任务
|
||
//播种复核台复位
|
||
desk.restDeskStatus(enumDeskState.空闲, enumDeskType.播种); //播种台状态复位到空闲,
|
||
}
|
||
_seedsDesk = getRandomFreeSeedsDesk();
|
||
_desk = getRandomFreeDesk();
|
||
int labelMaxInWave = WmsConstants.MAX_LABEL_DATA_IN_A_WAVE; //一个标签一个波次只能存储40条数据
|
||
|
||
#if DEBUG
|
||
// if (lblist.Count == 0)
|
||
{
|
||
lblist.Clear();
|
||
initialDebugSetting();
|
||
}
|
||
lblist.Sort();
|
||
// int minId = lblist[0];
|
||
// int maxId = lblist[lblist.Count - 1];
|
||
// labelMaxInWave = 2;
|
||
#endif
|
||
|
||
|
||
// List<WmsStockRecord> strecs = null;
|
||
waveOrder = Util.getOrderNo(enumCreateOrderType.dpsOrder, _obj.getNextSeq(enumCreateOrderType.dpsOrder));
|
||
//waveOrder = "WV" + System.DateTime.Now.ToString("yyyyMMddHHmmss");
|
||
int pickDetailMaxInWave = WmsConstants.MAX_CONTROL_DATA_IN_A_WAVE; //一个控制器最大存储1200条
|
||
Dictionary<int, int> labelCnt = new Dictionary<int, int>();
|
||
Dictionary<int, int> comCnt = new Dictionary<int, int>();
|
||
|
||
Dictionary<int, int> tmplabelCnt = new Dictionary<int, int>();
|
||
Dictionary<int, int> tmpcomCnt = new Dictionary<int, int>();
|
||
bool isReachLimit = false;
|
||
|
||
int waveSize = 0;
|
||
//List<WmsOutPickPort> lstPort;
|
||
List<WmsOutPickLable_tmp> lstLabel;
|
||
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("waveNo {0}", waveOrder));
|
||
|
||
//播种常量,达不到最小订单摘取需求的合并成大订单先统一摘取再分播
|
||
bool isSeedsEnabled = WmsConstants.OUT_BULK_SEEDS_PICK_ON;
|
||
int pickGoodsTypeMin = WmsConstants.OUT_MAX_SEEDS_GOODSTYPE_CNT; //单独摘取订单 最少货物类型
|
||
int pickGoodsCountMin = WmsConstants.OUT_MAX_SEEDS_BULK_CNT_SUM; // 单独摘取订单 最少货物数量
|
||
int seedsCount = seedsDesk.seedsCount; //播种台一次播种订单数量
|
||
decimal sumBulkCnt = 0;
|
||
bool isSeedPickInSameWave = true;
|
||
// bool canSeedPickLessThanseedsCount = false; //单个播种拣选单数量不可少于播种能力
|
||
List<WmsOutPickRequest> seedsRequests = new List<WmsOutPickRequest>();
|
||
Dictionary<string, WmsStockRecord> seedsBulks = new Dictionary<string, WmsStockRecord>();
|
||
List<WmsStockRecord> lstSeedsBulk = new List<WmsStockRecord>();
|
||
|
||
//订单充足的情况下,每个波次的拣货负载均衡化,每个波次每个复核台都要最大负载,不空转
|
||
//先满足播种数据,再进行摘果
|
||
|
||
|
||
if (desk.ID == 0) // no free pick desk
|
||
{
|
||
if (isSeedsEnabled)
|
||
{
|
||
_seedsDesk = getRandomFreeSeedsDesk();
|
||
if (seedsDesk.ID == 0)
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
|
||
|
||
int bulkCnt = 0;
|
||
int requestCnt = 0;
|
||
|
||
bulkRequests = new List<WmsOutPickRequest>(); //for batch process in a new thread
|
||
|
||
//开始处理有零货的订单
|
||
DateTime d0 = DateTime.Now;
|
||
double totoalTime = 0d;
|
||
string lastAddress = "";
|
||
foreach (WmsOutPickRequest request in requests)
|
||
{
|
||
DateTime d00 = DateTime.Now;
|
||
if(request.pickOrderNo== "PK23031557945")
|
||
{
|
||
bool HIT = true;
|
||
}
|
||
if (request.bulkCnt > 0)
|
||
{
|
||
requestCnt++;
|
||
}
|
||
|
||
if (requestCnt >= pickDetailMaxInWave)
|
||
{
|
||
break;
|
||
}
|
||
|
||
if (request.bulkCnt == 0)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
|
||
|
||
// LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("开始处理零库出库 {0} ------------", request.pickOrderNo ));
|
||
LogHelper.debug(this.GetType(), string.Format("开始处理零库出库 {0} ------------", request.pickOrderNo));
|
||
|
||
|
||
DataTable dt = stkRecord.getPickStockRecods(request.pickOrderNo, true).Tables[0];//取出库明细
|
||
// lstPort = new List<WmsOutPickPort>();
|
||
lstLabel = new List<WmsOutPickLable_tmp>();
|
||
|
||
//开始处理零货出库
|
||
|
||
|
||
DataView dvBulk = new DataView(dt);
|
||
dvBulk.RowFilter = string.Format(" volType in ({0},{1})", (int)enumWhLocVol.零库1, (int)enumWhLocVol.零库);
|
||
|
||
if (bulkCnt + dvBulk.Count >= pickDetailMaxInWave)
|
||
{
|
||
break;
|
||
}
|
||
|
||
|
||
|
||
|
||
//TimeSpan tssss = DateTime.Now - d00;
|
||
//System.Diagnostics.Debug.WriteLine(string.Format(" {0} {1},befor prepare bulklist, cost {2}", DateTime.Now, request.pickOrderNo, tssss.TotalSeconds));
|
||
|
||
DateTime d1 = DateTime.Now;
|
||
|
||
List<WmsStockRecord> lstBulk = new List<WmsStockRecord>();
|
||
bulkCnt = dvBulk.Count;
|
||
|
||
/*foreach (DataRowView drv in dvBulk)
|
||
{
|
||
bulkCnt++;
|
||
lstBulk.Add(new WmsStockRecord(drv.Row));
|
||
}*/
|
||
|
||
|
||
|
||
// TimeSpan tsss = DateTime.Now - d1;
|
||
|
||
// LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" {0} prepare bulklist count :{1}, cost {2}", request.pickOrderNo, lstBulk.Count, tsss.TotalSeconds));
|
||
// DateTime d2 = DateTime.Now;
|
||
|
||
lstBulk = new List<WmsStockRecord>();
|
||
sumBulkCnt = 0;
|
||
int lastId = 0;
|
||
foreach (DataRowView drv in dvBulk)
|
||
{
|
||
WmsStockRecord sr = new WmsStockRecord();
|
||
|
||
sr.ID = Convert.ToInt32(drv["id"].ToString());
|
||
sr.locationId = drv["locationID"].ToString();
|
||
sr.orderDetailId = Convert.ToInt32(drv["orderDetailId"].ToString());
|
||
|
||
if (WmsConstants.OUT_STOCK_DEDUCT)
|
||
{
|
||
sr.count = Convert.ToDecimal(drv["countOuting"].ToString());
|
||
}
|
||
else
|
||
{
|
||
sr.count = Convert.ToDecimal(drv["count"].ToString());
|
||
}
|
||
#if DEBUG
|
||
if (lblist.Count > 0)
|
||
{
|
||
int id = new Random().Next(lblist.Count);
|
||
//#if DEBUG
|
||
sr.location.elabId = lblist[id]; //new Random().Next(minId, maxId + 1); //测试。。。随机分配标签id 为 1-3
|
||
|
||
while (lblist.Count > 1 && lastId == sr.location.elabId)
|
||
{
|
||
id = new Random().Next(lblist.Count);
|
||
sr.location.elabId = lblist[id];
|
||
}
|
||
|
||
lastId = sr.location.elabId;
|
||
//#endif
|
||
}
|
||
#endif
|
||
sumBulkCnt += sr.count;
|
||
lstBulk.Add(sr);
|
||
|
||
|
||
}
|
||
|
||
|
||
//tsss = DateTime.Now - d2;
|
||
|
||
// LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" {0} {1},prepare bulklist2 count :{2}, cost {3}", DateTime.Now, request.pickOrderNo, lstBulk.Count, tsss.TotalSeconds));
|
||
|
||
|
||
/*
|
||
pickDetailMaxInWave -= strecs.Count;
|
||
|
||
if (pickDetailMaxInWave < 0)
|
||
{
|
||
//超出一个波次最大分拣数量
|
||
isReachLimit = true;
|
||
break;
|
||
}
|
||
*/
|
||
|
||
tmplabelCnt.Clear();
|
||
tmpcomCnt.Clear();
|
||
|
||
|
||
//DateTime d11 = DateTime.Now;
|
||
//System.Diagnostics.Debug.WriteLine(string.Format(" 开始检查是否超限 --- {0}", d11));
|
||
|
||
if (isSeedsEnabled
|
||
&& lstBulk.Count < pickGoodsTypeMin //订单货品种类小
|
||
&& sumBulkCnt < pickGoodsCountMin
|
||
&& !noSeeds.Contains(request.pickOrderNo)
|
||
|
||
) //订单货品零货数量小
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("进入播种拣选 seedsRequests.Count:{0} ,_seedsDesk.ID :{1}" +
|
||
",seedsRequests contains {2}: {3}", seedsRequests.Count, _seedsDesk.ID, request.pickOrderNo, seedsRequests.Contains(request)));
|
||
foreach (WmsOutPickRequest wor in seedsRequests)
|
||
{
|
||
if (wor.pickOrderNo == request.pickOrderNo)
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), "seedsRequests.Contains(request): " + seedsRequests.Contains(request));
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), "seedsRequests contains " + request.pickOrderNo);
|
||
continue;
|
||
}
|
||
}
|
||
//播种筛选
|
||
// if (isSeedsEnabled && seedsRequests.Count < seedsCount )//播种能力之内
|
||
// && lstBulk.Count < pickGoodsTypeMin //订单货品种类小
|
||
// && sumBulkCnt < pickGoodsCountMin) //订单货品零货数量小
|
||
if (_seedsDesk.ID > 0) //exist free seeds desk
|
||
{
|
||
|
||
if (seedsRequests.Count < seedsCount)//播种能力之内
|
||
{
|
||
//符合播种条件,整合订单
|
||
seedsRequests.Add(request);
|
||
|
||
//出库明细合并
|
||
foreach (WmsStockRecord wsr in lstBulk)
|
||
{
|
||
if (seedsBulks.ContainsKey(wsr.locationId))
|
||
{
|
||
seedsBulks[wsr.locationId].count += wsr.count;
|
||
seedsBulks[wsr.locationId].countOuting += wsr.countOuting;
|
||
}
|
||
else
|
||
{
|
||
seedsBulks[wsr.locationId] = wsr;
|
||
}
|
||
lstSeedsBulk.Add(wsr);
|
||
}
|
||
|
||
|
||
if (seedsRequests.Count == seedsCount) //生成播种拣选单
|
||
{
|
||
//create seeds pick request
|
||
|
||
//create pick detail WmsOutPickLable_tmp
|
||
createSeedsRequest(seedsRequests, seedsBulks, lstSeedsBulk);
|
||
lstSeedsBulk.Clear();
|
||
seedsRequests.Clear();
|
||
seedsBulks.Clear();
|
||
_seedsDesk = getRandomFreeSeedsDesk(); //重新取可用播种台
|
||
seedsCount = _seedsDesk.seedsCount;
|
||
// continue;
|
||
|
||
|
||
|
||
}
|
||
|
||
|
||
continue;
|
||
}
|
||
|
||
|
||
}
|
||
else //no free seeds desk
|
||
{
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("播种拣选,no free seeds desk"));
|
||
|
||
if (!isSeedPickInSameWave) //播、摘同波次
|
||
{
|
||
break;
|
||
}
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("订单{0} 将进入下一播种波次,开始处理下个订单", request.pickOrderNo));
|
||
continue;
|
||
|
||
}
|
||
|
||
|
||
}
|
||
|
||
else // 非播种拣选
|
||
{
|
||
_desk = getRandomFreeDesk();
|
||
/*
|
||
*一个客户在同一个波次不能有多个pickOrder,不然比较麻烦
|
||
if (!lastAddress.Equals(request.customerName + request.custAddress))
|
||
{
|
||
_desk = getRandomFreeDesk();
|
||
lastAddress = request.customerName + request.custAddress;
|
||
}
|
||
*/
|
||
|
||
if (desk.color == 0) // no exist free desk, then process bulk
|
||
{
|
||
// LogHelper.debug(typeof(lWmsOutPickRequest), "摘果式拣选,无可用复核台");
|
||
if (isSeedsEnabled && _seedsDesk.ID > 0) // 启用播种后,由播种台是否空闲来判断是否结束循环
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), " 播种台有空,继续处理剩余订单");
|
||
continue;
|
||
}
|
||
else
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), " 无可用复核台、播种台,波次生成结束");
|
||
break;
|
||
}
|
||
|
||
}
|
||
else {
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("pickorderno: {0},desk id :{1}", request.pickOrderNo, desk.ID));
|
||
}
|
||
|
||
if (WmsConstants.OUT_LIGHT_ENABLE)
|
||
{
|
||
#region checklabellimit
|
||
foreach (WmsStockRecord rec in lstBulk)//检查电子标签数量是否超过范围
|
||
{
|
||
|
||
/*
|
||
if (lblist.Count > 0)
|
||
{
|
||
int id = new Random().Next(lblist.Count);
|
||
//#if DEBUG
|
||
rec.location.elabId = lblist[id]; //new Random().Next(minId, maxId + 1); //测试。。。随机分配标签id 为 1-3
|
||
|
||
while (lblist.Count > 1 && lastId == rec.location.elabId)
|
||
{
|
||
id = new Random().Next(lblist.Count);
|
||
rec.location.elabId = lblist[id];
|
||
}
|
||
|
||
lastId = rec.location.elabId;
|
||
//#endif
|
||
}
|
||
*/
|
||
|
||
|
||
|
||
if (tmplabelCnt.ContainsKey(rec.location.elabId))
|
||
{
|
||
tmplabelCnt[rec.location.elabId]++;
|
||
}
|
||
else
|
||
{
|
||
tmplabelCnt[rec.location.elabId] = 1;
|
||
}
|
||
|
||
if (tmpcomCnt.ContainsKey(rec.location.port))
|
||
{
|
||
tmpcomCnt[rec.location.port] = tmpcomCnt[rec.location.port] + 1;
|
||
}
|
||
else
|
||
{
|
||
tmpcomCnt[rec.location.port] = 1;
|
||
}
|
||
|
||
|
||
if (labelCnt.ContainsKey(rec.location.elabId))
|
||
{
|
||
labelCnt[rec.location.elabId] = labelCnt[rec.location.elabId] + 1;
|
||
if (labelCnt[rec.location.elabId] >= labelMaxInWave)
|
||
{
|
||
isReachLimit = true;
|
||
|
||
foreach (int k in tmplabelCnt.Keys)
|
||
{
|
||
if (labelCnt.ContainsKey(k))
|
||
{
|
||
labelCnt[k] -= tmplabelCnt[k];
|
||
}
|
||
}
|
||
|
||
|
||
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
labelCnt[rec.location.elabId] = 1;
|
||
}
|
||
|
||
if (comCnt.ContainsKey(rec.location.port))
|
||
{
|
||
comCnt[rec.location.port] = comCnt[rec.location.port] + 1;
|
||
if (comCnt[rec.location.port] >= pickDetailMaxInWave)
|
||
{
|
||
isReachLimit = true;
|
||
|
||
foreach (int k in tmpcomCnt.Keys)
|
||
{
|
||
if (comCnt.ContainsKey(k))
|
||
{
|
||
comCnt[k] -= tmpcomCnt[k];
|
||
}
|
||
}
|
||
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
comCnt[rec.location.port] = 1;
|
||
}
|
||
}
|
||
#endregion
|
||
//TimeSpan ts11 = DateTime.Now - d11;
|
||
//System.Diagnostics.Debug.WriteLine(string.Format(" 检查是否超限完毕 --- cost {0}", ts11.TotalSeconds + " : " + ts11.TotalMilliseconds));
|
||
|
||
if (isReachLimit)
|
||
{
|
||
isReachLimit = false;
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("超过限制,继续下条数据.... "));
|
||
|
||
continue;
|
||
}
|
||
}
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" lstBulk.Count:{1},sumBulkCnt:{2}"
|
||
, seedsRequests.Count, lstBulk.Count, sumBulkCnt));
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("进入摘果式拣选"));
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest),
|
||
string.Format("last address: {0},current address: {1}",
|
||
lastAddress, request.customerName + request.custAddress));
|
||
|
||
|
||
//}
|
||
|
||
|
||
|
||
//建立零库电子拣选临时数据 ---摘果
|
||
|
||
if (desk.color == 0)
|
||
{
|
||
break;
|
||
}
|
||
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), " 摘果式 保存整货和零货出库分拣数据");
|
||
|
||
WmsOutPickLable_tmp wpl;
|
||
foreach (WmsStockRecord rec in lstBulk)
|
||
{
|
||
// if (rec.count == 0)
|
||
if (rec.count + rec.countOuting < 1) //不支持小数
|
||
{
|
||
continue;
|
||
}
|
||
wpl = new WmsOutPickLable_tmp();
|
||
wpl.pickOrderNo = request.pickOrderNo;
|
||
wpl.recordId = rec.ID;
|
||
wpl.color = desk.color;
|
||
|
||
wpl.count = rec.count + rec.countOuting;
|
||
wpl.locationId = rec.locationId;
|
||
wpl.elabAddress = rec.location.elabAddress;
|
||
wpl.elabId = rec.location.elabId;
|
||
// wpl.elabId = new Random().Next(1,4); //测试。。。随机分配标签id 为 1-3
|
||
wpl.port = rec.location.port;
|
||
wpl.orderDetailId = rec.orderDetailId;
|
||
//#if DEBUG
|
||
try
|
||
{
|
||
if (comLables.Count > 0)
|
||
{
|
||
wpl.port = comLables[wpl.elabId]; //rec.location.elabId < 4 ?5 :3; //测试。。。 分配标签端口为3
|
||
}
|
||
}
|
||
catch { }
|
||
//#endif
|
||
wpl.dpsOrder = waveOrder;
|
||
wpl.operater = this.operId;
|
||
lstLabel.Add(wpl);
|
||
|
||
}
|
||
|
||
|
||
//保存整货和零货出库分拣数据
|
||
|
||
|
||
|
||
try
|
||
{
|
||
using (TransactionScope scope1 = new TransactionScope())
|
||
{
|
||
foreach (WmsOutPickLable_tmp wp in lstLabel) //建立电子拣选临时数据
|
||
{
|
||
wp.Add();
|
||
|
||
WmsOutPickPort wop = new WmsOutPickPort();// wp.recordId
|
||
wop.getPickPortByRecordId(wp.recordId);
|
||
wop.dpsOrder = waveOrder;
|
||
wop.Update();
|
||
// WmsOutPickDetail pd = new WmsOutPickDetail(wp.orderDetailId);
|
||
// pd.updateErpSaleDetail_deng(true);
|
||
|
||
}
|
||
|
||
// foreach (WmsOutPickPort wop in lstPort) //建立电子拣选临时数据
|
||
// {
|
||
// wop.Add();
|
||
|
||
// }
|
||
|
||
|
||
if (lstLabel.Count > 0)
|
||
{
|
||
request.waveOrder = waveOrder;
|
||
// request.state = (int)enumOutStockRequestStatus.正在分拣;
|
||
request.waveStart = request.getDateTime();
|
||
|
||
request.operater = this.operId;
|
||
request.updateBulkPickStatus(request.pickOrderNo, enumOutStockPickStatus.正在分拣, operId);
|
||
request.desk = desk.color;
|
||
desk.state = (int)enumDeskState.任务中;
|
||
desk.Update();
|
||
request.Update();
|
||
bulkRequests.Add(request);
|
||
int count= outRequest.saveTempData4Validation(waveOrder,request.pickOrderNo);
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), "---------- insert into detail temp data count " + count);
|
||
}
|
||
//if (lstPort.Count > 0)
|
||
// {
|
||
// request.updateBatchPickStatus(request.pickOrderNo, enumOutStockPickStatus.待处理);
|
||
// }
|
||
|
||
|
||
|
||
|
||
waveSize++;
|
||
|
||
scope1.Complete();
|
||
|
||
//TimeSpan ts2 = DateTime.Now - d12;
|
||
//System.Diagnostics.Debug.WriteLine(string.Format(" {1} 保存完毕 {0} cost {2} .....", request.pickOrderNo, DateTime.Now, ts2.TotalSeconds + " : " + ts2.TotalMilliseconds));
|
||
}
|
||
|
||
|
||
//System.Diagnostics.Debug.WriteLine(string.Format("{1} 处理完毕 {0} cost {2} .....", request.pickOrderNo,DateTime.Now, ts.TotalSeconds +" : "+ ts.TotalMilliseconds));
|
||
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LogHelper.WriteLog(typeof(lWmsOutPickRequest), e);
|
||
// System.Diagnostics.Debug.WriteLine(e.Message);
|
||
}
|
||
|
||
|
||
|
||
TimeSpan ts00 = DateTime.Now - d00;
|
||
totoalTime += ts00.TotalSeconds;
|
||
}
|
||
}
|
||
|
||
|
||
/*少于播种台播种订单个数时 ,等待新订单加入后再拣选 或改播种台或改摘果
|
||
*/
|
||
if (isSeedsEnabled && seedsRequests.Count > 0)
|
||
{
|
||
if (seedsRequests.Count == seedsCount || seedsRequests.Count >= seedsDesk.seedsMinCount) // || seedsRequests.Count < seedsCount && canSeedPickLessThanseedsCount
|
||
{
|
||
createSeedsRequest(seedsRequests, seedsBulks, lstSeedsBulk);//生成播种拣选单
|
||
}
|
||
else
|
||
{
|
||
// _seedsDesk = getRandomFreeSeedsDesk();
|
||
// if (seedsDesk.ID == 0) //无可用播种台
|
||
{
|
||
foreach (WmsOutPickRequest pr in seedsRequests)
|
||
{
|
||
if (!seedsWaiting.Keys.Contains(pr.pickOrderNo))
|
||
{
|
||
seedsWaiting[pr.pickOrderNo] = System.DateTime.Now;
|
||
}
|
||
else
|
||
{
|
||
|
||
DateTime dte = seedsWaiting[pr.pickOrderNo].AddMinutes(WmsConstants.OUT_MAX_SEEDS_WAIT_MINUES);
|
||
if (dte > System.DateTime.Now)
|
||
{
|
||
seedsWaiting.Remove(pr.pickOrderNo);
|
||
noSeeds.Add(pr.pickOrderNo);
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format("pr {0} waited {1},noseeds marked",pr.pickOrderNo,dte.CompareTo(DateTime.Now)));
|
||
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
seedsRequests.Clear();
|
||
seedsBulks.Clear();
|
||
|
||
}
|
||
//int count1 = 0;
|
||
try
|
||
{
|
||
// count = outRequest.saveTempData4Validation(waveOrder);
|
||
|
||
}
|
||
catch (Exception er)
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), er.Message);
|
||
|
||
}
|
||
|
||
// LogHelper.debug(typeof(lWmsOutPickRequest), "---------- insert into detail temp data count " + count);
|
||
TimeSpan ts1 = DateTime.Now - d0;
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("{0} 零库处理完毕----- cost {1} .....{2}", DateTime.Now, ts1.TotalSeconds + ":" + ts1.TotalMilliseconds, totoalTime));
|
||
// insert tmp data for validation
|
||
//outRequest.saveTempData4Validation(waveOrder);
|
||
|
||
WmsConstants.WAVE_CURRENT_PICK_STATUS.Clear();
|
||
|
||
|
||
|
||
WmsConstants.WAVE_CURRENT_ORDER = waveOrder;
|
||
|
||
WmsConstants.WAVE_LAST_TIME = DateTime.Now;
|
||
|
||
//点亮标签开始捡货
|
||
// elelab.pick.send_data_pick(pickLabelDetail.getData4Pick(waveOrder).Tables[0], enumLabelPickType.pick);
|
||
|
||
|
||
//检查待补货出货单状态
|
||
checkRepAndNoStockOrders();
|
||
|
||
// isProcessWaveing = false; //TODO: check if all batch is not finished, what happend?
|
||
|
||
/*
|
||
* Thread.CurrentThread.Join(1);
|
||
|
||
Thread batchPick4Bulk = new Thread(new ParameterizedThreadStart(processBatchOrdersWithBulk));
|
||
batchPick4Bulk.IsBackground = true;
|
||
batchPick4Bulk.Start(bulkRequests);
|
||
*/
|
||
// Thread.CurrentThread.Join(1);
|
||
|
||
// process all batch pick request
|
||
// Thread batchPick = new Thread(new ParameterizedThreadStart(processBatchWithBulkOrders));
|
||
// batchPick.IsBackground = true;
|
||
// batchPick.Start(requests);
|
||
// batchPick.Start(bulkRequests); //只处理有零货的订单,全为整的订单暂时在 GoodsBatchOutForm newBatchOnlyPDATasks
|
||
// processAllBatchOrders(requests, waveOrder);
|
||
TimeSpan ts0 = DateTime.Now - d0;
|
||
//System.Diagnostics.Debug.WriteLine(string.Format("{0} 全部处理完毕{1} ..", DateTime.Now, ts0.TotalSeconds + " : " + ts0.TotalMilliseconds));
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("{0} 全部处理完毕,耗时{1} ..", DateTime.Now, ts0.TotalSeconds + ":" + ts0.TotalMilliseconds));
|
||
// TaskCallBack();
|
||
try
|
||
{
|
||
outRequest.fixMore();
|
||
}
|
||
catch (Exception er)
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest),er.StackTrace.ToString());
|
||
|
||
}
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 取指定分区的,指定状态的亮灯数据
|
||
/// 按复核台、波次号 asc 排序
|
||
/// </summary>
|
||
/// <param name="part"></param>
|
||
/// <param name="status"></param>
|
||
/// <returns></returns>
|
||
internal DataTable getSeedDesksPickList(int partId, enumPickState status)
|
||
{
|
||
|
||
DataTable dt= pickLabelDetail.getSeedDesksPickList(partId, status);
|
||
|
||
if (!WmsConstants.SEEDS_PARTION_DESK_COLOR_MAP)
|
||
{
|
||
return dt;
|
||
}
|
||
|
||
Dictionary<int, string> currentWavePart = new Dictionary<int, string> ();
|
||
Dictionary<int, int> mapColorPairs = new Dictionary<int, int> ();
|
||
|
||
foreach (DataRow dr in dt.Rows)
|
||
{
|
||
string waveNo = dr["dpsOrder"].ToString();
|
||
int color = getMapColor(mapColorPairs, Convert.ToInt16(dr["color"].ToString()));
|
||
dr["color"] = color;
|
||
currentWavePart[color]=waveNo;
|
||
}
|
||
|
||
|
||
|
||
WmsWave ww = new WmsWave();
|
||
ww.clearSeedsPart(partId);
|
||
foreach (int color in currentWavePart.Keys)
|
||
{
|
||
ww.partion = partId;
|
||
ww.mapColor = color;
|
||
ww.waveNo= currentWavePart[color];
|
||
ww.terminal = getOrigColor(mapColorPairs, color);
|
||
ww.Add();
|
||
}
|
||
|
||
|
||
return dt;
|
||
|
||
}
|
||
private int getMapColor(Dictionary<int, int> mapColorPairs, int color)
|
||
{
|
||
|
||
if (mapColorPairs.ContainsKey(color))
|
||
{
|
||
return mapColorPairs[color];
|
||
}
|
||
|
||
int maxColor = 0;
|
||
foreach (int value in mapColorPairs.Values)
|
||
{
|
||
if (maxColor < value)
|
||
{
|
||
maxColor = value;
|
||
}
|
||
}
|
||
maxColor++;
|
||
mapColorPairs[color] = maxColor;
|
||
|
||
return maxColor;
|
||
|
||
}
|
||
|
||
private int getOrigColor(Dictionary<int, int> mapColorPairs, int color)
|
||
{
|
||
|
||
foreach (int key in mapColorPairs.Keys)
|
||
{
|
||
if (color == mapColorPairs[key])
|
||
{
|
||
return key;
|
||
}
|
||
}
|
||
return color;
|
||
}
|
||
|
||
void createSeedsRequest(List<WmsOutPickRequest> seedsRequests, Dictionary<string, WmsStockRecord> seedsBulks,List<WmsStockRecord> lstBulk )
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("开始生成播种拣选单,seedsRequests.count :{0},seedsBulks.count:{1}",
|
||
seedsRequests.Count, seedsBulks.Count));
|
||
|
||
List<WmsOutPickLable_tmp> lstLabel = new List<WmsOutPickLable_tmp>();
|
||
|
||
if (_seedsDesk.ID == 0)
|
||
{
|
||
return;
|
||
}
|
||
|
||
WmsOutPickRequest seedPickRequest = new WmsOutPickRequest();
|
||
seedPickRequest.pickOrderNo = Util.getOrderNo(enumCreateOrderType.seedsPickOrder, seedPickRequest.getNextSeq(enumCreateOrderType.seedsPickOrder));
|
||
seedPickRequest.orderType = (int)enumOutOrderType.销售出库;
|
||
seedPickRequest.outStoreType = (int)enumOutStoreType.播种拣货出库;
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("播种拣选单 :{0} ", seedPickRequest.pickOrderNo));
|
||
|
||
WmsWave ww = new WmsWave();
|
||
ww.waveNo = waveOrder;
|
||
ww.seedsNo = seedPickRequest.pickOrderNo;
|
||
ww.deskColor = _seedsDesk.color;
|
||
ww.state =(int) enumOutStockRequestStatus.正在分拣;
|
||
|
||
|
||
|
||
WmsOutPickLable_tmp wpl;
|
||
foreach (WmsStockRecord rec in seedsBulks.Values)
|
||
{
|
||
if (rec.count +rec.countOuting <1)
|
||
{
|
||
// continue;
|
||
}
|
||
wpl = new WmsOutPickLable_tmp();
|
||
wpl.pickOrderNo = seedPickRequest.pickOrderNo;
|
||
wpl.recordId = rec.ID;
|
||
wpl.color = seedsDesk.color;
|
||
wpl.orderDetailId = rec.orderDetailId;//部分,不精确到一一对应
|
||
wpl.count = rec.count + rec.countOuting;
|
||
wpl.locationId = rec.locationId;
|
||
wpl.elabAddress = rec.location.elabAddress;
|
||
wpl.elabId = rec.location.elabId;
|
||
wpl.port = rec.location.port;
|
||
//#if DEBUG
|
||
if (comLables.Count > 0)
|
||
{
|
||
wpl.port = comLables[wpl.elabId]; //rec.location.elabId < 4 ?5 :3; //测试。。。 分配标签端口为3
|
||
|
||
}
|
||
//#endif
|
||
wpl.dpsOrder = waveOrder;
|
||
wpl.operater = this.operId;
|
||
|
||
|
||
|
||
lstLabel.Add(wpl);
|
||
|
||
}
|
||
int i =0;
|
||
int startId = seedsDesk.startLabelId;
|
||
//保存整货和零货出库分拣数据
|
||
try
|
||
{
|
||
using (TransactionScope scope1 = new TransactionScope())
|
||
{
|
||
ww.Add();
|
||
foreach (WmsOutPickLable_tmp wp in lstLabel) //建立电子拣选临时数据
|
||
{
|
||
wp.Add();
|
||
|
||
}
|
||
seedsDesk.state = (int)enumDeskState.任务中;
|
||
seedsDesk.Update();
|
||
|
||
foreach (WmsOutPickRequest request in seedsRequests)
|
||
{
|
||
|
||
if (lstLabel.Count > 0)
|
||
{
|
||
|
||
request.waveOrder = waveOrder;
|
||
// request.state = (int)enumOutStockRequestStatus.正在分拣;
|
||
request.waveStart = request.getDateTime();
|
||
request.operater = this.operId;
|
||
|
||
|
||
// request.updateBulkPickStatus(request.pickOrderNo, enumOutStockPickStatus.正在分拣, operId);
|
||
request.bulkPickState = (int)enumOutStockPickStatus.正在分拣;
|
||
request.desk = seedsDesk.color;
|
||
|
||
|
||
|
||
request.seedsLabelId = startId > 0 ? startId++ : seedsDesk.color * 10 + ++i; //每个播种复合台的标签ID编号不重复,应对多个播种台共用一个标签控制器的情况。
|
||
request.seedsPickNo = seedPickRequest.pickOrderNo; //赋值播种拣选订单单号
|
||
request.seedsPort = seedsDesk.port;
|
||
request.Update();
|
||
bulkRequests.Add(request);
|
||
|
||
int count = outRequest.saveTempData4Validation(waveOrder, request.pickOrderNo);
|
||
request.updateBulkPickStatus(request.pickOrderNo, enumOutStockPickStatus.正在分拣,operId);
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), "---------- insert into detail temp data count " + count);
|
||
}
|
||
|
||
|
||
//waveSize++;
|
||
|
||
/*
|
||
Erp_sale es = new Erp_sale();
|
||
es.getByPickOrder(request.pickOrderNo);
|
||
es.liangdeng = true;
|
||
es.Update();
|
||
*/
|
||
|
||
}
|
||
WmsOutPickPort wop;
|
||
foreach (WmsStockRecord wsr in lstBulk)
|
||
{
|
||
wop = new WmsOutPickPort();
|
||
wop.getPickPortByRecordId(wsr.ID);
|
||
wop.dpsOrder = waveOrder;
|
||
wop.pickDetailId = wsr.orderDetailId;
|
||
wop.Update();
|
||
}
|
||
scope1.Complete();
|
||
|
||
//TimeSpan ts2 = DateTime.Now - d12;
|
||
//System.Diagnostics.Debug.WriteLine(string.Format(" {1} 保存完毕 {0} cost {2} .....", request.pickOrderNo, DateTime.Now, ts2.TotalSeconds + " : " + ts2.TotalMilliseconds));
|
||
}
|
||
|
||
|
||
//System.Diagnostics.Debug.WriteLine(string.Format("{1} 处理完毕 {0} cost {2} .....", request.pickOrderNo,DateTime.Now, ts.TotalSeconds +" : "+ ts.TotalMilliseconds));
|
||
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LogHelper.WriteLog(typeof(lWmsOutPickRequest), e);
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 点亮待拣选标签
|
||
/// </summary>
|
||
//public void lightLables()
|
||
//{
|
||
// lastWave = DateTime.Now;
|
||
// WmsConstants.WAVE_CURRENT_LIGHTS_STATUS.Clear();
|
||
// elelab.pick.send_data_pick( pickLabelDetail.getPickedData(enumLabelPickState.notPicked).Tables[0], enumLabelPickType.pick);
|
||
//}
|
||
|
||
/// <summary>
|
||
/// 检查补货出货单状态
|
||
/// 若不再缺货则进下个波次
|
||
/// </summary>
|
||
|
||
public void checkRepAndNoStockOrders()
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format(" start check stock for ...... " + enumOutStockRequestStatus.等待补货));
|
||
bool isOk;
|
||
List<WmsOutPickRequest> prs = outRequest.getRequestObjects( enumOutStockRequestStatus.等待补货);
|
||
foreach (WmsOutPickRequest pr in prs)
|
||
{
|
||
// LogHelper.debug(typeof(lWmsOutPickRequest), String.Format(" start check stock for pr {0} ...... ", pr.pickOrderNo));
|
||
isOk = true;
|
||
foreach (WmsOutPickDetail pd in pr.outDetails)
|
||
{
|
||
if (pd.state == (int)enumOutStockDetailStatus.等待补货)
|
||
{
|
||
// decimal d = pd.goods.stockBulkCount /* pd.getGoodsStockCnt(enumWhLocVol.零库)*/;
|
||
decimal d = pd.goods.stockBulkAvCount /* pd.getGoodsStockCnt(enumWhLocVol.零库)*/;
|
||
if (pd.bulkCount >= d)
|
||
{
|
||
isOk = false;
|
||
break;
|
||
}
|
||
|
||
}
|
||
}
|
||
if (isOk)
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format( "pr {0} stock bulk available, start stock process... ",pr.pickOrderNo ) );
|
||
pr.state = (int)enumOutStockRequestStatus.待定位;
|
||
|
||
// pr.operater = LoginInfo.UserId;
|
||
// pr.lastmodified = pr.getDateTime();
|
||
pr.operater = this.operId;
|
||
pr.Update();
|
||
|
||
new lWmsOutRequest(operId).requestOutStock(pr); //在库存扣除后,将分拣单状态置为等待波次
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format("pr {0} stock process done...,new status {1} ", pr.pickOrderNo, pr.state));
|
||
}
|
||
}
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), String.Format(" end check stock for ...... " + enumOutStockRequestStatus.等待补货));
|
||
|
||
}
|
||
|
||
void processBatchOrdersWithBulk(Object obs)
|
||
{
|
||
//开始处理整库出货部分
|
||
|
||
DateTime t0 = DateTime.Now;
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" 整库部分出库 处理开始...................." ) );
|
||
|
||
|
||
List<WmsOutPickRequest> requests = (List<WmsOutPickRequest>)obs;
|
||
|
||
|
||
foreach (WmsOutPickRequest request in requests)
|
||
{
|
||
processPickRequest(request);
|
||
}
|
||
TimeSpan ts = DateTime.Now - t0;
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" 整库部分出库 处理完毕 cost {0}....................", ts.TotalSeconds + " : " + ts.TotalMilliseconds));
|
||
|
||
}
|
||
|
||
/*
|
||
void processBatchWithBulkOrders(Object obs)
|
||
{
|
||
//开始处理全整库出货部分
|
||
DateTime t0 = DateTime.Now;
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format (" 整库出库 处理开始...................." ));
|
||
|
||
List<WmsOutPickRequest> requests = (List<WmsOutPickRequest>)obs;
|
||
|
||
|
||
|
||
foreach (WmsOutPickRequest request in requests)
|
||
{
|
||
|
||
if (request.bulkCnt ==0){ //亮灯波次只处理有零货也有整货的分拣单
|
||
continue;
|
||
}
|
||
|
||
processPickRequest(request);
|
||
}
|
||
|
||
TimeSpan ts = DateTime.Now - t0;
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format (" 整库部分出库 处理完毕 cost {0}....................", ts.TotalSeconds + " : " + ts.TotalMilliseconds));
|
||
}
|
||
*/
|
||
|
||
/// <summary>
|
||
/// 生成手持拣货数据 //GoodsBatchOutForm.cs newBatchOnlyPDATasks
|
||
/// </summary>
|
||
public void createPDAPickTasks( )
|
||
{
|
||
List<WmsOutPickRequest> lst = outRequest.getRequestObjects( enumOutStockRequestStatus.定位完成);
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("begin createPDAPickTasks...count {0}................",lst.Count));
|
||
foreach (WmsOutPickRequest pr in lst)
|
||
{
|
||
processPickRequest(pr);
|
||
}
|
||
}
|
||
|
||
|
||
public void processBatchPickOrders()
|
||
{
|
||
DataTable tb = outRequest.getBatchOnlyRequests(enumOutStockPickStatus.待处理);
|
||
|
||
foreach (DataRow dr in tb.Rows)
|
||
{
|
||
processPickRequest(new WmsOutPickRequest(dr));
|
||
}
|
||
}
|
||
|
||
void processPickRequest(WmsOutPickRequest request)
|
||
{
|
||
// DateTime t0 = DateTime.Now;
|
||
// System.Diagnostics.Debug.WriteLine(string.Format("{0} 整库 {1} 处理开始..................", DateTime.Now, request.pickOrderNo));
|
||
|
||
// DataTable dt = stkRecord.getPickStockRecods(request.pickOrderNo, true).Tables[0];//取出库明细
|
||
|
||
DataTable dt = stkRecord.getPickStockRecodsForPDAProcess(request.pickOrderNo ).Tables[0];
|
||
List<WmsOutPickPort> lstPort = new List<WmsOutPickPort>();
|
||
DataView dv = new DataView(dt);
|
||
dv.RowFilter = string.Format(" volType in ({0},{1},{2})", (int)enumWhLocVol.小整, (int)enumWhLocVol.中整, (int)enumWhLocVol.大整);
|
||
|
||
if (WmsConstants.OUT_STOCK_BULK_PDA_SCAN)
|
||
{
|
||
//零库数据也入PDA手持捡货表
|
||
dv.RowFilter = "";
|
||
}
|
||
|
||
string tranLocationId = request.tranLocationId;
|
||
WmsLocation tranLoc=null;
|
||
if (String.IsNullOrEmpty(tranLocationId))
|
||
{
|
||
tranLocationId= new TmsStock().getTranLocation(request.customerId);
|
||
}
|
||
|
||
// LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("begin processPickRequest...prNo {0}....,records cnt {1}............",request.pickOrderNo, dv.Count));
|
||
|
||
if (dv.Count == 0 && request.batchPickState >0)
|
||
{
|
||
request.operater = this.operId;
|
||
request.tranLocationId = tranLocationId;
|
||
request.batchPickState =(int) enumOutStockPickStatus.已定位 ;
|
||
request.Update();
|
||
return;
|
||
}
|
||
//get tranLocationId,集货区,一条线路 共用一个整货位
|
||
if (!String.IsNullOrEmpty(tranLocationId))
|
||
{
|
||
tranLoc = new WmsLocation(tranLocationId);
|
||
}
|
||
foreach (DataRowView drv in dv)
|
||
{
|
||
|
||
WmsStockRecord stRec = new WmsStockRecord(drv.Row);
|
||
WmsOutPickPort wpp = new WmsOutPickPort();
|
||
if (stRec.ID == 0)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
if (WmsConstants.OUT_STOCK_DEDUCT)
|
||
{
|
||
wpp.count = stRec.countOuting;
|
||
}
|
||
else
|
||
{
|
||
wpp.count = stRec.count;
|
||
}
|
||
|
||
wpp.volType = Convert.ToInt16(drv["volType"].ToString());
|
||
wpp.locationId = stRec.locationId;
|
||
wpp.pickOrderNo = stRec.orderNo;
|
||
wpp.recType = stRec.rectype;
|
||
wpp.recordId = stRec.ID;
|
||
// wpp.waveOrder = request.waveOrder;// WmsConstants.WAVE_CURRENT_ORDER; //TODO: wave order can be null
|
||
wpp.pickOrderNo = request.pickOrderNo;
|
||
wpp.operater = operId;
|
||
wpp.tranLocationId = tranLocationId;
|
||
wpp.pickDetailId = stRec.orderDetailId;
|
||
if (tranLoc != null)
|
||
{
|
||
wpp.tranArea = tranLoc.part;
|
||
}
|
||
wpp.partion = stRec.partion;//part 分区flag 1,2,3,4,5 分区拣货定义
|
||
lstPort.Add(wpp);
|
||
|
||
}
|
||
// System.Diagnostics.Debug.WriteLine(string.Format("{2} {0}, 记录 count:{1}", request.pickOrderNo, dvBatch.Count,DateTime.Now));
|
||
|
||
|
||
|
||
|
||
try
|
||
{
|
||
using (TransactionScope scope = new TransactionScope())
|
||
{
|
||
foreach (WmsOutPickPort wop in lstPort) //建立手持分拣数据
|
||
{
|
||
wop.Add();
|
||
|
||
}
|
||
// request.waveOrder = WmsConstants.WAVE_CURRENT_ORDER;
|
||
request.state = (int)enumOutStockRequestStatus.等待波次;
|
||
// request.waveStart = request.getDateTime();
|
||
request.operater = this.operId;
|
||
request.tranLocationId = tranLocationId;
|
||
if (lstPort.Count > 0)
|
||
{
|
||
// request.updateBatchPickStatus(request.pickOrderNo, enumOutStockPickStatus.正在分拣,operId);
|
||
}
|
||
if (request.batchPickState == (int)enumOutStockPickStatus.待处理)
|
||
{
|
||
request.batchPickState = (int)enumOutStockPickStatus.已定位;
|
||
}
|
||
if (WmsConstants.OUT_STOCK_BULK_PDA_SCAN && request.bulkPickState == (int)enumOutStockPickStatus.待处理)
|
||
{
|
||
request.bulkPickState = (int)enumOutStockPickStatus.已定位;
|
||
}
|
||
request.Update();
|
||
|
||
scope.Complete();
|
||
}
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LogHelper.WriteLog(typeof(lWmsOutPickRequest), e);
|
||
throw e;
|
||
|
||
}
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("end processPickRequest...prNo {0}....,records cnt {1}............", request.pickOrderNo, dv.Count));
|
||
|
||
// TimeSpan ts = DateTime.Now - t0;
|
||
// System.Diagnostics.Debug.WriteLine(string.Format("{0} {2}处理完毕 cost {1}....................", DateTime.Now, ts.TotalSeconds + " : " + ts.TotalMilliseconds, request.pickOrderNo));
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 随机获取摘取单订单复合台
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
private WmsOutDesk getRandomFreeDesk()
|
||
{
|
||
|
||
// #if DEBUG
|
||
// initialDesk();//TODO: remove
|
||
// #endif
|
||
|
||
|
||
return desk.getRandomDesk(enumDeskState.空闲);
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 随机获取多订单播种复合台
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
private WmsOutDesk getRandomFreeSeedsDesk()
|
||
{
|
||
return desk.getRandomDesk(enumDeskState.空闲,enumDeskType.播种);
|
||
|
||
}
|
||
/// <summary>
|
||
/// seeds pick, by plate, 按灭捡货灯,更新数据
|
||
/// </summary>
|
||
/// <param name="color"></param>
|
||
/// <param name="elabId"></param>
|
||
/// <param name="pickCount"></param>
|
||
/// <param name="elabAddress"></param>
|
||
/// <returns></returns>
|
||
public bool updateSeedsPickingStatus(int color, int elabId, decimal pickCount, int elabAddress,int partion=-1)
|
||
{
|
||
if(partion>-1 && WmsConstants.SEEDS_PARTION_DESK_COLOR_MAP)
|
||
{
|
||
WmsWave ww = new WmsWave();
|
||
DataTable dt= ww.getSeedsPart(partion, color);
|
||
foreach(DataRow dr in dt.Rows)
|
||
{
|
||
ww = new WmsWave(dr);
|
||
color = ww.terminal;
|
||
}
|
||
}
|
||
using (TransactionScope scope = new TransactionScope())
|
||
{
|
||
WmsOutPickLable_tmp wpt = new WmsOutPickLable_tmp(color, elabId, elabAddress); ;
|
||
|
||
|
||
|
||
if (!WmsConstants.OUT_STOCK_DEDUCT)
|
||
{
|
||
pickLabelDetail.updatePickingStatus(color, elabId, elabAddress, pickCount);
|
||
}
|
||
else
|
||
{
|
||
|
||
/*
|
||
* seeds pick
|
||
//update wmsOutPickPort
|
||
WmsOutPickPort wop = new WmsOutPickPort();
|
||
wop.updatePickDetailByStkrecId(wpt.recordId, enumPickState.已拣, operId);
|
||
//new stockRecord //to update current rec
|
||
WmsStockRecord wsr = new WmsStockRecord(wpt.recordId);
|
||
wsr.count = pickCount;
|
||
wsr.countOuting = 0;
|
||
wsr.operater = operId;
|
||
// wsr.Add();
|
||
wsr.Update();
|
||
*/
|
||
//update stock,update label tmp
|
||
pickLabelDetail.updatePickingStatus(color, elabId, elabAddress, pickCount, true);
|
||
|
||
//pickLabelDetail.finishCurrentPickingData(false);
|
||
}
|
||
|
||
|
||
//更新待复核数据状态
|
||
/*
|
||
WmsOutPickDetail_tmp pd = new WmsOutPickDetail_tmp(wpt.orderDetailId);
|
||
pd.bulkPicked += pickCount;
|
||
if (pd.bulkPicked == pd.bulkCount)
|
||
{
|
||
pd.bulkPickState = (int)enumOutStockPickStatus.分拣完成;
|
||
}
|
||
pd.Update();
|
||
|
||
WmsOutPickDetail pd1 = new WmsOutPickDetail (wpt.orderDetailId);
|
||
pd1.bulkPicked += pickCount;
|
||
if (pd1.bulkPicked == pd.bulkCount)
|
||
{
|
||
pd1.bulkPickState = (int)enumOutStockPickStatus.分拣完成;
|
||
}
|
||
pd1.Update();
|
||
|
||
* */
|
||
// pickLabelDetail.updateValidPickingStatus(color, elabId, elabAddress);
|
||
|
||
|
||
scope.Complete();
|
||
}
|
||
|
||
|
||
// UpdateUIDelegate(); //update ui
|
||
|
||
//updateStockByElePick( color, elabId, pickCount, elabAddress);
|
||
|
||
return true;
|
||
}
|
||
/// <summary>
|
||
/// 按灭拣货灯,更新数据
|
||
/// </summary>
|
||
/// <param name="color"></param>
|
||
/// <param name="elabId"></param>
|
||
/// <param name="pickCount"></param>
|
||
/// <param name="elabAddress"></param>
|
||
/// <returns></returns>
|
||
public bool updatePickingStatus(int color, int elabId, decimal pickCount, int elabAddress)
|
||
{
|
||
using (TransactionScope scope = new TransactionScope())
|
||
{
|
||
// WmsOutPickLable_tmp wpt = new WmsOutPickLable_tmp(color, elabId, elabAddress,(int) pickCount); ;
|
||
|
||
WmsOutPickLable_tmp wpt = new WmsOutPickLable_tmp(color, elabId, elabAddress); ;
|
||
|
||
if (!WmsConstants.OUT_STOCK_DEDUCT)
|
||
{
|
||
pickLabelDetail.updatePickingStatus(color, elabId, elabAddress, pickCount);
|
||
}
|
||
else
|
||
{
|
||
//update wmsOutPickPort
|
||
WmsOutPickPort wop = new WmsOutPickPort();
|
||
wop.updatePickDetailByStkrecId(wpt.recordId, enumPickState.已拣, operId);
|
||
|
||
//new stockRecord //to update current rec
|
||
|
||
WmsStockRecord wsr = new WmsStockRecord(wpt.recordId);
|
||
wsr.count = pickCount;
|
||
wsr.countOuting = 0;
|
||
wsr.operater = operId;
|
||
// wsr.Add();
|
||
wsr.Update();
|
||
pickLabelDetail.updatePickingStatus(color, elabId, elabAddress, pickCount, true);
|
||
}
|
||
|
||
|
||
//更新待复核数据状态
|
||
|
||
WmsOutPickDetail_tmp pd = new WmsOutPickDetail_tmp(wpt.orderDetailId);
|
||
pd.bulkPicked += pickCount;
|
||
if (pd.bulkPicked == pd.bulkCount)
|
||
{
|
||
pd.bulkPickState = (int)enumOutStockPickStatus.分拣完成;
|
||
}
|
||
pd.Update();
|
||
|
||
WmsOutPickDetail pd1 = new WmsOutPickDetail(wpt.orderDetailId);
|
||
pd1.bulkPicked += pickCount;
|
||
if (pd1.bulkPicked == pd1.bulkCount)
|
||
{
|
||
pd1.bulkPickState = (int)enumOutStockPickStatus.分拣完成;
|
||
}
|
||
pd1.Update();
|
||
|
||
// pickLabelDetail.updateValidPickingStatus(color, elabId, elabAddress);
|
||
|
||
//to update erp detail
|
||
// wpt.pickOrderNo
|
||
|
||
// pd1.updateErpSaleDetail_deng(false);
|
||
|
||
scope.Complete();
|
||
}
|
||
|
||
|
||
return true;
|
||
}
|
||
|
||
/* public void updateStockByElePick(int color, int elabId, decimal pickCount, int elabAddress)
|
||
{
|
||
if (!WmsConstants.OUT_STOCK_PDA_SCAN)
|
||
{
|
||
return;
|
||
}
|
||
|
||
}
|
||
*/
|
||
public delegate void UpdateUI();//声明一个更新主线程的委托
|
||
public UpdateUI UpdateUIDelegate;
|
||
|
||
public delegate void AccomplishTask();//声明一个在完成任务时通知主线程的委托
|
||
public AccomplishTask TaskCallBack;
|
||
private int p;
|
||
|
||
|
||
/// <summary>
|
||
/// 结束当前波次
|
||
/// pick.cs 在不同线程访问该方法。
|
||
/// </summary>
|
||
/// <param name="waveOrder"></param>
|
||
/// <returns></returns>
|
||
public bool finishCurrentWave(string waveNo,bool isForce)
|
||
{
|
||
|
||
{
|
||
//string waveOrder = pickLabelDetail.finishCurrentPickingData();//结束当前拣选的数据
|
||
// if (!string.IsNullOrEmpty(waveOrder))
|
||
// {
|
||
try
|
||
{
|
||
|
||
// if (isForce)
|
||
// {
|
||
//TODO: to turn off the lights
|
||
// }
|
||
|
||
LogHelper.debug("lwmsoutpickrequest", String.Format(" WmsConstants.WAVE_CURRENT_ORDER {0}, WmsConstants.WAVE_LAST_ORDER {1}, waveNo {2}",
|
||
WmsConstants.WAVE_CURRENT_ORDER, WmsConstants.WAVE_LAST_ORDER, waveNo));
|
||
|
||
WmsConstants.WAVE_CURRENT_ORDER = waveNo.Equals(WmsConstants.WAVE_LAST_ORDER)
|
||
? WmsConstants.WAVE_CURRENT_ORDER:waveNo ;
|
||
|
||
using (TransactionScope scope = new TransactionScope())
|
||
{
|
||
outRequest.completeWaveBulkPickStatus(WmsConstants.WAVE_CURRENT_ORDER,operId);
|
||
pickLabelDetail.finishCurrentPickingData(isForce);//结束当前拣选的数据
|
||
LogHelper.debug("lwmsoutpickrequest","end finish current picking data " +waveNo);
|
||
WmsConstants.WAVE_CURRENT_ORDER = "";
|
||
|
||
if (!WmsConstants.WAVE_CURRENT_ORDER.Equals(WmsConstants.WAVE_LAST_ORDER))
|
||
{
|
||
WmsConstants.WAVE_LAST_ORDER = WmsConstants.WAVE_CURRENT_ORDER;
|
||
TimeSpan ts = DateTime.Now - WmsConstants.WAVE_LAST_TIME;
|
||
WmsConstants.WAVE_TOTAL_SECONDS += ts.Seconds;
|
||
WmsConstants.WAVE_CNT++;
|
||
//WmsConstants.WAVE_CURRENT_ORDER = "";
|
||
WmsConstants.WAVE_SECONDS = WmsConstants.WAVE_TOTAL_SECONDS / WmsConstants.WAVE_CNT;
|
||
|
||
}
|
||
|
||
//if (!string.IsNullOrEmpty(WmsConstants.WAVE_CURRENT_ORDER))
|
||
{
|
||
|
||
}
|
||
scope.Complete();
|
||
}
|
||
// _canNewWave = true;
|
||
// TaskCallBack(); //send info to the main ui to start new wave.,for its in another thread, will neve success.
|
||
}
|
||
catch (Exception er )
|
||
{
|
||
LogHelper.WriteLog(typeof(lWmsOutPickRequest), er);
|
||
Thread.CurrentThread.Join(10);
|
||
// finishCurrentWave(isForce);
|
||
throw er;
|
||
}
|
||
}
|
||
|
||
// }
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 清理已捡完数据
|
||
/// 当前分区若全部已拣完,则选取新数据开始新拣选
|
||
///
|
||
/// </summary>
|
||
/// <param name="waveOrder"></param>
|
||
/// <returns></returns>
|
||
public bool finishPartWave(int part, bool isForce)
|
||
{
|
||
try
|
||
{
|
||
using (TransactionScope scope = new TransactionScope())
|
||
{
|
||
//TODO: 分区分拣结束,判断分区的订单不存在未拣的部分,则更新pickdetail 和pickrequest bulkPikckStatus
|
||
//1. 更新每个[orderDetailId] detail picked Count and bulk pick status ---已经在每个灯灭时做 ,见 lWmsOutPickRequest.updatePickingStatus
|
||
//3. 更新每个[pickOrderNo] pick status
|
||
|
||
DataTable dt = pickLabelDetail.getPartPickList(part).Tables[0];
|
||
|
||
if (dt.Rows.Count >0 ) //本区未拣完
|
||
{
|
||
foreach (DataRow dr in dt.Rows)
|
||
{
|
||
if (new WmsOutPickLable(dr).state == 0)
|
||
{
|
||
if( !isForce)
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
|
||
//本区已拣完,查看订单明细可能在其他区或未开始拣选的情况
|
||
|
||
DataTable dt1= pickLabelDetail.getPartUnPickList(part) ;
|
||
if (dt1.Rows.Count == 0) //本区订单不存在未捡完的情况
|
||
{
|
||
//更新pickorder,pickorder detail validation bulkstate,清理亮灯数据
|
||
|
||
string lastRequest = "";
|
||
foreach (DataRow dr in dt.Rows)
|
||
{
|
||
if (String.IsNullOrEmpty(lastRequest)|| lastRequest != new WmsOutPickLable(dr).pickOrderNo)
|
||
{
|
||
lastRequest = new WmsOutPickLable(dr).pickOrderNo;
|
||
|
||
lastRequest = new WmsOutPickLable(dr).pickOrderNo;
|
||
WmsOutPickRequest pr = new WmsOutPickRequest(lastRequest);
|
||
pr.bulkPickState =(int) enumOutStockPickStatus.分拣完成;
|
||
if (pr.batchPickState == -1 || pr.batchPickState >= (int)enumOutStockPickStatus.分拣完成)
|
||
{
|
||
pr.state = (int)enumOutStockPickStatus.分拣完成;
|
||
//TODO: outrequest order status
|
||
// WmsOutRequest or = new WmsOutRequest();
|
||
|
||
}
|
||
pr.operater = operId;
|
||
pr.Update();
|
||
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
|
||
pickLabelDetail.finishPartPickingData(part,isForce);//结束当前拣选的数据
|
||
|
||
scope.Complete();
|
||
}
|
||
// _canNewWave = true;
|
||
// TaskCallBack(); //send info to the main ui to start new wave.,for its in another thread, will neve success.
|
||
}
|
||
catch (Exception er)
|
||
{
|
||
LogHelper.WriteLog(typeof(lWmsOutPickRequest), er);
|
||
Thread.CurrentThread.Join(10);
|
||
// finishCurrentWave(isForce);
|
||
// throw er;
|
||
}
|
||
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
|
||
public DataSet getPickRequest4BulkValidate(object desk)
|
||
{
|
||
DataSet ds = outRequest.getPickRequest4BulkVailidate(desk);
|
||
|
||
|
||
|
||
//test for barcode
|
||
// #if DEBUG
|
||
DataTable tmp;
|
||
Int64 i = 6900000000000;
|
||
for (int j = 0; j < 2; j++)
|
||
{
|
||
tmp = ds.Tables[j];
|
||
|
||
foreach (DataRow dr in tmp.Rows)
|
||
{
|
||
i++;
|
||
if (string.IsNullOrEmpty(dr["barCode"].ToString()))
|
||
{
|
||
dr["barCode"] = dr["goodsId"].ToString();
|
||
}
|
||
}
|
||
}
|
||
// #endif
|
||
|
||
|
||
|
||
|
||
DataView dv = ds.Tables[0].DefaultView;
|
||
|
||
dv.Sort = "dpsOrder ASC"; //fifo
|
||
// DataTable dt = dv.ToTable(true, "pickOrderNo","orderState","customerName"); // TODO: check why custid to multi custname, custid: C1ZTLQIA97N
|
||
DataTable dt = dv.ToTable(true,"orderBulkPickstate","dpsOrder", "pickOrderNo", "orderState", "customerName", "custAddress", "desk", "seedsLabelId","xuhao"); // 打印封箱
|
||
dt.TableName = "tablePickOrderList";
|
||
|
||
int kk=0;
|
||
foreach (DataRow dr in dt.Rows)
|
||
{
|
||
kk++;
|
||
dr["xuhao"] = kk + "";
|
||
}
|
||
ds.Tables.Add(dt);
|
||
|
||
// dv.RowFilter = string.Format("orderState <'{0}'",(int)enumOutStockPickStatus.复核完成);
|
||
//DataTable dt2 = dv.ToTable(true, "dpsOrder", "seedsPickNo", "desk", "orderState"); // distinct pickOrderNo
|
||
DataTable dt2 = dv.ToTable(true, "dpsOrder", "seedsPickNo", "desk"); // distinct seedsPickNo
|
||
dt2.TableName = "tableSeedsPickOrders";
|
||
ds.Tables.Add(dt2);
|
||
|
||
//DataView dv2 = outRequest.getValidationExceptionSolutions(desk).Tables[0].DefaultView;
|
||
//dv2.RowFilter = "state =" + (int)enumOutStockDetailStatus.validatedExceptionSulution ;
|
||
//DataTable dtExceptionSolution = dv.ToTable();
|
||
//dtExceptionSolution.TableName = "exsolutions";
|
||
//ds.Tables.Add(dtExceptionSolution);
|
||
|
||
//DataTable dtExceptionSolution = outRequest.getValidationExceptionSolutions(desk).Tables[0].Clone();
|
||
//dtExceptionSolution.TableName = "exsolutions";
|
||
//ds.Tables.Add(dtExceptionSolution);
|
||
return ds;
|
||
}
|
||
|
||
|
||
public DataSet getPickRequest4SeedsOperation(int desk, enumOutStockRequestStatus seedsStatus, string seedsNo = "")
|
||
{
|
||
DataSet ds = outRequest.getPickRequest4BulkSeedsVailidate(desk,seedsStatus,seedsNo);
|
||
|
||
|
||
|
||
//test for barcode
|
||
#if DEBUG
|
||
|
||
DataTable tmp;
|
||
|
||
for (int j = 0; j < 2; j++)
|
||
{
|
||
tmp = ds.Tables[j];
|
||
|
||
foreach (DataRow dr in tmp.Rows)
|
||
{
|
||
|
||
if (string.IsNullOrEmpty(dr["barCode"].ToString()))
|
||
{
|
||
dr["barCode"] = dr["goodsId"].ToString();
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
|
||
|
||
DataView dv = ds.Tables[0].DefaultView;
|
||
|
||
dv.Sort = "seedsPickNo ASC"; //fifo
|
||
// DataTable dt = dv.ToTable(true, "pickOrderNo","orderState","customerName"); // TODO: check why custid to multi custname, custid: C1ZTLQIA97N
|
||
DataTable dt = dv.ToTable(true, "orderBulkPickstate", "dpsOrder", "pickOrderNo", "orderState", "customerName", "custAddress", "desk", "seedsLabelId", "xuhao"); // 打印封箱
|
||
dt.TableName = "tablePickOrderList";
|
||
ds.Tables.Add(dt);
|
||
dv = ds.Tables[1].DefaultView;
|
||
DataTable dt2 = dv.ToTable(true, "dpsOrder", "seedsPickNo", "desk","seedsstatus"); // distinct seedsPickNo
|
||
dt2.TableName = "tableSeedsPickOrders";
|
||
ds.Tables.Add(dt2);
|
||
|
||
|
||
//DataView dv2 = outRequest.getValidationExceptionSolutions(desk).Tables[0].DefaultView;
|
||
//dv2.RowFilter = "state =" + (int)enumOutStockDetailStatus.validatedExceptionSulution ;
|
||
//DataTable dtExceptionSolution = dv.ToTable();
|
||
//dtExceptionSolution.TableName = "exsolutions";
|
||
//ds.Tables.Add(dtExceptionSolution);
|
||
|
||
//DataTable dtExceptionSolution = outRequest.getValidationExceptionSolutions(desk).Tables[0].Clone();
|
||
//dtExceptionSolution.TableName = "exsolutions";
|
||
//ds.Tables.Add(dtExceptionSolution);
|
||
return ds;
|
||
}
|
||
|
||
public DataTable getSeedsGoods(string seedsNo)
|
||
{
|
||
return outRequest.getSeedsGoods(seedsNo);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 零货分拣复核完成
|
||
/// </summary>
|
||
/// <param name="pickOrderNo"></param>
|
||
/// <param name="validationDetails"></param>
|
||
public bool completeBulkValidation(string pickOrderNo, int bulkBox, int bulkBag,
|
||
DataTable validationDetails = null)
|
||
{
|
||
try
|
||
{
|
||
using (TransactionScope scope = new TransactionScope())
|
||
{
|
||
if (!string.IsNullOrEmpty(pickOrderNo))
|
||
{
|
||
if (validationDetails == null)
|
||
{
|
||
validationDetails = outRequest.getValidationDetail(pickOrderNo);
|
||
}
|
||
bool isException = false;
|
||
|
||
DataView dv = validationDetails.DefaultView;
|
||
dv.RowFilter = "bulkPickState =" + (int)enumOutStockPickStatus.复核异常;
|
||
isException = dv.Count > 0;
|
||
|
||
WmsOutPickRequest po = new WmsOutPickRequest(pickOrderNo);
|
||
po.bulkBox = bulkBox;
|
||
po.bulkBag = bulkBag;
|
||
lTmsStock lts = new lTmsStock(operId);
|
||
lts.newBulkTransStore(pickOrderNo, po.customerId, bulkBox, bulkBag);// 拼箱拼袋进集货区
|
||
/* try
|
||
{
|
||
lTmsStock lts = new lTmsStock(operId);
|
||
lts.newBulkTransStore(pickOrderNo, po.customerId, bulkBox, bulkBag);// 拼箱拼袋进集货区
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LogHelper.WriteLog(typeof(lWmsOutPickRequest), e);
|
||
}
|
||
*/
|
||
po.bulkPickState = isException ? (int)enumOutStockPickStatus.复核异常 : (int)enumOutStockPickStatus.复核完成;
|
||
po.operater = this.operId;
|
||
if (po.bulkPickState == (int)enumOutStockPickStatus.复核完成) //both bulk and batch completed validation
|
||
{
|
||
if (po.batchPickState == (int)enumOutStockPickStatus.无需分拣
|
||
|| po.batchPickState == (int)enumOutStockPickStatus.复核完成)
|
||
{
|
||
po.state = (int)enumOutStockRequestStatus.集货完成;
|
||
updateErpSaleStatus(po.pickOrderNo, enumOutStockRequestStatus.集货完成);
|
||
/*
|
||
Erp_sale es = new Erp_sale();
|
||
if (!WmsConstants.OUT_REQUEST_MERGE)
|
||
{
|
||
es.getByPickOrder(po.pickOrderNo);
|
||
Employee em = new Employee(operId);
|
||
es.fuheren = em.em_name;
|
||
es.fuhesj = es.getDateTime();
|
||
es.fuhezt = true;
|
||
es.Update();
|
||
}
|
||
else
|
||
{
|
||
es.updatePickStatus(po.pickOrderNo, enumOutStockRequestStatus.集货完成);
|
||
}
|
||
*/
|
||
}
|
||
|
||
}
|
||
po.Update();
|
||
|
||
|
||
|
||
|
||
foreach (DataRow dr in validationDetails.Rows)
|
||
{
|
||
WmsOutPickDetail pd = new WmsOutPickDetail(dr);
|
||
WmsOutPickDetail_tmp pdt = new WmsOutPickDetail_tmp(dr);
|
||
// isException = isException || pdt.bulkPickState == (int)enumOutStockPickStatus.复核异常;
|
||
pd.operater = this.operId;
|
||
pdt.operater = this.operId;
|
||
|
||
//check batch pick status
|
||
if ( (int)pd.batchPickState ==(int)enumOutStockPickStatus.无需分拣
|
||
|| (int)pd.batchPickState > (int)enumOutStockPickStatus.分拣完成 ) //batch pick completed
|
||
{
|
||
if (pdt.bulkPickState != (int)enumOutStockPickStatus.复核异常)
|
||
{
|
||
pd.state = (int)enumOutStockDetailStatus.集货完成;
|
||
}
|
||
}
|
||
pdt.state = pd.state;
|
||
pdt.orderState = po.bulkPickState;
|
||
pd.UpdateNoCompare(); //所有字段,除ID外,覆盖原值
|
||
pdt.Update();
|
||
|
||
}
|
||
|
||
|
||
|
||
outRequest.deleteTempValidationData(pickOrderNo);
|
||
}
|
||
scope.Complete();
|
||
return true;
|
||
|
||
}
|
||
|
||
// TaskCallBack(); //send info to the main ui to start new wave.,for its in another thread, will neve success.
|
||
}
|
||
catch (Exception er)
|
||
{
|
||
LogHelper.WriteLog(typeof(lWmsOutPickRequest), er);
|
||
Thread.CurrentThread.Join(200);
|
||
// completeBulkValidation(pickOrderNo, bulkBox, bulkBag, validationDetails);
|
||
throw er;
|
||
return false;
|
||
}
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 零货分拣复核完成
|
||
/// </summary>
|
||
/// <param name="pickOrderNo"></param>
|
||
/// <param name="validationDetails"></param>
|
||
public bool completeSeedsPack(string pickOrderNo, int bulkBox=0,int bulkBag=0, DataTable validationDetails = null)
|
||
{
|
||
try
|
||
{
|
||
WmsOutPickRequest po = new WmsOutPickRequest(pickOrderNo);
|
||
if (po.bulkPickState == (int)enumOutStockPickStatus.打包完成)
|
||
{
|
||
return false;
|
||
}
|
||
using (TransactionScope scope = new TransactionScope())
|
||
{
|
||
if (!string.IsNullOrEmpty(pickOrderNo))
|
||
{
|
||
if (validationDetails == null)
|
||
{
|
||
validationDetails = outRequest.getValidationDetail(pickOrderNo);
|
||
}
|
||
bool isException = false;
|
||
|
||
DataView dv = validationDetails.DefaultView;
|
||
dv.RowFilter = "bulkPickState =" + (int)enumOutStockPickStatus.复核异常;
|
||
isException = dv.Count > 0;
|
||
po.bulkBox = bulkBox;
|
||
po.bulkBag = bulkBag;
|
||
|
||
if (bulkBox + bulkBag == 0) //播种复核台前置打印,数量为一个包装
|
||
{
|
||
po.bulkBag = 1;
|
||
}
|
||
lTmsStock lts = new lTmsStock(operId);
|
||
lts.newBulkTransStore(pickOrderNo, po.customerId, bulkBox, bulkBag);// 拼箱拼袋进集货区
|
||
|
||
/* try
|
||
{
|
||
lTmsStock lts = new lTmsStock(operId);
|
||
lts.newBulkTransStore(pickOrderNo, po.customerId, bulkBox, bulkBag);// 拼箱拼袋进集货区
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LogHelper.WriteLog(typeof(lWmsOutPickRequest), e);
|
||
}
|
||
*/
|
||
po.bulkPickState = isException ? (int)enumOutStockPickStatus.复核异常 : (int)enumOutStockPickStatus.打包完成;
|
||
po.operater = this.operId;
|
||
if (po.bulkPickState == (int)enumOutStockPickStatus.打包完成) //both bulk and batch completed validation
|
||
{
|
||
if (po.batchPickState == (int)enumOutStockPickStatus.无需分拣
|
||
|| po.batchPickState == (int)enumOutStockPickStatus.复核完成)
|
||
{
|
||
po.state = (int)enumOutStockRequestStatus.集货完成;
|
||
Erp_sale es = new Erp_sale();
|
||
es.updatePickStatus(po.pickOrderNo, enumOutStockRequestStatus.集货完成);
|
||
}
|
||
|
||
}
|
||
po.Update();
|
||
|
||
|
||
|
||
|
||
foreach (DataRow dr in validationDetails.Rows)
|
||
{
|
||
WmsOutPickDetail pd = new WmsOutPickDetail(dr);
|
||
WmsOutPickDetail_tmp pdt = new WmsOutPickDetail_tmp(dr);
|
||
// isException = isException || pdt.bulkPickState == (int)enumOutStockPickStatus.复核异常;
|
||
pd.operater = this.operId;
|
||
pdt.operater = this.operId;
|
||
|
||
//check batch pick status
|
||
if ((int)pd.batchPickState == (int)enumOutStockPickStatus.无需分拣
|
||
|| (int)pd.batchPickState > (int)enumOutStockPickStatus.分拣完成) //batch pick completed
|
||
{
|
||
if (pdt.bulkPickState != (int)enumOutStockPickStatus.复核异常)
|
||
{
|
||
pd.state = (int)enumOutStockDetailStatus.集货完成;
|
||
}
|
||
}
|
||
pdt.state = pd.state;
|
||
pdt.orderState = po.bulkPickState;
|
||
pd.UpdateNoCompare(); //所有字段,除ID外,覆盖原值
|
||
pdt.Update();
|
||
|
||
}
|
||
|
||
|
||
|
||
outRequest.deleteTempValidationData(pickOrderNo);
|
||
}
|
||
scope.Complete();
|
||
return true;
|
||
|
||
}
|
||
|
||
// TaskCallBack(); //send info to the main ui to start new wave.,for its in another thread, will neve success.
|
||
}
|
||
catch (Exception er)
|
||
{
|
||
LogHelper.WriteLog(typeof(lWmsOutPickRequest), er);
|
||
Thread.CurrentThread.Join(200);
|
||
// completeBulkValidation(pickOrderNo, bulkBox, bulkBag, validationDetails);
|
||
throw er;
|
||
return false;
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// batch pick orders waiting for out
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public DataSet getBatchOutPickOrders4Pick()
|
||
{
|
||
DataSet ds = outRequest.getBatchOutPickOrders(enumOutStockRequestStatus.正在分拣, enumOutStockPickStatus.待处理, enumOutStockPickStatus.正在分拣);
|
||
//DataTable dt = outRequest.getRepRequestDetailsLessThan(enumOutStockPickStatus.复核完成);
|
||
|
||
// DataTable repTable = outRequest.getRequests(enumOutOrderType.repOrderOut, enumOutStockRequestStatus.等待分拣).Tables[0];
|
||
|
||
DataView dv = ds.Tables[0].DefaultView;
|
||
|
||
dv.RowFilter = "orderType =" + (int) enumOutOrderType.补货出库;
|
||
|
||
DataTable dt = dv.ToTable();
|
||
dt.TableName = "repOrder";
|
||
ds.Tables.Add(dt);
|
||
return ds;
|
||
}
|
||
/// <summary>
|
||
/// pick order detail
|
||
/// </summary>
|
||
/// <param name="pickOrderNo"></param>
|
||
/// <returns></returns>
|
||
public DataSet getBatchOutPickOrderDetails(string pickOrderNo)
|
||
{
|
||
|
||
return outRequest.getBatchOutPickOrderDetails(pickOrderNo, enumOutStockDetailStatus.等待分拣, enumOutStockPickStatus.待处理);
|
||
}
|
||
/// <summary>
|
||
/// get port pick detail by id
|
||
/// </summary>
|
||
/// <param name="recordId"></param>
|
||
/// <returns></returns>
|
||
public DataTable getPortOutPickOrderDetail(int id)
|
||
{
|
||
return outPickPort.getPickDetail(id);
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// batch pick order pick detail
|
||
/// </summary>
|
||
/// <param name="pickOrderNo"></param>
|
||
/// <returns></returns>
|
||
public DataSet getBatchOutPickOrderPickDetails(string pickOrderNo)
|
||
{
|
||
|
||
// return outRequest.getBatchOutPickOrderPickDetails(pickOrderNo,enumOutStockRequestStatus.正在分拣, enumOutStockPickStatus.待处理);
|
||
return outRequest.getBatchOutPickOrderPickDetails(pickOrderNo);
|
||
}
|
||
|
||
/// <summary>
|
||
/// batch pick order pick detail
|
||
/// </summary>
|
||
/// <param name="pickOrderNo"></param>
|
||
/// <returns></returns>
|
||
public DataTable getPickOrderTmsInfo(string pickOrderNo)
|
||
{
|
||
|
||
// return outRequest.getBatchOutPickOrderPickDetails(pickOrderNo,enumOutStockRequestStatus.正在分拣, enumOutStockPickStatus.待处理);
|
||
return outRequest.getPickOrderTmsInfo(pickOrderNo);
|
||
}
|
||
|
||
/// <summary>
|
||
///整库开始拣货
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public bool startPickBatchPickOrder(string pickOrderNo)
|
||
{
|
||
bool success = false;
|
||
|
||
try
|
||
{
|
||
WmsOutPickRequest po = new WmsOutPickRequest(pickOrderNo);
|
||
TmsLineDetail tld = new TmsLineDetail().getLineDetailByCustId(po.customerId);
|
||
List<WmsLocation> locs =new TmsStock().getFreeLocation(tld.ID, Utils.enumWhLocVol.装车集货, Utils.enumWhType.集货库 );
|
||
|
||
using (TransactionScope scope = new TransactionScope())
|
||
{
|
||
foreach (WmsLocation loc in locs)
|
||
{
|
||
po.tranLocationId = loc.locationId;
|
||
po.operater = operId;
|
||
po.Update(); //添加集货货位,整货出库目的地
|
||
break;
|
||
}
|
||
|
||
success= outRequest.updateBatchPickStatus(pickOrderNo, enumOutStockPickStatus.正在分拣,operId) > 0;
|
||
scope.Complete();
|
||
|
||
|
||
return true;
|
||
}
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LogHelper.WriteLog(this.GetType(), e);
|
||
return false;
|
||
}
|
||
|
||
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 整库出库\复核完成
|
||
/// </summary>
|
||
/// <param name="pickOrderNo"></param>
|
||
/// <returns></returns>
|
||
public bool updateBatchPickStatus(string pickOrderNo, enumOutStockPickStatus pickStatus)
|
||
{
|
||
WmsOutPickRequest pickRequest = new WmsOutPickRequest(pickOrderNo);
|
||
try
|
||
{
|
||
using (TransactionScope scope = new TransactionScope())
|
||
{
|
||
//更新batchPickstatus
|
||
pickRequest.updateBatchPickStatus(pickOrderNo, pickStatus,operId);
|
||
|
||
if (pickRequest.bulkPickState == (int)enumOutStockPickStatus.无需分拣 || pickRequest.bulkPickState >= (int)pickStatus) //no bulk or bulk finished
|
||
{
|
||
//更新订单明细状态
|
||
enumOutStockDetailStatus detailState = pickStatus == enumOutStockPickStatus.分拣完成 ?
|
||
enumOutStockDetailStatus.完成分拣 : enumOutStockDetailStatus.复核完成;
|
||
//更新订单状态
|
||
enumOutStockRequestStatus orderState = pickStatus == enumOutStockPickStatus.分拣完成 ?
|
||
enumOutStockRequestStatus.分拣完成 : enumOutStockRequestStatus.复核完成;
|
||
|
||
pickRequest.updateBatchOrderStatus(pickOrderNo,orderState, detailState, operId);
|
||
|
||
Erp_sale es = new Erp_sale();
|
||
es.updatePickStatus(pickRequest.pickOrderNo, orderState);
|
||
|
||
}
|
||
|
||
scope.Complete();
|
||
}
|
||
}catch(Exception e){
|
||
LogHelper.WriteLog(this.GetType(), e);
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/// <summary>
|
||
/// finish one pick detail
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public bool finishPickItem(string flowNo,string waveOrder, string pickOrderNo , int id, decimal pickCount)
|
||
{
|
||
|
||
_outPickPort = new WmsOutPickPort(id);
|
||
string jobNo = _outPickPort.jobNo;
|
||
// WmsFlow wf = new WmsFlow(jobNo, waveOrder);
|
||
// wf.finishedCnt++;
|
||
using (TransactionScope scope = new TransactionScope())
|
||
{
|
||
// wf.Update();
|
||
int volType = updatePortPickStateStk(id, flowNo,enumPickState.已拣,pickCount);
|
||
|
||
|
||
if (outPickPort.getPickDetailsCnt(pickOrderNo, enumPickState.未拣, volType > 0) == 0)
|
||
{
|
||
if (volType > 0) //订单整货手持分拣完成
|
||
{
|
||
if (!(updateBatchPickStatus(pickOrderNo, enumOutStockPickStatus.分拣完成)))
|
||
{
|
||
if (!(updateBatchPickStatus(pickOrderNo, enumOutStockPickStatus.分拣完成)))
|
||
{
|
||
|
||
outPickPort.updatePickState(id, enumPickState.未拣, operId);
|
||
//twice failure then roll back status
|
||
return false;
|
||
};
|
||
};
|
||
}
|
||
else //订单零货手持捡货完成
|
||
{
|
||
if (!(outRequest.completeBulkPickStatus(pickOrderNo, operId)))
|
||
{
|
||
if (!(outRequest.completeBulkPickStatus(pickOrderNo, operId)))
|
||
{
|
||
outPickPort.updatePickState(id, enumPickState.未拣, operId);
|
||
|
||
//twice failure then roll back status
|
||
return false;
|
||
};
|
||
};
|
||
//当前wave的零货全部拣选完毕,则结束当前wave
|
||
if (!String.IsNullOrEmpty(waveOrder)
|
||
&& outPickPort.getPickDetailsCnt(null, enumPickState.未拣, false, waveOrder) == 0)
|
||
{
|
||
finishCurrentWave(waveOrder,true);
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
scope.Complete();
|
||
}
|
||
return true;
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// finish check one pick detail by location
|
||
/// </summary>
|
||
/// <param name="pickOrderNo"></param>
|
||
/// <param name="id"></param>
|
||
/// <returns></returns>
|
||
public bool finishBatchValidateItem(string pickOrderNo, int id,int checkBy2=0)
|
||
{
|
||
using (TransactionScope scope = new TransactionScope())
|
||
{
|
||
outPickPort.updatePickState(id, enumPickState.复核完成,operId);
|
||
_outPickPort = new WmsOutPickPort(id);
|
||
_outPickPort.checkBy2 = checkBy2;
|
||
_outPickPort.checkBy = operId;
|
||
_outPickPort.checkTime = outPickPort.getDateTime();
|
||
_outPickPort.checkByTime2 = outPickPort.getDateTime();
|
||
_outPickPort.Update();
|
||
|
||
//updatePickState(id, enumPickState.复核完成);
|
||
|
||
if (outPickPort.getPickDetailsCnt(pickOrderNo, enumPickState.未拣)
|
||
+ outPickPort.getPickDetailsCnt(pickOrderNo, enumPickState.已拣) == 0)
|
||
{
|
||
if (!(updateBatchPickStatus(pickOrderNo, enumOutStockPickStatus.复核完成)))
|
||
{
|
||
if (!(updateBatchPickStatus(pickOrderNo, enumOutStockPickStatus.复核完成)))
|
||
{
|
||
outPickPort.updatePickState(id, enumPickState.已拣, operId);
|
||
|
||
return false;
|
||
};
|
||
};
|
||
}
|
||
|
||
scope.Complete();
|
||
|
||
}
|
||
return true;
|
||
}
|
||
|
||
int updatePortPickStateStk(int id, string flowNo, enumPickState state, decimal pickCount = 0)
|
||
{
|
||
|
||
_outPickPort = new WmsOutPickPort(id);
|
||
|
||
if (outPickPort.state == (int)state)
|
||
{
|
||
return _outPickPort.volType;
|
||
}
|
||
if (pickCount > 0)
|
||
{
|
||
outPickPort.pickCount = pickCount; //pickCount 仅用于校验补货入库用,不用于记录实际拣货数量
|
||
}
|
||
outPickPort.operater = this.operId;
|
||
outPickPort.state = (int)state;
|
||
outPickPort.flowNo = flowNo;
|
||
outPickPort.pickBy = operId;
|
||
outPickPort.pickTime = outPickPort.getDateTime();
|
||
if (WmsConstants.OUT_STOCK_DEDUCT)
|
||
{
|
||
//更新库存
|
||
|
||
WmsStockRecord sr = new WmsStockRecord(outPickPort.recordId);
|
||
|
||
WmsStock stk = new WmsStock( outPickPort.locationId,sr.skuId);
|
||
_outRequest = new WmsOutPickRequest( outPickPort.pickOrderNo);
|
||
enumStockRecordType type = enumStockRecordType.销售出库;
|
||
/* if(outRequest.orderType ==(int) enumOutStoreType.补货出库){
|
||
type = enumStockRecordType.补零出库;
|
||
}
|
||
* */
|
||
if (outRequest.outStoreType == (int)enumOutStoreType.补货出库)
|
||
{
|
||
type = enumStockRecordType.补零出库;
|
||
}
|
||
string description = string.Format("\n type:{0}, 下架数量{1}, 备注:{2}",
|
||
type, pickCount, "");
|
||
stk.countOuting -= pickCount;
|
||
stk.countOuting = stk.countOuting > 0 ? stk.countOuting : 0;
|
||
stk.countOut += pickCount;
|
||
|
||
sr.count = pickCount;
|
||
sr.countOuting = sr.countOuting - pickCount;
|
||
sr.description = description;
|
||
sr.operater = operId;
|
||
sr.goodsId = sr.goodsId;
|
||
|
||
|
||
using (TransactionScope scope = new TransactionScope())
|
||
{
|
||
sr.Add();
|
||
|
||
stk.skuId = sr.skuId; //托盘,多sku情况
|
||
stk.updateCountOut();
|
||
//stk.Update();
|
||
|
||
|
||
outPickPort.Update();
|
||
scope.Complete();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
outPickPort.Update();
|
||
}
|
||
|
||
return _outPickPort.volType;
|
||
|
||
}
|
||
|
||
|
||
public DataTable getBatchPickOrders4Validate()
|
||
{
|
||
DataTable dt = getWmsOutPickRequest.getBatchPickOrders4Validation();
|
||
|
||
return dt;
|
||
|
||
|
||
}
|
||
|
||
public int getPickCount4valid(string pickOrderNo)
|
||
{
|
||
return outPickPort.getPickDetailsCnt(pickOrderNo, enumPickState.已拣);
|
||
}
|
||
|
||
|
||
public DataTable repTodayDetails4Pick(int userId = 0)
|
||
{
|
||
DataTable dt = getWmsOutPickRequest.getBatchPickOrderRepDetail("", enumOutOrderType.补货出库, enumPickState.未拣);
|
||
|
||
if (userId > 0)
|
||
{
|
||
DataView dv = dt.DefaultView;
|
||
dv.RowFilter = "takeBy="+userId;
|
||
return dv.ToTable("meOnly");
|
||
}
|
||
/*
|
||
dt.Columns.Remove("状态");
|
||
//dt.Columns.Remove("pickOrderNo");
|
||
dt.Columns.Remove("state");
|
||
dt.Columns.Remove("orderType");
|
||
dt.Columns.Remove("orderDate");
|
||
dt.Columns.Remove("pickCount");
|
||
dt.Columns.Remove("goodsid");
|
||
*/
|
||
return dt;
|
||
|
||
}
|
||
|
||
public DataTable repTodayDetails4In(string flowNo="")
|
||
{
|
||
DataTable dt = getWmsOutPickRequest.getBatchPickOrderRepDetail(flowNo, enumOutOrderType.补货出库, enumPickState.已拣);
|
||
|
||
/*
|
||
dt.Columns.Remove("货位");
|
||
dt.Columns.Remove("状态");
|
||
dt.Columns.Remove("state");
|
||
dt.Columns.Remove("orderType");
|
||
dt.Columns.Remove("orderDate");
|
||
dt.Columns.Remove("pickCount");
|
||
*/
|
||
return dt;
|
||
|
||
}
|
||
|
||
//-------------------------out logs----------------------begin---
|
||
|
||
|
||
private WmsOutLog _outLog;
|
||
|
||
WmsOutLog outLog
|
||
{
|
||
get
|
||
{
|
||
if (_outLog == null)
|
||
{
|
||
_outLog = new WmsOutLog();
|
||
}
|
||
return _outLog;
|
||
}
|
||
}
|
||
public DataTable getOrderLogs(string orderNo, string pickOrderNo)
|
||
{
|
||
return outLog.getOrderLogs(orderNo,pickOrderNo);
|
||
}
|
||
|
||
|
||
|
||
public DataTable getOrderLogs(string orderNo, bool isSaleOrder)
|
||
{
|
||
|
||
if (isSaleOrder)
|
||
{
|
||
return outLog.getOrderLogs(orderNo, "");
|
||
}
|
||
else
|
||
{
|
||
return outLog.getOrderLogs("",orderNo);
|
||
}
|
||
}
|
||
|
||
internal bool updatePriority(string[] orders, int priority,int operId)
|
||
{
|
||
|
||
|
||
|
||
try
|
||
{
|
||
// using (TransactionScope scope = new TransactionScope())
|
||
{
|
||
|
||
string whOrders = "";
|
||
foreach (string order in orders)
|
||
{
|
||
whOrders += "'"+ order + "',";
|
||
}
|
||
|
||
whOrders = whOrders.Substring(0, whOrders.Length - 1);
|
||
whOrders = "(" + whOrders + ")";
|
||
return _obj.updatePriority(whOrders, priority,operId);
|
||
|
||
|
||
// scope.Complete();
|
||
}
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LogHelper.WriteLog(this.GetType(), e);
|
||
return false;
|
||
}
|
||
|
||
// return true;
|
||
}
|
||
|
||
|
||
|
||
|
||
//------------------light labels
|
||
|
||
public void lightLables()
|
||
{
|
||
|
||
elelab.pick.init_port(enumLabelPickType.pick);
|
||
DataTable dt = new WmsOutPickLable().getPickedData(enumPickState.未拣).Tables[0];
|
||
elelab.pick.send_data_pick(dt, enumLabelPickType.pick);
|
||
|
||
}
|
||
|
||
|
||
//seeds
|
||
|
||
public enumOutSeedsStatus updateSeedingStatus(string seedsPickNo, string goodsId, string batch, int labId, int address, decimal count, int checkedBy2)
|
||
{
|
||
LogHelper.debug(this.GetType(), "updateSeedingStatus... operId is " + operId);
|
||
LogHelper.debug(this.GetType(), "begin to update seeding pick.....>");
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("seedsPickNo:{0},goodsId:{1},batch:{2},labId:{3},address:{4},count:{5},checkBy2:{6}"
|
||
,seedsPickNo, goodsId, batch, labId, address, count, checkedBy2));
|
||
|
||
enumOutSeedsStatus rt = enumOutSeedsStatus.状态更新成功;
|
||
int cnt = outPickTmp.updateSeedingPickStatus(seedsPickNo, goodsId, batch, labId, address, count,operId,checkedBy2);
|
||
|
||
if (cnt == 0)
|
||
{
|
||
LogHelper.debug(this.GetType(), " 更新失败,。。。。。。。return failure");
|
||
return enumOutSeedsStatus.处理失败;
|
||
}
|
||
|
||
int color = 0;
|
||
using (TransactionScope scope = new TransactionScope())
|
||
{
|
||
if (outRequest.getUnSeedsCnt(seedsPickNo, goodsId, batch) == 0)
|
||
{ //该商品播种完毕
|
||
|
||
outPickTmp.completeSeeding(seedsPickNo, goodsId, batch);
|
||
rt = enumOutSeedsStatus.商品完成分播;
|
||
}
|
||
LogHelper.debug(this.GetType(), " " + rt);
|
||
|
||
if (outRequest.getUnSeedsCnt(seedsPickNo, labId) == 0) // LabId对应的分拣单播种完毕
|
||
{
|
||
|
||
|
||
DataTable dtSeeds = outRequest.getSeedsData(seedsPickNo, labId);
|
||
|
||
DataView dv = dtSeeds.DefaultView;
|
||
DataTable dtPickOrders = dv.ToTable(true, "pickOrderNo");
|
||
|
||
try
|
||
{
|
||
|
||
foreach (DataRow dr in dtPickOrders.Rows)
|
||
{
|
||
string pickOrderNo = dr[0].ToString();
|
||
WmsOutPickRequest pr = new WmsOutPickRequest(pickOrderNo);
|
||
//分拣明细状态 更新为 零货复核完成(enumOutStockPickStatus.复核完成) 和 全部完成分拣(enumOutStockDetailStatus.完成分拣)
|
||
foreach (WmsOutPickDetail pd in pr.outDetails)
|
||
{
|
||
if (pd.bulkCount > 0)
|
||
{
|
||
pd.bulkPickState = (int)enumOutStockPickStatus.复核完成;
|
||
|
||
|
||
if (pd.batchPickState == (int)enumOutStockPickStatus.无需分拣 || pd.batchPickState > (int)enumOutStockPickStatus.分拣完成)
|
||
{
|
||
pd.state = (int)enumOutStockDetailStatus.复核完成; ;
|
||
}
|
||
pd.operater = this.operId;
|
||
pd.Update();
|
||
|
||
}
|
||
}
|
||
pr.bulkPickState = (int)enumOutStockPickStatus.复核完成;
|
||
if (pr.batchPickState == (int)enumOutStockPickStatus.无需分拣 || pr.batchPickState >= (int)enumOutStockPickStatus.分拣完成)
|
||
{
|
||
|
||
enumOutStockRequestStatus state = enumOutStockRequestStatus.分拣完成;
|
||
|
||
if (pr.batchPickState == (int)enumOutStockPickStatus.无需分拣 || pr.batchPickState == (int)enumOutStockPickStatus.复核完成)
|
||
{
|
||
state = enumOutStockRequestStatus.复核完成;
|
||
}
|
||
|
||
pr.state = (int)state;
|
||
|
||
|
||
updateErpSaleStatus( pr.pickOrderNo,state);
|
||
|
||
}
|
||
pr.operater = this.operId;
|
||
pr.Update();
|
||
|
||
outPickPort.updateBulkPickStateByPickOrder(pr.pickOrderNo, operId, checkedBy2); //update pickport
|
||
|
||
// outRequest.completeValidation(pr.pickOrderNo);//打包后,再从临时表删除
|
||
color = pr.desk;
|
||
}
|
||
rt = enumOutSeedsStatus.分拣单完成分播;
|
||
LogHelper.debug(this.GetType(), " " + rt);
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LogHelper.WriteLog(this.GetType(), e);
|
||
return enumOutSeedsStatus.处理失败;
|
||
}
|
||
|
||
// pk order is finished, to print code, can be packed.
|
||
}
|
||
if (outRequest.getUnSeedsCnt(seedsPickNo) == 0)//是否播种单订单全部分播完毕
|
||
{
|
||
outPickTmp.completeSeeding(seedsPickNo);
|
||
if (WmsConstants.OUT_BULK_DESK_CONTROLL)
|
||
{
|
||
setDeskFree(color);
|
||
LogHelper.debug(typeof(lWmsOutRequest), color +"播种台播种完毕,设置状态为空闲,参与下个波次");
|
||
}
|
||
WmsWave ww = new WmsWave();
|
||
ww.QueryBySeedsNo(seedsPickNo);
|
||
ww.state = (int)enumOutStockRequestStatus.复核完成;
|
||
ww.Update();
|
||
|
||
rt = enumOutSeedsStatus.播种单完成分播;
|
||
LogHelper.debug(this.GetType(), " " + rt);
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), " 测试日志输出");
|
||
}
|
||
scope.Complete();
|
||
}
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), " return value is " + rt.ToString());
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), "end update seeding pick.....>");
|
||
return rt; //elabid pk order is not finished.
|
||
}
|
||
|
||
private void updateErpSaleStatus(string pickOrderNo, enumOutStockRequestStatus state)
|
||
{
|
||
Erp_sale es = new Erp_sale();
|
||
if (1==2 &&!WmsConstants.OUT_REQUEST_MERGE)
|
||
{
|
||
es.getByPickOrder( pickOrderNo);
|
||
Employee em = new Employee(operId);
|
||
es.fuheren = em.em_name;
|
||
es.fuhesj = es.getDateTime();
|
||
es.fuhezt = true;
|
||
es.Update();
|
||
es.updatePickStatus(pickOrderNo, enumOutStockRequestStatus.复核完成);
|
||
}else
|
||
es.updatePickStatus( pickOrderNo, state);
|
||
}
|
||
|
||
|
||
|
||
public void createBoxes(int color,int volume,int lengh=0,int width=0,int height=0,int number =1){
|
||
|
||
WmsPlate wob = new WmsPlate();
|
||
for (int i = 1; i <= number; i++)
|
||
{
|
||
wob.volume = volume;
|
||
wob.color = color;
|
||
wob.length = lengh;
|
||
wob.width = width;
|
||
wob.height = height;
|
||
wob.Add();
|
||
}
|
||
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 注册箱子
|
||
///
|
||
/// </summary>
|
||
/// <param name="boxId"></param>
|
||
/// <param name="waveNo"></param>
|
||
/// <param name="color"></param>
|
||
/// <returns></returns>
|
||
public bool regBox(string boxId,string waveNo,int color)
|
||
{
|
||
|
||
plate.deleteByPlateId(boxId);
|
||
plate.plateId = boxId;
|
||
plate.waveNo = waveNo;
|
||
plate.color = color;
|
||
return plate.Add() > 0;
|
||
|
||
}
|
||
/// <summary>
|
||
/// 可注册箱子的波次号
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public DataSet getBoxWaves()
|
||
{
|
||
return plate.getPlateWaves() ;
|
||
}
|
||
|
||
public DataTable getBoxsByWave(string waveOrder, int color =0)
|
||
{
|
||
return plate.getPlatesByWave(waveOrder, color);
|
||
}
|
||
|
||
public string getWaveNoByBoxId(string boxId)
|
||
{
|
||
DataTable dt = plate.getPlateById(boxId);
|
||
if (dt.Rows.Count > 0)
|
||
{
|
||
return dt.Rows[0]["waveNo"].ToString();
|
||
}
|
||
return "";
|
||
|
||
}
|
||
|
||
|
||
internal DataTable getWaveDeskByBoxId(string boxId)
|
||
{
|
||
return plate.getPlateById(boxId);
|
||
}
|
||
|
||
internal DataTable getPartionPickDetailByBoxId(string boxId)
|
||
{
|
||
return plate.getPartionPickDetailByPlateId(boxId);
|
||
}
|
||
|
||
internal enumRegPlateResult regPartBox(int partion, string boxId)
|
||
{
|
||
int id = Util.getBoxId(boxId);
|
||
DataTable dt = new WmsOutPickLable().getPartPickList(partion).Tables[0];
|
||
DataView dv = dt.DefaultView;
|
||
if (WmsConstants.PART_ORDER_SIZE > 1) //多单拣选
|
||
{ //周转箱颜色要和亮灯颜色一致
|
||
int color = Util.getBoxColor(boxId);
|
||
|
||
|
||
dv.RowFilter = "color =" + color;
|
||
if (dv.Count > 0)
|
||
{
|
||
String pickNo = dv[0]["pickOrderNo"].ToString();
|
||
WmsPlate wb = new WmsPlate(id);
|
||
wb.pickOrderNo = pickNo;
|
||
wb.partion = partion;
|
||
wb.Update();
|
||
return enumRegPlateResult.成功;
|
||
}
|
||
else
|
||
{
|
||
return enumRegPlateResult.箱子颜色和订单灯色不符;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (dv.Count > 0)
|
||
{
|
||
String pickNo = dv[0]["pickOrderNo"].ToString();
|
||
WmsPlate wb = new WmsPlate(id);
|
||
wb.pickOrderNo = pickNo;
|
||
wb.Update();
|
||
return enumRegPlateResult.成功;
|
||
}
|
||
else
|
||
{
|
||
return enumRegPlateResult.当前无拣货订单;
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
|
||
internal DataTable getBoxsByPickOrder(string pickOrderNo)
|
||
{
|
||
return plate.getPlatesByPickOrder(pickOrderNo);
|
||
}
|
||
|
||
internal List<int> getPartsFinishIds()
|
||
{
|
||
DataTable dt = getWmsOutPickRequest.getPartsFinishIds();
|
||
|
||
List<int> lst = new List<int>();
|
||
Node nd;
|
||
foreach (DataRow dr in dt.Rows)
|
||
{
|
||
nd = new Node(dr);
|
||
lst.Add(nd.flag);
|
||
}
|
||
return lst;
|
||
}
|
||
|
||
internal DataTable getPartionRequests(int partion)
|
||
{
|
||
return pickLabelDetail.getPartionRequests(partion);
|
||
}
|
||
internal DataTable getLightPartions()
|
||
{
|
||
return getWmsOutPickRequest.getLightPartions();
|
||
}
|
||
|
||
Dictionary<int, int> partColors = new Dictionary<int, int>();
|
||
public List<int> newPartPickWave()
|
||
{
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), "开始新波次。。。。。。。。。。。。。。。。。。");
|
||
|
||
List<DataTable> lst = outRequest.getRecords4PartWave(enumOutOrderType.销售出库); //.getRequestObjects(enumOutOrderType.拣货单, enumOutStockRequestStatus.波次处理);
|
||
|
||
return createPartPickWave(lst);
|
||
|
||
}
|
||
/// <summary>
|
||
/// 按拣货单生成亮灯数据
|
||
/// </summary>
|
||
/// <param name="pickOrderNo"></param>
|
||
/// <param name="partion"></param>
|
||
public void newPartionPick(string pickOrderNo, int partion)
|
||
{
|
||
List<DataTable> lst = new List<DataTable>();
|
||
lst.Add( outRequest.getRecords4PickOrder(pickOrderNo, partion));
|
||
createPartPickWave(lst);
|
||
}
|
||
|
||
public List<int> createPartPickWave(List<DataTable> lst)
|
||
{
|
||
|
||
List<int> lstParts = new List<int>();
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), "开始新波次。。。。。。。。。。。。。。。。。。");
|
||
|
||
// List<DataTable> lst = outRequest.getRecords4PartWave(); //.getRequestObjects(enumOutOrderType.拣货单, enumOutStockRequestStatus.波次处理);
|
||
List<WmsOutPickRequest> batchRequests = new List<WmsOutPickRequest>();
|
||
|
||
int recCnt = 0;
|
||
foreach (DataTable dt in lst)
|
||
{
|
||
recCnt += dt.Rows.Count;
|
||
|
||
|
||
}
|
||
if (recCnt == 0)
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("无订单需要处理,波次结束"));
|
||
checkRepAndNoStockOrders();
|
||
return lstParts;
|
||
}
|
||
|
||
int labelMaxInWave = WmsConstants.MAX_LABEL_DATA_IN_A_WAVE; //一个标签一个波次只能存储40条数据
|
||
|
||
#if DEBUG
|
||
// if (lblist.Count == 0)
|
||
{
|
||
lblist.Clear();
|
||
initialDebugSetting();
|
||
}
|
||
lblist.Sort();
|
||
// int minId = lblist[0];
|
||
// int maxId = lblist[lblist.Count - 1];
|
||
// labelMaxInWave = 2;
|
||
#endif
|
||
|
||
|
||
// List<WmsStockRecord> strecs = null;
|
||
|
||
waveOrder ="WAVE_PART_PICK";
|
||
int pickDetailMaxInWave = WmsConstants.MAX_CONTROL_DATA_IN_A_WAVE; //控制器每个端口最大存储1200条
|
||
Dictionary<int, int> labelCnt = new Dictionary<int, int>();
|
||
Dictionary<int, int> comCnt = new Dictionary<int, int>();
|
||
|
||
Dictionary<int, int> tmplabelCnt = new Dictionary<int, int>();
|
||
Dictionary<int, int> tmpcomCnt = new Dictionary<int, int>();
|
||
bool isReachLimit = false;
|
||
|
||
int waveSize = 0;
|
||
//List<WmsOutPickPort> lstPort;
|
||
List<WmsOutPickLable_tmp> lstLabel = new List<WmsOutPickLable_tmp>();
|
||
List<WmsStockRecord> lstBulk = new List<WmsStockRecord>();
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("waveNo {0}", waveOrder));
|
||
|
||
//播种常量,达不到最小订单摘取需求的合并成大订单先统一摘取再分播
|
||
bool isSeedsEnabled = WmsConstants.OUT_BULK_SEEDS_PICK_ON;
|
||
int pickGoodsTypeMin = WmsConstants.OUT_MAX_SEEDS_GOODSTYPE_CNT; //单独摘取订单 最少货物类型
|
||
int pickGoodsCountMin = WmsConstants.OUT_MAX_SEEDS_BULK_CNT_SUM; // 单独摘取订单 最少货物数量
|
||
int seedsCount = seedsDesk.seedsCount; //播种台一次播种订单数量
|
||
decimal sumBulkCnt = 0;
|
||
bool isSeedPickInSameWave = false;
|
||
// bool canSeedPickLessThanseedsCount = false; //单个播种拣选单数量不可少于播种能力
|
||
List<WmsOutPickRequest> seedsRequests = new List<WmsOutPickRequest>();
|
||
Dictionary<string, WmsStockRecord> seedsBulks = new Dictionary<string, WmsStockRecord>();
|
||
|
||
// int bulkCnt = 0;
|
||
// int requestCnt = 0;
|
||
|
||
//bulkRequests = new List<WmsOutPickRequest>(); //for batch process in a new thread
|
||
|
||
//开始处理有零货的订单
|
||
DateTime d0 = DateTime.Now;
|
||
// double totoalTime = 0d;
|
||
// string lastAddress = "";
|
||
// int lastPart = -1;
|
||
int color = 1;
|
||
string lastRequest = "";
|
||
int requestCntInPart = 0;
|
||
foreach (DataTable dt1 in lst)
|
||
{
|
||
lastRequest = "";
|
||
requestCntInPart = 0;
|
||
|
||
foreach (DataRow dr in dt1.Rows)
|
||
{
|
||
WmsStockRecord sr = new WmsStockRecord(dr);
|
||
if (String.IsNullOrEmpty(lastRequest) || !sr.orderNo.Equals(lastRequest))
|
||
{
|
||
lastRequest = sr.orderNo;
|
||
requestCntInPart++;
|
||
if (requestCntInPart > WmsConstants.PART_ORDER_SIZE) //限制同区同时分拣订单的数量
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
if(pickDetailMaxInWave <= lstBulk.Count){
|
||
break;
|
||
}
|
||
lstBulk.Add(new WmsStockRecord(dr));
|
||
|
||
}
|
||
}
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("待处理拣货笔数:{0}", lstBulk.Count));
|
||
#region 建立零库电子拣选临时数据
|
||
int lastId = 0;
|
||
WmsOutPickLable_tmp wpl;
|
||
foreach( WmsStockRecord rec in lstBulk)
|
||
{
|
||
|
||
if (lblist.Count > 0)
|
||
{
|
||
int id = new Random().Next(lblist.Count);
|
||
#if DEBUG
|
||
rec.location.elabId = lblist[id]; //new Random().Next(minId, maxId + 1); //测试。。。随机分配标签id 为 1-3
|
||
|
||
while (lblist.Count > 1 && lastId == rec.location.elabId)
|
||
{
|
||
id = new Random().Next(lblist.Count);
|
||
rec.location.elabId = lblist[id];
|
||
}
|
||
|
||
lastId = rec.location.elabId;
|
||
#endif
|
||
}
|
||
|
||
//建立零库电子拣选临时数据
|
||
|
||
if (rec.count + rec.countOuting < 1) //不支持小数
|
||
{
|
||
continue;
|
||
}
|
||
wpl = new WmsOutPickLable_tmp();
|
||
wpl.pickOrderNo = rec.orderNo;
|
||
wpl.recordId = rec.ID;
|
||
// wpl.color = desk.color;
|
||
wpl.count = rec.countOuting;
|
||
wpl.locationId = rec.locationId;
|
||
wpl.elabAddress = rec.location.elabAddress;
|
||
wpl.elabId = rec.location.elabId;
|
||
// wpl.elabId = new Random().Next(1,4); //测试。。。随机分配标签id 为 1-3
|
||
wpl.port = rec.location.port;
|
||
wpl.partion = rec.partion;
|
||
wpl.orderDetailId = rec.orderDetailId;
|
||
#if DEBUG
|
||
try
|
||
{
|
||
if (comLables.Count > 0)
|
||
{
|
||
wpl.port = comLables[wpl.elabId]; //rec.location.elabId < 4 ?5 :3; //测试。。。 分配标签端口为3
|
||
}
|
||
}
|
||
catch { }
|
||
#endif
|
||
wpl.dpsOrder = waveOrder;
|
||
wpl.operater = this.operId;
|
||
lstLabel.Add(wpl);
|
||
|
||
}
|
||
|
||
#endregion
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" lstBulk.Count:{1},sumBulkCnt:{2}"
|
||
, seedsRequests.Count, lstBulk.Count, sumBulkCnt));
|
||
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("进入摘果式拣选"));
|
||
|
||
|
||
#region 保存整货和零货出库分拣数据
|
||
|
||
|
||
|
||
WmsOutPickRequest request ;
|
||
lastRequest = "";
|
||
|
||
int lastPartion=-1;
|
||
try
|
||
{
|
||
using (TransactionScope scope1 = new TransactionScope())
|
||
{
|
||
foreach (WmsOutPickLable_tmp wp in lstLabel) //建立电子拣选临时数据
|
||
{
|
||
if (lastPartion == -1 || lastPartion != wp.partion)
|
||
{
|
||
lstParts.Add(wp.partion);
|
||
color = 0; //每个区从红色开始分配灯色
|
||
lastPartion = wp.partion;
|
||
lastRequest = "";
|
||
|
||
if (partColors.ContainsKey(wp.partion)) //在分区一波次只有一个订单情况下,每波次颜色红绿轮替
|
||
{
|
||
if (partColors[wp.partion] == 1)
|
||
{
|
||
partColors[wp.partion] = 2;
|
||
}
|
||
else
|
||
{
|
||
partColors[wp.partion] = 1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
partColors[wp.partion] = 1;
|
||
}
|
||
|
||
}
|
||
|
||
if (String.IsNullOrEmpty(lastRequest) || !wp.pickOrderNo.Equals(lastRequest))
|
||
{
|
||
lastRequest = wp.pickOrderNo;
|
||
|
||
request = new WmsOutPickRequest(wp.pickOrderNo);
|
||
|
||
request.waveOrder = waveOrder;
|
||
|
||
// request.state = (int)enumOutStockRequestStatus.正在分拣;
|
||
if(String.IsNullOrEmpty(request.waveStart)){
|
||
request.waveStart = request.getDateTime();
|
||
}
|
||
request.operater = this.operId;
|
||
|
||
request.bulkPickState =(int)enumOutStockPickStatus.正在分拣;
|
||
WmsOutPickDetail wd = new WmsOutPickDetail(wp.orderDetailId);
|
||
if(wd.bulkPickState !=(int)enumOutStockPickStatus.正在分拣){
|
||
wd.bulkPickState =(int)enumOutStockPickStatus.正在分拣;
|
||
wd.operater =operId;
|
||
wd.Update();
|
||
}
|
||
// add or update WmsOutPickDetail_tmp for validation
|
||
|
||
if(request.desk ==0){
|
||
request.desk = getRandomFreeDesk().color;
|
||
}
|
||
//color = request.desk;
|
||
color++;
|
||
if (String.IsNullOrEmpty(request.tranLocationId))
|
||
{
|
||
request.tranLocationId = new TmsStock().getTranLocation(request.customerId);
|
||
}
|
||
request.waveOrder = waveOrder;
|
||
request.Update();
|
||
request.savePartionTempData4Validation(request.pickOrderNo);
|
||
if (request.batchPickState > -1)
|
||
{
|
||
batchRequests.Add(request);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
if (WmsConstants.PART_ORDER_SIZE == 1)
|
||
{
|
||
wp.color = partColors[wp.partion];
|
||
}
|
||
else
|
||
{
|
||
wp.color = color;
|
||
}
|
||
|
||
|
||
|
||
wp.Add();
|
||
}
|
||
waveSize++;
|
||
|
||
scope1.Complete();
|
||
|
||
//TimeSpan ts2 = DateTime.Now - d12;
|
||
//System.Diagnostics.Debug.WriteLine(string.Format(" {1} 保存完毕 {0} cost {2} .....", request.pickOrderNo, DateTime.Now, ts2.TotalSeconds + " : " + ts2.TotalMilliseconds));
|
||
}
|
||
|
||
|
||
//System.Diagnostics.Debug.WriteLine(string.Format("{1} 处理完毕 {0} cost {2} .....", request.pickOrderNo,DateTime.Now, ts.TotalSeconds +" : "+ ts.TotalMilliseconds));
|
||
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LogHelper.WriteLog(typeof(lWmsOutPickRequest), e);
|
||
// System.Diagnostics.Debug.WriteLine(e.Message);
|
||
}
|
||
|
||
// TimeSpan ts00 = DateTime.Now - d00;
|
||
// totoalTime += ts00.TotalSeconds;
|
||
|
||
|
||
#endregion
|
||
|
||
//检查待补货出货单状态
|
||
// checkRepAndNoStockOrders();
|
||
Thread stockCheckThread = new Thread(checkRepAndNoStockOrders);
|
||
stockCheckThread.IsBackground = true;
|
||
stockCheckThread.Start();
|
||
/*
|
||
Thread.CurrentThread.Join(1);
|
||
|
||
// process all batch pick request
|
||
|
||
Thread batchPick = new Thread(new ParameterizedThreadStart(processBatchWithBulkOrders));
|
||
batchPick.IsBackground = true;
|
||
batchPick.Start(batchRequests);
|
||
*/
|
||
// processAllBatchOrders(requests, waveOrder);
|
||
TimeSpan ts0 = DateTime.Now - d0;
|
||
//System.Diagnostics.Debug.WriteLine(string.Format("{0} 全部处理完毕{1} ..", DateTime.Now, ts0.TotalSeconds + " : " + ts0.TotalMilliseconds));
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("{0} 全部处理完毕{1} ..", DateTime.Now, ts0.TotalSeconds + " : " + ts0.TotalMilliseconds));
|
||
// TaskCallBack();
|
||
|
||
return lstParts;
|
||
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 根据销售订单或拣货单生成亮灯数据
|
||
/// </summary>
|
||
/// <param name="orderNo"></param>
|
||
/// <param name="orderType"></param>
|
||
/// <param name="partion"></param>
|
||
/// <returns></returns>
|
||
internal DataTable getOrderPickList(string orderNo, bool isPickOrder, int partion)
|
||
{
|
||
string pickOrderNo = orderNo;
|
||
if (!isPickOrder)
|
||
{
|
||
pickOrderNo = new lWmsOutRequest(operId).genPickOrder(orderNo);
|
||
|
||
}
|
||
newPartionPick(pickOrderNo, partion);
|
||
return outRequest.getOrderPickList(pickOrderNo, partion);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 播种式拣选
|
||
/// 只有播种台一种复核台
|
||
/// 每个播种台发起一组波次,当有播种台空闲时,该播种台发起新拣货任务,拣货任务分布在各个拣货区,拣货区通过几种方式实现亮灯拣货
|
||
/// 1. 先注册周转箱领取任务并亮灯,每个周转箱只对应一个复核台,只亮一种颜色的灯
|
||
/// 2. 先拣货后注册周转箱。 通过完成键呼叫后续任务,任务按
|
||
/// 波次任务安分区注册周转箱
|
||
/// 摘果拣选分区按周转箱亮灯
|
||
/// 周转箱在同一个波次内可以流转到多个分拣区拣货
|
||
/// </summary>
|
||
public void newBulkSeedsDPSPickWave()
|
||
{
|
||
|
||
//播种筛选,
|
||
//适合播种的客户订单合并成一个、多个大订单,统一捡出后进行播种操作
|
||
//1. 单个订单的品种少 、数量少
|
||
//2. 订单数量多
|
||
|
||
//只处理订单零货部分
|
||
//加入播种选项,所有订单零货部分使用摘取+播种方式
|
||
//1.播种点数量可配置, 分别用不同颜色区分
|
||
//2.每个播种点可分播客户的数量配置, 即每个播种点处理零货订单数量( 例如配置成6个,一次捡6个客户的订单零货部分,送由一个播种点播种)
|
||
//3.波次和播种点的对应关系,一个波次只摘取一个播种点的零货,还是多个播种点的数据?
|
||
//4.
|
||
|
||
|
||
//一个波次可以摘取订单数 = 空闲分播台数量*每个分播台可分播客户数, 分播台的订单用颜色区分
|
||
//
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), "开始新波次。。。。。。。。。。。。。。。。。。");
|
||
|
||
// System.Diagnostics.Debug.WriteLine("begin make new wave .....{0}" ,DateTime.Now);
|
||
|
||
List<WmsOutPickRequest> requests = outRequest.getRequests4Wave(); //.getRequestObjects(enumOutOrderType.拣货单, enumOutStockRequestStatus.波次处理);
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("待处理订单数量:{0}", requests.Count));
|
||
|
||
if (requests.Count == 0)
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("无订单需要处理,波次结束"));
|
||
checkRepAndNoStockOrders();
|
||
return;
|
||
}
|
||
// desk.restDeskStatus(enumDeskState.free);
|
||
// desk.restDeskStatus(enumDeskState.free, enumDeskType.播种); //播种台状态复位到空闲,是不是可以由播种员实际播种任务进度控制?
|
||
//_seedsDesk = getRandomFreeSeedsDesk();
|
||
// _desk = getRandomFreeDesk();
|
||
int labelMaxInWave = WmsConstants.MAX_LABEL_DATA_IN_A_WAVE; //一个标签一个波次只能存储40条数据
|
||
|
||
//#if DEBUG
|
||
// if (lblist.Count == 0)
|
||
{
|
||
lblist.Clear();
|
||
initialDebugSetting();
|
||
}
|
||
lblist.Sort();
|
||
// int minId = lblist[0];
|
||
// int maxId = lblist[lblist.Count - 1];
|
||
// labelMaxInWave = 2;
|
||
//#endif
|
||
|
||
|
||
// List<WmsStockRecord> strecs = null;
|
||
// waveOrder = Util.getOrderNo(enumCreateOrderType.waveOrder, _obj.getNextSeq());
|
||
//waveOrder = "WV" + System.DateTime.Now.ToString("yyyyMMddHHmmss");
|
||
int pickDetailMaxInWave = WmsConstants.MAX_CONTROL_DATA_IN_A_WAVE; //一个控制器最大存储1200条
|
||
Dictionary<int, int> labelCnt = new Dictionary<int, int>();
|
||
Dictionary<int, int> comCnt = new Dictionary<int, int>();
|
||
|
||
Dictionary<int, int> tmplabelCnt = new Dictionary<int, int>();
|
||
Dictionary<int, int> tmpcomCnt = new Dictionary<int, int>();
|
||
bool isReachLimit = false;
|
||
|
||
int waveSize = 0;
|
||
//List<WmsOutPickPort> lstPort;
|
||
List<WmsOutPickLable_tmp> lstLabel;
|
||
List<WmsStockRecord> lstBulk;
|
||
|
||
// LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("waveNo {0}", waveOrder));
|
||
|
||
//播种常量,达不到最小订单摘取需求的合并成大订单先统一摘取再分播
|
||
bool isSeedsEnabled = WmsConstants.OUT_BULK_SEEDS_PICK_ON;
|
||
int pickGoodsTypeMin = WmsConstants.OUT_MAX_SEEDS_GOODSTYPE_CNT; //单独摘取订单 最少货物类型
|
||
int pickGoodsCountMin = WmsConstants.OUT_MAX_SEEDS_BULK_CNT_SUM; // 单独摘取订单 最少货物数量
|
||
int seedsCount;//= seedsDesk.seedsCount; //播种台一次播种订单数量
|
||
decimal sumBulkCnt = 0;
|
||
bool isSeedPickInSameWave = true;
|
||
// bool canSeedPickLessThanseedsCount = false; //单个播种拣选单数量不可少于播种能力
|
||
List<WmsOutPickRequest> seedsRequests = new List<WmsOutPickRequest>();
|
||
Dictionary<string, WmsStockRecord> seedsBulks = new Dictionary<string, WmsStockRecord>();
|
||
|
||
|
||
|
||
_seedsDesk = getRandomFreeSeedsDesk();
|
||
|
||
seedsCount = seedsDesk.seedsCount;
|
||
|
||
|
||
|
||
int bulkCnt = 0;
|
||
int requestCnt = 0;
|
||
|
||
bulkRequests = new List<WmsOutPickRequest>(); //for batch process in a new thread
|
||
|
||
//开始处理有零货的订单
|
||
DateTime d0 = DateTime.Now;
|
||
double totoalTime = 0d;
|
||
string lastAddress = "";
|
||
foreach (WmsOutPickRequest request in requests)
|
||
{
|
||
if (seedsDesk.ID == 0)
|
||
{
|
||
return;
|
||
}
|
||
DateTime d00 = DateTime.Now;
|
||
|
||
if (request.bulkCnt > 0)
|
||
{
|
||
requestCnt++;
|
||
}
|
||
|
||
if (requestCnt >= pickDetailMaxInWave)
|
||
{
|
||
break;
|
||
}
|
||
|
||
if (request.bulkCnt == 0)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
|
||
|
||
// LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("开始处理零库出库 {0} ------------", request.pickOrderNo ));
|
||
LogHelper.debug(this.GetType(), string.Format("开始处理零库出库 {0} ------------", request.pickOrderNo));
|
||
|
||
|
||
DataTable dt = stkRecord.getPickStockRecods(request.pickOrderNo, true).Tables[0];//取出库明细
|
||
// lstPort = new List<WmsOutPickPort>();
|
||
lstLabel = new List<WmsOutPickLable_tmp>();
|
||
|
||
//开始处理零货出库
|
||
|
||
|
||
DataView dvBulk = new DataView(dt);
|
||
dvBulk.RowFilter = string.Format(" volType in ({0},{1})", (int)enumWhLocVol.零库1, (int)enumWhLocVol.零库);
|
||
|
||
|
||
|
||
//TimeSpan tssss = DateTime.Now - d00;
|
||
//System.Diagnostics.Debug.WriteLine(string.Format(" {0} {1},befor prepare bulklist, cost {2}", DateTime.Now, request.pickOrderNo, tssss.TotalSeconds));
|
||
|
||
DateTime d1 = DateTime.Now;
|
||
|
||
// lstBulk = new List<WmsStockRecord>();
|
||
|
||
|
||
|
||
// TimeSpan tsss = DateTime.Now - d1;
|
||
|
||
// LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" {0} prepare bulklist count :{1}, cost {2}", request.pickOrderNo, lstBulk.Count, tsss.TotalSeconds));
|
||
// DateTime d2 = DateTime.Now;
|
||
|
||
lstBulk = new List<WmsStockRecord>();
|
||
sumBulkCnt = 0;
|
||
foreach (DataRowView drv in dvBulk)
|
||
{
|
||
WmsStockRecord sr = new WmsStockRecord(drv.Row);
|
||
|
||
// sr.ID = Convert.ToInt32(drv["id"].ToString());
|
||
// sr.locationId = drv["locationID"].ToString();
|
||
// sr.orderDetailId = Convert.ToInt32(drv["orderDetailId"].ToString());
|
||
|
||
if (WmsConstants.OUT_STOCK_DEDUCT)
|
||
{
|
||
sr.count = Convert.ToDecimal(drv["countOuting"].ToString());
|
||
}
|
||
else
|
||
{
|
||
sr.count = Convert.ToDecimal(drv["count"].ToString());
|
||
}
|
||
|
||
sumBulkCnt += sr.count;
|
||
lstBulk.Add(sr);
|
||
}
|
||
|
||
|
||
//tsss = DateTime.Now - d2;
|
||
|
||
// LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" {0} {1},prepare bulklist2 count :{2}, cost {3}", DateTime.Now, request.pickOrderNo, lstBulk.Count, tsss.TotalSeconds));
|
||
|
||
|
||
/*
|
||
pickDetailMaxInWave -= strecs.Count;
|
||
|
||
if (pickDetailMaxInWave < 0)
|
||
{
|
||
//超出一个波次最大分拣数量
|
||
isReachLimit = true;
|
||
break;
|
||
}
|
||
*/
|
||
|
||
tmplabelCnt.Clear();
|
||
tmpcomCnt.Clear();
|
||
|
||
int lastId = 0;
|
||
|
||
//DateTime d11 = DateTime.Now;
|
||
//System.Diagnostics.Debug.WriteLine(string.Format(" 开始检查是否超限 --- {0}", d11));
|
||
|
||
#region checkmax
|
||
/*
|
||
* if (WmsConstants.OUT_LIGHT_ENABLE)
|
||
{
|
||
foreach (WmsStockRecord rec in lstBulk)//检查电子标签数量是否超过范围
|
||
{
|
||
|
||
if (lblist.Count > 0)
|
||
{
|
||
int id = new Random().Next(lblist.Count);
|
||
//#if DEBUG
|
||
rec.location.elabId = lblist[id]; //new Random().Next(minId, maxId + 1); //测试。。。随机分配标签id 为 1-3
|
||
|
||
while (lblist.Count > 1 && lastId == rec.location.elabId)
|
||
{
|
||
id = new Random().Next(lblist.Count);
|
||
rec.location.elabId = lblist[id];
|
||
}
|
||
|
||
lastId = rec.location.elabId;
|
||
//#endif
|
||
}
|
||
|
||
|
||
|
||
if (tmplabelCnt.ContainsKey(rec.location.elabId))
|
||
{
|
||
tmplabelCnt[rec.location.elabId]++;
|
||
}
|
||
else
|
||
{
|
||
tmplabelCnt[rec.location.elabId] = 1;
|
||
}
|
||
|
||
if (tmpcomCnt.ContainsKey(rec.location.port))
|
||
{
|
||
tmpcomCnt[rec.location.port] = tmpcomCnt[rec.location.port] + 1;
|
||
}
|
||
else
|
||
{
|
||
tmpcomCnt[rec.location.port] = 1;
|
||
}
|
||
|
||
|
||
if (labelCnt.ContainsKey(rec.location.elabId))
|
||
{
|
||
labelCnt[rec.location.elabId] = labelCnt[rec.location.elabId] + 1;
|
||
if (labelCnt[rec.location.elabId] >= labelMaxInWave)
|
||
{
|
||
isReachLimit = true;
|
||
|
||
foreach (int k in tmplabelCnt.Keys)
|
||
{
|
||
if (labelCnt.ContainsKey(k))
|
||
{
|
||
labelCnt[k] -= tmplabelCnt[k];
|
||
}
|
||
}
|
||
|
||
|
||
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
labelCnt[rec.location.elabId] = 1;
|
||
}
|
||
|
||
if (comCnt.ContainsKey(rec.location.port))
|
||
{
|
||
comCnt[rec.location.port] = comCnt[rec.location.port] + 1;
|
||
if (comCnt[rec.location.port] >= pickDetailMaxInWave)
|
||
{
|
||
isReachLimit = true;
|
||
|
||
foreach (int k in tmpcomCnt.Keys)
|
||
{
|
||
if (comCnt.ContainsKey(k))
|
||
{
|
||
comCnt[k] -= tmpcomCnt[k];
|
||
}
|
||
}
|
||
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
comCnt[rec.location.port] = 1;
|
||
}
|
||
}
|
||
|
||
//TimeSpan ts11 = DateTime.Now - d11;
|
||
//System.Diagnostics.Debug.WriteLine(string.Format(" 检查是否超限完毕 --- cost {0}", ts11.TotalSeconds + " : " + ts11.TotalMilliseconds));
|
||
|
||
if (isReachLimit)
|
||
{
|
||
isReachLimit = false;
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("超过限制,继续下条数据.... "));
|
||
|
||
continue;
|
||
}
|
||
}
|
||
* */
|
||
#endregion endcheck
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format(" lstBulk.Count:{1},sumBulkCnt:{2}"
|
||
, seedsRequests.Count, lstBulk.Count, sumBulkCnt));
|
||
|
||
if (isSeedsEnabled
|
||
// && lstBulk.Count < pickGoodsTypeMin //订单货品种类小
|
||
// && sumBulkCnt < pickGoodsCountMin
|
||
&& !noSeeds.Contains(request.pickOrderNo)
|
||
|
||
)
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("进入播种拣选 seedsRequests.Count:{0} ", seedsRequests.Count));
|
||
//播种筛选
|
||
|
||
if (_seedsDesk.ID > 0) //exist free seeds desk
|
||
{
|
||
|
||
if (seedsRequests.Count < seedsCount)//播种能力之内
|
||
{
|
||
//符合播种条件,整合订单
|
||
seedsRequests.Add(request);
|
||
|
||
//出库明细合并
|
||
foreach (WmsStockRecord wsr in lstBulk)
|
||
{
|
||
if (seedsBulks.ContainsKey(wsr.locationId))
|
||
{
|
||
seedsBulks[wsr.locationId].count += wsr.count;
|
||
seedsBulks[wsr.locationId].countOuting += wsr.countOuting;
|
||
}
|
||
else
|
||
{
|
||
seedsBulks[wsr.locationId] = wsr;
|
||
}
|
||
}
|
||
|
||
|
||
if (seedsRequests.Count == seedsCount) //生成播种拣选单
|
||
{
|
||
//create seeds pick request
|
||
|
||
//create pick detail WmsOutPickLable_tmp
|
||
createSeedsLabelDetail(seedsRequests, seedsBulks);
|
||
|
||
seedsRequests.Clear();
|
||
seedsBulks.Clear();
|
||
_seedsDesk = getRandomFreeSeedsDesk(); //重新取可用播种台
|
||
seedsCount = seedsDesk.seedsCount;
|
||
// continue;
|
||
|
||
}
|
||
|
||
|
||
continue;
|
||
}
|
||
|
||
|
||
}
|
||
else //no free seeds desk
|
||
{
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("播种拣选,no free seeds desk"));
|
||
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("订单{0} 将进入下一播种波次,开始处理下个订单", request.pickOrderNo));
|
||
continue;
|
||
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
TimeSpan ts00 = DateTime.Now - d00;
|
||
totoalTime += ts00.TotalSeconds;
|
||
|
||
}
|
||
if (seedsRequests.Count>0) //生成播种拣选单
|
||
{
|
||
//create seeds pick request
|
||
|
||
//create pick detail WmsOutPickLable_tmp
|
||
createSeedsLabelDetail(seedsRequests, seedsBulks);
|
||
}
|
||
|
||
|
||
/*少于播种台播种订单个数时 ,等待新订单加入后再拣选 或改播种台或改摘果
|
||
|
||
if (isSeedsEnabled && seedsRequests.Count > 0)
|
||
{
|
||
if (seedsRequests.Count == seedsCount || seedsRequests.Count >= seedsDesk.seedsMinCount) // || seedsRequests.Count < seedsCount && canSeedPickLessThanseedsCount
|
||
{
|
||
createSeedsLabelDetail(seedsRequests, seedsBulks);//生成播种拣选单
|
||
}
|
||
else
|
||
{
|
||
_seedsDesk = getRandomFreeSeedsDesk();
|
||
if (seedsDesk.ID == 0) //无可用播种台
|
||
{
|
||
foreach (WmsOutPickRequest pr in seedsRequests)
|
||
{
|
||
if (!seedsWaiting.Keys.Contains(pr.pickOrderNo))
|
||
{
|
||
seedsWaiting[pr.pickOrderNo] = System.DateTime.Now;
|
||
}
|
||
else
|
||
{
|
||
if (seedsWaiting[pr.pickOrderNo].AddMinutes(WmsConstants.OUT_MAX_SEEDS_WAIT_MINUES) < System.DateTime.Now)
|
||
{
|
||
seedsWaiting.Remove(pr.pickOrderNo);
|
||
noSeeds.Add(pr.pickOrderNo);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
seedsRequests.Clear();
|
||
seedsBulks.Clear();
|
||
|
||
}*/
|
||
|
||
|
||
|
||
TimeSpan ts1 = DateTime.Now - d0;
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("{0} 零库处理完毕----- cost {1} .....{2}", DateTime.Now, ts1.TotalSeconds + " : " + ts1.TotalMilliseconds, totoalTime));
|
||
// insert tmp data for validation
|
||
/// outRequest.saveTempData4Validation(waveOrder);
|
||
|
||
WmsConstants.WAVE_CURRENT_PICK_STATUS.Clear();
|
||
|
||
|
||
WmsConstants.WAVE_CURRENT_ORDER = waveOrder;
|
||
|
||
WmsConstants.WAVE_LAST_TIME = DateTime.Now;
|
||
|
||
|
||
//检查待补货出货单状态
|
||
Thread stockCheckThread = new Thread(checkRepAndNoStockOrders);
|
||
stockCheckThread.IsBackground = true;
|
||
stockCheckThread.Start();
|
||
|
||
TimeSpan ts0 = DateTime.Now - d0;
|
||
//System.Diagnostics.Debug.WriteLine(string.Format("{0} 全部处理完毕{1} ..", DateTime.Now, ts0.TotalSeconds + " : " + ts0.TotalMilliseconds));
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("{0} 全部处理完毕{1} ..", DateTime.Now, ts0.TotalSeconds + " : " + ts0.TotalMilliseconds));
|
||
// TaskCallBack();
|
||
|
||
}
|
||
|
||
|
||
|
||
private void createSeedsLabelDetail(List<WmsOutPickRequest> seedsRequests, Dictionary<string, WmsStockRecord> seedsBulks)
|
||
{
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("开始生成播种拣选单,seedsRequests.count :{0},seedsBulks.count:{1}",
|
||
seedsRequests.Count, seedsBulks.Count));
|
||
|
||
List<WmsOutPickLable_tmp> lstLabel = new List<WmsOutPickLable_tmp>();
|
||
|
||
if (_seedsDesk.ID == 0)
|
||
{
|
||
return;
|
||
}
|
||
waveOrder = Util.getOrderNo(enumCreateOrderType.dpsOrder, _obj.getNextSeq(enumCreateOrderType.dpsOrder));
|
||
WmsOutPickRequest seedPickRequest = new WmsOutPickRequest();
|
||
seedPickRequest.pickOrderNo = Util.getOrderNo(enumCreateOrderType.seedsPickOrder, seedPickRequest.getNextSeq(enumCreateOrderType.seedsPickOrder));
|
||
seedPickRequest.orderType = (int)enumOutOrderType.销售出库;
|
||
seedPickRequest.outStoreType = (int)enumOutStoreType.播种拣货出库;
|
||
LogHelper.debug(typeof(lWmsOutPickRequest), string.Format("播种拣选单 :{0} ", seedPickRequest.pickOrderNo));
|
||
WmsOutPickLable_tmp wpl;
|
||
foreach (WmsStockRecord rec in seedsBulks.Values)
|
||
{
|
||
if (rec.count + rec.countOuting <= 1)
|
||
{
|
||
continue;
|
||
}
|
||
wpl = new WmsOutPickLable_tmp();
|
||
wpl.pickOrderNo = seedPickRequest.pickOrderNo;
|
||
wpl.recordId = rec.ID; //link goods info
|
||
wpl.color = seedsDesk.color;
|
||
wpl.partion = rec.partion;
|
||
wpl.count = rec.count + rec.countOuting;
|
||
wpl.locationId = rec.locationId;
|
||
wpl.elabAddress = rec.location.elabAddress;
|
||
wpl.elabId = rec.location.elabId;
|
||
wpl.port = rec.location.port;
|
||
//#if DEBUG
|
||
|
||
if (comLables.Count > 0)
|
||
{
|
||
int id = new Random().Next(lblist.Count);
|
||
wpl.elabId = lblist[id];
|
||
wpl.port = comLables[wpl.elabId];
|
||
|
||
|
||
}
|
||
//#endif
|
||
wpl.dpsOrder = waveOrder;
|
||
wpl.operater = this.operId;
|
||
lstLabel.Add(wpl);
|
||
|
||
}
|
||
int i = 0;
|
||
int startId = seedsDesk.startLabelId;
|
||
//保存分拣数据
|
||
try
|
||
{
|
||
using (TransactionScope scope1 = new TransactionScope())
|
||
{
|
||
foreach (WmsOutPickLable_tmp wp in lstLabel) //建立电子拣选临时数据
|
||
{
|
||
wp.Add();
|
||
|
||
}
|
||
seedsDesk.state = (int)enumDeskState.任务中;
|
||
seedsDesk.Update();
|
||
|
||
foreach (WmsOutPickRequest request in seedsRequests)
|
||
{
|
||
request.waveOrder = waveOrder;
|
||
// request.state = (int)enumOutStockRequestStatus.正在分拣;
|
||
request.waveStart = request.getDateTime();
|
||
request.operater = this.operId;
|
||
if (lstLabel.Count > 0)
|
||
{
|
||
// request.updateBulkPickStatus(request.pickOrderNo, enumOutStockPickStatus.正在分拣, operId);
|
||
request.bulkPickState = (int)enumOutStockPickStatus.正在分拣;
|
||
request.desk = seedsDesk.color;
|
||
|
||
}
|
||
|
||
request.seedsLabelId = startId > 0 ? startId++ : seedsDesk.color * 10 + ++i; //每个播种复合台的标签ID编号不重复,应对多个播种台共用一个标签控制器的情况。
|
||
request.seedsPickNo = seedPickRequest.pickOrderNo; //赋值播种拣选订单单号
|
||
request.seedsPort = seedsDesk.port;
|
||
if (comLables.Count > 0)
|
||
{
|
||
request.seedsPort = comLables[1];
|
||
}
|
||
request.Update();
|
||
// bulkRequests.Add(request);
|
||
//waveSize++;
|
||
|
||
}
|
||
outRequest.saveTempData4Validation(waveOrder);
|
||
scope1.Complete();
|
||
|
||
//TimeSpan ts2 = DateTime.Now - d12;
|
||
//System.Diagnostics.Debug.WriteLine(string.Format(" {1} 保存完毕 {0} cost {2} .....", request.pickOrderNo, DateTime.Now, ts2.TotalSeconds + " : " + ts2.TotalMilliseconds));
|
||
}
|
||
|
||
|
||
//System.Diagnostics.Debug.WriteLine(string.Format("{1} 处理完毕 {0} cost {2} .....", request.pickOrderNo,DateTime.Now, ts.TotalSeconds +" : "+ ts.TotalMilliseconds));
|
||
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LogHelper.WriteLog(typeof(lWmsOutPickRequest), e);
|
||
|
||
}
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 播种区域周转箱任务领取注册并亮灯
|
||
/// 当拣货分区有拣货任务,且空闲时,空周转箱流入
|
||
/// 扫描周转箱条码,根据周转箱容积,分配拣货任务并亮灯
|
||
/// 分配任务按分播台顺序依次分配
|
||
/// 同一个物品尽量分配在同一个周转箱或相邻周转箱
|
||
/// 周转箱专属一个分拣区,同个周转箱不跨区分配
|
||
/// </summary>
|
||
/// <param name="plateNo"></param>
|
||
/// <param name="partion"></param>
|
||
/// <returns></returns>
|
||
public enumRegPlateResult regSeedsPlate(string plateId,int partion)
|
||
{
|
||
decimal usedVol = 0;
|
||
int lastColor = 0;
|
||
DataTable dt = getWmsOutPickRequest.getPartionBulkDetailInCurrentWave();
|
||
|
||
DataView dv = dt.DefaultView;
|
||
WmsPlate box = new WmsPlate(plateId);
|
||
if (box.ID == 0)
|
||
{
|
||
return enumRegPlateResult.容器不存在;
|
||
}
|
||
if (box.state == (int)enumPlateStatus.空闲)//复核台扫描周转箱,设置状态为free.
|
||
{
|
||
box.waveNo = "";
|
||
box.terminal = 0;
|
||
box.partion = 0;
|
||
}
|
||
else// not free box
|
||
{
|
||
if (!String.IsNullOrEmpty(box.waveNo) || box.terminal > 0)
|
||
{
|
||
dv.RowFilter = "dpsOrder='" + box.waveNo + "' and color =" + box.terminal;
|
||
if (dv.Count == 0) //周转箱历史绑定未被释放
|
||
{
|
||
box.waveNo = "";
|
||
box.terminal = 0;
|
||
}
|
||
|
||
}
|
||
|
||
dv.RowFilter = "plate='" + plateId + "' and partion <>" + partion;
|
||
if (dv.Count > 0)
|
||
{
|
||
return enumRegPlateResult.容器已被其他货区占用;
|
||
}
|
||
}
|
||
|
||
dv.RowFilter = "plate='" + plateId + "' and partion =" + partion +" and dpsOrder ='" + box.waveNo +"'";
|
||
foreach (DataRowView drv in dv)
|
||
{
|
||
WmsOutPickLable_tmp wpl = new WmsOutPickLable_tmp(drv.Row);
|
||
usedVol += wpl.calVol;
|
||
}
|
||
if (usedVol >= box.volume)
|
||
{
|
||
return enumRegPlateResult.容器空间不足;
|
||
}
|
||
|
||
dv.RowFilter = "isnull(plate,'-1')='-1' and state=0 and partion =" + partion;
|
||
if (box.terminal > 0)
|
||
{
|
||
dv.RowFilter += " and color = " + box.terminal;
|
||
}
|
||
dv.Sort = "color,plate,calVol desc";
|
||
if (dv.Count == 0)
|
||
{
|
||
return enumRegPlateResult.当前无拣货订单;
|
||
}
|
||
|
||
bool isReged = false;
|
||
using (TransactionScope scope1 = new TransactionScope())
|
||
{
|
||
foreach (DataRowView drv in dv)
|
||
{
|
||
|
||
if (box.volume - usedVol <= 0)
|
||
{
|
||
break;
|
||
}
|
||
|
||
WmsOutPickLable_tmp wpl = new WmsOutPickLable_tmp(drv.Row);
|
||
|
||
lastColor= box.terminal;
|
||
|
||
if (lastColor > 0 && lastColor != wpl.color) //周转箱分配唯一的分播台
|
||
{
|
||
continue;
|
||
}
|
||
|
||
if (!String.IsNullOrEmpty(box.waveNo) && box.waveNo != wpl.dpsOrder)//周转箱分配唯一的分播台
|
||
{
|
||
continue;
|
||
}
|
||
|
||
decimal sv = wpl.calVol / wpl.count;
|
||
decimal osv = wpl.minOperateCount * sv;
|
||
|
||
decimal newCnt = 0;
|
||
bool isSplitTask = false;
|
||
|
||
|
||
if (wpl.calVol > box.volume - usedVol)
|
||
{
|
||
|
||
newCnt = Math.Floor((box.volume - usedVol) / osv) * wpl.minOperateCount;
|
||
|
||
usedVol = box.volume;
|
||
}
|
||
else if (wpl.calVol == box.volume - usedVol)
|
||
{
|
||
newCnt = wpl.count;
|
||
usedVol += wpl.calVol;
|
||
/*
|
||
wpl.plate = box.plateId;
|
||
wpl.Update();
|
||
box.Update();
|
||
|
||
break;
|
||
*/
|
||
}
|
||
else if (wpl.calVol < box.volume - usedVol)
|
||
{
|
||
newCnt = wpl.count;
|
||
usedVol += wpl.calVol;
|
||
isSplitTask = wpl.plate == "-1";
|
||
/*
|
||
wpl.plate = box.plateId;
|
||
wpl.Update();
|
||
box.Update();
|
||
|
||
if (isSplitTask) //同一个品多个周转箱,剩余尾数独占一个周转箱,方便分播
|
||
{
|
||
break;
|
||
}
|
||
*/
|
||
|
||
}
|
||
|
||
newCnt = newCnt > WmsConstants.MAX_PICK_CNT_BULK ? WmsConstants.MAX_PICK_CNT_BULK : newCnt;
|
||
|
||
if (newCnt > 0)
|
||
{
|
||
if (lastColor == 0)
|
||
{
|
||
lastColor = wpl.color;
|
||
box.waveNo = wpl.dpsOrder;
|
||
box.terminal = wpl.color;//seeds desk
|
||
box.state = (int)enumPlateStatus.摘果周转;
|
||
}
|
||
|
||
wpl.count = newCnt;
|
||
wpl.plate = box.plateId;
|
||
wpl.Update();
|
||
|
||
// usedVol += newCnt * sv;
|
||
wpl = new WmsOutPickLable_tmp(drv.Row);
|
||
if (wpl.count - newCnt > 0)
|
||
{
|
||
wpl.count = wpl.count - newCnt;
|
||
wpl.plate = "-1";
|
||
wpl.calVol = 0;
|
||
wpl.Add();//新增待注册周转箱任务
|
||
}
|
||
|
||
box.Update();
|
||
isReged = true;
|
||
}
|
||
|
||
if (isSplitTask) //同一个品多个周转箱,剩余尾数独占一个周转箱,方便分播
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
scope1.Complete();
|
||
}
|
||
|
||
|
||
return enumRegPlateResult.成功 ;
|
||
|
||
}
|
||
|
||
|
||
internal DataTable getPlatePickList(string plateId, int part)
|
||
{
|
||
return pickLabelDetail.getPlateTaskPickList(plateId, part);
|
||
}
|
||
internal DataTable getPlatePickTaskList4wince(string plateId, int part)
|
||
{
|
||
return pickLabelDetail.getPlatePickTaskList4wince(plateId, part);
|
||
}
|
||
|
||
internal DataTable getDeskList(enumDeskType deskType)
|
||
{
|
||
return desk.getDeskList(deskType);
|
||
}
|
||
|
||
internal int setDeskFree(int deskId)
|
||
{
|
||
WmsOutDesk desk = new WmsOutDesk().getDeskObjByColor(deskId);
|
||
if (desk.state != (int)enumDeskState.空闲)
|
||
{
|
||
desk.state =(int)enumDeskState.空闲;
|
||
return desk.Update();
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
internal int setPlateFree(string plateId)
|
||
{
|
||
WmsPlate plate = new WmsPlate(plateId);
|
||
plate.state = (int)enumPlateStatus.空闲;
|
||
return plate.Update();
|
||
}
|
||
|
||
internal bool finishBulkValidateItem(int id, int status, string remark, int reason, decimal count, int checkedBy1)
|
||
{
|
||
|
||
WmsOutPickDetail_tmp tmp = new WmsOutPickDetail_tmp(id);
|
||
|
||
tmp.bulkPickState = status;
|
||
tmp.validRemark = remark;
|
||
tmp.validReason = reason;
|
||
tmp.confirmedCount = count;
|
||
tmp.operater = operId;
|
||
tmp.checkedBy1 = checkedBy1;
|
||
tmp.checkedBy = tmp.operater;
|
||
tmp.checkedTime = tmp.getDateTime();
|
||
|
||
//updatePickState(id, enumPickState.复核完成);
|
||
using (TransactionScope scope = new TransactionScope())
|
||
{
|
||
outPickPort.updatePickStateByOrderDetailId(id, enumPickState.复核完成, operId, checkedBy1);
|
||
|
||
tmp.Update();
|
||
|
||
scope.Complete();
|
||
|
||
}
|
||
return true;
|
||
|
||
|
||
}
|
||
}
|
||
|
||
}
|
||
|