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; }