/// 
///INTERFACE CLASS FOR TABLE t_wmsStock
///By wm with codesmith. 
///on 05/14/2017
/// 
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 WmsStock : WmsStock_base
    {
        public WmsStock()
        {
        }
        public WmsStock(int id): base(id)
        {
        }
         public WmsStock(DataRow dr): base(dr)
        {
          
        }
        /*public WmsStock(string goodsId, string batch, string locationId) 
         {
             cmdParameters[0] = goodsId;
             cmdParameters[1] = batch;
             cmdParameters[2] = locationId;
             this._goodsId = goodsId;
             this._batch = batch;
             this._locationId = locationId;
             getModel(100);
         }
         * */
        public WmsStock(string locationId, int skuId, string goodsId = null,string batch=null)
        {
            cmdParameters[0] = locationId;
            if (skuId == 0 && !string.IsNullOrEmpty(goodsId))
            {
                cmdParameters[1] = goodsId;
                cmdParameters[2] = batch;
                getModel(104);
            }
            else if(skuId >0)
            {
                cmdParameters[1] = skuId;
                getModel(103);
            }
        }
 
        /*
public WmsStock( string locationId)
{
    cmdParameters[0] = locationId;
    getModel(110);
}
* */
        protected override void getImp()
         {
             model_imp = new WmsStock_Imp();
         }
        public List getStockObjs(string locationId)
        {
            DataTable dt = getStocks(locationId);
            List lst = new List();
            foreach (DataRow dr in dt.Rows)
            {
                lst.Add(new WmsStock(dr));
            }
            return lst;
        }
        public List getLackStockObjs()
        {
            DataTable dt = CustQuery(1900).Tables[0];
            List lst = new List();
            foreach (DataRow dr in dt.Rows)
            {
                lst.Add(new WmsStock(dr));
            }
            return lst;
        }
        public WmsStock getVirStock(string goodsId,int skuId=0)
        {
            WmsGoods wg = new WmsGoods(goodsId);
            WmsLocation loc = new WmsLocation();
            return new WmsStock(  loc.getVirLocations(wg.part).locationId,skuId,goodsId);
        }
        public decimal getAvCount()
        {
            decimal cnt = count - countOut + adjustingCnt +virtialCount;
            if (WmsConstants.OUT_STOCK_DEDUCT)
            {
                cnt = cnt - countOuting;
            }
            return cnt;
        }
        /// 
        /// query same goods locations,存储整货位只含同品同批的情况  ( VOLTYPE=0 OR STORETYPE =0 )
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        public DataTable querySameGoodsLocations(string goodsId, enumWhLocVol volType, int skuId = 0, string batch = "", enumWhType whType = enumWhType.合格库,int recommandWareHouse=0)
        { 
           if (skuId > 0)
            {
                return queryBySku(skuId, volType,whType);
            } 
            cmdParameters[0] = goodsId;
            if (!String.IsNullOrEmpty(batch))
            {
                cmdParameters[1] = batch;
                cmdParameters[2] =(int)whType;
                return CustQuery(200).Tables[0];
            }
            else
            {
                cmdParameters[1] = (int)whType;
                return CustQuery(203).Tables[0];
            }
        }
        /// 
        /// //query sharing locations,不包括同品同批的情况
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        public DataTable queryOtherSharingLocations(WmsGoods goods, int volType, int locCnt, enumWhType whType = enumWhType.合格库)
        {
         
            cmdParameters[1] = goods; 
            cmdParameters[3] = volType;
            cmdParameters[4] = locCnt;
            cmdParameters[5] = (int)whType; 
            return CustQuery(204).Tables[0];
        }
        public DataTable queryBySku(int skuId, enumWhLocVol volType, enumWhType whType = enumWhType.合格库)
        {
            cmdParameters[0] = skuId;
            cmdParameters[1] = (int)whType;
            cmdParameters[2] = (int)volType;
            return CustQuery(2011).Tables[0];
        }
        public DataTable queryBySku(string skuCode, enumWhType whType = enumWhType.合格库)
        {
            cmdParameters[0] = skuCode;
            cmdParameters[1] = (int)whType; 
            return CustQuery(202).Tables[0];
        }
    
        /// 
        /// 根据商品编号和货位容量类别查询
        /// 
        /// 
        /// 
        public DataTable queryByGoodsIdVolType(int skuId,string skuCode,string goodsId, string batch,
            enumWhLocVol locVolType, enumWhType whType)
        {
            if (skuId > 0)
            {
                return queryBySkuVolType(skuId, locVolType, whType);
            } 
            if (!string.IsNullOrEmpty( skuCode))
            {
                return queryBySkuVolType(skuCode, locVolType, whType);
            }
            cmdParameters[0] = goodsId;
            cmdParameters[1] = (int)locVolType;
            cmdParameters[2] = batch;
            cmdParameters[3] = (int)whType;
            return CustQuery(500).Tables[0];
        }
        /// 
        /// 根据商品编号和货位容量类别查询
        /// 
        /// 
        /// 
        public DataTable queryBySkuVolType(int skuId, enumWhLocVol locVolType, enumWhType whType)
        {
            cmdParameters[0] = skuId;
            cmdParameters[1] = (int)locVolType;  
            cmdParameters[2] = (int)whType;
            return CustQuery(501).Tables[0];
        }
        public DataTable queryBySkuVolType(string skuCode, enumWhLocVol locVolType, enumWhType whType)
        {
            cmdParameters[0] = skuCode;
            cmdParameters[1] = (int)locVolType; 
            cmdParameters[2] = (int)whType;
            return CustQuery(502).Tables[0];
        }
        public DataSet QueryByName(string namelike,enumWhType whType)
        {
            cmdParameters[0] = namelike;
            cmdParameters[1] = (int)whType;
           
            return CustQuery(300);
        }
        public DataTable getStockRecord(string orderNo)
        {
            cmdParameters[0] = orderNo;
            return CustQuery(400).Tables[0];
        }
        private WmsLocation _location;
        public WmsLocation location
        {
            get {
                if (_location == null || _location.locationId != _locationId)
                {
                    _location = new WmsLocation(locationId);
                }
                return _location;
            
            }
             
        }
        public bool isCanDelete()
        {
            return countIn == 0  //无待上架库存
                    && count - countOut == 0 //架上库存
                    && adjustingCnt == 0
                    && countOuting == 0
                   //            && plateCount <= 0
                     && virtialCount == 0;
        }
        /// 
        /// // 更新库存出库信息,库存扣完,则删除记录
        /// 
        /// 
        public int updateCountOut()
        {
            if (String.IsNullOrEmpty(plateId))
            {
                if(ID == 0)
                {
                    return 0;
                }
              //  if (countIn <= 0 && count - countOut <= 0 && countOuting <= 0) //负库存 允许存在
                if (isCanDelete()) //待下架库存
                    {
                    LogHelper.debug(typeof(WmsStock),
                        string.Format("stk id {7}:  locationid {6}, goodsId {0}, 库存扣完删除库存记录,countIn: {1} ,count: {2},countOut: {3} ,countIn: {4},plateCount {5}",
                        goodsId, countIn, count, countOut, countIn,plateCount,locationId,ID)
                        );
                    return Delete(); // 库存扣完,删除记录
                }
                else
                {
                    return base.Update();
                }
            }
            else //托盘,可能多货品、多批次 
            {
                WmsPlateStock wps = new WmsPlateStock(skuId,plateId);
                if (countIn <= 0 && count - countOut <= 0 && countOuting <= 0)
                {
                    LogHelper.debug(typeof(WmsStock),
                        string.Format("{0} 库存扣完删除库存记录,countIn: {1} ,count: {2},countOut: {3} ,countIn: {4}",
                        goodsId, countIn, count, countOut, countIn)
                        );
                    int cnt =wps.Delete();
                    DataTable dt = wps.getPlateStock(plateId);
                    if (dt.Rows.Count == 0)
                    {
                        wps.clearPlate(plateId);
                        
                    }
                    return cnt;
                    // 库存扣完,删除记录
                }
                else
                {
                    wps.countOut = countOut;
                    wps.countOuting = countOuting;
                   return wps.Update();
                }
            }
            //return 0;
        }
        /// 
        /// 删除盘点库位等指定库位类型的库存
        /// 
        /// 
        public void deleteLocByType(enumWhLocVol locType)
        {
            cmdParameters[0] = (int)locType;
            CustOper(1600) ;
        }
       /// 
       /// 删除指定sku的库存记录
       /// 全仓盘点时清除skuId 为0的库存
       /// 
       /// 
        public void deleteLocBySkuId(int skuId)
        {
            cmdParameters[0] = skuId;
            CustOper(1610);
        }
        /// 
        /// get location data by locid
        /// for wince
        /// 
        /// 
        /// 
        public DataTable getStockLocation(string locId,string goodsId =null)
        {
            cmdParameters[0] = locId;
            cmdParameters[1] = goodsId;
            return CustQuery(600).Tables[0];
        }
        /// 
        /// stock records
        /// 
        /// 
        /// 
        public DataTable getStocks(string locId)
        {
            cmdParameters[0] = locId;
            return CustQuery(620).Tables[0];
        }
       
        public DataSet queryByGoodsBarcode(string barcode)
        {
            cmdParameters[0] = barcode;           
            return CustQuery(605);
        }
    
        /// 
        /// get locations by goodsid
        /// for wince with ch title
        /// 
        /// 
        /// 
        public DataTable getGoodsStockLocations(string barcode)
        {
            cmdParameters[0] = barcode;
            return CustQuery(605).Tables[0];
           // return CustQuery(610).Tables[0];
        }
        /// 
        /// 根据商品比较wms和erp库存
        /// 
        /// 
        /// 
        public DataTable getStockLocationCompareErp(string goodsId,string barcode)
        {
            cmdParameters[0] = goodsId;
            cmdParameters[1] = barcode;
            return CustQuery(700).Tables[0];
        }
        /// 
        /// 已下架商品待上架商品列表
        /// 
        /// 
        /// 
        public DataTable getLocationDownList4Up(int operId)
        {
            cmdParameters[0] = operId;
            return CustQuery(800).Tables[0];
        }
        public DataTable getLocationDownList4UpFlow(int operId,string flowNo)
        {
            if (string.IsNullOrEmpty(flowNo))
            {
                return getLocationDownList4Up(operId);
            }
            if (WmsConstants.UP_DOWN_SELF_RECS)
            {
                cmdParameters[0] = operId;
            }
         
            cmdParameters[1] = flowNo;
            return CustQuery(810).Tables[0];
        }
        public DataTable getGoodsERPStoreByBarcode(string barcode)
        {
            cmdParameters[0] = barcode;
            return CustQuery(900).Tables[0];
        }
         
        public int maintainIssue(int skuId ,enumStockLocationStatus state, int operId)
        {
            cmdParameters[0] = skuId; 
            cmdParameters[1] = (int)state;  
            cmdParameters[2] = operId;
          return  CustOper(1000) ;
        }
        public void recordMaintain(string locId, int operId)
        {
            cmdParameters[0] = locId;
            cmdParameters[1] = operId;        
            CustOper(1100);
        }
        /// 
        /// 比较wms erp库存
        /// 
        /// 
        /// 
        /// 
        /// 
        public DataSet getStockDiff(string querystr, int rownumStart, int rownumEnd)
        {             
            if (rownumEnd > rownumStart && rownumStart > 0)
            {
                this.rownumStart = rownumStart;
               this.rownumEnd = rownumEnd;
            }
            //  DataSet ds = string.IsNullOrEmpty(querystr) ? _obj.Query() : _obj.Query(querystr);
       
            if (string.IsNullOrEmpty(querystr))
            {
                cmdParameters[0] = querystr;
                return CustQuery(199) ;
            }
             
            cmdParameters[0] = getCondition(querystr); 
            return CustQuery(199) ;
           
        }
      
        public DataTable getWmsStockDetails(string goodsId, int skuId,string extrQuery)
        {
            cmdParameters[0] = skuId;
            cmdParameters[1] = goodsId;
            cmdParameters[2] = getCondition(extrQuery); 
            return CustQuery(1200).Tables[0];
        }
        public void cleanPandiane()
        {
            CustOper(2300);
        }
        public DataTable getFreeStockLocations(string goodsId, int count)
        {
            cmdParameters[0] = goodsId;
            cmdParameters[1] = count;
         
            return CustQuery(1300).Tables[0];
        }
         
        /// 
        /// 库存汇总 
        /// sum by goodsId, batch
        /// 
        /// 
        /// 
        public DataSet QuerySum(string querystr, int rownumStart, int rownumEnd)
        { 
            cmdParameters[0] = getCondition(querystr, rownumStart, rownumEnd); 
            return CustQuery(101) ;
        }
        /// 
        /// 库存汇总 
        /// sum by goodsId 
        /// 
        /// 
        /// 
        public DataSet QuerySumNoBatch(string querystr, int rownumStart, int rownumEnd)
        {
            cmdParameters[0] = getCondition(querystr, rownumStart, rownumEnd);
            return CustQuery(98);
        }
        /// 
        /// 零库查询,补货参考
        /// 
        /// 
        /// 
        public DataSet QueryBulkRep(string querystr, int rownumStart, int rownumEnd)
        {
            cmdParameters[0] = getCondition(querystr, rownumStart, rownumEnd); 
            return CustQuery(102);
        }
      /// 
      /// 查询库存变动记录
      /// 
      /// 
      /// 
      /// 
      /// 
        public DataSet queryStockRecords(string querystr, int rownumStart, int rownumEnd)
        {
            cmdParameters[0] = getCondition(querystr, rownumStart, rownumEnd);
            return CustQuery(1400);
        }
        public DataTable getStockInfo(string goodsId,int skuId=0,string batch="",  enumWhType whType = enumWhType.合格库)
        { 
           // Sku sku = skuId > 0 ? new Sku(skuId) : new Sku(skuCode); 
         //   int SKUID = sku.ID; 
            cmdParameters[0] = goodsId;
            cmdParameters[1] = skuId;// batch;
            cmdParameters[2] = batch;// batch;
            cmdParameters[3] = (int)whType;
            return CustQuery(401).Tables[0];
        }
        public decimal getUsedPercent(string locationId)
        {
            /*
            WmsStock stock;
            WmsGoods goods;
            decimal maxcnt = 0;
            decimal percent=0;
            Wmslocation loc = new Wmslocation(locationId);
            DataTable dt = getStocks(locationId);
            foreach (DataRow dr in dt.Rows)
            {
                stock = new WmsStock(dr);
                goods = new WmsGoods(stock.goodsId);
                decimal cnt = stock.count - stock.countOut + stock.countIn;//- stock.countOuting; //see v_stockGoods   (dbo.v_stockGoodsBasic.countIn + dbo.v_stockGoodsBasic.countOut + dbo.v_stockGoodsBasic.count)  / dbo.v_stockGoodsBasic.maxCount AS usedPercent,
                
                maxcnt = goods.getMaxCount(loc.volType);
                maxcnt = maxcnt > 0 ? maxcnt : 1;
                percent += cnt / maxcnt;
              
            }*/
            cmdParameters[0] = locationId;
            DataTable dt = CustQuery(1500).Tables[0];
            try
            {
                if (dt.Rows.Count > 0)
                {
                    return Convert.ToDecimal(dt.Rows[0][0].ToString());
                }
            }
            catch { }
            return 0;
        }
      
        public DataSet queryPlateStock(string querystr, int rownumStart, int rownumEnd)
        {
            cmdParameters[0] = getCondition(querystr, rownumStart, rownumEnd);
            return CustQuery(1700);
        }
        public DataTable queryPerformanceKPI(string querystr,bool isSum)
        {
            cmdParameters[0] = getCondition(querystr, rownumStart, rownumEnd);
            if(isSum)
                return CustQuery(1810).Tables[0];
            return CustQuery(1820).Tables[0];
        }
        public DataTable getElbPartStks(int part)
        {
            cmdParameters[0] = part;
            return CustQuery(2000).Tables[0];
        }
        public DataTable getElbPartTasksSum(int part)
        {
            cmdParameters[0] = part;
            return CustQuery(2100).Tables[0];
        }
        public DataSet queryTmps()
        {
            return CustQuery(2200) ;
        }
    }
}