コード例 #1
0
        /// <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);
        }
コード例 #2
0
        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)));
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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));
            }
        }
コード例 #5
0
        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);
                    }
                }
            }
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        /// <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));
        }