diff --git a/server/modules/yx/mapper/yx_history_score_control_line_mapper.go b/server/modules/yx/mapper/yx_history_score_control_line_mapper.go index 3b2181f..cb317d7 100644 --- a/server/modules/yx/mapper/yx_history_score_control_line_mapper.go +++ b/server/modules/yx/mapper/yx_history_score_control_line_mapper.go @@ -13,9 +13,21 @@ func NewYxHistoryScoreControlLineMapper() *YxHistoryScoreControlLineMapper { func (m *YxHistoryScoreControlLineMapper) SelectByYearAndCategory(year, professionalCategory, category string) ([]entity.YxHistoryScoreControlLine, error) { var items []entity.YxHistoryScoreControlLine + // 判断是否为表演类,如果是则匹配多个类别 + var categories []string + switch professionalCategory { + case "表演类": + categories = []string{"表演类-戏剧影视表演", "表演类-服装表演", "表演类-戏剧影视导演"} + // fallthrough // 继续执行下面的case + case "音乐类": + categories = []string{"音乐类-音乐表演声乐", "音乐类-音乐表演器乐", "音乐类-音乐教育"} + default: + categories = []string{professionalCategory} + } + err := config.DB.Model(&entity.YxHistoryScoreControlLine{}). Where("year = ?", year). - Where("professional_category = ?", professionalCategory). + Where("professional_category IN ?", categories). Where("category = ?", category). Order("batch desc"). Find(&items).Error diff --git a/server/modules/yx/service/yx_calculation_major_service.go b/server/modules/yx/service/yx_calculation_major_service.go index 1f24cbe..e951038 100644 --- a/server/modules/yx/service/yx_calculation_major_service.go +++ b/server/modules/yx/service/yx_calculation_major_service.go @@ -27,7 +27,7 @@ type YxCalculationMajorService struct { func NewYxCalculationMajorService() *YxCalculationMajorService { mapper := mapper.NewYxCalculationMajorMapper() return &YxCalculationMajorService{ - BaseService: common.NewBaseService[entity.YxCalculationMajor](), + BaseService: common.NewBaseService[entity.YxCalculationMajor](), historyMajorEnrollService: NewYxHistoryMajorEnrollService(), mapper: mapper, historyScoreControlLineService: NewYxHistoryScoreControlLineService(), @@ -311,17 +311,137 @@ func (s *YxCalculationMajorService) UserMajorDTOGetHistory(userMajorDTOList *[]d func (s *YxCalculationMajorService) CheckEnrollProbability(schoolMajorDTOList *[]dto.SchoolMajorDTO, userScoreVO vo.UserScoreVO) error { professionalCategory := userScoreVO.ProfessionalCategory if "表演类" == professionalCategory { + s.BiaoYanRecommendMajorListSetEnrollProbability(schoolMajorDTOList, userScoreVO) // TODO: biaoyanService } else if "音乐类" == professionalCategory { // TODO: musicService } else { - s.betaRecommendMajorListSetEnrollProbability(schoolMajorDTOList, userScoreVO) + s.BetaRecommendMajorListSetEnrollProbability(schoolMajorDTOList, userScoreVO) } return nil } -// betaRecommendMajorListSetEnrollProbability 美术与设计类,书法类,体育类 获取录取率 -func (s *YxCalculationMajorService) betaRecommendMajorListSetEnrollProbability(recommendMajorList *[]dto.SchoolMajorDTO, userScoreVO vo.UserScoreVO) { +// BiaoYanRecommendMajorListSetEnrollProbability 表演类 获取录取率 +func (s *YxCalculationMajorService) BiaoYanRecommendMajorListSetEnrollProbability(recommendMajorList *[]dto.SchoolMajorDTO, userScoreVO vo.UserScoreVO) { + if recommendMajorList == nil || len(*recommendMajorList) == 0 { + return + } + professionalCategory := userScoreVO.ProfessionalCategory + nowBatch := "本科" + + // 获取省控线 Map + historyScoreControlLineMap, err := s.historyScoreControlLineService.MapsBatchByProfessionalCategoryOfYear(common.NowYear, professionalCategory, userScoreVO.CognitioPolyclinic) + if err != nil { + return + } + + culturalScore := userScoreVO.CulturalScore + professionalScore := userScoreVO.ProfessionalScore + + var nowMajorTypeChild string + var batchKey string + for i := range *recommendMajorList { + item := &(*recommendMajorList)[i] + + rulesEnrollProbability := item.PrivateRulesEnrollProbability + probabilityOperator := item.PrivateProbabilityOperator + + // 当前子类型 + nowMajorTypeChild = item.MajorTypeChild + // 整合为 表演类-XXX子类型 + batchKey = professionalCategory + "-" + nowMajorTypeChild + "_" + item.Batch + + // 获取对应批次的省控线 + controlLineData, ok := historyScoreControlLineMap[batchKey] + if !ok { + if val, okDefault := historyScoreControlLineMap["本科"]; okDefault { + controlLineData = val + } else { + continue + } + } + + // 判断子类型,使用对应的成绩进行计算 + professionalScore = userScoreVO.ProfessionalCategoryChildrenScore[item.MajorTypeChild] + + culturalControlLine := controlLineData.CulturalScore + specialControlLine := controlLineData.SpecialScore + + if rulesEnrollProbability == "" { + continue + } + + // 补全 probabilityOperator 逻辑 + if rulesEnrollProbability == "文过专排" && probabilityOperator == "" { + probabilityOperator = "文*0+专*1" + } else if rulesEnrollProbability == "专过文排" && probabilityOperator == "" { + probabilityOperator = "文*1+专*0" + } + + if probabilityOperator == "" { + item.EnrollProbability = common.Number5 + continue + } + + // 判断其他录取要求 + if !calc.OtherScoreJudge(professionalScore, userScoreVO, *item) { + item.EnrollProbability = common.Number0 + continue + } + + // 判断是否过省控线 + if !calc.CrossingControlLine(rulesEnrollProbability, culturalScore, professionalScore, culturalControlLine, specialControlLine) { + item.EnrollProbability = common.Number0 + continue + } + + // 计算学生折合分 + studentScore := calc.ConvertIntoScore(rulesEnrollProbability, culturalScore, professionalScore, probabilityOperator) + item.PrivateStudentScore = studentScore + item.StudentScore = studentScore + + // 权限检查 + if !calc.HasComputeEnrollProbabilityPermissions(nowBatch, item.Batch) { + item.EnrollProbability = common.Number0 + continue + } + + // 录取方式计算 + if common.CulturalControlLineGuoMain == rulesEnrollProbability { + if len(item.HistoryMajorEnrollList) == 0 { + item.EnrollProbability = common.Number0 + continue + } + item.EnrollProbability = (studentScore * item.HistoryMajorEnrollList[0].AdmissionLine) * common.Number0p75 + if studentScore >= item.HistoryMajorEnrollList[0].AdmissionLine { + item.EnrollProbability *= common.Number0p5 + } + continue + } else { + nowYearProvincialControlLine := calc.ConvertIntoScore(rulesEnrollProbability, culturalControlLine, specialControlLine, probabilityOperator) + if nowYearProvincialControlLine <= 0 { + item.EnrollProbability = common.Number0 + continue + } + + diffMap := calc.ComputeHistoryMajorEnrollScoreLineDifferenceWithRulesEnrollProbability(item.MajorType, rulesEnrollProbability, probabilityOperator, item.HistoryMajorEnrollMap) + historyThreeYearDiff := diffMap["scoreDifference"].(float64) + + if historyThreeYearDiff == 0 { + item.EnrollProbability = common.Number0 + continue + } + + nowYearDiff := studentScore - nowYearProvincialControlLine + + enrollProbability := calc.CommonCheckEnrollProbability(nowYearDiff, historyThreeYearDiff) + item.EnrollProbability = calc.CommonCheckEnrollProbabilityBeilv(enrollProbability) + } + } +} + +// BetaRecommendMajorListSetEnrollProbability 美术与设计类,书法类,体育类 获取录取率 +func (s *YxCalculationMajorService) BetaRecommendMajorListSetEnrollProbability(recommendMajorList *[]dto.SchoolMajorDTO, userScoreVO vo.UserScoreVO) { if recommendMajorList == nil || len(*recommendMajorList) == 0 { return } @@ -474,28 +594,28 @@ func (s *YxCalculationMajorService) GetCalculationMajorByID(id string) (*yxVO.Yx func (s *YxCalculationMajorService) CreateCalculationMajor(req *yxDto.CreateCalculationMajorRequest) (*yxVO.YxCalculationMajorVO, error) { // DTO 转 Entity - 只使用 Entity 中存在的字段 entityItem := &entity.YxCalculationMajor{ - ID: uuid.New().String(), - SchoolCode: req.SchoolCode, - MajorCode: req.MajorCode, - MajorName: req.MajorName, - MajorType: req.MajorType, - MajorTypeChild: req.MajorTypeChild, - PlanNum: req.PlanNum, - MainSubjects: req.MainSubjects, - Limitation: req.Limitation, - EnrollmentCode: req.EnrollmentCode, - Tuition: req.Tuition, - Detail: req.Detail, - Category: req.Category, - Batch: req.Batch, - RulesEnrollProbability: req.RulesEnrollProbability, - ProbabilityOperator: req.ProbabilityOperator, - Kslx: req.Kslx, - State: req.State, - EnrollProbability: req.EnrollProbability, - StudentConvertedScore: req.StudentScore, - RulesEnrollProbabilitySx: req.RulesEnrollProbability, - CreateTime: time.Now(), + ID: uuid.New().String(), + SchoolCode: req.SchoolCode, + MajorCode: req.MajorCode, + MajorName: req.MajorName, + MajorType: req.MajorType, + MajorTypeChild: req.MajorTypeChild, + PlanNum: req.PlanNum, + MainSubjects: req.MainSubjects, + Limitation: req.Limitation, + EnrollmentCode: req.EnrollmentCode, + Tuition: req.Tuition, + Detail: req.Detail, + Category: req.Category, + Batch: req.Batch, + RulesEnrollProbability: req.RulesEnrollProbability, + ProbabilityOperator: req.ProbabilityOperator, + Kslx: req.Kslx, + State: req.State, + EnrollProbability: req.EnrollProbability, + StudentConvertedScore: req.StudentScore, + RulesEnrollProbabilitySx: req.RulesEnrollProbability, + CreateTime: time.Now(), } // 注意:分数限制字段存储在 OtherScoreLimitation 中,需要单独处理 @@ -516,7 +636,7 @@ func (s *YxCalculationMajorService) CreateCalculationMajor(req *yxDto.CreateCalc entityItem.OtherScoreLimitation = strings.Join(otherLimitations, ",") } -// 保存到数据库 + // 保存到数据库 if err := s.Create(entityItem); err != nil { return nil, err } @@ -628,28 +748,28 @@ func (s *YxCalculationMajorService) BatchCreateCalculationMajors(reqs *[]yxDto.C for _, req := range *reqs { // DTO 转 Entity - 只使用 Entity 中存在的字段 entityItem := entity.YxCalculationMajor{ - ID: uuid.New().String(), - SchoolCode: req.SchoolCode, - MajorCode: req.MajorCode, - MajorName: req.MajorName, - MajorType: req.MajorType, - MajorTypeChild: req.MajorTypeChild, - PlanNum: req.PlanNum, - MainSubjects: req.MainSubjects, - Limitation: req.Limitation, - EnrollmentCode: req.EnrollmentCode, - Tuition: req.Tuition, - Detail: req.Detail, - Category: req.Category, - Batch: req.Batch, - RulesEnrollProbability: req.RulesEnrollProbability, - ProbabilityOperator: req.ProbabilityOperator, - Kslx: req.Kslx, - State: req.State, - EnrollProbability: req.EnrollProbability, - StudentConvertedScore: req.StudentScore, - RulesEnrollProbabilitySx: req.RulesEnrollProbability, - CreateTime: now, + ID: uuid.New().String(), + SchoolCode: req.SchoolCode, + MajorCode: req.MajorCode, + MajorName: req.MajorName, + MajorType: req.MajorType, + MajorTypeChild: req.MajorTypeChild, + PlanNum: req.PlanNum, + MainSubjects: req.MainSubjects, + Limitation: req.Limitation, + EnrollmentCode: req.EnrollmentCode, + Tuition: req.Tuition, + Detail: req.Detail, + Category: req.Category, + Batch: req.Batch, + RulesEnrollProbability: req.RulesEnrollProbability, + ProbabilityOperator: req.ProbabilityOperator, + Kslx: req.Kslx, + State: req.State, + EnrollProbability: req.EnrollProbability, + StudentConvertedScore: req.StudentScore, + RulesEnrollProbabilitySx: req.RulesEnrollProbability, + CreateTime: now, } // 处理分数限制字段 @@ -679,30 +799,30 @@ func (s *YxCalculationMajorService) BatchCreateCalculationMajors(reqs *[]yxDto.C // convertToVO Entity 转 VO(私有方法) func (s *YxCalculationMajorService) convertToVO(entity entity.YxCalculationMajor) *yxVO.YxCalculationMajorVO { vo := &yxVO.YxCalculationMajorVO{ - ID: entity.ID, - SchoolCode: entity.SchoolCode, - MajorCode: entity.MajorCode, - MajorName: entity.MajorName, - MajorType: entity.MajorType, - MajorTypeChild: entity.MajorTypeChild, - PlanNum: entity.PlanNum, - MainSubjects: entity.MainSubjects, - Limitation: entity.Limitation, - EnrollmentCode: entity.EnrollmentCode, - Tuition: entity.Tuition, - Detail: entity.Detail, - Category: entity.Category, - Batch: entity.Batch, - RulesEnrollProbability: entity.RulesEnrollProbability, - ProbabilityOperator: entity.ProbabilityOperator, - Kslx: entity.Kslx, - State: entity.State, - EnrollProbability: entity.EnrollProbability, - StudentScore: entity.StudentConvertedScore, - PrivateStudentScore: entity.PrivateStudentConvertedScore, - StudentConvertedScore: entity.StudentConvertedScore, - CreateTime: entity.CreateTime.Format("2006-01-02 15:04:05"), - UpdateTime: "", + ID: entity.ID, + SchoolCode: entity.SchoolCode, + MajorCode: entity.MajorCode, + MajorName: entity.MajorName, + MajorType: entity.MajorType, + MajorTypeChild: entity.MajorTypeChild, + PlanNum: entity.PlanNum, + MainSubjects: entity.MainSubjects, + Limitation: entity.Limitation, + EnrollmentCode: entity.EnrollmentCode, + Tuition: entity.Tuition, + Detail: entity.Detail, + Category: entity.Category, + Batch: entity.Batch, + RulesEnrollProbability: entity.RulesEnrollProbability, + ProbabilityOperator: entity.ProbabilityOperator, + Kslx: entity.Kslx, + State: entity.State, + EnrollProbability: entity.EnrollProbability, + StudentScore: entity.StudentConvertedScore, + PrivateStudentScore: entity.PrivateStudentConvertedScore, + StudentConvertedScore: entity.StudentConvertedScore, + CreateTime: entity.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: "", } // 注意:SchoolName, ChineseScoreLimitation 等字段需要从关联表或其他来源获取 // 这里设置为空字符串 diff --git a/server/modules/yx/service/yx_history_score_control_line_service.go b/server/modules/yx/service/yx_history_score_control_line_service.go index 5d53fd4..0943259 100644 --- a/server/modules/yx/service/yx_history_score_control_line_service.go +++ b/server/modules/yx/service/yx_history_score_control_line_service.go @@ -23,14 +23,29 @@ func (s *YxHistoryScoreControlLineService) MapsBatchByProfessionalCategoryOfYear } result := make(map[string]entity.YxHistoryScoreControlLine) - for _, item := range list { - // 复制对象逻辑,处理"本科A段"映射为"提前批" - if item.Batch == "本科A段" { - newItem := item - newItem.Batch = "提前批" - result[newItem.Batch] = newItem + + switch professionalCategory { + case "表演类": + for _, item := range list { + // 复制对象逻辑,处理"本科A段"映射为"提前批" + // if item.Batch == "本科A段" { + // newItem := item + // newItem.Batch = "提前批" + // result[newItem.Batch] = newItem + // } + result[item.ProfessionalCategory+"_"+item.Batch] = item + } + default: + for _, item := range list { + // 复制对象逻辑,处理"本科A段"映射为"提前批" + if item.Batch == "本科A段" { + newItem := item + newItem.Batch = "提前批" + result[newItem.Batch] = newItem + } + result[item.Batch] = item } - result[item.Batch] = item } + return result, nil }