ldj/wavePick/BLL/lWmsOutPickLable.cs

412 lines
12 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;
}
try
{
isProcessing = true;
doWaveProcess();
}
catch (Exception er)
{
}
isProcessing = false;
}
public void doWaveProcess()
{
System.Diagnostics.Debug.WriteLine("begin make new wave .....{0}", DateTime.Now);
DataTable dt = _obj.getNewPickList().Tables[0];
if (dt.Rows.Count == 0)
{
_obj.updateWaveStatus();
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
|| wop.state>0
)
{
continue;
}
if (i >= pickDetailMaxInWave)
{
break;
}
i++;
// string lbAdrss = wop.elabId + "-" + wop.elabAddress;
// 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 = new WmsOutPickLable_tmp(dr);
if (i == 998)
{
i++;
i--;
}
lstLabel_tmp.Add(wpl);
if (String.IsNullOrEmpty(wop.waveOrder))
{
wop.waveOrder = waveOrder;
wpl.waveOrder = waveOrder;
}
else
{
waveOrder = wop.waveOrder;
}
lstLabel.Add(wop);
// lstLabel_tmp.Add(wpl);
//保存整货和零货出库分拣数据
}
try
{
using (TransactionScope scope1 = new TransactionScope())
{
foreach (WmsOutPickLable_tmp wp in lstLabel_tmp) //建立电子拣选临时数据
{
wp.color = Utils.Util.getColor(wp.color);
wp.Add();
}
foreach (WmsOutPickLable wp in lstLabel ) //建立电子拣选临时数据
{
wp.pickOrderNo = "";
wp.Update();
}
scope1.Complete();
}
waveSize++;
}
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();
WmsConstants.WAVE_CURRENT_ORDER = waveOrder;
WmsConstants.WAVE_LAST_TIME = DateTime.Now;
_obj.updateWaveStatus();
}
internal void finishCurrentWave(string waveNo,bool isForce)
{
try
{
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 = "";
}
_obj.updateWaveStatus();
scope.Complete();
WmsConstants.WAVE_LAST_END = DateTime.Now;
}
// _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;
}
}
public void updateWaveFlag()
{
_obj.updateWaveStatus();
}
}
}