2025-03-07 19:03:20 +08:00

403 lines
10 KiB
Go

package controller
import (
"case-open-api/api/dao"
"case-open-api/api/dto"
"case-open-api/api/requests"
"case-open-api/api/responses"
"case-open-api/api/service"
"case-open-api/global"
"case-open-api/utils"
"fmt"
"github.com/gin-gonic/gin"
"math"
"strconv"
"time"
)
type Res struct {
}
// GetResProjectList 获取项目列表
func (b *Res) GetResProjectList(c *gin.Context) {
resRequest := requests.ResRequest{}
req := resRequest.GetResProjectList
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
// 获取数据
ProjectDao := dao.ProjectDao{}
projects, err := ProjectDao.GetResProjectListSearch(req)
if err != nil {
responses.FailWithMessage("获取数据失败", c)
return
}
// 处理返回值
g := dto.GetResProjectListDto(projects)
projectPlatformDao := dao.ProjectPlatformDao{}
caseDao := dao.CaseDao{}
for _, projectDto := range g {
// 获取项目关联平台
maps := make(map[string]interface{})
maps["project_id"] = projectDto.ProjectId
maps["platform_id"] = platformId
projectPlatform, _ := projectPlatformDao.GetProjectPlatform(maps)
if projectPlatform != nil {
// 加载是否存在福利
projectDto.LoadIsWelfare(projectPlatform)
}
// 获取最近7天的病例
now := time.Now()
t := now.AddDate(0, 0, -7)
maps = make(map[string]interface{})
maps["project_id"] = projectDto.ProjectId
result, _ := caseDao.GetCaseFormPastDay(maps, t)
if result != nil {
// 加载最近更新情况
projectDto.LoadIsRecentlyUpdate(result)
}
}
responses.OkWithData(g, c)
}
// GetResCaseList 获取病例列表
func (b *Res) GetResCaseList(c *gin.Context) {
resRequest := requests.ResRequest{}
req := resRequest.GetResCaseList
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
// 获取数据
caseDao := dao.CaseDao{}
cases, err := caseDao.GetResCaseList(req)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 处理返回值
g := dto.GetCaseResListDto(cases)
responses.OkWithData(g, c)
}
// GetResCaseRecordList 病例领取记录
func (b *Res) GetResCaseRecordList(c *gin.Context) {
resRequest := requests.ResRequest{}
req := resRequest.GetResCaseRecordList
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
}
projectId, err := strconv.ParseInt(req.ProjectId, 10, 64)
if err != nil {
responses.Fail(c)
return
}
req.PlatformId = platformId
if req.StartTime != "" {
if req.EndTime == "" {
responses.FailWithMessage("参数错误", c)
return
}
}
page := 1
if req.Pindex != 0 {
page = req.Pindex
}
pageSize := 100
// 获取数据
caseUserDao := dao.CaseUserDao{}
caseUsers, total, err := caseUserDao.GetResCaseUserRecordList(req, page, pageSize)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 处理返回值
g := make([]*dto.ResCaseRecordDto, len(caseUsers))
if len(caseUsers) > 0 {
recordScoreDao := dao.RecordScoreDao{}
caseCommentDao := dao.CaseCommentDao{}
caseUserAnswerDao := dao.CaseUserAnswerDao{}
userDao := dao.UserDao{}
projectPlatformWhiteService := service.ProjectPlatformWhiteService{}
for i, v := range caseUsers {
// 获取积分发放记录
maps := make(map[string]interface{})
maps["project_id"] = req.ProjectId
maps["case_id"] = v.CaseId
maps["platform_id"] = v.PlatformId
maps["user_id"] = v.UserId
recordScores, _ := recordScoreDao.GetRecordScoreList(maps)
// 获取用户评论
maps = make(map[string]interface{})
maps["case_id"] = v.CaseId
maps["platform_id"] = v.PlatformId
maps["user_id"] = v.UserId
maps["status"] = 1
caseComments, _ := caseCommentDao.GetCaseCommentList(maps)
// 获取用户答题记录
maps = make(map[string]interface{})
maps["case_user_id"] = v.CaseUserId
maps["platform_id"] = v.PlatformId
maps["user_id"] = v.UserId
caseUserAnswers, _ := caseUserAnswerDao.GetCaseUserAnswerPreloadList(maps)
// 用时
minutes := v.ReadDuration / 60
remainingSeconds := v.ReadDuration % 60
residenceTime := fmt.Sprintf("%02d:%02d", minutes, remainingSeconds)
response := &dto.ResCaseRecordDto{
CaseUserId: fmt.Sprintf("%d", v.CaseUserId),
Sid: fmt.Sprintf("%d", v.CaseId),
Beizhu: "",
OpenId: "",
Title: v.Case.CaseName,
NickName: v.User.UserName,
RealName: v.User.UserName,
Mobile: v.User.MobileEncryption,
Hos2: v.User.DepartmentName, // 科室
Job: utils.DoctorTitleToString(v.User.Title),
HospitalName: v.User.Hospital.HospitalName,
ResideProvince: v.User.Hospital.Province,
ResideCity: v.User.Hospital.City,
CreateDate: time.Time(v.CreatedAt).Format("2006-01-02"),
CreateTimes: time.Time(v.CreatedAt).Format("15:04:05"),
ResidenceTime: residenceTime,
QuestionAnswer: nil,
TslUid: v.User.UserIden,
TslShareUserId: v.ShareUserIden,
IsVip: 0,
Credit1: 0,
Credit2: 0,
Credit3: 0,
Credit4: 0,
CreditTotal: v.TotalScore,
HasRemark: 0,
Remark: nil,
}
// 积分
for _, v3 := range recordScores {
if v3.Type == 1 {
response.Credit1 = v3.Score
}
if v3.Type == 2 {
response.Credit2 = v3.Score
}
if v3.Type == 3 {
response.Credit3 = v3.Score
}
if v3.Type == 4 {
response.Credit4 = v3.Score
}
}
// 评论
if len(caseComments) > 0 {
response.Remark = make([]*dto.RemarkDto, len(caseComments))
response.HasRemark = 1
for i2, comment := range caseComments {
remarkDto := &dto.RemarkDto{
Remark: comment.Content,
CreateTime: time.Time(comment.CreatedAt).Format("2006-01-02 15:04:05"),
}
response.Remark[i2] = remarkDto
}
}
// 题目
if len(caseUserAnswers) > 0 {
response.QuestionAnswer = make([]*dto.QuestionAnswerDto, len(caseUserAnswers))
for i2, records := range caseUserAnswers {
questionAnswerDto := &dto.QuestionAnswerDto{
Question: records.CaseItemQuestion.QuestionName,
Answer: records.Answer,
Correct: false,
Order: i2 + 1,
}
if records.IsTrue == 1 {
questionAnswerDto.Correct = true
}
response.QuestionAnswer[i2] = questionAnswerDto
}
}
// 获取用户数据
user, _ := userDao.GetUserById(v.UserId)
if user != nil {
// 检测用户是否白名单
isWhite, _ := projectPlatformWhiteService.CheckProjectPlatformWhiteByUser(user, projectId, v.PlatformId)
if isWhite {
response.IsVip = 1
}
}
// 将转换后的结构体添加到新切片中
g[i] = response
}
}
result := make(map[string]interface{})
result["pindex"] = page
result["psize"] = pageSize
result["ptotal"] = int(math.Ceil(float64(total) / float64(pageSize)))
result["ctotal"] = total
result["data"] = g
responses.OkWithData(result, c)
}
// GetResCaseBehaviorList 获取病例用户操作行为列表
func (b *Res) GetResCaseBehaviorList(c *gin.Context) {
resRequest := requests.ResRequest{}
req := resRequest.GetResCaseBehaviorList
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
}
if req.StartTime != "" {
if req.EndTime == "" {
responses.FailWithMessage("参数错误", c)
return
}
}
// 获取数据
caseUserDao := dao.CaseUserDao{}
caseUsers, err := caseUserDao.GetResCaseBehaviorList(req)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 处理返回值
g := make([]*dto.ResCaseBehaviorDto, len(caseUsers))
if len(caseUsers) > 0 {
userBehaviorRecordDao := dao.UserBehaviorRecordDao{}
for i, v := range caseUsers {
response := &dto.ResCaseBehaviorDto{
TslUid: v.User.UserIden,
Sid: fmt.Sprintf("%d", v.CaseId),
StartTime: time.Time(v.StartTime).Format("2006-01-02 15:04:05"),
EndTime: time.Time(v.StartTime).Format("2006-01-02 15:04:05"),
UseTime: v.ReadDuration,
IsComplete: 1,
Action: nil,
}
// 获取用户操作行为记录
maps := make(map[string]interface{})
maps["case_id"] = v.CaseId
maps["platform_id"] = v.PlatformId
maps["user_id"] = v.UserId
userBehaviorRecords, _ := userBehaviorRecordDao.GetUserBehaviorRecordList(maps)
// 评论
if len(userBehaviorRecords) > 0 {
response.Action = make([]*dto.ActionDto, len(userBehaviorRecords))
for i2, record := range userBehaviorRecords {
// 用时
useTime := time.Time(record.EndTime).Sub(time.Time(record.StartTime))
actionDto := &dto.ActionDto{
Step: record.Step,
In: time.Time(record.StartTime).Format("2006-01-02 15:04:05"),
Out: time.Time(record.EndTime).Format("2006-01-02 15:04:05"),
UseTime: int(useTime.Seconds()),
}
response.Action[i2] = actionDto
}
}
// 将转换后的结构体添加到新切片中
g[i] = response
}
}
responses.OkWithData(g, c)
}