package controller import ( "server/common" user_service "server/modules/user/service" yxDto "server/modules/yx/dto" "server/modules/yx/entity" yx_service "server/modules/yx/service" "strconv" "time" "github.com/gin-gonic/gin" ) type UserMajorController struct { userScoreService *user_service.UserScoreService yxUserScoreService *yx_service.YxUserScoreService yxCalculationMajorService *yx_service.YxCalculationMajorService yxVolunteerService *yx_service.YxVolunteerService yxVolunteerRecordService *yx_service.YxVolunteerRecordService } func NewUserMajorController() *UserMajorController { return &UserMajorController{ yxUserScoreService: yx_service.NewYxUserScoreService(), userScoreService: user_service.NewUserScoreService(), yxCalculationMajorService: yx_service.NewYxCalculationMajorService(), yxVolunteerService: yx_service.NewYxVolunteerService(), yxVolunteerRecordService: yx_service.NewYxVolunteerRecordService(), } } // RegisterRoutes 注册路由 func (ctrl *UserMajorController) RegisterRoutes(rg *gin.RouterGroup) { group := rg.Group("/user/major") { // group.GET("/", ctrl.GetActive) // group.GET("/:id", ctrl.GetByID) group.GET("/list", ctrl.List) group.GET("/list_by_school", ctrl.ListBySchool) group.POST("/save_volunteer", ctrl.SaveVolunteer) } } // ListBySchool 获取当前院校下其他专业数据 // @Summary 获取当前院校下其他专业数据 // @Tags 用户专业 // @Param page query int false "页码" default(1) // @Param size query int false "每页数量" default(10) // @Param school_code query string true "院校代码" // @Param probability query string false "录取概率类型(难录取/可冲击/较稳妥/可保底)" default("") // @Success 200 {object} common.Response // @Router /user/major/list_by_school [get] func (ctrl *UserMajorController) ListBySchool(c *gin.Context) { page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) size, _ := strconv.Atoi(c.DefaultQuery("size", "10")) schoolMajorQuery := yxDto.SchoolMajorQuery{ Page: page, Size: size, SchoolCode: c.Query("school_code"), Probability: c.DefaultQuery("probability", ""), LoginUserId: common.GetLoginUser(c).ID, } userScoreVO, err := ctrl.userScoreService.GetActiveByID(schoolMajorQuery.LoginUserId) if err != nil { common.Error(c, 500, err.Error()) return } schoolMajorQuery.UserScoreVO = userScoreVO items, total, probCount, err := ctrl.yxCalculationMajorService.RecommendMajorList(schoolMajorQuery) if err != nil { common.Error(c, 500, err.Error()) return } newMap := map[string]interface{}{ "items": items, "total": total, "probCount": probCount, } common.SuccessPage(c, newMap, total, page, size) } // List 获取当前用户可检索列表 // @Summary 获取当前用户可检索列表 // @Tags 用户专业 // @Param page query int false "页码" default(1) // @Param size query int false "每页数量" default(10) // @Param batch query string false "批次(本科提前批/本科A段/本科B段/本科/高职高专)" default("") // @Param probability query string false "录取概率类型(难录取/可冲击/较稳妥/可保底)" default("") // @Success 200 {object} common.Response // @Router /user/major/list [get] func (ctrl *UserMajorController) List(c *gin.Context) { page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) size, _ := strconv.Atoi(c.DefaultQuery("size", "10")) schoolMajorQuery := yxDto.SchoolMajorQuery{ Keyword: c.DefaultQuery("keyword", ""), Page: page, Size: size, SchoolCode: c.Query("schoolCode"), Batch: c.DefaultQuery("batch", ""), Probability: c.DefaultQuery("probability", ""), LoginUserId: common.GetLoginUser(c).ID, } userScoreVO, err := ctrl.userScoreService.GetActiveByID(schoolMajorQuery.LoginUserId) if err != nil { common.Error(c, 500, err.Error()) return } schoolMajorQuery.UserScoreVO = userScoreVO items, total, probCount, err := ctrl.yxCalculationMajorService.RecommendMajorList(schoolMajorQuery) if err != nil { common.Error(c, 500, err.Error()) return } newMap := map[string]interface{}{ "items": items, "total": total, "probCount": probCount, } common.SuccessPage(c, newMap, total, page, size) } // SaveVolunteer 保存志愿明细 // @Summary 保存志愿明细 // @Tags 用户专业 // @Param keys body []string true "Keys: schoolCode_majorCode_enrollmentCode" // @Success 200 {object} common.Response // @Router /user/major/save_volunteer [post] func (ctrl *UserMajorController) SaveVolunteer(c *gin.Context) { var keys []string if err := c.ShouldBindJSON(&keys); err != nil { common.Error(c, 500, err.Error()) return } // data deduplication seen := make(map[string]bool) var uniqueKeys []string for _, key := range keys { if !seen[key] { seen[key] = true uniqueKeys = append(uniqueKeys, key) } } keys = uniqueKeys loginUserId := common.GetLoginUser(c).ID userScoreVO, err := ctrl.userScoreService.GetActiveByID(loginUserId) if err != nil { common.Error(c, 500, err.Error()) return } if userScoreVO.CalculationTableName == "" { common.Error(c, 500, "未找到计算表名") return } // 查找当前激活的志愿表 volunteer, err := ctrl.yxVolunteerService.FindActiveByScoreId(userScoreVO.ID) if err != nil { common.Error(c, 500, "查找志愿表失败: "+err.Error()) return } if volunteer == nil || volunteer.ID == "" { common.Error(c, 500, "请先创建志愿表") return } // 查找专业信息 majors, err := ctrl.yxCalculationMajorService.FindListByCompositeKeys(userScoreVO.CalculationTableName, keys, userScoreVO.ID) if err != nil { common.Error(c, 500, "查找专业信息失败: "+err.Error()) return } // 构建 Map 用于保持顺序 majorMap := make(map[string]entity.YxCalculationMajor) for _, major := range majors { k := major.SchoolCode + "_" + major.MajorCode + "_" + major.EnrollmentCode majorMap[k] = major } var records []entity.YxVolunteerRecord for i, key := range keys { if major, ok := majorMap[key]; ok { record := entity.YxVolunteerRecord{ VolunteerID: volunteer.ID, SchoolCode: major.SchoolCode, MajorCode: major.MajorCode, EnrollmentCode: major.EnrollmentCode, Indexs: i + 1, CreateBy: loginUserId, CreateTime: time.Now(), Batch: major.Batch, EnrollProbability: major.EnrollProbability, StudentConvertedScore: major.StudentConvertedScore, CalculationMajorID: major.ID, } records = append(records, record) } } // 先删除旧数据 if err := ctrl.yxVolunteerRecordService.DeleteByVolunteerID(volunteer.ID); err != nil { common.Error(c, 500, "删除旧数据失败: "+err.Error()) return } // 批量插入新数据 if len(records) > 0 { if err := ctrl.yxVolunteerRecordService.BatchCreate(records); err != nil { common.Error(c, 500, "保存失败: "+err.Error()) return } } common.Success(c, "保存成功") }