/// 
///LOGIC CLASS FOR TABLE t_wmsOrderRequest
///By wm with codesmith. 
///on 07/07/2020
/// 
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.Wcf;
using DeiNiu.Utils;
namespace DeiNiu.wms.Logical
{
    [Serializable]
    public class lWmsOrderRequest   :lbase
    {
        WmsOrderRequest _obj;
        public lWmsOrderRequest()
        {
             initialize();
        }
 
        public  WmsOrderRequest getWmsOrderRequest
        {
            get
            {
             if (_obj == null)
                {
                    _obj = new WmsOrderRequest();
                   
                } 
                _obj.operater = operId;
                return _obj;
            }
        }
        
       public lWmsOrderRequest(int operId)
            : base(operId)
        {
            initialize();
        }
        
  
		/// 
		/// get all data
		/// 
        public DataSet getAllData()
        {
           return _obj.Query();
        }
        /// 
        /// get all data
        /// 
        public DataSet getAllActiveData()
        {
            return _obj.QueryActived();
        }
		/// 
		/// get a record by id
		/// 
        public void initialize(int id)
		{
            _obj = id != 0 ? new WmsOrderRequest(id) : new WmsOrderRequest();
		}
        /// 
		/// get a record by id 0
		/// 
        public void initialize()
        {
            initialize(0);
        }
         /// 
        /// get a record by id
        /// 
        public void initialize(DataRow dr)
        {
            _obj =   new WmsOrderRequest(dr);
        }
        
        protected override DeiNiu.Data.BaseObject.BaseModel getModel()
        {
            return _obj;
        }
 
        //begin cust db operation, query, excute sql etc.
     
        internal int add(WmsOrderRequest wmsOrder)
        {
            enumCreateOrderType type = enumCreateOrderType.obsolete;
           // enumWhType toWhtype = enumWhType.报废库;
            switch ((enumOrderType)wmsOrder.orderType)
            {
                case enumOrderType.报废申请:
                    type = enumCreateOrderType.obsolete;
                //    toWhtype = enumWhType.报废库;
                    break;
                case enumOrderType.仓间调拨:
                    type = enumCreateOrderType.transferInternal;
                    break;
                case enumOrderType.库区转移:
                    type = enumCreateOrderType.transferOutside;
                    break;
                case enumOrderType.退供应商:
                    type = enumCreateOrderType.returnVender;
                    break;
                case enumOrderType.内部领用:
                    type = enumCreateOrderType.selfPickOrder;
                    break;
                case enumOrderType.无单入库:
                    type = enumCreateOrderType.stockInWithNoOrder;
                    break;
                case enumOrderType.货位下架:
                    type = enumCreateOrderType.stockLocationDown;
                    break;
            }
            wmsOrder.orderNo = Util.getOrderNo(type, new WmsOrderRequest().getNextSeq(type));
            //  wmsOrder.venderNo 
            wmsOrder.orderTypeName = ((enumOrderType)wmsOrder.orderType).ToString();
            wmsOrder.venderName = new Erp_bussinessDoc(wmsOrder.venderNo).businessName;
            wmsOrder.operater = operId;
            return wmsOrder.Add();
        }
     
        /// 
        public void update()
        {
            if (valid())
            {
                using (TransactionScope scope = new TransactionScope())
                {
                    //Node tmp = new Node();
                    //tmp.parentid = 1;
                    //tmp.name = "test trans" + DateTime.Now;
                    //tmp.description = "this is for transTest";
                    //tmp.Add();
                    _obj.Update();
                    scope.Complete();
                }
            }
        }
        
