/// <summary> /// 根据ID获取Sprint详情 /// </summary> /// <param name="sprintID"></param> /// <returns></returns> private SprintInfoModel getSprintInfoBySprintID(int sprintID) { SprintInfoModel sprintInfoModel = null; var sprintEntity = this._relaseSprintBll.GetEntity(new DapperExQuery <T_RELEASE_SPRINT>().AndWhere(s => s.ID, OperationMethod.Equal, sprintID)); if (sprintEntity != null) { sprintInfoModel = AutoMapper.Mapper.Map <T_RELEASE_SPRINT, SprintInfoModel>(sprintEntity); } return(sprintInfoModel); }
public bool EditSprint(int teamID, int sprintID, DateTime startTime, DateTime endTime) { SprintInfoModel sprintInfoModel = this.GetSprintInfoByTeamIDAndSprintID(teamID, sprintID); if (sprintInfoModel == null) { Enforce.Throw(new LogicErrorException("当前Sprint不存在")); } sprintInfoModel.startTime = startTime; sprintInfoModel.endTime = endTime; return(this._relaseSprintBll.Update(AutoMapper.Mapper.Map <SprintInfoModel, T_RELEASE_SPRINT>(sprintInfoModel))); }
public SprintInfoModel GetSprintInfoByTeamIDAndSprintID(int teamID, int sprintID) { SprintInfoModel sprintInfoModel = this.getSprintInfoBySprintID(sprintID); if (sprintInfoModel != null) { if (this.getReleaseInfoByTeamIDAndReleaseID(teamID, sprintInfoModel.releaseID) == null) { Enforce.Throw(new LogicErrorException("当前团队不存在该Sprint")); } } return(sprintInfoModel); }
public bool SetCurrentSprint(int teamID, int sprintID) { SprintInfoModel sprintInfoModel = this.GetSprintInfoByTeamIDAndSprintID(teamID, sprintID); if (sprintInfoModel == null) { Enforce.Throw(new LogicErrorException("当前Sprint不存在")); } string lockKey = string.Format("Scrum_Team_{0}", teamID); lock (lockKey) { return(this._relaseSprintBll.SetCurrentSprint(teamID, sprintID)); } }
public void DeleteSprint(int teamID, int sprintID) { SprintInfoModel sprintInfoModel = this.GetSprintInfoByTeamIDAndSprintID(teamID, sprintID); if (sprintInfoModel != null) { if (this._backlogRepository.GetBacklogInfoList(teamID, sprintID).Where(s => !s.state.Equals(BacklogState.FAIL)).Count() > 0) { Enforce.Throw(new LogicErrorException("当前Sprint下存在Backlog,无法删除")); } var sprintInfoModelList = this.ListSprint(teamID, sprintInfoModel.releaseID); var maxSprintNo = sprintInfoModelList.Count > 0?sprintInfoModelList.Max(s => s.no):0; if (!sprintInfoModel.no.Equals(maxSprintNo)) { Enforce.Throw(new LogicErrorException("不能删除该Sprint")); } string lockKey = string.Format("Scrum_Team_{0}", teamID); lock (lockKey) { sprintInfoModelList = this.ListSprint(teamID, sprintInfoModel.releaseID); if (sprintInfoModelList.Count <= 0) { Enforce.Throw(new LogicErrorException("当前Sprint已经被删除")); } maxSprintNo = sprintInfoModelList.Count > 0 ? sprintInfoModelList.Max(s => s.no) : 0; if (!sprintInfoModel.no.Equals(maxSprintNo)) { Enforce.Throw(new LogicErrorException("不能删除该Sprint")); } SprintInfoModel modifySprintInfoModel = sprintInfoModelList.OrderByDescending(s => s.no).Where(s => s.no < maxSprintNo).FirstOrDefault(); if (modifySprintInfoModel != null) { modifySprintInfoModel.state = 1; this._relaseSprintBll.DeleteSprint(new DapperExQuery <T_RELEASE_SPRINT>() .AndWhere(s => s.ID, OperationMethod.Equal, sprintID) .AndWhere(s => s.R_NO, OperationMethod.Equal, maxSprintNo), Mapper.Map <SprintInfoModel, T_RELEASE_SPRINT>(modifySprintInfoModel)); } else { this._relaseSprintBll.DeleteSprint(new DapperExQuery <T_RELEASE_SPRINT>() .AndWhere(s => s.ID, OperationMethod.Equal, sprintID) .AndWhere(s => s.R_NO, OperationMethod.Equal, maxSprintNo), null); } } } }
public SprintInfoModel CreateSprint(int teamID, int releaseID, DateTime startTime, DateTime endTime, string currentMail) { if (this.getReleaseInfoByTeamIDAndReleaseID(teamID, releaseID) == null) { Enforce.Throw(new LogicErrorException("不存在该Release")); } SprintInfoModel sprintInfoModel = new SprintInfoModel(); sprintInfoModel.releaseID = releaseID; sprintInfoModel.startTime = startTime; sprintInfoModel.endTime = endTime; sprintInfoModel.state = 0; sprintInfoModel.createUserMail = currentMail; sprintInfoModel.createTime = DateTime.Now; var sprintInfoModelList = this.ListSprint(teamID, releaseID); var maxSprintNo = sprintInfoModelList.Count > 0?sprintInfoModelList.Max(s => s.no):0; string lockKey = string.Format("Scrum_Team_{0}", teamID); lock (lockKey) { sprintInfoModelList = this.ListSprint(teamID, releaseID); maxSprintNo = sprintInfoModelList.Count > 0 ? sprintInfoModelList.Max(s => s.no) : 0; sprintInfoModel.no = maxSprintNo + 1; if (sprintInfoModelList.Count <= 0) { sprintInfoModel.state = 1; } var sprint = AutoMapper.Mapper.Map <SprintInfoModel, T_RELEASE_SPRINT>(sprintInfoModel); if (this._relaseSprintBll.Add(sprint)) { sprintInfoModel = Mapper.Map <T_RELEASE_SPRINT, SprintInfoModel>(sprint); } } return(sprintInfoModel); }
/// <summary> /// Funcionalidad para consultar informacion del Sprint. /// </summary> /// <param name="proyecto"> Cadena con la nombre del Proyecto al que pertenece el sprint.</param> /// <param name="sprint"> Cadena con el numero de Sprint a consultar.</param> /// <returns>Modelo con la informacion del Sprint a consultar</returns> // GET: Informacion public ActionResult Informacion(string proyecto, string sprint) { if (!revisarPermisos("Consultar Detalles de Sprints")) { //despliega mensaje en caso de no poder crear un usuario this.AddToastMessage("Acceso Denegado", "No tienes permiso para consultar detalles de sprints!", ToastType.Warning); return(RedirectToAction("Index", "Home")); } //se revisa que el proyecto y el sprint existan if (String.IsNullOrEmpty(proyecto)) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } if (String.IsNullOrEmpty(sprint)) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } var proy = baseDatos.Proyectos.Find(proyecto); if (proy == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } var spr = baseDatos.Sprints.Find(proyecto, Int32.Parse(sprint)); if (spr == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } //se actualiza la informacion en el modelo var model = new SprintInfoModel(); model.sprintNumero = sprint; model.sprintModulos = spr.Sprint_Modulos.Count(); model.sprintFechaInicio = spr.fechaInicio.ToString("dd/MM/yyyy"); model.sprintFechaFinal = spr.fechaFinal.ToString("dd/MM/yyyy"); model.sprintEsfuerzo = 0; //esfuerzo obtenido de los requerimientos que pertenecen a los modulos asociados foreach (var sprMod in spr.Sprint_Modulos) { foreach (var req in sprMod.Modulo1.Requerimientos) { model.sprintEsfuerzo += (req.esfuerzo ?? 0); } } //Charts DateTime start = spr.fechaInicio; DateTime end = spr.fechaFinal; ViewBag.dias = Enumerable.Range(0, 1 + end.Subtract(start).Days).Select(offset => start.AddDays(offset).ToString("dd/MM/yy")).ToArray(); // extrapolar los valores que no se encuentran en la base de datos var horas_esfuerzo = baseDatos.Progreso_Sprint.Where(s => s.sprintNumero == spr.numero && s.sprintProyecto == proyecto).ToList(); var esfuerzo_real = new List <double>(); if (horas_esfuerzo.Any()) { //tomar el ultimo dia para iterar por cada día var ultimo_dia = horas_esfuerzo.Select(h => h.fecha).Max(); for (var dia = start; dia < ultimo_dia.AddDays(1); dia = dia.AddDays(1)) { double puntaje; var esfuerzo_actual = horas_esfuerzo.Where(s => s.fecha.Date.Equals(dia.Date)).FirstOrDefault(); // repetir el esfuerzo del día pasado si no se hizo nada if (esfuerzo_actual == null) { puntaje = esfuerzo_real.Last(); } //sino, usar el puntaje normal else { puntaje = esfuerzo_actual.puntos; } esfuerzo_real.Add(puntaje); } } ViewBag.esfuerzo_real = esfuerzo_real; var esfuerzo_total = baseDatos.Progreso_Sprint.Find(start, proyecto, spr.numero); // mostrar una estimacion del esfuerzo ideal si se encuentran datos acerca de los puntajes if (esfuerzo_total != null) { var puntos = esfuerzo_total.puntos; double longitud_del_sprint = end.Subtract(start).TotalDays; var velocidad = puntos / longitud_del_sprint; ViewBag.esfuerzo_ideal = Enumerable.Range(0, (int)longitud_del_sprint + 1).Select(x => System.Convert.ToDouble(((int)longitud_del_sprint - x) * velocidad)).ToList(); } else { ViewBag.esfuerzo_ideal = new List <double>(); } return(View(model)); }