/// <summary>
 /// 填充指令列表
 /// </summary>
 /// <param name="instList"></param>
 /// <param name="taskObj"></param>
 /// <param name="taskID"></param>
 /// <returns></returns>
 public bool FillInstList(IList<BaseInstInfo> instList, BaseTaskInfo taskObj, string taskID)
 {
     if (MStatus == MachineWorkStatus.MACHINE_IDLE)
     {
         _currentAutoInstIndex = 0;
         this._instList.Clear();
         foreach (BaseInstInfo instObj in instList)
         {
             this._instList.Add(instObj);
         }
         _currentTaskID = taskID;
         _currentTaskObj = taskObj;
         return true;
     }
     else
     {
         return false;
     }
 }
        /// <summary>
        /// 序列化任务到xml字符串
        /// </summary>
        /// <param name="task"></param>
        /// <returns></returns>
        public static string Serialize(BaseTaskInfo task)
        {
            string xmlStr = string.Empty;
            XmlSerializer serializer = new XmlSerializer(task.GetType());
            MemoryStream stream = new MemoryStream();
            serializer.Serialize(stream, task);
            byte[] buffer = stream.GetBuffer();
            xmlStr = Encoding.UTF8.GetString(buffer);
            //switch(task.taskCode)
            //{
            //    case TaskCode.TASK_EMPTY:
            //        {
            //            return string.Empty;
            //        }
            //    case TaskCode.TASK_PRODUCT_INHOUSE:
            //        {

            //            break;
            //        }
            //    case TaskCode.TASK_PRODUCT_OUTHOUSE:
            //        {

            //            break;
            //        }
            //    case TaskCode.TASK_PALLETE_INHOUSE:
            //        {
            //            break;
            //        }
            //    case TaskCode.TASK_PALLETE_OUTHOUSE:
            //        {
            //            break;
            //        }
            //    default:
            //        break;
            //}
            return xmlStr;
        }
        /// <summary>
        /// 解析任务,行成指令列表,同时分派资源
        /// </summary>
        /// <param name="task"></param>
        /// <param name ="VehicleAllocRequire">是否需要分配小车资源</param>
        /// <param name="HouseAllocRequire">是否需要分配仓位资源</param>
        /// <returns>0:成功解析任务,任务索引向前移动一条,1:执行条件不满足,任务索引停在当前,2:执行条件不满足,任务索引向前移动一条。 /// </returns>
        public static int ParseTask(bool VehicleAllocRequire, bool HouseAllocRequire,ref BaseTaskInfo task,out IList<BaseInstInfo> instList)
        {
            instList = null;
            TransVehicle m1 = _Model.transVehicleDic[1];
            TransVehicle m2 = _Model.transVehicleDic[2];
            if(task.taskCode == TaskCode.TASK_EMPTY)
            {
                //空任务
                return 0;
            }
            else if(task.taskCode == TaskCode.TASK_PRODUCT_INHOUSE)
            {

                TaskProductInhouse realTask= (TaskProductInhouse)task;
                //分配小车
                if(VehicleAllocRequire)
                {
                    int machineNo = ProductHouseInMachineSelect(realTask.productID);
                    if (machineNo <= 0)
                    {
                        //所有小车都在忙,
                        return 1;
                    }
                    realTask.machineAllocated = machineNo;
                }
                //分配仓位
               if(HouseAllocRequire)
               {
                   int L = 0, R = 0, C = 0;
                   if(!ChooseEmptyHouse(realTask.machineAllocated,out L,out R,out C))
                   {
                       return 2;
                   }
                   realTask.targetL = L;
                   realTask.targetR = R;
                   realTask.targetC = C;
               }
                //分解任务,生成指令列表
                instList = new List<BaseInstInfo>();
                //开始
                InstBegin inst0 = new InstBegin();
                inst0.instComment = "开始";
                instList.Add(inst0);
                //1 从当前位置到取货口
                InstMovL inst1 = new InstMovL();
                inst1.targetL = 1;
                inst1.instComment = "移动到目标层";
                instList.Add(inst1);
                //2
                InstMovC inst2 = new InstMovC();
                inst2.targetC = 1;
                inst2.instComment = "移动取货口";
                instList.Add(inst2);
                //3 取货
                InstLoad inst3 = new InstLoad();
                inst3.instComment = "取货";
                instList.Add(inst3);
                //4 到目标仓位
                InstMovC inst4 = new InstMovC();
                inst4.targetC = realTask.targetC;
                inst4.instComment = "移动到目标列";
                instList.Add(inst4);
                //5
                InstMovL inst5 = new InstMovL();
                inst5.targetL = realTask.targetL;
                inst5.instComment = "移动到目标层";
                instList.Add(inst5);
                //卸货
                InstUnload inst6 = new InstUnload();
                inst6.instComment = "仓位放货";
                instList.Add(inst6);

                //结束指令
                InstEnd inst7 = new InstEnd();
                inst7.instComment = "结束";
                instList.Add(inst7);
                return 0;
            }
            else if(task.taskCode == TaskCode.TASK_PRODUCT_OUTHOUSE)
            {
                //出库任务
                TaskProductOuthouse poutTask = task as TaskProductOuthouse;
                if(poutTask == null)
                {
                    return 2;
                }
                //自动分配仓位
                int L=0,R=0,C=0;
                if (HouseAllocRequire)
                {
                    //if (!_Model.warestoreBll.GetHouseCell(poutTask.productType, out L, out R, out C))
                    int reChooseHouse = ChooseProductoutHouse(poutTask.productType, out L, out R, out C);
                    if(reChooseHouse  != 0)
                    {
                        return 2;
                    }
                    task.targetL = L;
                    task.targetR = R;
                    task.targetC = C;
                }
                //自动分配小车
                TransVehicle selectedM = null;
                if (VehicleAllocRequire)
                {
                    if (R > 0 && R < 3)
                    {
                        if (m1.MStatus != MachineWorkStatus.MACHINE_IDLE)
                            return 2;
                        task.machineAllocated = 1;
                    }
                    else if (R >= 3 && R < 5)
                    {
                        if (m2.MStatus != MachineWorkStatus.MACHINE_IDLE)
                            return 2;
                        task.machineAllocated = 2;
                    }
                    else
                        return 2;
                }
                selectedM = _Model.transVehicleDic[task.machineAllocated];
                if(selectedM.MStatus != MachineWorkStatus.MACHINE_IDLE)
                {
                    return 2;
                }
                //指令分解
                //分解任务,生成指令列表
                instList = new List<BaseInstInfo>();
                //开始
                InstBegin inst0 = new InstBegin();
                inst0.instComment = "开始";
                instList.Add(inst0);

                //1 从当前位置到目标仓位层
                InstMovL inst1 = new InstMovL();
                inst1.targetL = task.targetL;
                inst1.instComment = "移动到出库仓位所在的层";
                instList.Add(inst1);

                //2 到目标仓位所在列
                InstMovC inst2 = new InstMovC();
                inst2.targetC = task.targetC;
                inst2.instComment = "移动到出库仓位所在的列";
                instList.Add(inst2);

                //3取货
                InstLoad inst3 = new InstLoad();
                inst3.instComment = "取货";
                instList.Add(inst3);

                //4 移动到1层
                InstMovL inst4 = new InstMovL();
                inst4.targetL = 1;
                inst4.instComment = "移动到出库口所在的层";
                instList.Add(inst4);

                //5 移动到出库口所在列
                InstMovC inst5 = new InstMovC();
                inst5.targetC = _Model.wareHouseSet.columnCount;
                inst5.instComment = "移动到出库口所在列";
                instList.Add(inst5);

                //6 卸货
                InstUnload inst6 = new InstUnload();
                inst6.instComment = "卸货";
                instList.Add(inst6);

                //7 结束
                InstEnd inst7 = new InstEnd();
                inst7.instComment = "结束";
                instList.Add(inst7);

                return 0;
            }
            else if(task.taskCode == TaskCode.TASK_PALLETE_INHOUSE)
            {
                //空板入库任务
                return 0;
            }
            else if(task.taskCode == TaskCode.TASK_PALLETE_OUTHOUSE)
            {
                //空板出库任务
                return 0;
            }
            else
            {
                //不可识别的任务码
                return 0;
            }
        }