         private bool valid()
        {
            return true;
        }
         internal DataTable getDetail(string orderNo)
         {
             return getWmsOrderRequest.getDetail(orderNo);
         }
         internal int addDetail( enumOrderType orderType,Wcf.WcfWmsOrderDetail[] wcfDetails)
         {
             /*
             enumWhType whType = enumWhType.合格库, toWhType = enumWhType.报废库;
             if (wcfDetails.Length > 0)
             { 
                 switch (orderType)
                 {
                     case enumOrderType.报废申请:
                         whType = enumWhType.合格库;
                         toWhType = enumWhType.报废库;
                         break;
                     case enumOrderType.库区转移:
                         whType = enumWhType.合格库;
                         toWhType = enumWhType.报废库;
                         break;
                 }
             }
             */
             foreach (WcfWmsOrderDetail wd in wcfDetails)
             {
                // wd.whtype = (int)whType;
               //  wd.toWhType =(int) toWhType;
                
                 wd.state = 0;
               int id=  wd.getDbObject().Add();
                log.Debug("add orderDetail " + wd.getDbObject());
                log.Debug("add orderDetail2 " + new WmsOutDetail(id));
            }
             return wcfDetails.Length;
         }
         internal int deleteOrder(string orderNo)
         {
             int rt = 0;
             WmsOrderRequest order = new WmsOrderRequest(orderNo);
             if( order.state ==(int)enumOrderStatus.创建)
             rt=  getWmsOrderRequest.DeleteOrder(orderNo);
             
             return rt;
         }
         internal int approveOrder(string orderNo,int operId)
         {
             int rt = 0;
             WmsOrderRequest order = new WmsOrderRequest(orderNo);  
             DataTable dt= order.getDetail(order.orderNo);
             // to create tasks.
             using (TransactionScope scope = new TransactionScope())
             {
                 order.state = (int)enumOrderStatus.已核准;
                 order.approvedBy = this.operId;
                 order.approveDate = order.getDateTime();
                 order.Update();
                if (order.orderType == (int)enumOrderType.无单入库)  //无单入库则生成入库通知单
                { 
                    Erp_purch purch = new Erp_purch();
                    purch.pur_order = orderNo;
                    purch.orderType = order.orderType;
                    purch.order_typeName = ((enumOrderType)order.orderType).ToString();
                    purch.vender = order.requestBy + "";
                    purch.venderName = WmsConstants.CURRENT_USER_ORG;
                    purch.orgid= WmsConstants.CURRENT_USER_ORGID;
                    purch.entid= WmsConstants.CURRENT_USER_ORGID;
                    int i = 0;
                    foreach (DataRow dr in dt.Rows)
                    {
                        WmsOrderDetail od = new WmsOrderDetail(dr);
                        Erp_purch_d pd = new Erp_purch_d();
                        pd.pur_order = orderNo;
                        pd.pur_order_sn = ++i;
                        pd.goods_id = od.goodsId;
                        pd.count = od.count;
                        pd.add_date = pd.getDateTime();
                        pd.entid = WmsConstants.CURRENT_USER_ORGID; 
                        pd.Add();
                    }
                    purch.Add();
                    scope.Complete();
                    return rt;
                }
                enumOutStoreType outStoreType =Util.getOutStoreTypeByOrderType( order.orderType);
                 enumStockRecordType recType = Util.getStockRecordType((int)outStoreType);
                
                 WmsWave ww = new WmsWave();
                    ww.waveNo = Util.getOrderNo(enumCreateOrderType.waveOrder, _obj.getNextSeq(enumCreateOrderType.waveOrder)); ;
                    ww.operater = this.operId;
                    ww.type = (int)recType; 
                    ww.Add();
                 
                string locId = "";
                string taskId = Util.getOrderNo(enumCreateOrderType.pickJobNo, _obj.getNextSeq(enumCreateOrderType.pickJobNo));
           
                foreach (DataRow dr in dt.Rows)
                {
               
                    WmsOrderDetail od = new WmsOrderDetail(dr);
                    WmsLocation loc = new WmsLocation(od.locationId);
                  
                    if (order.orderType == (int)enumOrderType.货位下架)  //无单货位下架,执行时直接减库存   countOut += count, 有单移库下架,则走正常拣货流程
                    {
                        loc.state = (int)enumStockLocationStatus.入库受限;
                        loc.Update();
                    }
                    
                    WmsStock stk = new WmsStock(od.locationId, od.skuId, od.goodsId);
                    stk.countOuting += od.count;
                    stk.Update();
                    
                   // stk.state = (int)enumStockLocationStatus.不可用;
                  //  loc.state = (int)enumStockLocationStatus.不可用;
                   
                  //  loc.Update();
                    WmsStockRecord sr = new WmsStockRecord(dr);
                    sr.rectype =(int)recType;
                    sr.orderDetailId = od.ID;
                    sr.countOuting = od.count;
                    sr.count = 0;
                    sr.description = "";
                    sr.Add();
                    WmsOutPickPort wp = new WmsOutPickPort(dr);
                    wp.jobNo = taskId;
                    wp.pickOrderNo = order.orderNo;
                    wp.waveOrder = ww.waveNo;
                    wp.volType = loc.volType;
                    wp.tranArea = order.toWhType;
                    wp.recordId = sr.ID;
                    wp.recType = (int)recType;
                    wp.pickDetailId = od.ID;
 
                    wp.Add();
                    locId = od.locationId;
                }
                WmsFlow wf = new WmsFlow();
                wf.orderNo = order.orderNo;// ww.waveNo;
                wf.task = taskId;
                wf.type = (int)Util.getTaskType((int)recType); ;
                wf.typeName = recType.ToString();
                wf.taskCnt = dt.Rows.Count;
                wf.taskPartion = new WmsLocation(locId).partion;
               wf.Add();
                  
                 scope.Complete();
             }
             return rt;
         }
    }
    
    
}