/// <summary> /// 获取并设置下一申请期信息,仅在当前父阶段所有子阶段都完成后才调用 /// </summary> /// <param name="currentParentStage"></param> /// <returns></returns> public string ChildStageFinishHandler_GetNextParent(StudentApplyStageEntity currentParentStage) { Guid studentID = currentParentStage.StudentID; IEnumerable<StudentApplyStageEntity> siblingParentStages = repository.StudentApplyStage.Where(s => s.StudentID == studentID && s.StageClass == 1 && s.StageNo != currentParentStage.StageNo); StudentApplyStageEntity nextParent; if (siblingParentStages.Count(s => s.Percentage < 100) <= 0) { return "ApplyCompleted"; } else { //如果所有申请期的Percentage 都不为0,则选取第一个未完成的申请期 //否则,选取第一个未开始的申请期,并调用StartParentStage 函数初始化申请期的进度信息 if (siblingParentStages.Count(s => s.Percentage == 0) <= 0) { nextParent = siblingParentStages.FirstOrDefault(s => s.Percentage > 0 && s.Percentage < 100); } else { nextParent = siblingParentStages.FirstOrDefault(s => s.Percentage == 0); StartParentStage(nextParent.StageNo, studentID); } return nextParent.StageNameEn; } }
public JsonResult Post_InformationFormsHandout(StudentApplyStageEntity ajaxData) { StudentApplyStageEntity newEntity = repository.StudentApplyStage.SingleOrDefault(s => s.StudentID == ajaxData.StudentID && s.StageNo == ajaxData.StageNo); if (newEntity == null) return Json(new { SaveResult = false, Msg = "学生ID 为空,或不存在指定的阶段" }); newEntity.EndDate = ajaxData.EndDate; newEntity.Remark = ajaxData.Remark; newEntity.CurrentOption = ajaxData.CurrentOption; newEntity.Percentage = UpdateChildPercentage(newEntity); repository.SaveStudentApplyStage(newEntity); if(newEntity.Percentage < 100) return Json(new { SaveResult = true, Percentage = newEntity.Percentage }); StageSubmitCBModel returnData = ChildStageFinishHandler(newEntity); returnData.SaveResult = true; returnData.Percentage = newEntity.Percentage; return Json(returnData); }
public StageSubmitCBModel ChildStageFinishHandler(StudentApplyStageEntity childStage) { //dynamic resultObject = new ExpandoObject(); StageSubmitCBModel resultData = new StageSubmitCBModel(); StudentApplyStageEntity parentStage = repository.StudentApplyStage.SingleOrDefault(s => s.StudentID == childStage.StudentID && s.StageNo == childStage.ParentNo); parentStage.Percentage = UpdateParentPercentage(parentStage.StageNo, parentStage.StudentID); if (parentStage.Percentage == 100) { resultData.IsParentComplete = true; resultData.NextParentNameEn = ChildStageFinishHandler_GetNextParent(parentStage); } else { resultData.IsParentComplete = false; resultData.NextSiblingNameEn = ChildStageFinishHandler_GetNextSibling(childStage); } repository.SaveStudentApplyStage(parentStage); return resultData; }
/// <summary> /// 获取并设置下一子阶段信息,仅在当前子阶段完成,而其他兄弟子阶段未全部完成才调用 /// </summary> /// <param name="currentChildStage"></param> /// <returns></returns> public string ChildStageFinishHandler_GetNextSibling(StudentApplyStageEntity currentChildStage) { Guid studentID = currentChildStage.StudentID; IEnumerable<StudentApplyStageEntity> siblingChild = repository.StudentApplyStage .Where(s => s.StudentID == studentID && s.ParentNo == currentChildStage.ParentNo && s.StageClass == 2 && s.StageNo != currentChildStage.StageNo); StudentApplyStageEntity nextChild; //如果兄弟阶段的Percent 都不为0,则选取第一个未完成的阶段 //否则,选取第一个未开始的阶段,Percent 为0 if (siblingChild.Count(s => s.Percentage == 0) <= 0) { nextChild = siblingChild.Where(s => s.Percentage > 0 && s.Percentage < 100).OrderBy(s => s.StageNo).First(); } else { nextChild = siblingChild.Where(s => s.Percentage == 0).OrderBy(s=>s.StageNo).First(); nextChild.Percentage = 1; nextChild.CurrentOption = nextChild.BeginOption; repository.SaveStudentApplyStage(nextChild); } return nextChild.StageNameEn; }
/// <summary> /// 返回子阶段的阶段百分比 /// </summary> /// <param name="childStage"></param> /// <returns></returns> public int UpdateChildPercentage(StudentApplyStageEntity childStage) { string[] statusOptionArray = childStage.StatusOption.Split(','); int statusOptionLength = statusOptionArray.Length; int currentOptionIndex = Array.IndexOf(statusOptionArray, childStage.CurrentOption); return (currentOptionIndex + 1) * 100 / statusOptionLength; }
/// <summary> /// /// </summary> /// <param name="stageNo">当前阶段ID</param> /// <param name="refBeginDate">基准开始日期</param> /// <param name="refEndDate">基准结束日期</param> /// <param name="currentDetail">当前阶段Detail</param> /// <param name="studentID">学生ID</param> /// <param name="isDateSameWithParent">是否和父阶段日期一样</param> /// <returns></returns> StudentApplyStageEntity CalApplyStage( int stageNo, DateTime refBeginDate, DateTime? refEndDate, ApplyStageVersionDetailEntity currentDetail, Guid studentID, bool isDateSameWithParent, DateTime signDate) { StudentApplyStageEntity applyStage = new StudentApplyStageEntity { ID = Guid.NewGuid(), StudentID = studentID, StageNo = stageNo, StageName = currentDetail.StageName, StageNameEn = currentDetail.StageNameEn, StageClass = currentDetail.StageClass, ParentNo = currentDetail.ParentNo, IsForbid = currentDetail.IsForbid, StatusOption = currentDetail.StatusOption, BeginOption = currentDetail.BeginOption, EndOption = currentDetail.EndOption, CurrentOption = currentDetail.BeginOption, CanForbid = currentDetail.CanForbid, CanChangeDate = currentDetail.CanChangeDate, CanChangeName = currentDetail.CanChangeName, IsDateSameWithParent = currentDetail.IsDateSameWithParent }; //如果当前阶段的日期与父阶段一样,则直接赋值即可 if (isDateSameWithParent) { applyStage.BeginDate = refBeginDate; applyStage.EndDate = Convert.ToDateTime(refEndDate); } else { //如果当前阶段的开始日期需要计算,则在基准开始日期上加上给定天数 if (Convert.ToBoolean(currentDetail.IsCalBeginDate)) { applyStage.BeginDate = refBeginDate.AddDays(Convert.ToInt16(currentDetail.BeginDate)); } else //否则,则拼接年、月、日 来计算日期。下面算法的结果是,计算出给定月份的最后一天的日期值 { int year = (signDate.Month > currentDetail.BeginDate) ? signDate.Year + 1 : signDate.Year; int month = Convert.ToInt16(currentDetail.BeginDate) + 1; if (month > 12) { year += 1; month = 1; } int day = 1; applyStage.BeginDate = new DateTime(year, month, day).AddDays(-1); } //如果当前阶段的结束日期需要计算,则在基准结束日期上加上给定天数 if (Convert.ToBoolean(currentDetail.IsCalEndDate)) { applyStage.EndDate = applyStage.BeginDate.AddDays(Convert.ToInt16(currentDetail.EndDate)); } else //否则,则拼接年、月、日 来计算日期。下面算法的结果是,计算出给定月份的最后一天的日期值 { int year = (signDate.Month > currentDetail.EndDate) ? signDate.Year + 1 : signDate.Year; int month = Convert.ToInt16(currentDetail.EndDate) + 1; if (month > 12) { year += 1; month = 1; } int day = 1; applyStage.EndDate = new DateTime(year, month, day).AddDays(-1); } } return applyStage; }
/// <summary> /// 更新一条数据 /// </summary> /// <param name="applyStage"></param> public void SaveStudentApplyStage(StudentApplyStageEntity applyStage) { StudentApplyStageEntity originEntity = context.StudentApplyStage.SingleOrDefault(s => s.StudentID == applyStage.StudentID && s.StageNo == applyStage.StageNo); context.Entry(originEntity).CurrentValues.SetValues(applyStage); context.SaveChanges(); }