This commit is contained in:
2025-03-07 16:57:28 +08:00
parent 93ab56f580
commit 83fa2cc789
181 changed files with 14333 additions and 0 deletions
+11
View File
@@ -0,0 +1,11 @@
package controller
// Api api接口
type Api struct {
Public // 公共方法
Project // 项目
Case // 病例
ProjectPlatform // 项目-平台
CaseComment // 评论
User // 用户
}
+661
View File
@@ -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)
}
+428
View File
@@ -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)
}
+99
View File
@@ -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)
}
+91
View File
@@ -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)
}
+293
View File
@@ -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("结束")
}
+238
View File
@@ -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)
}