ldj/ePickSqlite/BLL/lWmsOutPickLable.cs

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 lWmsOutPickLable :lbase
{
WmsOutPickLable _obj;
public lWmsOutPickLable()
{
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;
}
}
// }
}
}
}