first
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
package controller
|
||||
|
||||
// Api api接口
|
||||
type Api struct {
|
||||
Public // 公共方法
|
||||
Project // 项目
|
||||
Case // 病例
|
||||
ProjectPlatform // 项目-平台
|
||||
CaseComment // 评论
|
||||
User // 用户
|
||||
}
|
||||
@@ -0,0 +1,661 @@
|
||||
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/api/service"
|
||||
"case-api/global"
|
||||
"case-api/utils"
|
||||
"github.com/gin-gonic/gin"
|
||||
"math"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Case struct {
|
||||
}
|
||||
|
||||
// GetCasePage 获取列表-分页
|
||||
func (b *Case) GetCasePage(c *gin.Context) {
|
||||
caseRequest := requests.CaseRequest{}
|
||||
req := caseRequest.GetCasePage
|
||||
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
|
||||
}
|
||||
|
||||
if req.Page == 0 {
|
||||
req.Page = 1
|
||||
}
|
||||
|
||||
if req.PageSize == 0 {
|
||||
req.PageSize = 20
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
// 获取用户信息
|
||||
userDao := dao.UserDao{}
|
||||
user, err := userDao.GetUserById(userId)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("内部错误", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取数据
|
||||
caseDao := dao.CaseDao{}
|
||||
cases, total, err := caseDao.GetCasePageSearch(req, req.Page, req.PageSize)
|
||||
if err != nil {
|
||||
responses.FailWithMessage(err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
// 处理返回值
|
||||
g := dto.GetCaseListDto(cases)
|
||||
|
||||
projectPlatformDao := dao.ProjectPlatformDao{}
|
||||
casePlatformDao := dao.CasePlatformDao{}
|
||||
userService := service.UserService{}
|
||||
for _, caseDto := range g {
|
||||
// 加载是否为新病例(最近7天)
|
||||
caseDto.LoadIsNew(caseDto.CreatedAt)
|
||||
|
||||
// 获取项目关联平台
|
||||
maps := make(map[string]interface{})
|
||||
maps["project_id"] = caseDto.ProjectId
|
||||
maps["platform_id"] = platformId
|
||||
projectPlatform, _ := projectPlatformDao.GetProjectPlatform(maps)
|
||||
if projectPlatform != nil {
|
||||
if caseDto.CaseStatus != 1 {
|
||||
continue
|
||||
}
|
||||
|
||||
// 获取病例平台表
|
||||
maps = make(map[string]interface{})
|
||||
maps["case_id"] = caseDto.CaseId
|
||||
maps["platform_id"] = platformId
|
||||
casePlatform, err := casePlatformDao.GetCasePlatform(maps)
|
||||
if err != nil && casePlatform == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
if projectPlatform.IsWelfare == 1 {
|
||||
// 单个病例总积分-单个病例已发放积分
|
||||
diffScore := projectPlatform.SingleCaseScore - casePlatform.IssuedScore
|
||||
if diffScore > 0 {
|
||||
caseDto.IsWelfare = 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 检测用户是否已参与过病例 -- 需考虑相同手机号的用户
|
||||
caseId, err := strconv.ParseInt(caseDto.CaseId, 10, 64)
|
||||
if err != nil {
|
||||
responses.Fail(c)
|
||||
return
|
||||
}
|
||||
|
||||
isJoin := userService.CheckUserIsJoinCase(caseId, user.MobileEncryption)
|
||||
if isJoin == true {
|
||||
caseDto.LoadIsJoin(true)
|
||||
}
|
||||
}
|
||||
|
||||
result := make(map[string]interface{})
|
||||
result["page"] = req.Page
|
||||
result["page_size"] = req.PageSize
|
||||
result["total"] = total
|
||||
result["data"] = g
|
||||
responses.OkWithData(result, c)
|
||||
}
|
||||
|
||||
// GetCaseQuestionSelectList 获取病例题目选择列表
|
||||
func (b *Case) GetCaseQuestionSelectList(c *gin.Context) {
|
||||
id := c.Param("case_id")
|
||||
if id == "" {
|
||||
responses.FailWithMessage("缺少参数", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 将 id 转换为 int64 类型
|
||||
caseId, err := strconv.ParseInt(id, 10, 64)
|
||||
if err != nil {
|
||||
responses.Fail(c)
|
||||
return
|
||||
}
|
||||
|
||||
platformId := c.GetInt64("PlatformId") // 平台id
|
||||
if platformId == 0 {
|
||||
responses.FailWithMessage("内部错误", c)
|
||||
return
|
||||
}
|
||||
|
||||
userId := c.GetInt64("UserId") // 用户id
|
||||
if userId == 0 {
|
||||
responses.FailWithMessage("内部错误", 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
|
||||
}
|
||||
|
||||
// 获取病例题目列表
|
||||
caseItemQuestionDao := dao.CaseItemQuestionDao{}
|
||||
maps = make(map[string]interface{})
|
||||
maps["case_id"] = caseId
|
||||
caseItemQuestions, err := caseItemQuestionDao.GetCaseItemQuestionPreloadList(maps)
|
||||
|
||||
g := make([]*dto.CaseItemQuestionDto, len(caseItemQuestions))
|
||||
|
||||
for i, v := range caseItemQuestions {
|
||||
questionDto := dto.GetCaseItemQuestionDto(v)
|
||||
|
||||
// 加载数据-病例明细-题目-选项
|
||||
if len(v.CaseItemQuestionOption) > 0 {
|
||||
questionDto = questionDto.LoadCaseItemQuestionOption(v.CaseItemQuestionOption)
|
||||
}
|
||||
|
||||
if len(v.StatCaseQuestion) > 0 {
|
||||
for _, optionDto := range questionDto.CaseItemQuestionOption {
|
||||
for _, caseQuestionDto := range v.StatCaseQuestion {
|
||||
// 将 id 转换为 int64 类型
|
||||
optionId, err := strconv.ParseInt(optionDto.OptionId, 10, 64)
|
||||
if err != nil {
|
||||
responses.Fail(c)
|
||||
return
|
||||
}
|
||||
|
||||
if optionId == caseQuestionDto.QuestionId {
|
||||
// 占比
|
||||
proportion := math.Round(float64(caseQuestionDto.SelectNum)/float64(result.JoinNum)*10000) / 100
|
||||
|
||||
optionDto.LoadProportion(proportion)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 将转换后的结构体添加到新切片中
|
||||
g[i] = questionDto
|
||||
}
|
||||
|
||||
responses.OkWithData(g, c)
|
||||
}
|
||||
|
||||
// FinishCase 完成病例
|
||||
func (b *Case) FinishCase(c *gin.Context) {
|
||||
caseRequest := requests.CaseRequest{}
|
||||
req := caseRequest.FinishCase
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
responses.FailWithMessage(err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
// 参数验证
|
||||
if err := global.Validate.Struct(req); err != nil {
|
||||
responses.FailWithMessage(utils.Translate(err), c)
|
||||
return
|
||||
}
|
||||
|
||||
if len(req.Answer) > 0 || req.Answer == nil {
|
||||
for _, answer := range req.Answer {
|
||||
if err := global.Validate.Struct(answer); err != nil {
|
||||
responses.FailWithMessage(utils.Translate(err), c)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
id := c.Param("case_id")
|
||||
if id == "" {
|
||||
responses.FailWithMessage("缺少参数", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 将 id 转换为 int64 类型
|
||||
caseId, err := strconv.ParseInt(id, 10, 64)
|
||||
if err != nil {
|
||||
responses.Fail(c)
|
||||
return
|
||||
}
|
||||
|
||||
platformId := c.GetInt64("PlatformId") // 平台id
|
||||
if platformId == 0 {
|
||||
responses.FailWithMessage("内部错误", c)
|
||||
return
|
||||
}
|
||||
|
||||
userId := c.GetInt64("UserId") // 用户id
|
||||
if userId == 0 {
|
||||
responses.FailWithMessage("内部错误", c)
|
||||
return
|
||||
}
|
||||
|
||||
projectId, err := strconv.ParseInt(req.ProjectId, 10, 64)
|
||||
if err != nil {
|
||||
responses.Fail(c)
|
||||
return
|
||||
}
|
||||
|
||||
req.PlatformId = platformId
|
||||
req.UserId = userId
|
||||
|
||||
// 获取病例数据
|
||||
caseDao := dao.CaseDao{}
|
||||
caseResult, err := caseDao.GetCaseById(caseId)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("非法病例", c)
|
||||
return
|
||||
}
|
||||
|
||||
if caseResult.CaseStatus == 2 {
|
||||
responses.FailWithMessage("非法病例", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 检测病例是否属于平台
|
||||
casePlatformDao := dao.CasePlatformDao{}
|
||||
maps := make(map[string]interface{})
|
||||
maps["case_id"] = caseId
|
||||
maps["platform_id"] = platformId
|
||||
casePlatform, err := casePlatformDao.GetCasePlatform(maps)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("非法数据", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取用户信息
|
||||
userDao := dao.UserDao{}
|
||||
user, err := userDao.GetUserById(userId)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("非法用户", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 检测用户是否属于白名单
|
||||
projectPlatformWhiteService := service.ProjectPlatformWhiteService{}
|
||||
isWhite, _ := projectPlatformWhiteService.CheckProjectPlatformWhiteByUser(user, projectId, platformId)
|
||||
|
||||
// 开始事务
|
||||
tx := global.Db.Begin()
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
tx.Rollback()
|
||||
}
|
||||
}()
|
||||
|
||||
// 检测用户是否已参与过病例 -- 需考虑相同手机号的用户
|
||||
userService := service.UserService{}
|
||||
isJoin := userService.CheckUserIsJoinCase(caseId, user.MobileEncryption)
|
||||
if isJoin == true {
|
||||
tx.Rollback()
|
||||
// 已参与该病例,无法完成
|
||||
responses.Ok(c)
|
||||
return
|
||||
}
|
||||
|
||||
caseService := service.CaseService{}
|
||||
|
||||
if req.Content != "" {
|
||||
// 处理评论内容
|
||||
basicSensitiveWordService := service.BasicSensitiveWordService{}
|
||||
content, isSensitive := basicSensitiveWordService.Filter(req.Content)
|
||||
|
||||
// 新增评论
|
||||
caseCommentDao := dao.CaseCommentDao{}
|
||||
caseComment := &model.CaseComment{
|
||||
CaseId: caseId,
|
||||
PlatformId: platformId,
|
||||
Level: 1,
|
||||
UserId: userId,
|
||||
Status: 1,
|
||||
IsSensitive: isSensitive,
|
||||
IsHighQuality: 0,
|
||||
IsGrantHighQuality: 0,
|
||||
LikeNum: 0,
|
||||
Content: content,
|
||||
}
|
||||
|
||||
if isSensitive == 1 {
|
||||
caseComment.ContentWord = req.Content
|
||||
}
|
||||
|
||||
caseComment, err = caseCommentDao.AddCaseComment(tx, caseComment)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("评论失败", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 增加病例留言人数
|
||||
err = caseService.AddCaseMessageNum(tx, caseId, casePlatform.CasePlatformId)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("评论失败", c)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if req.StartRead == "" || req.EndRead == "" {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("参数错误", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 新增参与记录
|
||||
caseUser := &model.CaseUser{
|
||||
CaseId: caseId,
|
||||
PlatformId: platformId,
|
||||
UserId: userId,
|
||||
ShareUserIden: req.ShareUserIden,
|
||||
TotalScore: 0,
|
||||
}
|
||||
|
||||
// 开始参与时间
|
||||
startRead, err := time.Parse("2006-01-02 15:04:05", req.StartRead)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("评论失败9", c)
|
||||
return
|
||||
}
|
||||
caseUser.StartTime = model.LocalTime(startRead)
|
||||
|
||||
// 结束参与时间
|
||||
endRead, err := time.Parse("2006-01-02 15:04:05", req.EndRead)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("评论失败8", c)
|
||||
return
|
||||
}
|
||||
caseUser.EndTime = model.LocalTime(endRead)
|
||||
|
||||
// 计算阅读时长
|
||||
readDuration := endRead.Sub(startRead)
|
||||
if readDuration <= 0 {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("评论失败7", c)
|
||||
return
|
||||
}
|
||||
caseUser.ReadDuration = int(readDuration.Seconds())
|
||||
caseUserDao := dao.CaseUserDao{}
|
||||
_, err = caseUserDao.AddCaseUser(tx, caseUser)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("评论失败6", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 增加病例参加人数
|
||||
err = caseService.AddCaseJoinNum(tx, caseId, casePlatform.CasePlatformId, isWhite)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("评论失败5", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 增加用户答题记录
|
||||
if len(req.Answer) > 0 || req.Answer == nil {
|
||||
err = userService.AddCaseUserAnswer(tx, caseId, platformId, userId, caseUser.CaseUserId, req.Answer)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("评论失败4", c)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 发放积分-完成阅读
|
||||
err = userService.ReportUserScore(tx, caseResult.ProjectId, caseId, platformId, 1, user)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("评论失败3", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取项目关联平台配置
|
||||
projectPlatformDao := dao.ProjectPlatformDao{}
|
||||
maps = make(map[string]interface{})
|
||||
maps["project_id"] = req.ProjectId
|
||||
maps["platform_id"] = platformId
|
||||
projectPlatform, err := projectPlatformDao.GetProjectPlatform(maps)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("评论失败1", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 发放积分-阅读时间满足
|
||||
if int(readDuration.Seconds()) >= projectPlatform.ReadDuration {
|
||||
err = userService.ReportUserScore(tx, caseResult.ProjectId, caseId, platformId, 2, user)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("评论失败2", c)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 上报用户答题数据
|
||||
if len(req.Answer) > 0 || req.Answer == nil {
|
||||
err = userService.ReportCaseUserAnswer(caseId, platformId, user, caseUser)
|
||||
if err != nil {
|
||||
// 失败不返回,只记录日志。
|
||||
utils.LogJsonErr("上报用户答题数据", err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
tx.Commit()
|
||||
responses.Ok(c)
|
||||
}
|
||||
|
||||
// GetCase 获取详情
|
||||
func (b *Case) GetCase(c *gin.Context) {
|
||||
id := c.Param("case_id")
|
||||
if id == "" {
|
||||
responses.FailWithMessage("缺少参数", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 将 id 转换为 int64 类型
|
||||
caseId, err := strconv.ParseInt(id, 10, 64)
|
||||
if err != nil {
|
||||
responses.Fail(c)
|
||||
return
|
||||
}
|
||||
|
||||
platformId := c.GetInt64("PlatformId") // 平台id
|
||||
if platformId == 0 {
|
||||
responses.FailWithMessage("内部错误", c)
|
||||
return
|
||||
}
|
||||
|
||||
userId := c.GetInt64("UserId") // 用户id
|
||||
if userId == 0 {
|
||||
responses.FailWithMessage("内部错误", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取用户信息
|
||||
userDao := dao.UserDao{}
|
||||
user, err := userDao.GetUserById(userId)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("内部错误", 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
|
||||
}
|
||||
|
||||
g := dto.GetCaseDto(result)
|
||||
|
||||
caseItemDao := dao.CaseItemDao{}
|
||||
maps = make(map[string]interface{})
|
||||
maps["case_id"] = caseId
|
||||
caseItems, err := caseItemDao.GetCaseItemList(maps)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("数据异常", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 检测用户是否已参与过病例 -- 需考虑相同手机号的用户
|
||||
userService := service.UserService{}
|
||||
isJoin := userService.CheckUserIsJoinCase(caseId, user.MobileEncryption)
|
||||
if isJoin == true {
|
||||
// 已参与该病例
|
||||
g.LoadIsJoin(true)
|
||||
}
|
||||
|
||||
// 加载数据-病例明细
|
||||
g.LoadCaseItem(caseItems)
|
||||
|
||||
// 获取项目关联平台
|
||||
projectPlatformDao := dao.ProjectPlatformDao{}
|
||||
maps = make(map[string]interface{})
|
||||
maps["project_id"] = result.ProjectId
|
||||
maps["platform_id"] = platformId
|
||||
projectPlatform, _ := projectPlatformDao.GetProjectPlatform(maps)
|
||||
if projectPlatform == nil {
|
||||
responses.FailWithMessage("数据异常", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取病例平台表
|
||||
maps = make(map[string]interface{})
|
||||
maps["case_id"] = result.CaseId
|
||||
maps["platform_id"] = platformId
|
||||
casePlatform, _ := casePlatformDao.GetCasePlatform(maps)
|
||||
if casePlatform == nil {
|
||||
responses.FailWithMessage("数据异常", c)
|
||||
return
|
||||
}
|
||||
|
||||
if projectPlatform.IsWelfare == 1 {
|
||||
// 单个病例总积分-单个病例已发放积分
|
||||
diffScore := projectPlatform.SingleCaseScore - casePlatform.IssuedScore
|
||||
if diffScore > 0 {
|
||||
g.IsWelfare = 1
|
||||
}
|
||||
}
|
||||
|
||||
caseItemQuestionDao := dao.CaseItemQuestionDao{}
|
||||
caseItemModelDao := dao.CaseItemModelDao{}
|
||||
for _, item := range g.CaseItem {
|
||||
// 模块
|
||||
maps = make(map[string]interface{})
|
||||
maps["case_item_id"] = item.CaseItemId
|
||||
caseItemModel, err := caseItemModelDao.GetCaseItemModelList(maps)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("数据异常", c)
|
||||
return
|
||||
}
|
||||
|
||||
item.LoadCaseItemModel(caseItemModel)
|
||||
|
||||
maps = make(map[string]interface{})
|
||||
maps["case_item_id"] = item.CaseItemId
|
||||
caseItemQuestions, err := caseItemQuestionDao.GetCaseItemQuestionPreloadList(maps)
|
||||
if err == nil && len(caseItemQuestions) > 0 {
|
||||
// 加载数据-病例明细-题目
|
||||
caseItemQuestionDto := make([]*dto.CaseItemQuestionDto, len(caseItemQuestions))
|
||||
|
||||
for i, v := range caseItemQuestions {
|
||||
questionDto := dto.GetCaseItemQuestionDto(v)
|
||||
|
||||
// 加载数据-病例明细-题目-选项
|
||||
if len(v.CaseItemQuestionOption) > 0 {
|
||||
questionDto = questionDto.LoadCaseItemQuestionOption(v.CaseItemQuestionOption)
|
||||
}
|
||||
|
||||
if len(v.StatCaseQuestion) > 0 {
|
||||
for _, optionDto := range questionDto.CaseItemQuestionOption {
|
||||
for _, caseQuestionDto := range v.StatCaseQuestion {
|
||||
// 将 id 转换为 int64 类型
|
||||
optionId, err := strconv.ParseInt(optionDto.OptionId, 10, 64)
|
||||
if err != nil {
|
||||
responses.Fail(c)
|
||||
return
|
||||
}
|
||||
|
||||
if optionId == caseQuestionDto.OptionId {
|
||||
// 计算占比
|
||||
proportion := math.Round(float64(caseQuestionDto.SelectNum)/float64(result.JoinNum)*10000) / 100
|
||||
|
||||
// 加载数据-占比
|
||||
optionDto.LoadProportion(proportion)
|
||||
|
||||
// 加载数据-被选择数量
|
||||
optionDto.LoadSelectNum(caseQuestionDto.SelectNum)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 将转换后的结构体添加到新切片中
|
||||
caseItemQuestionDto[i] = questionDto
|
||||
}
|
||||
|
||||
item.CaseItemQuestion = caseItemQuestionDto
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
responses.OkWithData(g, c)
|
||||
}
|
||||
@@ -0,0 +1,428 @@
|
||||
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/api/service"
|
||||
"case-api/global"
|
||||
"case-api/utils"
|
||||
"github.com/gin-gonic/gin"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type CaseComment struct {
|
||||
}
|
||||
|
||||
// GetCaseCommentPage 获取列表-分页
|
||||
func (b *CaseComment) GetCaseCommentPage(c *gin.Context) {
|
||||
caseCommentRequest := requests.CaseCommentRequest{}
|
||||
req := caseCommentRequest.GetCaseCommentPage
|
||||
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
|
||||
}
|
||||
|
||||
if req.Page == 0 {
|
||||
req.Page = 1
|
||||
}
|
||||
|
||||
if req.PageSize == 0 {
|
||||
req.PageSize = 20
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
// 获取病例数据
|
||||
caseDao := dao.CaseDao{}
|
||||
caseResult, err := caseDao.GetCaseById(caseId)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("非法病例", c)
|
||||
return
|
||||
}
|
||||
|
||||
if caseResult.CaseStatus == 2 {
|
||||
responses.FailWithMessage("非法病例", 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
|
||||
}
|
||||
|
||||
// 获取评论数据
|
||||
caseCommentDao := dao.CaseCommentDao{}
|
||||
caseComments, total, err := caseCommentDao.GetCaseCommentPageSearch(req, req.Page, req.PageSize)
|
||||
if err != nil {
|
||||
responses.FailWithMessage(err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
// 处理返回值
|
||||
g := dto.GetCaseCommentListDto(caseComments)
|
||||
|
||||
caseCommentLikeDao := dao.CaseCommentLikeDao{}
|
||||
for _, commentDto := range g {
|
||||
// 获取是否点赞
|
||||
maps = make(map[string]interface{})
|
||||
maps["comment_id"] = commentDto.CommentId
|
||||
maps["user_id"] = userId
|
||||
isLike, _ := caseCommentLikeDao.GetCaseCommentLikeCount(maps)
|
||||
|
||||
// 加载数据-点赞
|
||||
commentDto.LoadIsLike(isLike)
|
||||
|
||||
// 获取次级评论
|
||||
maps = make(map[string]interface{})
|
||||
maps["root_id"] = commentDto.CommentId
|
||||
maps["status"] = 1
|
||||
subComments, _ := caseCommentDao.GetCaseCommentPreloadListLimit(maps, 5)
|
||||
if len(subComments) > 0 {
|
||||
// 加载数据-次级评论
|
||||
commentDto.LoadCaseComment(subComments)
|
||||
|
||||
for _, caseCommentDto := range commentDto.CaseComment {
|
||||
// 获取是否点赞
|
||||
maps = make(map[string]interface{})
|
||||
maps["comment_id"] = caseCommentDto.CommentId
|
||||
maps["user_id"] = userId
|
||||
isLike, _ = caseCommentLikeDao.GetCaseCommentLikeCount(maps)
|
||||
|
||||
// 加载数据-点赞
|
||||
commentDto.LoadIsLike(isLike)
|
||||
}
|
||||
|
||||
// 处理剩余评论数量字段
|
||||
maps = make(map[string]interface{})
|
||||
maps["root_id"] = commentDto.CommentId
|
||||
maps["status"] = 1
|
||||
totalAmount, _ := caseCommentDao.GetCaseCommentCount(maps)
|
||||
|
||||
// 加载数据-剩余数量
|
||||
commentDto.LoadTotalAmount(totalAmount - int64(len(subComments)))
|
||||
}
|
||||
}
|
||||
|
||||
result := make(map[string]interface{})
|
||||
result["page"] = req.Page
|
||||
result["page_size"] = req.PageSize
|
||||
result["total"] = total
|
||||
result["data"] = g
|
||||
responses.OkWithData(result, c)
|
||||
}
|
||||
|
||||
// AddCaseComment 新增
|
||||
func (b *CaseComment) AddCaseComment(c *gin.Context) {
|
||||
caseCommentRequest := requests.CaseCommentRequest{}
|
||||
req := caseCommentRequest.AddCaseComment
|
||||
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
|
||||
}
|
||||
|
||||
// 参数判断
|
||||
if req.Comment.Level == 2 || req.Comment.Level == 3 {
|
||||
if req.Comment.ParentId == "" || req.Comment.RootId == "" {
|
||||
responses.FailWithMessage("参数错误", c)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
platformId := c.GetInt64("PlatformId") // 平台id
|
||||
if platformId == 0 {
|
||||
responses.FailWithMessage("内部错误", c)
|
||||
return
|
||||
}
|
||||
|
||||
userId := c.GetInt64("UserId") // 用户id
|
||||
if userId == 0 {
|
||||
responses.FailWithMessage("内部错误", c)
|
||||
return
|
||||
}
|
||||
|
||||
req.PlatformId = platformId
|
||||
req.UserId = userId
|
||||
|
||||
// 将 id 转换为 int64 类型
|
||||
caseId, err := strconv.ParseInt(req.CaseId, 10, 64)
|
||||
if err != nil {
|
||||
responses.Fail(c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取病例数据
|
||||
caseDao := dao.CaseDao{}
|
||||
caseResult, err := caseDao.GetCaseById(caseId)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("非法病例", c)
|
||||
return
|
||||
}
|
||||
|
||||
if caseResult.CaseStatus == 2 {
|
||||
responses.FailWithMessage("非法病例", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 检测病例是否属于平台
|
||||
casePlatformDao := dao.CasePlatformDao{}
|
||||
maps := make(map[string]interface{})
|
||||
maps["case_id"] = caseId
|
||||
maps["platform_id"] = platformId
|
||||
casePlatform, err := casePlatformDao.GetCasePlatform(maps)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("非法数据", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 处理评论内容
|
||||
basicSensitiveWordService := service.BasicSensitiveWordService{}
|
||||
content, isSensitive := basicSensitiveWordService.Filter(req.Comment.Content)
|
||||
|
||||
// 开始事务
|
||||
tx := global.Db.Begin()
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
tx.Rollback()
|
||||
}
|
||||
}()
|
||||
|
||||
// 新增评论
|
||||
caseCommentDao := dao.CaseCommentDao{}
|
||||
caseComment := &model.CaseComment{
|
||||
CaseId: caseId,
|
||||
PlatformId: platformId,
|
||||
Level: req.Comment.Level,
|
||||
UserId: userId,
|
||||
Status: 1,
|
||||
IsSensitive: isSensitive,
|
||||
IsHighQuality: 0,
|
||||
IsGrantHighQuality: 0,
|
||||
LikeNum: 0,
|
||||
Content: content,
|
||||
}
|
||||
|
||||
if isSensitive == 1 {
|
||||
caseComment.ContentWord = req.Comment.Content
|
||||
}
|
||||
|
||||
// 评论根id
|
||||
if req.Comment.RootId != "" {
|
||||
rootId, err := strconv.ParseInt(req.Comment.RootId, 10, 64)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("评论失败", c)
|
||||
return
|
||||
}
|
||||
|
||||
caseComment.RootId = rootId
|
||||
}
|
||||
|
||||
// 评论父级id
|
||||
if req.Comment.ParentId != "" {
|
||||
parentId, err := strconv.ParseInt(req.Comment.ParentId, 10, 64)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("评论失败", c)
|
||||
return
|
||||
}
|
||||
|
||||
caseComment.ParentId = parentId
|
||||
}
|
||||
|
||||
caseComment, err = caseCommentDao.AddCaseComment(tx, caseComment)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("评论失败", c)
|
||||
return
|
||||
}
|
||||
// 增加病例留言人数
|
||||
caseService := service.CaseService{}
|
||||
err = caseService.AddCaseMessageNum(tx, caseId, casePlatform.CasePlatformId)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("评论失败", c)
|
||||
return
|
||||
}
|
||||
|
||||
tx.Commit()
|
||||
responses.Ok(c)
|
||||
}
|
||||
|
||||
// AddCaseCommentLike 新增点赞
|
||||
func (b *CaseComment) AddCaseCommentLike(c *gin.Context) {
|
||||
id := c.Param("comment_id")
|
||||
if id == "" {
|
||||
responses.FailWithMessage("缺少参数", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 将 id 转换为 int64 类型
|
||||
commentId, err := strconv.ParseInt(id, 10, 64)
|
||||
if err != nil {
|
||||
responses.Fail(c)
|
||||
return
|
||||
}
|
||||
|
||||
userId := c.GetInt64("UserId") // 用户id
|
||||
if userId == 0 {
|
||||
responses.FailWithMessage("内部错误", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 检测用户是否已点赞
|
||||
caseCommentLikeDao := dao.CaseCommentLikeDao{}
|
||||
maps := make(map[string]interface{})
|
||||
maps["comment_id"] = commentId
|
||||
maps["user_id"] = userId
|
||||
caseCommentLike, _ := caseCommentLikeDao.GetCaseCommentLike(maps)
|
||||
if caseCommentLike != nil {
|
||||
// 已点赞
|
||||
responses.Ok(c)
|
||||
return
|
||||
}
|
||||
|
||||
// 开始事务
|
||||
tx := global.Db.Begin()
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
tx.Rollback()
|
||||
}
|
||||
}()
|
||||
|
||||
// 新增点赞
|
||||
caseCommentLike = &model.CaseCommentLike{
|
||||
CommentId: commentId,
|
||||
UserId: userId,
|
||||
}
|
||||
_, err = caseCommentLikeDao.AddCaseCommentLike(tx, caseCommentLike)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("操作失败", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 新增点赞数
|
||||
caseCommentDao := dao.CaseCommentDao{}
|
||||
err = caseCommentDao.Inc(tx, commentId, "like_num", 1)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("操作失败", c)
|
||||
return
|
||||
}
|
||||
|
||||
tx.Commit()
|
||||
responses.Ok(c)
|
||||
}
|
||||
|
||||
// DeleteCaseCommentLike 取消点赞
|
||||
func (b *CaseComment) DeleteCaseCommentLike(c *gin.Context) {
|
||||
id := c.Param("comment_id")
|
||||
if id == "" {
|
||||
responses.FailWithMessage("缺少参数", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 将 id 转换为 int64 类型
|
||||
commentId, err := strconv.ParseInt(id, 10, 64)
|
||||
if err != nil {
|
||||
responses.Fail(c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取评论数据
|
||||
caseCommentDao := dao.CaseCommentDao{}
|
||||
caseComment, _ := caseCommentDao.GetCaseCommentById(commentId)
|
||||
if caseComment == nil {
|
||||
responses.FailWithMessage("操作失败", c)
|
||||
return
|
||||
}
|
||||
|
||||
userId := c.GetInt64("UserId") // 用户id
|
||||
if userId == 0 {
|
||||
responses.FailWithMessage("内部错误", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 检测用户是否已点赞
|
||||
caseCommentLikeDao := dao.CaseCommentLikeDao{}
|
||||
maps := make(map[string]interface{})
|
||||
maps["comment_id"] = commentId
|
||||
maps["user_id"] = userId
|
||||
caseCommentLike, _ := caseCommentLikeDao.GetCaseCommentLike(maps)
|
||||
if caseCommentLike == nil {
|
||||
// 未点赞
|
||||
responses.Ok(c)
|
||||
return
|
||||
}
|
||||
|
||||
// 开始事务
|
||||
tx := global.Db.Begin()
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
tx.Rollback()
|
||||
}
|
||||
}()
|
||||
|
||||
// 删除点赞
|
||||
err = caseCommentLikeDao.DeleteCaseCommentLikeById(tx, caseCommentLike.LikeId)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("操作失败", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 去除点赞数
|
||||
if caseComment.LikeNum > 0 {
|
||||
err = caseCommentDao.Dec(tx, commentId, "like_num", 1)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
responses.FailWithMessage("操作失败", c)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
tx.Commit()
|
||||
responses.Ok(c)
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"case-api/api/dao"
|
||||
"case-api/api/dto"
|
||||
"case-api/api/requests"
|
||||
"case-api/api/responses"
|
||||
"case-api/api/service"
|
||||
"case-api/global"
|
||||
"case-api/utils"
|
||||
"github.com/gin-gonic/gin"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Project struct {
|
||||
}
|
||||
|
||||
// GetProjectPage 获取列表-分页
|
||||
func (b *Project) GetProjectPage(c *gin.Context) {
|
||||
ProjectRequest := requests.ProjectRequest{}
|
||||
req := ProjectRequest.GetProjectPage
|
||||
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
|
||||
}
|
||||
|
||||
if req.Page == 0 {
|
||||
req.Page = 1
|
||||
}
|
||||
|
||||
if req.PageSize == 0 {
|
||||
req.PageSize = 20
|
||||
}
|
||||
|
||||
platformId := c.GetInt64("PlatformId") // 平台id
|
||||
if platformId == 0 {
|
||||
responses.FailWithMessage("内部错误", c)
|
||||
return
|
||||
}
|
||||
|
||||
req.PlatformId = platformId
|
||||
|
||||
// 获取数据
|
||||
ProjectDao := dao.ProjectDao{}
|
||||
projects, total, err := ProjectDao.GetProjectPageSearch(req, req.Page, req.PageSize)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("获取数据失败", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 处理返回值
|
||||
g := dto.GetProjectListDto(projects)
|
||||
|
||||
caseDao := dao.CaseDao{}
|
||||
projectService := service.ProjectService{}
|
||||
for _, projectDto := range g {
|
||||
// 获取最近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 {
|
||||
if result.CaseStatus == 1 {
|
||||
// 加载最近更新情况
|
||||
projectDto.LoadIsRecentlyUpdate(result)
|
||||
}
|
||||
}
|
||||
|
||||
projectId, err := strconv.ParseInt(projectDto.ProjectId, 10, 64)
|
||||
if err != nil {
|
||||
responses.Fail(c)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取项目福利存在情况
|
||||
isHaveWelfare := projectService.GetProjectIsHaveWelfare(projectId, platformId)
|
||||
|
||||
// 加载是否开启福利
|
||||
if isHaveWelfare {
|
||||
projectDto.IsWelfare = 1
|
||||
}
|
||||
}
|
||||
|
||||
result := make(map[string]interface{})
|
||||
result["page"] = req.Page
|
||||
result["page_size"] = req.PageSize
|
||||
result["total"] = total
|
||||
result["data"] = g
|
||||
responses.OkWithData(result, c)
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"case-api/api/dao"
|
||||
"case-api/api/dto"
|
||||
"case-api/api/requests"
|
||||
"case-api/api/responses"
|
||||
"case-api/api/service"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type ProjectPlatform struct{}
|
||||
|
||||
// GetProjectPlatform 获取详情
|
||||
func (b *ProjectPlatform) GetProjectPlatform(c *gin.Context) {
|
||||
projectPlatformRequest := requests.ProjectPlatformRequest{}
|
||||
req := projectPlatformRequest.GetProjectPlatform
|
||||
if err := c.ShouldBind(&req); err != nil {
|
||||
responses.FailWithMessage(err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
userId := c.GetInt64("UserId") // 用户id
|
||||
if userId == 0 {
|
||||
responses.FailWithMessage("内部错误", c)
|
||||
return
|
||||
}
|
||||
|
||||
platformId := c.GetInt64("PlatformId") // 平台id
|
||||
if platformId == 0 {
|
||||
responses.FailWithMessage("内部错误", c)
|
||||
return
|
||||
}
|
||||
|
||||
platformDao := dao.PlatformDao{}
|
||||
platform, err := platformDao.GetPlatformById(platformId)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("数据异常", c)
|
||||
return
|
||||
}
|
||||
|
||||
if platform.PlatformStatus == 2 {
|
||||
responses.FailWithMessage("数据异常", c)
|
||||
return
|
||||
}
|
||||
|
||||
projectPlatformDao := dao.ProjectPlatformDao{}
|
||||
maps := make(map[string]interface{})
|
||||
maps["project_id"] = req.ProjectId
|
||||
maps["platform_id"] = platformId
|
||||
projectPlatform, err := projectPlatformDao.GetProjectPlatform(maps)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("数据异常", c)
|
||||
return
|
||||
}
|
||||
|
||||
if projectPlatform.Status == 0 {
|
||||
responses.FailWithMessage("数据异常", c)
|
||||
return
|
||||
}
|
||||
|
||||
g := dto.GetProjectPlatformDto(projectPlatform)
|
||||
|
||||
// 加载数据-平台名称
|
||||
g.LoadPlatFormName(platform)
|
||||
|
||||
// 获取用户信息
|
||||
userDao := dao.UserDao{}
|
||||
user, err := userDao.GetUserById(userId)
|
||||
if err != nil {
|
||||
responses.FailWithMessage("数据异常", c)
|
||||
return
|
||||
}
|
||||
|
||||
// 检测用户是否属于白名单
|
||||
projectPlatformWhiteService := service.ProjectPlatformWhiteService{}
|
||||
isWhite, _ := projectPlatformWhiteService.CheckProjectPlatformWhiteByUser(user, projectPlatform.ProjectId, platformId)
|
||||
|
||||
// 加载数据-用户白名单
|
||||
g.LoadIsWhiteUser(isWhite)
|
||||
|
||||
if platformId == 2 {
|
||||
g.SingleCaseScore = g.SingleCaseScore * 10
|
||||
g.CompleteRead = g.CompleteRead * 10
|
||||
g.CompleteReadTime = g.CompleteReadTime * 10
|
||||
g.FirstHighQuality = g.FirstHighQuality * 10
|
||||
g.OnceMoreHighQuality = g.OnceMoreHighQuality * 10
|
||||
}
|
||||
|
||||
responses.OkWithData(g, c)
|
||||
}
|
||||
@@ -0,0 +1,293 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"case-api/api/dao"
|
||||
"case-api/api/dto"
|
||||
"case-api/api/requests"
|
||||
"case-api/api/responses"
|
||||
"case-api/api/service"
|
||||
"case-api/global"
|
||||
"case-api/utils"
|
||||
"fmt"
|
||||
"github.com/gin-gonic/gin"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
type Public struct{}
|
||||
|
||||
// Login 登陆
|
||||
func (b *Public) Login(c *gin.Context) {
|
||||
publicRequest := requests.PublicRequest{}
|
||||
req := publicRequest.Login
|
||||
if err := c.ShouldBind(&req); err != nil {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": utils.Translate(err),
|
||||
"code": -1,
|
||||
"data": gin.H{
|
||||
"source": req.Source,
|
||||
},
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// 参数验证
|
||||
if err := global.Validate.Struct(req); err != nil {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": utils.Translate(err),
|
||||
"code": -1,
|
||||
"data": gin.H{
|
||||
"source": req.Source,
|
||||
},
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if req.UserIden == "" && req.UnionId == "" && req.Token == "" {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "缺少参数",
|
||||
"code": -1,
|
||||
"data": gin.H{
|
||||
"source": req.Source,
|
||||
},
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// 检测平台
|
||||
platformDao := dao.PlatformDao{}
|
||||
maps := make(map[string]interface{})
|
||||
maps["platform_key"] = req.PlatformKey
|
||||
platform, err := platformDao.GetPlatform(maps)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "非法平台",
|
||||
"code": -1,
|
||||
"data": gin.H{
|
||||
"source": req.Source,
|
||||
},
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// 检测状态
|
||||
if platform.PlatformStatus == 2 {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "非法平台",
|
||||
"code": -1,
|
||||
"data": gin.H{
|
||||
"source": req.Source,
|
||||
},
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// 验证参数
|
||||
if req.Source == 3 {
|
||||
if req.ProjectId == "" {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "缺少参数:项目标识",
|
||||
"code": -1,
|
||||
"data": gin.H{
|
||||
"source": req.Source,
|
||||
},
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if req.MobileEncryption == "" {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "缺少参数:手机号",
|
||||
"code": -1,
|
||||
"data": gin.H{
|
||||
"source": req.Source,
|
||||
},
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if req.DoctorName == "" {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "缺少参数:医生名称",
|
||||
"code": -1,
|
||||
"data": gin.H{
|
||||
"source": req.Source,
|
||||
},
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if req.HospitalName == "" {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "缺少参数:医院名称",
|
||||
"code": -1,
|
||||
"data": gin.H{
|
||||
"source": req.Source,
|
||||
},
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if req.DepartmentName == "" {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "缺少参数:科室名称",
|
||||
"code": -1,
|
||||
"data": gin.H{
|
||||
"source": req.Source,
|
||||
},
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if req.Address == "" {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "缺少参数:地址",
|
||||
"code": -1,
|
||||
"data": gin.H{
|
||||
"source": req.Source,
|
||||
},
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if req.UserIden == "" {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "缺少参数:用户唯一标识",
|
||||
"code": -1,
|
||||
"data": gin.H{
|
||||
"source": req.Source,
|
||||
},
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 开始事务
|
||||
tx := global.Db.Begin()
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
tx.Rollback()
|
||||
}
|
||||
}()
|
||||
|
||||
// 获取用户数据-不存在时注册
|
||||
userService := service.UserService{}
|
||||
user, err := userService.GetUserInfo(tx, req)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
if req.Source == 2 {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "登录失败",
|
||||
"code": -2,
|
||||
"data": gin.H{
|
||||
"source": req.Source,
|
||||
},
|
||||
})
|
||||
|
||||
return
|
||||
} else {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "登录失败",
|
||||
"code": -2,
|
||||
"data": gin.H{
|
||||
"source": req.Source,
|
||||
},
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 下发token
|
||||
token := &utils.Token{
|
||||
UserId: fmt.Sprintf("%d", user.UserId),
|
||||
PlatformId: fmt.Sprintf("%d", platform.PlatformId),
|
||||
}
|
||||
|
||||
// 生成jwt
|
||||
jwt, err := token.NewJWT()
|
||||
if err != nil || jwt == "" {
|
||||
tx.Rollback()
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "登陆失败",
|
||||
"code": -1,
|
||||
"data": gin.H{
|
||||
"source": req.Source,
|
||||
},
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
g := dto.UserLoginDto(user)
|
||||
|
||||
g.LoadToken(jwt)
|
||||
|
||||
tx.Commit()
|
||||
responses.OkWithData(g, c)
|
||||
}
|
||||
|
||||
func (b *Public) T(c *gin.Context) {
|
||||
// 开始事务
|
||||
tx := global.Db.Begin()
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
tx.Rollback()
|
||||
}
|
||||
}()
|
||||
|
||||
//// 获取用户信息
|
||||
//userDao := dao.UserDao{}
|
||||
//user, err := userDao.GetUserById(1)
|
||||
//if err != nil {
|
||||
// tx.Rollback()
|
||||
// fmt.Println(err)
|
||||
// return
|
||||
//}
|
||||
//
|
||||
//userService := service.UserService{}
|
||||
//err = userService.ReportUserScore(tx, 1, 1, 2, 1, user)
|
||||
//if err != nil {
|
||||
// tx.Rollback()
|
||||
// fmt.Println(err)
|
||||
// return
|
||||
//}
|
||||
|
||||
// 获取用户信息
|
||||
userDao := dao.UserDao{}
|
||||
user, err := userDao.GetUserById(1)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
caseUserDao := dao.CaseUserDao{}
|
||||
caseUser, err := caseUserDao.GetCaseUserById(1877273809162080256)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
userService := service.UserService{}
|
||||
// 上报用户答题数据
|
||||
err = userService.ReportCaseUserAnswer(1, 2, user, caseUser)
|
||||
if err != nil {
|
||||
// 失败不返回,只记录日志。
|
||||
fmt.Println(err)
|
||||
}
|
||||
|
||||
fmt.Println("结束")
|
||||
}
|
||||
@@ -0,0 +1,238 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user