/// 
///LOGIC CLASS FOR TABLE t_tmsTranRequest
///By wm with codesmith. 
///on 07/26/2017
/// 
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 lTmsTranRequest   :lbase
    {
        TmsTranRequest _obj;
        public lTmsTranRequest()
        {
             initialize();
        }
        public lTmsTranRequest(int operId)
            : base(operId)
        {
            initialize();
        }
        public  TmsTranRequest getTmsTranRequest
        {
            get
            {
                return _obj;
            }
        }
  
		/// 
		/// 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 TmsTranRequest(id) : new TmsTranRequest();
		}
        /// 
		/// get a record by id 0
		/// 
        public void initialize()
        {
            initialize(0);
        }
         /// 
        /// get a record by id
        /// 
        public void initialize(DataRow dr)
        {
            _obj =   new TmsTranRequest(dr);
        }
        
        protected override DeiNiu.Data.BaseObject.BaseModel getModel()
        {
            return _obj;
        }
 
        //begin cust db operation, query, excute sql etc.
        
     
        /// 
        /// 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 DataSet queryPickRequests(string query, int rownumStart, int rownumEnd)
         {
            return _obj.queryPickRequests(query, rownumStart, rownumEnd);
         }
         internal DataTable queryPickRequests4Report(string pickOrderNo)
         {  
            WmsOutPickRequest wpr = new WmsOutPickRequest(pickOrderNo);
             
          //  DataTable dt = _obj.queryPickRequests4Report(pickOrderNo);
            DataTable dt = _obj.queryPickRequests4Report(wpr.transNo,wpr.customerId);
            if (string.IsNullOrEmpty(wpr.invoiceNo))
             {
                 foreach (DataRow dr1 in dt.Rows)
                 {
                     dr1.BeginEdit();
                     wpr.invoiceNo = Utils.Util.getOrderNo(enumCreateOrderType.pickOutInvoice, wpr.getNextSeq(enumCreateOrderType.pickOutInvoice));
                     wpr.invoicedBy = LoginInfo.UserId;
                     dr1["invoiceNo"] = wpr.invoiceNo;
                     dr1["invoicedBy"] = LoginInfo.UserId;
                     dr1.EndEdit();
                 }
             }
             return dt;
         }
         internal DataTable getFreeViechles()
         {
             return new TmsViechle().queryByStatus(Utils.enumViechleStatus.可用,Utils.enumViechleTransStatus.空闲 );
             //return _obj.getViechles(Utils.enumViechleStatus.可用, Utils.enumTranStatus.配送结束);
         }
        internal DataTable getLatestPickRequestsByViechole(string plateId)
        {
            return getTmsTranRequest.getLatestPickRequestsByViechole(plateId);
        }
        /*
         internal string creatTrans(string[] pickOrders, string orderNo, int thirdPart, int status, int lineId, string viechle, int tranType, int person, string contact, string phone, string description)
         {
             Utils.enumTranType tType = (enumTranType)(tranType);
           
             TmsViechle tv = new TmsViechle(viechle);
            
            
             if (tType == enumTranType.自营配送 && (tv.state == (int)Utils.enumViechleStatus.不可用 || tv.transState !=(int) Utils.enumViechleTransStatus.空闲 ))
             {
                 return viechle+ " 车辆不可用";
             }
             string tranOrder = string.IsNullOrEmpty(orderNo) ? Util.getOrderNo(enumCreateOrderType.transOrder, _obj.getNextSeq()) : orderNo;
             TmsTranRequest tmr = new TmsTranRequest();
             tmr.transNo = tranOrder;
             tmr.tranType = tranType;
             tmr.lineId = lineId;
             tmr.viechleNo = viechle;
             tmr.contact = contact;
             tmr.phone = phone;
             tmr.driver = person;
             tmr.thirdPart = thirdPart;
             tmr.description = description;
             tmr.state = status;
             tmr.operater = operId;
             int i = 0;
             try
             {
                 using (TransactionScope scope = new TransactionScope())
                 {
                     tmr.Add();
                     foreach (string pickOrder in pickOrders)
                     {
                         WmsOutPickRequest op = new WmsOutPickRequest(pickOrder);
                         if (op.state >= (int)enumOutStockRequestStatus.配送中)
                         {
                             continue;
                         }
                         op.tranOrderNo = tranOrder;
                         op.state = (int)enumOutStockRequestStatus.配送中;
                         op.operater = operId;
                         op.Update();
                         TmsTranRequestDetail td = new TmsTranRequestDetail();
                         td.pickRequest = pickOrder;
                         td.transNo = tranOrder;
                         td.operater = operId;
                         td.Add();
                         i++;
                     }
                     if (i > 0)
                     {
                        // tv.state = (int)Utils.enumViechleStatus.不可用;
                         tv.transState = (int)Utils.enumViechleTransStatus.装车;
                         tv.operater = operId;
                         tv.transOrder = tranOrder;
                         tv.Update();
                     }
                     else
                     {
                         return "创建失败";
                     }
                     scope.Complete();
                 }
                 return "创建成功";
             }
             catch  
             {
                 return "创建失败";
             }
              
         }
        */
        internal string creatTrans(string[] pickOrders, TmsTranRequest tmsTranRequest)
         {
             Utils.enumTranType tType = (enumTranType)(tmsTranRequest.tranType);
             TmsViechle tv = new TmsViechle(tmsTranRequest.viechleNo);
             if (tType == enumTranType.自营配送 && (tv.state == (int)Utils.enumViechleStatus.不可用 || tv.transState != (int)Utils.enumViechleTransStatus.空闲))
             {
                 return tmsTranRequest.viechleNo + " 车辆不可用";
             }
             string tranOrder = string.IsNullOrEmpty(tmsTranRequest.transNo) ? Util.getOrderNo(enumCreateOrderType.transOrder, _obj.getNextSeq(enumCreateOrderType.transOrder)) : tmsTranRequest.transNo;
             
             tmsTranRequest.transNo = tranOrder; 
             tmsTranRequest.operater = operId;
          
             int i = 0;
             try
             {
                 using (TransactionScope scope = new TransactionScope())
                 {
                     tmsTranRequest.Add();
                     foreach (string pickOrder in pickOrders)
                     {
                         WmsOutPickRequest op = new WmsOutPickRequest(pickOrder);
                         if (op.state >= (int)enumOutStockRequestStatus.已出库)
                         {
                             continue;
                         }
                         op.state = (int)enumOutStockRequestStatus.已出库;
                         op.operater = operId;
                         op.transNo = tranOrder;
                         op.Update();
                         TmsTranRequestDetail td = new TmsTranRequestDetail();
                         td.pickOrderNo = pickOrder;
                         td.transNo = tranOrder;
                         td.operater = operId;
                         td.Add();
                         i++;
                     }
                     if (i > 0)
                     {
                         // tv.state = (int)Utils.enumViechleStatus.不可用;
                         tv.transState = (int)Utils.enumViechleTransStatus.装车;
                         tv.operater = operId;
                         tv.transOrder = tranOrder;
                         tv.Update();
                     }
                     else
                     {
                         return "创建失败";
                     }
                     scope.Complete();
                 }
                 return "创建成功";
             }
             catch
             {
                 return "创建失败";
             }
         }
        public string createSimpleTran(List pickOrders, WmsPlate plate)
        {
            TmsTranRequest tmsTranRequest = new TmsTranRequest(); 
            tmsTranRequest.transNo = string.IsNullOrEmpty(plate.transNo) ? Util.getOrderNo(enumCreateOrderType.transOrder, _obj.getNextSeq(enumCreateOrderType.transOrder)) : plate.transNo;
            tmsTranRequest.operater = operId;
            tmsTranRequest.viechleNo = plate.plateId;
            int i = 0;
            try
            {
                using (TransactionScope scope = new TransactionScope())
                {
                    tmsTranRequest.Add();
                    foreach (WmsOutPickRequest op in pickOrders)
                    { 
                      
                        op.operater = operId;
                        op.transNo = tmsTranRequest.transNo;  
                        op.Update();
                       
                        TmsTranRequestDetail td = new TmsTranRequestDetail();
                        td.pickOrderNo = op.pickOrderNo;
                        td.transNo = tmsTranRequest.transNo;
                        td.operater = operId;
                        td.Add();
                        i++;
                    }
                    if (i > 0)
                    {
                        //plate.transNo = tmsTranRequest.transNo;
                    }
                    else
                    {
                        return "";
                    }
                    scope.Complete();
                }
                return plate.transNo;
            }
            catch
            {
                return "";
            }
        }
         internal bool updateTranStatus(string transOrder, int status, string mem)
         {
             try
             {
                 using (TransactionScope scope = new TransactionScope())
                 {
                     TmsTranRequest tr = new TmsTranRequest(transOrder);
                     tr.state = status;
                     tr.operater = operId;
                     tr.description += mem;
                     tr.description = tr.description.Length > 200 ? tr.description.Substring(0, 200) : tr.description;
                     tr.Update() ;
                     //update viechle
                     if (!string.IsNullOrEmpty(tr.viechleNo))
                     {
                         TmsViechle tv = new TmsViechle(tr.viechleNo);
                         tv.transState = (int)enumViechleTransStatus.空闲;
                         tv.operater = operId;
                         tv.Update();
                     }
                    
                 
                     scope.Complete();
                 }
                 return true;
             }
             catch
             {
                 return false;
             }
              
         }
        /// 
        /// 从零库出库集货区取走打包的零货
        /// 
        /// 
        /// 
         internal bool pickBulks(string tranNo,int stockId)
         {
             TmsStock ts = new TmsStock(stockId);
             WmsStockRecord wsr = new WmsStockRecord();
             wsr.orderNo = tranNo;
             wsr.locationId = ts.locationId;
             wsr.operater = operId;
             wsr.count = ts.count;
             wsr.goodsId = "打包散货";
             wsr.rectype = (int)enumStockRecordType.集货拣货;
             try
             {
                 using (TransactionScope scope = new TransactionScope())
                 {
                     ts.Delete();
                     wsr.Add();                    
                     scope.Complete();
                 }
                 return true;
             }
             catch
             {
                 return false;
             }
             
         }
         /// 
         /// 集货完毕,装车
         /// 
         /// 
         /// 
         internal string loadTrucks(string transNo, string pickOrderNo, int tranDetailId)
         {
             TmsTranRequestDetail trd = new TmsTranRequestDetail(tranDetailId);
             int leftunLoadCnt = 0;
             if (trd.transNo.Equals(transNo) && trd.pickOrderNo.Equals(pickOrderNo) && trd.state ==(int)enumTranDetailStatus.装车)
             {
                 //检查是否有未集货零货 
                 int leftBulksCnt = _obj.getPickRequestBulksCount(pickOrderNo);
                 if (leftunLoadCnt > 0)
                 {
                     return pickOrderNo + "有未集货打包零货,请先完成集货";
                 }
                 trd.state = (int)enumTranDetailStatus.配送;
                 trd.operater = operId;
                 leftunLoadCnt = _obj.getTransRequestsDetailCount(transNo,enumTranDetailStatus.装车);
                
                 
                 if (leftunLoadCnt == 1)
                 {
                     _obj = new TmsTranRequest(transNo);
                     
                 }
             }
             else
             {
                 return "装车失败,数据不符";
             }
             try
             {
                 using (TransactionScope scope = new TransactionScope())
                 {
                       trd.Update();
                       if (leftunLoadCnt == 1)
                       {
                           _obj.state = (int)enumTranStatus.配送途中;
                           _obj.operater = operId;
                           _obj.Update();
                       }
               
                     scope.Complete();
                 }
                 return "";
             }
             catch
             {
                 return "";
             }
         }
         internal int updatePickInvoice(string pickOrderNo, string invoiceNo)
         {
             WmsOutPickRequest wpr = new WmsOutPickRequest(pickOrderNo);
             wpr.invoiceNo = invoiceNo;
             wpr.invoicePrintCnt++;
             wpr.invoicedBy = LoginInfo.UserId; 
             return wpr.Update();
         }
          
    }
    
    
}