2025-03-07 16:57:28 +08:00

239 lines
4.7 KiB
Go

package controller
import (
"case-api/api/dao"
"case-api/api/dto"
"case-api/api/model"
"case-api/api/requests"
"case-api/api/responses"
"case-api/global"
"case-api/utils"
"fmt"
"github.com/gin-gonic/gin"
"strconv"
"strings"
"time"
)
type User struct {
}
// GetUserScore 获取用户积分获取情况
func (b *User) GetUserScore(c *gin.Context) {
userRequest := requests.UserRequest{}
req := userRequest.GetUserScore
if err := c.ShouldBind(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
platformId := c.GetInt64("PlatformId") // 平台id
if platformId == 0 {
responses.FailWithMessage("内部错误", c)
return
}
req.PlatformId = platformId
userId := c.GetInt64("UserId") // 用户id
if userId == 0 {
responses.FailWithMessage("内部错误", c)
return
}
req.UserId = userId
// 将 id 转换为 int64 类型
caseId, err := strconv.ParseInt(req.CaseId, 10, 64)
if err != nil {
responses.Fail(c)
return
}
// 检测病例是否属于平台
casePlatformDao := dao.CasePlatformDao{}
maps := make(map[string]interface{})
maps["case_id"] = caseId
maps["platform_id"] = platformId
_, err = casePlatformDao.GetCasePlatform(maps)
if err != nil {
responses.FailWithMessage("非法数据", c)
return
}
// 获取病例详情
caseDao := dao.CaseDao{}
result, err := caseDao.GetCaseById(caseId)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
if result.CaseStatus == 2 {
responses.FailWithMessage("数据异常", c)
return
}
// 获取用户总积分
caseUserDao := dao.CaseUserDao{}
maps = make(map[string]interface{})
maps["case_id"] = caseId
maps["platform_id"] = platformId
maps["user_id"] = userId
caseUser, _ := caseUserDao.GetCaseUser(maps)
if caseUser == nil {
responses.OkWithData(nil, c)
return
}
// 处理返回值
g := dto.GetCaseUserDto(caseUser)
// 获取用户获取积分记录
recordScoreDao := dao.RecordScoreDao{}
maps = make(map[string]interface{})
maps["case_id"] = caseId
maps["platform_id"] = platformId
maps["user_id"] = userId
recordScores, err := recordScoreDao.GetRecordScoreList(maps)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
mergedScore := 0
for _, score := range recordScores {
if score.Type == 3 || score.Type == 4 {
mergedScore += score.Score
}
}
// 优质留言
var describe []string
for _, score := range recordScores {
d := score.NodeName + ":"
if mergedScore != 0 {
score.Score = mergedScore
}
if score.Type == 4 {
continue
}
if platformId == 2 {
d = d + fmt.Sprintf("%d", score.Score*10)
} else {
d = d + fmt.Sprintf("%d", score.Score)
}
describe = append(describe, d)
}
g.Describe = strings.Join(describe, ",")
if platformId == 2 {
g.TotalScore = g.TotalScore * 10
}
responses.OkWithData(g, c)
}
// AddUserBehavior 上报用户行为
func (b *User) AddUserBehavior(c *gin.Context) {
userRequest := requests.UserRequest{}
req := userRequest.AddUserBehavior
if err := c.ShouldBind(&req); err != nil {
responses.Ok(c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.Ok(c)
return
}
platformId := c.GetInt64("PlatformId") // 平台id
if platformId == 0 {
responses.Ok(c)
return
}
userId := c.GetInt64("UserId") // 用户id
if userId == 0 {
responses.Ok(c)
return
}
req.PlatformId = platformId
req.UserId = userId
// 将 id 转换为 int64 类型
caseId, err := strconv.ParseInt(req.CaseId, 10, 64)
if err != nil {
responses.Ok(c)
return
}
// 检测病例是否属于平台
casePlatformDao := dao.CasePlatformDao{}
maps := make(map[string]interface{})
maps["case_id"] = caseId
maps["platform_id"] = platformId
_, err = casePlatformDao.GetCasePlatform(maps)
if err != nil {
responses.Ok(c)
return
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
// 增加用户行为记录
startTime, err := time.Parse("2006-01-02 15:04:05", req.StartTime)
if err != nil {
tx.Rollback()
responses.Ok(c)
return
}
endTime, err := time.Parse("2006-01-02 15:04:05", req.EndTime)
if err != nil {
tx.Rollback()
responses.Ok(c)
return
}
userBehaviorRecord := &model.UserBehaviorRecord{
CaseId: caseId,
PlatformId: platformId,
UserId: userId,
Step: req.Step,
StartTime: model.LocalTime(startTime),
EndTime: model.LocalTime(endTime),
}
userBehaviorRecordDao := dao.UserBehaviorRecordDao{}
_, err = userBehaviorRecordDao.AddUserBehaviorRecord(tx, userBehaviorRecord)
if err != nil {
tx.Rollback()
responses.Ok(c)
return
}
tx.Commit()
responses.Ok(c)
}