feat:获取成绩接口
This commit is contained in:
parent
2440e201bb
commit
8a8c0f0933
|
|
@ -4,6 +4,7 @@
|
||||||
"Cognitio",
|
"Cognitio",
|
||||||
"Fzby",
|
"Fzby",
|
||||||
"gonic",
|
"gonic",
|
||||||
|
"gorm",
|
||||||
"Xjysby",
|
"Xjysby",
|
||||||
"Xjysdy",
|
"Xjysdy",
|
||||||
"Yybyqy",
|
"Yybyqy",
|
||||||
|
|
|
||||||
|
|
@ -23,3 +23,9 @@
|
||||||
- `YxUserScoreController`: 用户分数控制器。
|
- `YxUserScoreController`: 用户分数控制器。
|
||||||
- `YxVolunteerController`: 志愿控制器。
|
- `YxVolunteerController`: 志愿控制器。
|
||||||
- `YxVolunteerRecordController`: 志愿明细控制器。
|
- `YxVolunteerRecordController`: 志愿明细控制器。
|
||||||
|
|
||||||
|
## server/modules/user
|
||||||
|
- `UserScoreService`: 用户成绩服务。
|
||||||
|
- `GetActiveByID(userID string)`: 获取用户当前激活的成绩,返回 `UserScoreVO`。
|
||||||
|
- `SaveUserScore(req *dto.SaveScoreRequest)`: 保存用户成绩,处理旧记录状态更新及 DTO 转换。
|
||||||
|
- `UserScoreVO`: 用户成绩视图对象,包含基础信息、选课列表及子专业成绩映射。
|
||||||
|
|
|
||||||
|
|
@ -47,3 +47,12 @@
|
||||||
- 创建了 `server/modules/yx/dto/` 目录。
|
- 创建了 `server/modules/yx/dto/` 目录。
|
||||||
- 将 `SaveScoreRequest` 及其校验逻辑移动到 `yx_user_score_dto.go`。
|
- 将 `SaveScoreRequest` 及其校验逻辑移动到 `yx_user_score_dto.go`。
|
||||||
- Controller 改为引用 `dto` 包。
|
- Controller 改为引用 `dto` 包。
|
||||||
|
|
||||||
|
### [任务执行] 处理 UserScoreVO 信息转换
|
||||||
|
- **操作目标**: 在 `UserScoreService` 中实现 Entity 到 VO 的转换,并完善 `UserScoreVO` 定义。
|
||||||
|
- **影响范围**: `server/modules/user/vo/user_score_vo.go`, `server/modules/user/service/user_score_service.go`
|
||||||
|
- **修改前记录**: `UserScoreVO` 为空,`GetActiveByID` 返回原始 Entity。
|
||||||
|
- **修改结果**:
|
||||||
|
- 定义了 `UserScoreVO` 结构体,其字段设计参考了 `SaveScoreRequest`。
|
||||||
|
- 在 `UserScoreService` 中实现了 `convertEntityToVo` 私有方法,处理了逗号分隔字符串到切片的转换,以及具体分数字段到 Map 的映射。
|
||||||
|
- 更新 `GetActiveByID` 返回 `UserScoreVO` 对象。
|
||||||
|
|
|
||||||
|
|
@ -24,4 +24,7 @@
|
||||||
- `mapper/`: 数据访问层实现。
|
- `mapper/`: 数据访问层实现。
|
||||||
- `service/`: 业务逻辑层实现。
|
- `service/`: 业务逻辑层实现。
|
||||||
- `controller/`: 控制层实现。
|
- `controller/`: 控制层实现。
|
||||||
|
- `user/`: 用户相关业务扩展。
|
||||||
|
- `vo/`: 视图对象,用于数据展示。
|
||||||
|
- `service/`: 业务逻辑层。
|
||||||
- `docs/`: Swagger API文档。
|
- `docs/`: Swagger API文档。
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,17 @@
|
||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"server/config"
|
"server/config"
|
||||||
|
"server/modules/user/vo"
|
||||||
"server/modules/yx/dto"
|
"server/modules/yx/dto"
|
||||||
"server/modules/yx/entity"
|
"server/modules/yx/entity"
|
||||||
"server/modules/yx/mapper"
|
"server/modules/yx/mapper"
|
||||||
"server/modules/yx/service"
|
"server/modules/yx/service"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
type UserScoreService struct {
|
type UserScoreService struct {
|
||||||
|
|
@ -16,8 +20,25 @@ type UserScoreService struct {
|
||||||
mapper *mapper.YxUserScoreMapper
|
mapper *mapper.YxUserScoreMapper
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *UserScoreService) GetActiveByID(d string) (any, any) {
|
// GetActiveByID 获取当前激活的成绩
|
||||||
panic("unimplemented")
|
func (s *UserScoreService) GetActiveByID(userID string) (*vo.UserScoreVO, error) {
|
||||||
|
var score entity.YxUserScore
|
||||||
|
// 明确指定字段,提高可读性
|
||||||
|
err := config.DB.Model(&entity.YxUserScore{}).
|
||||||
|
Where("create_by = ? AND state = ?", userID, "1"). // 注意:yx_user_score 表中关联用户的是 create_by
|
||||||
|
First(&score).Error
|
||||||
|
// 错误处理
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
|
return nil, fmt.Errorf("未找到用户的激活成绩记录")
|
||||||
|
}
|
||||||
|
return nil, fmt.Errorf("查询成绩记录失败: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 转换为 VO
|
||||||
|
scoreVO := s.convertEntityToVo(&score)
|
||||||
|
|
||||||
|
return scoreVO, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewUserScoreService() *UserScoreService {
|
func NewUserScoreService() *UserScoreService {
|
||||||
|
|
@ -77,32 +98,70 @@ func (s *UserScoreService) convertDtoToEntity(req *dto.SaveScoreRequest) *entity
|
||||||
ChineseScore: *req.ChineseScore,
|
ChineseScore: *req.ChineseScore,
|
||||||
Province: req.Province,
|
Province: req.Province,
|
||||||
State: "1", // 默认状态
|
State: "1", // 默认状态
|
||||||
Type: "2", // 艺术类
|
CreateBy: req.CreateBy,
|
||||||
|
}
|
||||||
|
|
||||||
|
// 映射子专业成绩到具体字段
|
||||||
|
if v, ok := req.ProfessionalCategoryChildrenScore["音乐表演声乐"]; ok {
|
||||||
|
entityItem.Yybysy = v
|
||||||
|
}
|
||||||
|
if v, ok := req.ProfessionalCategoryChildrenScore["音乐表演器乐"]; ok {
|
||||||
|
entityItem.Yybyqy = v
|
||||||
|
}
|
||||||
|
if v, ok := req.ProfessionalCategoryChildrenScore["音乐教育"]; ok {
|
||||||
|
entityItem.Yyjy = v
|
||||||
|
}
|
||||||
|
if v, ok := req.ProfessionalCategoryChildrenScore["戏剧影视导演"]; ok {
|
||||||
|
entityItem.Xjysdy = v
|
||||||
|
}
|
||||||
|
if v, ok := req.ProfessionalCategoryChildrenScore["戏剧影视表演"]; ok {
|
||||||
|
entityItem.Xjysby = v
|
||||||
|
}
|
||||||
|
if v, ok := req.ProfessionalCategoryChildrenScore["服装表演"]; ok {
|
||||||
|
entityItem.Fzby = v
|
||||||
}
|
}
|
||||||
|
|
||||||
// 映射子专业成绩
|
|
||||||
s.mapProfessionalScores(entityItem, req.ProfessionalCategoryChildrenScore)
|
|
||||||
return entityItem
|
return entityItem
|
||||||
}
|
}
|
||||||
|
|
||||||
// 私有方法:映射专业成绩
|
// 私有方法:Entity 转 VO
|
||||||
func (s *UserScoreService) mapProfessionalScores(entity *entity.YxUserScore, scoreMap map[string]float64) {
|
func (s *UserScoreService) convertEntityToVo(item *entity.YxUserScore) *vo.UserScoreVO {
|
||||||
if v, ok := scoreMap["音乐表演声乐"]; ok {
|
voItem := &vo.UserScoreVO{
|
||||||
entity.Yybysy = v
|
ID: item.ID,
|
||||||
|
Type: item.Type,
|
||||||
|
EducationalLevel: item.EducationalLevel,
|
||||||
|
CognitioPolyclinic: item.CognitioPolyclinic,
|
||||||
|
SubjectList: strings.Split(item.Subjects, ","),
|
||||||
|
ProfessionalCategory: item.ProfessionalCategory,
|
||||||
|
ProfessionalCategoryChildren: strings.Split(item.ProfessionalCategoryChildren, ","),
|
||||||
|
ProfessionalCategoryChildrenScore: make(map[string]float64),
|
||||||
|
ProfessionalScore: item.ProfessionalScore,
|
||||||
|
CulturalScore: item.CulturalScore,
|
||||||
|
EnglishScore: item.EnglishScore,
|
||||||
|
ChineseScore: item.ChineseScore,
|
||||||
|
Province: item.Province,
|
||||||
|
State: item.State,
|
||||||
}
|
}
|
||||||
if v, ok := scoreMap["音乐表演器乐"]; ok {
|
|
||||||
entity.Yybyqy = v
|
// 映射具体字段到子专业成绩 Map
|
||||||
|
if item.Yybysy > 0 {
|
||||||
|
voItem.ProfessionalCategoryChildrenScore["音乐表演声乐"] = item.Yybysy
|
||||||
}
|
}
|
||||||
if v, ok := scoreMap["音乐教育"]; ok {
|
if item.Yybyqy > 0 {
|
||||||
entity.Yyjy = v
|
voItem.ProfessionalCategoryChildrenScore["音乐表演器乐"] = item.Yybyqy
|
||||||
}
|
}
|
||||||
if v, ok := scoreMap["戏剧影视导演"]; ok {
|
if item.Yyjy > 0 {
|
||||||
entity.Xjysdy = v
|
voItem.ProfessionalCategoryChildrenScore["音乐教育"] = item.Yyjy
|
||||||
}
|
}
|
||||||
if v, ok := scoreMap["戏剧影视表演"]; ok {
|
if item.Xjysdy > 0 {
|
||||||
entity.Xjysby = v
|
voItem.ProfessionalCategoryChildrenScore["戏剧影视导演"] = item.Xjysdy
|
||||||
}
|
}
|
||||||
if v, ok := scoreMap["服装表演"]; ok {
|
if item.Xjysby > 0 {
|
||||||
entity.Fzby = v
|
voItem.ProfessionalCategoryChildrenScore["戏剧影视表演"] = item.Xjysby
|
||||||
}
|
}
|
||||||
|
if item.Fzby > 0 {
|
||||||
|
voItem.ProfessionalCategoryChildrenScore["服装表演"] = item.Fzby
|
||||||
|
}
|
||||||
|
|
||||||
|
return voItem
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
package vo
|
||||||
|
|
||||||
|
// UserScoreVO 用户成绩展示对象
|
||||||
|
type UserScoreVO struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Type string `json:"type"` // 填报类型(1-普通类 2-艺术类)
|
||||||
|
EducationalLevel string `json:"educationalLevel"` // 学历层次(1-本科,2-专科)
|
||||||
|
CognitioPolyclinic string `json:"CognitioPolyclinic"` // 文理分班(文科/理科)
|
||||||
|
SubjectList []string `json:"SubjectList"` // 选课列表
|
||||||
|
ProfessionalCategory string `json:"ProfessionalCategory"` // 专业类别
|
||||||
|
ProfessionalCategoryChildren []string `json:"ProfessionalCategoryChildren"` // 子级专业类别
|
||||||
|
ProfessionalCategoryChildrenScore map[string]float64 `json:"ProfessionalCategoryChildrenScore"` // 子级专业成绩
|
||||||
|
ProfessionalScore float64 `json:"ProfessionalScore"` // 专业总分
|
||||||
|
CulturalScore float64 `json:"CulturalScore"` // 文化成绩分
|
||||||
|
EnglishScore float64 `json:"EnglishScore"` // 英语成绩
|
||||||
|
ChineseScore float64 `json:"ChineseScore"` // 语文成绩
|
||||||
|
Province string `json:"Province"` // 高考省份
|
||||||
|
State string `json:"state"` // 状态
|
||||||
|
}
|
||||||
|
|
@ -7,3 +7,11 @@
|
||||||
2. 创建了 `server/modules/yx/dto/yx_user_score_dto.go`,将 `SaveScoreRequest` 结构体及 `Validate` 方法移动至此。
|
2. 创建了 `server/modules/yx/dto/yx_user_score_dto.go`,将 `SaveScoreRequest` 结构体及 `Validate` 方法移动至此。
|
||||||
3. 修改 `server/modules/yx/controller/yx_user_score_controller.go`,引入 `dto` 包并使用 `dto.SaveScoreRequest`。
|
3. 修改 `server/modules/yx/controller/yx_user_score_controller.go`,引入 `dto` 包并使用 `dto.SaveScoreRequest`。
|
||||||
- **执行结果**: 代码结构更清晰,符合 DTO 分层规范。
|
- **执行结果**: 代码结构更清晰,符合 DTO 分层规范。
|
||||||
|
|
||||||
|
## 会话 ID: 20251219-01
|
||||||
|
- **执行原因**: 用户要求在 `UserScoreService` 中处理 `scoreVO` 信息,参考 `yx_user_score_dto` 的结构。
|
||||||
|
- **执行过程**:
|
||||||
|
1. 定义 `server/modules/user/vo/user_score_vo.go` 中的 `UserScoreVO` 结构。
|
||||||
|
2. 在 `server/modules/user/service/user_score_service.go` 中实现 `convertEntityToVo` 逻辑。
|
||||||
|
3. 修改 `GetActiveByID` 方法,使其返回 `vo.UserScoreVO`。
|
||||||
|
- **执行结果**: 实现了 Entity 到 VO 的完整转换逻辑,支持子专业分数的 Map 映射。
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue