503 lines
13 KiB
Go

package controller
import (
"case-open-api/api/dao"
"case-open-api/api/dto"
"case-open-api/api/model"
"case-open-api/api/requests"
"case-open-api/api/responses"
"case-open-api/api/service"
"case-open-api/config"
"case-open-api/global"
"case-open-api/utils"
"fmt"
"github.com/gin-gonic/gin"
"math"
"strconv"
"strings"
"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)
var users []*model.User
// 检测用户是否参与过
if req.MobileEncryption != "" {
// 获取全部相同手机号
userDao := dao.UserDao{}
maps := make(map[string]interface{})
maps["mobile_encryption"] = req.MobileEncryption
users, err = userDao.GetUserList(maps)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
caseUserDao := dao.CaseUserDao{}
// 存在相同手机号用户
for _, user := range users {
for _, caseDto := range g {
// 检测积分是否已在其他平台发放过
maps = make(map[string]interface{})
maps["case_id"] = caseDto.SId
maps["user_id"] = user.UserId
caseUser, _ := caseUserDao.GetCaseUser(maps)
if caseUser != nil {
caseDto.IsJoin = true
}
}
}
}
// 获取平台数据
platformDao := dao.PlatformDao{}
platform, err := platformDao.GetPlatformById(platformId)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 获取该平台全部关联项目
projectPlatformDao := dao.ProjectPlatformDao{}
maps := make(map[string]interface{})
maps["platform_id"] = platformId
projectPlatforms, _ := projectPlatformDao.GetProjectPlatformList(maps)
if len(projectPlatforms) <= 0 {
responses.FailWithMessage("数据异常", c)
return
}
for _, caseDto := range g {
// 加载访问链接
link := config.C.DomainName + "/caseIntro" + "?project_id=" + caseDto.ProjectId + "&source=3" + "&platform_key=" + platform.PlatformKey + "&case_id=" + caseDto.SId
caseDto.LoadLink(link)
for _, m := range projectPlatforms {
projectId := fmt.Sprintf("%d", m.ProjectId)
if projectId == caseDto.ProjectId {
if m.IsWelfare == 1 {
// 单个病例总积分-单个病例已发放积分
diffScore := m.SingleCaseScore - caseDto.IssuedScore
if diffScore > 0 {
caseDto.IsWelfare = true
}
}
}
}
}
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
if config.C.Env == "dev" {
pageSize = 2
}
// 获取数据
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: utils.MaskNameStr(v.User.UserName, 2),
RealName: utils.MaskNameStr(v.User.UserName, 2),
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.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 {
caseItemQuestionOptionDao := dao.CaseItemQuestionOptionDao{}
response.QuestionAnswer = make([]*dto.QuestionAnswerDto, len(caseUserAnswers))
for i2, records := range caseUserAnswers {
var answerValues []string
if records.CaseItemQuestion.QuestionType != 3 {
// 获取对应题目选项
maps = make(map[string]interface{})
maps["question_id"] = records.QuestionId
caseItemQuestionOptions, _ := caseItemQuestionOptionDao.GetCaseItemQuestionOptionList(maps)
answers := strings.Split(records.Answer, "")
for _, answer := range answers {
if records.CaseItemQuestion.QuestionType == 4 {
if answer == "A" {
answerValues = append(answerValues, "正确")
}
if answer == "B" {
answerValues = append(answerValues, "错误")
}
} else {
answerNumber := int(answer[0] - 'A')
if len(caseItemQuestionOptions) >= answerNumber {
answerValues = append(answerValues, caseItemQuestionOptions[answerNumber].OptionValue)
}
}
}
}
questionAnswerDto := &dto.QuestionAnswerDto{
Question: records.CaseItemQuestion.QuestionName,
Answer: strings.Join(answerValues, "|"),
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"] = len(g)
result["total"] = 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)
}