220 lines
7.1 KiB
Go
220 lines
7.1 KiB
Go
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, "保存成功")
|
|
}
|