463 lines
14 KiB
C#
463 lines
14 KiB
C#
|
|
/// <summary>
|
|
///LOGIC CLASS FOR TABLE t_wmsOutPickLable
|
|
///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.Data.BaseObject;
|
|
using DeiNiu.Utils;
|
|
using System.Threading;
|
|
|
|
namespace DeiNiu.wms.Logical
|
|
{
|
|
[Serializable]
|
|
public class lWmsOutPickLableOld :lbase
|
|
{
|
|
WmsOutPickLable _obj;
|
|
|
|
public lWmsOutPickLableOld()
|
|
{
|
|
initialize();
|
|
}
|
|
|
|
public WmsOutPickLable getWmsOutPickLable
|
|
{
|
|
get
|
|
{
|
|
return _obj;
|
|
}
|
|
}
|
|
|
|
protected override BaseModel getModel()
|
|
{
|
|
return _obj;
|
|
}
|
|
|
|
/// <summary>
|
|
/// get all data
|
|
/// </summary>
|
|
public DataSet getAllData()
|
|
{
|
|
return _obj.Query();
|
|
}
|
|
|
|
/// <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 WmsOutPickLable(id) : new WmsOutPickLable();
|
|
}
|
|
|
|
/// <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 WmsOutPickLable(dr);
|
|
}
|
|
|
|
|
|
|
|
//begin cust db operation, query, excute sql etc.
|
|
|
|
|
|
/// <summary>
|
|
/// update in a transaction scrop
|
|
/// </summary>
|
|
|
|
public void update()
|
|
{
|
|
if (valid())
|
|
{
|
|
_obj.Update();
|
|
}
|
|
}
|
|
|
|
private bool valid()
|
|
{
|
|
return true;
|
|
}
|
|
//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()
|
|
{
|
|
|
|
|
|
try
|
|
{
|
|
string labels = "1,2,3,4,5,6,7,8,9,10,11,12";
|
|
string[] lbs = labels.Split(',');
|
|
foreach (string s in lbs)
|
|
{
|
|
comLables[Convert.ToInt16(s.Trim())] =6;
|
|
lblist.Add(Convert.ToInt16(s.Trim()));
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
private string waveOrder;
|
|
|
|
static bool isProcessing = false;
|
|
|
|
// public static bool isProcessWaveing = false;
|
|
/// <summary>
|
|
/// 开始新波次
|
|
/// </summary>
|
|
public void newPickWave()
|
|
{
|
|
|
|
if (isProcessing)
|
|
{
|
|
return;
|
|
}
|
|
isProcessing = true;
|
|
System.Diagnostics.Debug.WriteLine("begin make new wave .....{0}", DateTime.Now);
|
|
|
|
DataTable dt = _obj.getNewPickList().Tables[0];
|
|
if (dt.Rows.Count == 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
#if DEBUG
|
|
// if (lblist.Count == 0)
|
|
{
|
|
lblist.Clear();
|
|
initialDebugSetting();
|
|
}
|
|
lblist.Sort();
|
|
int minId = lblist[0];
|
|
int maxId = lblist[lblist.Count - 1];
|
|
#endif
|
|
|
|
|
|
// List<WmsStockRecord> strecs = null;
|
|
waveOrder = Util.getOrderNo(enumCreateOrderType.waveOrder, _obj.getNextSeq());
|
|
int labelMaxInWave = WmsConstants.MAX_LABEL_DATA_IN_A_WAVE; //一个标签一个波次只能存储40条数据
|
|
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>();
|
|
List<string> labelAddress = new List<string>();
|
|
|
|
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_tmp = new List<WmsOutPickLable_tmp>();
|
|
List<WmsOutPickLable> lstLabel = new List<WmsOutPickLable>();
|
|
|
|
int i = 0;
|
|
|
|
//开始处理有零货的订单
|
|
DateTime d0 = DateTime.Now;
|
|
double totoalTime = 0d;
|
|
int maxColorCnt = WmsConstants.MAX_COLORS;
|
|
int color = 0;
|
|
string lastPickorder = "";
|
|
foreach (DataRow dr in dt.Rows )
|
|
{
|
|
DateTime d00 = DateTime.Now;
|
|
|
|
WmsOutPickLable wop = new WmsOutPickLable(dr);
|
|
|
|
if (wop.waveOrder.Length > 0 || wop.count<=0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
//if (string.IsNullOrEmpty(lastPickorder))
|
|
// {
|
|
// lastPickorder = wop.pickOrderNo;
|
|
// }
|
|
|
|
if (!lastPickorder.Equals( wop.pickOrderNo))
|
|
{
|
|
lastPickorder = wop.pickOrderNo;
|
|
color++;
|
|
if (color > maxColorCnt )
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (i >= pickDetailMaxInWave)
|
|
{
|
|
break;
|
|
}
|
|
|
|
i++;
|
|
|
|
// lstPort = new List<WmsOutPickPort>();
|
|
|
|
|
|
// tmplabelCnt.Clear();
|
|
// tmpcomCnt.Clear();
|
|
|
|
|
|
|
|
//DateTime d11 = DateTime.Now;
|
|
//System.Diagnostics.Debug.WriteLine(string.Format(" 开始检查是否超限 --- {0}", d11));
|
|
|
|
|
|
|
|
#if DEBUG
|
|
|
|
int id = new Random().Next(1,lblist.Count);
|
|
Thread.Sleep(10);
|
|
int lastId = 0;
|
|
wop.elabId = lblist[id]; //new Random().Next(minId, maxId + 1); //测试。。。随机分配标签id 为 1-3
|
|
|
|
while (lblist.Count > 1 && lastId == wop.elabId)
|
|
{
|
|
id = new Random().Next(1, lblist.Count);
|
|
wop.elabId = lblist[id];
|
|
}
|
|
|
|
lastId = wop.elabId;
|
|
if (wop.elabAddress == 0)
|
|
{
|
|
wop.elabAddress = new Random().Next(11,33);
|
|
}
|
|
|
|
#endif
|
|
|
|
string lbAdrss = wop.elabId + "-" + wop.elabAddress;
|
|
if (labelAddress.Contains(lbAdrss))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
labelAddress.Add(lbAdrss);
|
|
|
|
if (labelCnt.ContainsKey(wop.elabId))
|
|
{
|
|
|
|
if (labelCnt[wop.elabId] <= labelMaxInWave)
|
|
{
|
|
labelCnt[wop.elabId]++;
|
|
}
|
|
else
|
|
{
|
|
continue;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
labelCnt[wop.elabId] = 1;
|
|
}
|
|
|
|
if (comCnt.ContainsKey(wop.port))
|
|
{
|
|
comCnt[wop.port] = comCnt[wop.port] + 1;
|
|
if (comCnt[wop.port] <= pickDetailMaxInWave)
|
|
{
|
|
comCnt[wop.port]++;
|
|
|
|
}
|
|
else
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
comCnt[wop.port] = 1;
|
|
}
|
|
|
|
//TimeSpan ts11 = DateTime.Now - d11;
|
|
//System.Diagnostics.Debug.WriteLine(string.Format(" 检查是否超限完毕 --- cost {0}", ts11.TotalSeconds + " : " + ts11.TotalMilliseconds));
|
|
|
|
if (isReachLimit)
|
|
{
|
|
isReachLimit = false;
|
|
System.Diagnostics.Debug.WriteLine(string.Format("超过限制,继续下条数据.... "));
|
|
continue;
|
|
}
|
|
|
|
WmsOutPickLable_tmp wpl;
|
|
|
|
wpl = new WmsOutPickLable_tmp();
|
|
wpl.color = color;
|
|
wpl.count = wop.count;
|
|
wpl.locationId = wop.locationId;
|
|
wpl.elabAddress = wop .elabAddress;
|
|
wpl.elabId = wop.elabId;
|
|
// wpl.elabId = new Random().Next(1,4); //测试。。。随机分配标签id 为 1-3
|
|
wpl.port = wop.port;
|
|
wpl.pickOrderNo = wop.pickOrderNo;
|
|
#if DEBUG
|
|
try
|
|
{
|
|
wpl.port = comLables[wpl.elabId]; //wop.elabId < 4 ?5 :3; //测试。。。 分配标签端口为3
|
|
}
|
|
catch { }
|
|
#endif
|
|
wpl.waveOrder = waveOrder;
|
|
wpl.operater = this.operId;
|
|
lstLabel_tmp.Add(wpl);
|
|
|
|
wop.waveOrder = waveOrder;
|
|
|
|
lstLabel.Add(wop);
|
|
//保存整货和零货出库分拣数据
|
|
}
|
|
|
|
try
|
|
{
|
|
// using (TransactionScope scope1 = new TransactionScope())
|
|
{
|
|
foreach (WmsOutPickLable_tmp wp in lstLabel_tmp) //建立电子拣选临时数据
|
|
{
|
|
wp.Add();
|
|
|
|
}
|
|
foreach (WmsOutPickLable wp in lstLabel ) //建立电子拣选临时数据
|
|
{
|
|
wp.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));
|
|
}
|
|
|
|
waveSize++;
|
|
|
|
|
|
//System.Diagnostics.Debug.WriteLine(string.Format("{1} 处理完毕 {0} cost {2} .....", request.pickOrderNo,DateTime.Now, ts.TotalSeconds +" : "+ ts.TotalMilliseconds));
|
|
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
System.Diagnostics.Debug.WriteLine(e.Message);
|
|
}
|
|
|
|
|
|
TimeSpan ts1 = DateTime.Now - d0;
|
|
System.Diagnostics.Debug.WriteLine(string.Format("{0} 零库处理完毕----- cost {1} .....{2}", DateTime.Now, ts1.TotalSeconds + " : " + ts1.TotalMilliseconds, totoalTime));
|
|
// insert tmp data for validation
|
|
|
|
|
|
WmsConstants.WAVE_CURRENT_PICK_STATUS.Clear();
|
|
|
|
////通知整库出货
|
|
//Thread light = new Thread(lightLables);
|
|
//light.IsBackground = true;
|
|
//light.Start();
|
|
// lightLables();
|
|
|
|
WmsConstants.WAVE_CURRENT_ORDER = waveOrder;
|
|
|
|
WmsConstants.WAVE_LAST_TIME = DateTime.Now;
|
|
isProcessing = false;
|
|
//点亮标签开始捡货
|
|
// elelab.pick.send_data_pick(_obj.getData4Pick(waveOrder).Tables[0], enumLabelPickType.pick);
|
|
|
|
isProcessing = false;
|
|
|
|
}
|
|
|
|
internal void finishCurrentWave(string waveNo,bool isForce)
|
|
{
|
|
|
|
{
|
|
//string waveOrder = pickLabelDetail.finishCurrentPickingData();//结束当前拣选的数据
|
|
// if (!string.IsNullOrEmpty(waveOrder))
|
|
// {
|
|
try
|
|
{
|
|
|
|
if (isForce)
|
|
{
|
|
//TODO: to turn off the lights
|
|
}
|
|
|
|
using (TransactionScope scope = new TransactionScope())
|
|
{
|
|
_obj.finishCurrentPickingData(waveNo,isForce);//结束当前拣选的数据
|
|
|
|
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))
|
|
{
|
|
|
|
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);
|
|
|
|
// finishCurrentWave(waveNo,isForce);
|
|
throw er;
|
|
}
|
|
}
|
|
|
|
// }
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|