/// 
///INTERFACE CLASS FOR TABLE t_wmsFlow
///By wm  
///on 06/04/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 WmsFlow : WmsFlow_base
    {
        private string taskNo;
        public WmsFlow()
        {
        }
        public WmsFlow(int id)
            : base(id)
        {
        }
        public WmsFlow(DataRow dr)
            : base(dr)
        {
        }
        /// 
        /// 一个流水号对应一托货物
        /// 
        ///   
        /// 
        /// 
        /* public WmsFlow(string flowNo)
         {
             cmdParameters[0] = flowNo;
             getModel(200);
         } */
        public WmsFlow( string orderNo,string flowNo, enumFlowTaskStatus status ,EnumFlowTaskType type)
        {
            cmdParameters[0] = flowNo;
            cmdParameters[1] = orderNo;
            cmdParameters[2] =(int) status;
            cmdParameters[3] = (int)type;
            getModel(250);
        }
        public WmsFlow(string orderNo, string flowNo )
        {
            cmdParameters[0] = flowNo;
            cmdParameters[1] = orderNo;
       
            getModel(270);
        }
        public enumRepResult checkFlow(int ownerId,int taskType)
        {
            LogHelper.debug("checkFlow", string.Format(" flow task:{3} flow current owner: {0}, to valid ownerId: {1}, taskType: {2} ", owner, ownerId, taskType,task ));
            if (owner>0 && owner != ownerId)
            {
                return enumRepResult.任务已被他人抢占;
            }else if(owner == 0)
            {  
                cmdParameters[0] = ownerId;
                cmdParameters[1] = taskType;
                int cnt = queryCount(280);
                LogHelper.debug("checkFlow", string.Format(" flow current owner: {0}, to valid ownerId: {1}, taskType: {2}, exists cnt {3}", owner,ownerId,taskType,cnt));
                if (cnt > WmsConstants.MAX_TASKS_OWN)
                {
                    return enumRepResult.任务已达到上线;
                }
            }
            return enumRepResult.成功;
        }
   
        public void finishedTasksPlus(int ownerId,decimal finishedPcs, bool isChildTasksOperation=false,bool isDone=false)
        {
            LogHelper.debug("finishedTasksPlus", string.Format(" orderno {5},  ownerId {0}, finishedPcs: {1}, isChildTasksOperation: {2}, isDone {3}, state {4}",
                ownerId,  finishedPcs,  isChildTasksOperation,  isDone,state ,orderNo));
            if (!isChildTasksOperation  && state == (int)enumFlowTaskStatus.已完成)
            {
                return;
            }
         //   if (finishedCnt < taskCnt)
            {
                 finishedCnt++;
            }
           
            state = (int)enumFlowTaskStatus.进行中;
            owner = ownerId;
            if (isChildTasksOperation) //细分任务比总体任务多,更新原来任务数
            {
                if (taskCnt < finishedCnt)
                {
                    taskCnt= finishedCnt;
                }
                
                if (isDone)
                {
                    state = (int)enumFlowTaskStatus.已完成;
                    finishedCnt = taskCnt;
                }
            }else
            if (finishedCnt >= taskCnt)
            {
                state = (int)enumFlowTaskStatus.已完成;
                finishedCnt = taskCnt;
            }
            this.finishedPcs += finishedPcs> 0?finishedPcs:1;
            Update();
        }
        public WmsFlow(string taskNo)
        { 
            cmdParameters[0] = taskNo;
            getModel(260);
        }
       
        protected override void getImp()
        {
            model_imp = new WmsFlow_Imp();
        }
        public DataTable getByFlowNo4Wince(string flowNo)
        {
            cmdParameters[0] = flowNo;
            return CustQuery(300).Tables[0];
        }
       /*
        public static bool isFlowFree(string flowNo)
        {
            return new WmsFlow(flowNo).ID == 0;
        }
        public static string flowOrderNo(string flowNo)
        { 
            return new WmsFlow(flowNo).orderNo; 
        }
        */
        public static bool free(string flowNo)
        {
            return false;
         //  return new WmsFlow().deleteFlow(flowNo) > 0;
          //  return  new WmsFlow(flowNo).Delete()>0;
        }
        private int deleteFlow(string flowNo)
        {
            cmdParameters[0] = flowNo;
            return CustOper(400);
        }
        public static void done(string flowNo)
        {
            //to update status of job, and progress on task.
           // throw new NotImplementedException();
        }
        public DataTable getTasks(int status, int partion, int emId,int days=1)
        {
            cmdParameters[0] = status;
            cmdParameters[1] = partion;
            cmdParameters[2] = emId;
            cmdParameters[3] = days;
            return CustQuery(500).Tables[0];
        }
        public DataTable getTaskDetail(string taskNo)
        {
            cmdParameters[0] = taskNo;
            return CustQuery(600).Tables[0];
        }
        public DataTable getFlowDetail(string flowNo)
        {
            cmdParameters[0] = flowNo;
            return CustQuery(700).Tables[0];
        }
        public DataTable getTaskInfo(string taskNo)
        {
            cmdParameters[0] = flowNo;
            return CustQuery(800).Tables[0];
        }
         
       /* public int startTask(string taskNo, int operId)
        {
            cmdParameters[0] = taskNo;
            cmdParameters[1] = operId;
            return CustOper(900) ;
        }*/
        public int startTask(string orderNo, string flowNo)
        {
            cmdParameters[0] = orderNo;
            cmdParameters[1] = flowNo;
            return CustOper(1000);
        }
        public DataTable getTaskDetail4Wince(string taskNo)
        {
            cmdParameters[0] = taskNo;
            return CustQuery(601).Tables[0];
        }
        public Boolean isStarted(string orderNo,string flowNo)
        {
            cmdParameters[0] = orderNo;
            cmdParameters[1] = flowNo;
            return CustQuery(1100).Tables[0].Rows.Count>0;
        }
        public int startAllTask(string orderNo )
        {
            cmdParameters[0] = orderNo; 
            return CustOper(1200);
        }
        public DataTable getTodayTaskSum()
        {
            return CustQuery(1300).Tables[0];
        }
        public DataSet getTodayKanban()
        {
            return CustQuery(1600);
        }
        public DataTable getUnFinishedByOrderNo(string  orderNo, EnumFlowTaskType taskType)
        {
            cmdParameters[0] = orderNo;
            cmdParameters[1] = (int)taskType;
           // cmdParameters[2] = flowNo;
            return CustQuery(1700).Tables[0];
        }
    }
}