/// 
///INTERFACE CLASS FOR TABLE t_wmsPlate
///By wm  
///on 05/22/2020
/// 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using DeiNiu.Utils;
namespace DeiNiu.wms.Data.Model
{
    [Serializable]
    public class WmsPlate : WmsPlate_base
    {
        public WmsPlate()
        {
        }
        public WmsPlate(string plateId)
        {
            cmdParameters[0] = plateId;
            getModel(100);
        }
        public WmsPlate(int id) : base(id)
        {
        }
        public WmsPlate(DataRow dr) : base(dr)
        {
        }
        protected override void getImp()
        {
            model_imp = new WmsPlate_Imp();
        }
        //begin cust db operation, query, excute sql etc.
        //begin cust db operation, query, excute sql etc.
        public DataTable getPlateById(string plateid)
        {
            cmdParameters[0] = plateid;
            return CustQuery(100).Tables[0];
        }
        public bool deleteByPlateId(string plateid)
        {
            cmdParameters[0] = plateid;
            return CustOper(200) > 0;
        }
        public DataSet getPlateWaves()
        {
            return CustQuery(300);
        }
        public DataTable getPlatesByWave(string waveOrder, int color)
        {
            cmdParameters[0] = waveOrder;
            if (color > 0)
            {
                cmdParameters[1] = color;
                return CustQuery(500).Tables[0];
            }
            else return CustQuery(400).Tables[0]; ;
        }
        public DataTable getPartionPickDetailByPlateId(string plateid)
        {
            cmdParameters[0] = plateid;
            return CustQuery(101).Tables[0];
        }
        public DataTable getPlatesByPickOrder(string pickOrderNo)
        {
            cmdParameters[0] = pickOrderNo;
            return CustQuery(600).Tables[0];
        }
        public void setFree()
        {
            this.waveNo = "";
            this.preInOrderNo = "";
            this.pickOrderNo = "";
            this.customerId = "";
            this.transNo = "";
            this.partion = 0;
            this.locationId = "";
            this.terminal = 0;
            this.state = 0;
            this.jobNo = "";
            this.inPlate = "";
            Update();
        }
        public WmsPlate getParentPlate(string plateId)
        {
            cmdParameters[0] = plateId;
            DataTable dt = CustQuery(700).Tables[0];
            foreach (DataRow dr in dt.Rows)
            {
                return new WmsPlate(dr);
            }
            return new WmsPlate();
        }
       
  /*public List getSubPlates(string plateId)
        {
            List lst = new List();
            cmdParameters[0] = plateId;
            DataTable dt = CustQuery(800).Tables[0];
            foreach (DataRow dr in dt.Rows)
            {
                lst.Add(new WmsPlate(dr));
            }
            return lst;
        }
        */
        public List getSubPlateIds(string plateId)
        {
            List lst = new List();
            cmdParameters[0] = plateId;
            DataTable dt = CustQuery(800).Tables[0];
            foreach (DataRow dr in dt.Rows)
            {
                lst.Add(dr["subPlateId"].ToString());
            }
            return lst;
        }
        public List getSubPlates(string plateId)
        {
            List lstp = new List();
            cmdParameters[0] = plateId;
            DataTable dt = CustQuery(1000).Tables[0];
            foreach (DataRow dr in dt.Rows)
            {
                lstp.Add(new WmsPlate(dr));
            }
            return lstp;
        }
      
