private void ExamingItemArray(object[] itemArray, string[] queryParams, int rowIndex, int shiftStartIndex)
        {

            var agent = _shiftDispatcherModel.GetPlanningAgent(queryParams, EnquiryRange);

            var validRangeLength = _dates.Count + shiftStartIndex; // 用连续日期长度来决定读取班表的格子数量

            var step = 1.0 / validRangeLength;
            var completeValue = Process + 1;

            var dirty = false; //用於BuildOnlines
            for (var i = shiftStartIndex; i < validRangeLength; i++)
            {
                if (agent == null) break;

                var dateIndex = i - shiftStartIndex;

                if (agent[dateIndex].SaftyGetProperty(o => o.IsNot<UnknowAssignment>())) // 已经有班 brak
                {
                    //xagent.OperationFail = true;
                    agent.Tag = "HasArranged";
                    _hasArrangedRows++;
                    break;
                }
                //Thread.Sleep(200);
                Process += step;

                if (itemArray[i].IsNullValue()) continue;

                string[] range;
                var assignmentTypeValue = ResolveShiftCellValue(itemArray[i].ToString(), out range); // 解析班表字串

                var hrDate = _dates[dateIndex].Date;

                if (!_assignmentTypes.ContainsKey(assignmentTypeValue)) //无效班型
                {
                    agent[hrDate] = new CellTerm(hrDate, assignmentTypeValue) { ErrorInfo = "NotExist"};
                    //xagent.OperationFail = true;
                    agent.Tag = "InvalidShiftCell";
                    continue; // 不结束循环继续往下找
                }

                var newAssignment = default(AssignmentBase);
                var assignmentType = _assignmentTypes[assignmentTypeValue];

                if (range == null) // 無自定義時間
                    newAssignment = _shiftDispatcherModel.CreateAssignmentWithSenser(hrDate, assignmentType);
                else
                {
                    var start = StringToDateTime(range[0], assignmentType.TimeRange.StartValue, hrDate);
                    var end = StringToDateTime(range[1], assignmentType.TimeRange.EndValue, hrDate);

                    if (end < start) // 跨天
                        end = end.AddDays(1);

                    Term.NewAssignment(start, end, assignmentType).SaftyInvoke<AssignmentBase>(o =>
                    {
                        newAssignment = o;
                        o.HrDate = hrDate;
                    });
                }

                if (newAssignment != null)
                {
                    agent.Schedule.Create(newAssignment,
                         (t, success) =>
                         {
                             if (success)
                             {
                                 dirty = true;
                                 t.SaftyInvoke<IAssignment>(a => agent.Schedule.ArrangeSubEvent(a, assignmentType.GetSubEventInsertRules(), null));
                             }
                             else // 安插班表失败
                             {
                                 agent.OperationFail = true;
                                 agent[hrDate] = new CellTerm(hrDate, assignmentTypeValue) { ErrorInfo = "Overlap" };
                             }
                         }, true);
                }
            }

            if (agent != null)
            {
                agent.Index = rowIndex;
                if (dirty)
                    agent.BuildOnlines();
                _bindableAgents.Add(agent.As<IEnumerable>()); // 注意IEnumerable类型转换, 不可修改
                if(agent.OperationFail == true)
                    _operationFailRows++;
            }
            else
                _bindableAgents.Add(new DummyAgent(queryParams, rowIndex).As<IEnumerable>()); // 注意IEnumerable类型转换, 不可修改

            _passedRows -= agent == null || agent.OperationFail == true || agent.Tag != null ? 1 : 0;
            _unreachableRows += agent == null ? 1 : 0;
            
            Process = completeValue;
        }