/// 
///LOGIC CLASS FOR TABLE t_wmsFlow
///By wm with codesmith. 
///on 07/10/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.Utils;
namespace DeiNiu.wms.Logical
{
    [Serializable]
    public class lWmsFlow   :lbase
    {
        WmsFlow _obj;
        public lWmsFlow()
        {
             initialize();
        }
 
        public  WmsFlow getWmsFlow
        {
            get
            {
             if (_obj == null)
                {
                    _obj = new WmsFlow();
                   
                } 
                _obj.operater = operId;
                return _obj;
            }
        }
        
       public lWmsFlow(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 WmsFlow(id) : new WmsFlow();
		}
        /// 
		/// get a record by id 0
		/// 
        public void initialize()
        {
            initialize(0);
        }
         /// 
        /// get a record by id
        /// 
        public void initialize(DataRow dr)
        {
            _obj =   new WmsFlow(dr);
        }
        
        protected override DeiNiu.Data.BaseObject.BaseModel getModel()
        {
            return _obj;
        }
 
        //begin cust db operation, query, excute sql etc.
     
        internal int add(WmsFlow obj)
        {
            return obj.Add();
        }
     
        /// 
        /// update in a transaction scrop
        /// 
        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 getTaskDetail(string taskNo)
         {
             return _obj.getTaskDetail(taskNo);
         }
         internal DataTable getTaskDetail4Wince(string taskNo)
         {
             /*
             WmsFlow wf = new WmsFlow(taskNo);
             enumFlowTaskType type = (enumFlowTaskType)wf.type;
              
             switch (type)
             {
                 case enumFlowTaskType.报废下架:
                     return getDownShelfDetail(taskNo);
                 case enumFlowTaskType.出库拣货下架:
                     return getDownShelfDetail(taskNo);
                 case enumFlowTaskType.储存区补货下架:
                     return getDownShelfDetail(taskNo);
                 case enumFlowTaskType.退供应商下架:
                     return getDownShelfDetail(taskNo);
                 case enumFlowTaskType.移库下架:
                     return getDownShelfDetail(taskNo);
                 case enumFlowTaskType.拣货区补货上架:
                     return getUpShelfDetail(taskNo);
                 case enumFlowTaskType.退供应商上架:
                     return getUpShelfDetail(taskNo); 
                 case enumFlowTaskType.预到收货上架:
                     return getUpShelfDetail(taskNo);
                 default:
                    throw new NotImplementedException();
                    
             }
             */
             DataTable dt = _obj.getTaskDetail4Wince(taskNo);
             foreach (DataRow dr in dt.Rows)
             {
                 dr["类型"] = ((enumStockRecordType) Convert.ToInt32(dr["recType"])).ToString();
                 dr["状态"] = ((enumPickState) Convert.ToInt32(dr["state"])).ToString();
             }
             dt.Columns.Remove("recType");
             dt.Columns.Remove("state");
             return dt;
            
         }
         private DataTable getUpShelfDetail(string taskNo)
         {
             return new WmsInUpPort().getTaskDetail(taskNo);
         }
         DataTable getDownShelfDetail(string taskNo)
         {
             return new WmsOutPickPort().getPickTaskDetails(taskNo);
         }
         internal DataTable getTasks(int status, int partion, int emId)
         {
             DataTable dt = _obj.getTasks(status, partion, emId);
             foreach (DataRow dr in dt.Rows)
             {
                 dr["类型"] = ((EnumFlowTaskType) Convert.ToInt32(dr["type"])).ToString();
                 dr["状态"] = ((enumFlowTaskStatus) Convert.ToInt32(dr["state"])).ToString(); 
             }
           
            return dt;
         }
         internal DataTable getFlowDetail(string flowNo)
         {
             DataTable dt = _obj.getFlowDetail(flowNo);
             foreach (DataRow dr in dt.Rows)
             {
                 dr["类型"] = ((EnumFlowTaskType) Convert.ToInt32(dr["type"])).ToString();
                 dr["状态"] = ((enumFlowTaskStatus) Convert.ToInt32(dr["state"])).ToString();
             }
           
            return dt;
         }
         internal DataTable getTaskInfo(string taskNo)
         {
             return _obj.getTaskInfo(taskNo);
         }
         internal enumFlowTaskResult startTask(string taskNo)
         {
             _obj = new WmsFlow(taskNo);
             if (getWmsFlow.owner > 0 && getWmsFlow.owner != this.operId)
             {
                 return  enumFlowTaskResult.已被他人开始;
             }
             if (getWmsFlow.state ==(int) enumFlowTaskStatus.取消
                 || getWmsFlow.state == (int)enumFlowTaskStatus.已完成
                  || getWmsFlow.state == (int)enumFlowTaskStatus.暂停)
             {
                 return enumFlowTaskResult.状态不允许;
             }
             getWmsFlow.state = (int)enumFlowTaskStatus.进行中;
             getWmsFlow.owner = operId;
             if ( getWmsFlow.Update()> 0)
             {
                 return enumFlowTaskResult.成功;
             }
             return enumFlowTaskResult.失败;
            
         }
         
        internal enumFlowTaskResult startTask(string orderNo, string flowNo)
        {
           if( _obj.startTask(orderNo, flowNo) > 0)
            {
                return enumFlowTaskResult.成功;
            }
            return enumFlowTaskResult.任务不存在;
        }
    }
    
    
}