412 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			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(); | |||
|  |          } | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |     } | |||
|  |      | |||
|  |      | |||
|  | } | |||
|  |   |