Example #1
0
 /// <summary>
 /// 记录项目状态变更流转
 /// </summary>
 /// <param name="projectId"></param>
 /// <param name="actionName"></param>
 /// <param name="targetStatus"></param>
 /// <param name="remarks"></param>
 /// <returns></returns>
 public virtual async Task TraceLog(int projectId, string actionName, ProjectStatus targetStatus, string remarks = "")
 {
     var projectTraceLog = new ProjectTraceLog()
     {
         ProjectId    = projectId,
         TargetStatus = targetStatus,
         Remarks      = remarks,
         ActionName   = actionName
     };
     await ProjectTraceLogRepository.InsertAsync(projectTraceLog);
 }
        public virtual async Task BringOutFinalReview(int[] projectIds)
        {
            if (await ProjectRepository.CountAsync(o => projectIds.Contains(o.Id) && !o.IsInFinalReview) > 0)
            {
                throw new UserFriendlyException("项目已经被移出终评");
            }
            //所有终评中的项目
            var reviews = await ReviewRepository.GetAll().Where(o => o.ReviewType == ReviewType.Finish)
                          .ToListAsync();

            var finalReviewProjects = reviews.SelectMany(o => o.ReviewProjects).Select(o => o.Id).Distinct();

            if (projectIds.Count(o => finalReviewProjects.Contains(o)) > 0)
            {
                throw new UserFriendlyException("无法将终评中的项目移出终评");
            }
            //已经是终评中的项目无法取消终评
            //if(await ProjectRepository.CountAsync(o=>projectIds.Contains(o.Id) && o.ProjectStatus == ProjectStatus.FinalReviewing) > 0)
            //{
            //    throw new UserFriendlyException("无法将终评中的项目移出终评");
            //}
            var projects = await ProjectRepository.GetAll().Where(o => projectIds.Contains(o.Id)).ToListAsync();

            foreach (var project in projects)
            {
                project.IsInFinalReview = false;
                //获取项目之前的项目状态
                var traceLogs = await ProjectTraceLogRepository.GetAll().Where(o => o.ProjectId == project.Id).ToListAsync();

                if (traceLogs.Count > 2)
                {
                    //最后一项记录保存的是项目的当前状态,故再往上取一个记录
                    var lastTraceLog = traceLogs[traceLogs.Count - 2];
                    project.ProjectStatus = lastTraceLog.TargetStatus;
                    //更改项目状态
                    await ProjectManager.TraceLog(project.Id, "移出终评", project.ProjectStatus);
                }

                await CacheManager.GetCache <int, object>("ProjectResultCache").RemoveAsync(project.Id);
            }
        }