        /// 
        /// 迭代取容器里所有商品,包含子容器及其子容器...
        /// 
        /// 
        /// 
       /* public List getPlateStoks(string plateId, bool showSub = false)
        {
            List stks = new List();
            DataTable dt = new WmsPlateStock_tmp().getStockLst(plateId);
            foreach (DataRow dr in dt.Rows)
            {
                stks.Add(new WmsPlateStock_tmp(dr));
            }
            if (!showSub)
            {
                return stks;
            }
            List subPlate = getSubPlates(plateId);
            foreach (WmsPlate obj in subPlate)
            {
                stks.Concat(getPlateStoks(obj.plateId, showSub));
            }
            return stks;
        }
        */
        private List getPlateJobsDts(List dts,string plateId, bool showSub = false)
        {
          //  LogHelper.debug(this.GetType(), string.Format(" plate contents dts size {2}, plateId {0},showSub {1}", plateId, showSub,dts.Count));
         
            dts.Add(new WmsPlateStock_tmp().getStockLst(plateId));
            LogHelper.debug(this.GetType(), string.Format(" plate contents dts size {2}, plateId {0},showSub {1}", plateId, showSub, dts.Count));
            if (!showSub)
            {
                return dts;
            }
            List   subPlate = getSubPlateIds(plateId);
            LogHelper.debug(this.GetType(), string.Format(" plate {0} sub plate count {1} ",plateId,subPlate.Count  ));
            foreach (string p in subPlate)
            {
                LogHelper.debug(this.GetType(), string.Format("2 subplate size {2}, plateId {0},sub plate id {1}", plateId, p, subPlate.Count));
                //  dts.Concat(getPlateJobsDts(dts,obj.plateId, showSub));
                if (p.Equals(plateId))
                {
                 
                    continue;
                }
                dts=(getPlateJobsDts(dts,  p, showSub));
            }
            return dts;
        }
        public DataTable getPateJobsDt(string plateId, bool showSub = false) 
        {
            List dts = new List();
            dts = getPlateJobsDts(dts ,plateId, showSub);
            DataTable d = dts[0];
            for  (int i = 1; i < dts.Count;i++)
            {
              d=  unionTables(d, dts[i],i+"");
            }
            return d;
        }
        private Dictionary> getPlatePlateRequest(Dictionary> requests, string plateId, bool showSub = false)
        {
           //   LogHelper.debug(this.GetType(), string.Format(" plate contents dts size {2}, plateId {0},showSub {1}", plateId, showSub, requests.Count));
           List lst = new WmsPlateStock_tmp().getPickRequests(plateId,enumOutStoreType.拣货出库);
            foreach(WmsOutPickRequest p in lst)
            {
                if (!requests.ContainsKey(p.pickOrderNo))
                {
                    requests.Add(p.pickOrderNo, lst);
                    
                  //  LogHelper.debug(this.GetType(), string.Format(" plateId {0} contents request  {1}", plateId, p.pickOrderNo));
                }
            }
         //   LogHelper.debug(this.GetType(), string.Format(" plateId {0} contents request size {2}, showSub {1}", plateId, showSub, lst.Count));
            if (!showSub)
            {
                return requests;
            }
            List subPlate = getSubPlateIds(plateId);
           // LogHelper.debug(this.GetType(), string.Format(" plate {0} sub plate count {1} ", plateId, subPlate.Count));
            foreach (string p in subPlate)
            {
                //  dts.Concat(getPlateJobsDts(dts,obj.plateId, showSub));
                requests =  getPlatePlateRequest(requests, p, showSub) ;
            }
            return requests;
        }
        public List getPlateRequests(string plateId, bool showSub = false)
        {
            List lst = new List();
            Dictionary> requests = new Dictionary>();
            requests = getPlatePlateRequest(requests, plateId, showSub);
          
            // LogHelper.debug(this.GetType(), string.Format(" plate {0} request list count {1} ", plateId, requests.Count));
           
            foreach (string p in requests.Keys)
            {
              lst= lst.Concat(requests[p]).ToList();    
            }
             LogHelper.debug(this.GetType(), string.Format(" plate {0} request  count {1} ", plateId, lst.Count));
            return lst ;
        }
        public static DataTable unionTables(DataTable dt1,DataTable dt2,string newName)
        {
            DataTable dt = dt1.Copy();
            dt.TableName= newName;  
            foreach(DataRow item in dt2.Rows)
            {
                DataRow dr = dt.NewRow();
                dr.ItemArray =item.ItemArray;
                dt.Rows.Add(dr);
            }
            return dt;
        }
        /// 
        /// 固定容器
        /// 
        /// 
        /// 
        public DataTable queryRegistedPlate(string flowNo)
        {
            cmdParameters[0] = flowNo;
            return CustQuery(900).Tables[0];
               
        }
        /// 
        /// 拣货子容器
        /// 
        /// 
        /// 
        public DataTable queryStockTmpPlate(string flowNo)
        {
            cmdParameters[0] = flowNo;
            return CustQuery(910).Tables[0];
        }
        public DataTable queryFromPlate(string flowNo)
        {
            DataTable dt = queryStockTmpPlate(flowNo);  
            if(dt.Rows.Count > 0)  //若存在 临时库存,返回库存相关内容
            {
                return dt;
            }
         
            return queryRegistedPlate(flowNo);  // 固定容器, 返回定义  
        }
        public int releaseSubPlate(string fromPlate)
        {
            cmdParameters[0] = fromPlate;
            return CustOper(1100);
        }
        public DataTable getLineId(string customerId)
        {
            cmdParameters[0] = customerId;
            return CustQuery(1200).Tables[0];
        }
        /// 
        /// 根据货物货区属性和客户ID,查找最新在用的wmsplate
        /// 
        /// pickorder custid
        /// 货区,114,115.。。
        /// 
        public WmsPlate getLatestPlate(string custId, string goodsId)
        {
            cmdParameters[0] = custId;
            cmdParameters[1] = goodsId;
            DataTable dt = CustQuery(1300).Tables[0];
            foreach (DataRow dr in dt.Rows)
            {
                return new WmsPlate(dr);
            }
            return new WmsPlate();
        }
    }
}