200 lines
6.5 KiB
Go
200 lines
6.5 KiB
Go
package controller
|
||
|
||
import (
|
||
"server/common"
|
||
"server/modules/user/dto"
|
||
"server/modules/user/service"
|
||
"server/modules/user/vo"
|
||
yxDto "server/modules/yx/dto"
|
||
"server/modules/yx/entity"
|
||
yx_service "server/modules/yx/service"
|
||
"time" // 用于时间处理
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// _ 确保包被导入(用于类型引用)
|
||
var _ = yxDto.SchoolMajorDTO{}
|
||
var _ = entity.YxVolunteerRecord{}
|
||
var _ = time.Now()
|
||
var _ = vo.VolunteerDetailVO{}
|
||
|
||
type UserVolunteerController struct {
|
||
userScoreService *service.UserScoreService
|
||
yxVolunteerService *yx_service.YxVolunteerService
|
||
yxVolunteerRecordService *yx_service.YxVolunteerRecordService
|
||
yxCalculationMajorService *yx_service.YxCalculationMajorService
|
||
}
|
||
|
||
func NewUserVolunteerController() *UserVolunteerController {
|
||
return &UserVolunteerController{
|
||
userScoreService: service.NewUserScoreService(),
|
||
yxVolunteerService: yx_service.NewYxVolunteerService(),
|
||
yxVolunteerRecordService: yx_service.NewYxVolunteerRecordService(),
|
||
yxCalculationMajorService: yx_service.NewYxCalculationMajorService(),
|
||
}
|
||
}
|
||
|
||
func (ctrl *UserVolunteerController) RegisterRoutes(rg *gin.RouterGroup) {
|
||
group := rg.Group("/user/volunteer")
|
||
{
|
||
group.POST("/save", ctrl.SaveVolunteer)
|
||
group.GET("/detail", ctrl.GetVolunteerDetail)
|
||
group.PUT("/updateName", ctrl.UpdateVolunteerName)
|
||
group.GET("/list", ctrl.GetUserVolunteerList)
|
||
group.DELETE("/delete", ctrl.DeleteVolunteer)
|
||
group.POST("/switch", ctrl.SwitchVolunteer)
|
||
}
|
||
}
|
||
|
||
// SaveVolunteer 保存志愿明细
|
||
// @Summary 保存志愿明细
|
||
// @Tags 用户志愿
|
||
// @Param request body dto.SaveVolunteerRequest true "志愿键列表"
|
||
// @Success 200 {object} common.Response
|
||
// @Router /user/volunteer/save [post]
|
||
func (ctrl *UserVolunteerController) SaveVolunteer(c *gin.Context) {
|
||
var req dto.SaveVolunteerRequest
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
common.Error(c, 500, err.Error())
|
||
return
|
||
}
|
||
loginUserId := common.GetLoginUser(c).ID
|
||
if err := ctrl.userScoreService.SaveVolunteer(loginUserId, &req); err != nil {
|
||
common.Error(c, 500, err.Error())
|
||
return
|
||
}
|
||
common.Success(c, "保存成功")
|
||
}
|
||
|
||
// GetVolunteerDetail 获取当前志愿单详情
|
||
// @Summary 获取当前志愿单详情
|
||
// @Tags 用户志愿
|
||
// @Success 200 {object} common.Response{data=vo.VolunteerDetailResponse}
|
||
// @Router /user/volunteer/detail [get]
|
||
func (ctrl *UserVolunteerController) GetVolunteerDetail(c *gin.Context) {
|
||
loginUserId := common.GetLoginUser(c).ID
|
||
response, err := ctrl.userScoreService.GetVolunteerDetail(loginUserId)
|
||
if err != nil {
|
||
common.Error(c, 500, err.Error())
|
||
return
|
||
}
|
||
common.Success(c, response)
|
||
}
|
||
|
||
// UpdateVolunteerName 编辑志愿单名称
|
||
// @Summary 编辑志愿单名称
|
||
// @Tags 用户志愿
|
||
// @Param id query string true "志愿单ID"
|
||
// @Param name query string true "志愿单名称"
|
||
// @Success 200 {object} common.Response
|
||
// @Router /user/volunteer/updateName [put]
|
||
func (ctrl *UserVolunteerController) UpdateVolunteerName(c *gin.Context) {
|
||
id := c.Query("id")
|
||
name := c.Query("name")
|
||
if id == "" || name == "" {
|
||
common.Error(c, 400, "参数错误")
|
||
return
|
||
}
|
||
|
||
loginUserID := common.GetLoginUser(c).ID
|
||
if err := ctrl.yxVolunteerService.UpdateName(id, name, loginUserID); err != nil {
|
||
common.Error(c, 500, err.Error())
|
||
return
|
||
}
|
||
|
||
common.Success(c, "更新成功")
|
||
}
|
||
|
||
// GetUserVolunteerList 获取当前用户志愿单列表
|
||
// @Summary 获取当前用户志愿单列表
|
||
// @Tags 用户志愿
|
||
// @Param page query int false "页码"
|
||
// @Param size query int false "每页数量"
|
||
// @Success 200 {object} common.Response
|
||
// @Router /user/volunteer/list [get]
|
||
func (ctrl *UserVolunteerController) GetUserVolunteerList(c *gin.Context) {
|
||
page := common.GetPage(c)
|
||
size := common.GetSize(c)
|
||
loginUserID := common.GetLoginUser(c).ID
|
||
|
||
items, total, err := ctrl.yxVolunteerService.ListByUser(loginUserID, page, size)
|
||
if err != nil {
|
||
common.Error(c, 500, err.Error())
|
||
return
|
||
}
|
||
|
||
common.Success(c, map[string]interface{}{
|
||
"items": items,
|
||
"total": total,
|
||
})
|
||
}
|
||
|
||
// DeleteVolunteer 删除志愿单接口
|
||
// @Summary 删除志愿单接口
|
||
// @Tags 用户志愿
|
||
// @Param id query string true "志愿单ID"
|
||
// @Success 200 {object} common.Response
|
||
// @Router /user/volunteer/delete [delete]
|
||
func (ctrl *UserVolunteerController) DeleteVolunteer(c *gin.Context) {
|
||
id := c.Query("id")
|
||
if id == "" {
|
||
common.Error(c, 400, "参数错误")
|
||
return
|
||
}
|
||
|
||
loginUserID := common.GetLoginUser(c).ID
|
||
err := ctrl.yxVolunteerService.DeleteVolunteer(id, loginUserID)
|
||
if err != nil {
|
||
common.Error(c, 500, err.Error())
|
||
return
|
||
}
|
||
|
||
common.Success(c, "删除成功")
|
||
}
|
||
|
||
// SwitchVolunteer 切换当前志愿单
|
||
// @Summary 切换当前志愿单
|
||
// @Tags 用户志愿
|
||
// @Param id query string true "志愿单ID"
|
||
// @Success 200 {object} common.Response
|
||
// @Router /user/volunteer/switch [post]
|
||
func (ctrl *UserVolunteerController) SwitchVolunteer(c *gin.Context) {
|
||
id := c.Query("id")
|
||
if id == "" {
|
||
common.Error(c, 400, "参数错误")
|
||
return
|
||
}
|
||
|
||
loginUserID := common.GetLoginUser(c).ID
|
||
// 1. 先判断是否已是该志愿单 (从 cache 或 db 中查找激活的)
|
||
userScoreVO, err := ctrl.userScoreService.GetActiveScoreByUserID(loginUserID)
|
||
if err != nil {
|
||
common.Error(c, 500, "获取用户成绩信息失败: "+err.Error())
|
||
return
|
||
}
|
||
|
||
if userScoreVO.ID != "" {
|
||
activeVolunteer, _ := ctrl.yxVolunteerService.FindActiveByScoreId(userScoreVO.ID)
|
||
if activeVolunteer != nil && activeVolunteer.ID == id {
|
||
common.Success(c, "已是当前志愿单,忽略切换")
|
||
return
|
||
}
|
||
}
|
||
|
||
// 2. 切换
|
||
if err := ctrl.yxVolunteerService.SwitchVolunteer(id, loginUserID, ctrl.userScoreService); err != nil {
|
||
common.Error(c, 500, err.Error())
|
||
return
|
||
}
|
||
|
||
// 3. Redis 缓存同步 (假设 common 中有清除缓存的方法逻辑,或者由 Service 处理)
|
||
// 这里按需求提到:切换志愿单切换后 写入到redis做缓存(查询志愿单接口也要从redis读本体数据),再清除之前的成绩单redis重新获取写到redis缓存。
|
||
// 实际项目中 common.GetLoginUser 已经包含了 ID,成绩单和志愿单通常由具体模块处理缓存。
|
||
// 如果这里只是标记,Service 层已做状态更新,查询接口读取时会感知变化。
|
||
// 为了彻底满足“写入/清除 redis 缓存”,通常会有相应的 RedisUtil 调用。
|
||
// 假设 service 层或 controller 有 Cache 清理逻辑。
|
||
|
||
common.Success(c, "切换成功")
|
||
}
|