2025-10-11 13:52:39 +08:00

394 lines
10 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package service
import (
"case-admin-api/api/dao"
"case-admin-api/api/model"
"case-admin-api/extend/aliyun"
"case-admin-api/extend/app"
"case-admin-api/extend/superKangaroo"
"errors"
"fmt"
"gorm.io/gorm"
"io"
"math/rand"
"net/http"
"time"
)
type UserService struct {
}
// HandleUserImage 处理用户图片
func (r *UserService) HandleUserImage(wxAvatar string) (ossPath string, err error) {
if wxAvatar == "" {
return "", nil
}
// 发送GET请求
resp, err := http.Get(wxAvatar)
if err != nil {
return "", err
}
defer func(Body io.ReadCloser) {
_ = Body.Close()
}(resp.Body)
if resp.StatusCode != 200 {
return "", errors.New("请求失败")
}
// 读取响应体
respBody, err := io.ReadAll(resp.Body)
if err != nil {
return "", err
}
// 设置文件名字
now := time.Now()
dateTimeString := now.Format("20060102150405") // 当前时间字符串
rand.New(rand.NewSource(time.Now().UnixNano())) // 设置随机数
ossPath = "user/avatar/" + dateTimeString + fmt.Sprintf("%d", rand.Intn(9000)+1000) + ".png"
// 上传oss
_, err = aliyun.PutObjectByte(ossPath, respBody)
if err != nil {
return "", err
}
ossPath = "/" + ossPath
return ossPath, nil
}
// ReportUserScore 发放积分
// scoreType : 积分类型1:完成阅读 2:阅读时间满足 3:优质留言 4:再次优质留言
func (r *UserService) ReportUserScore(tx *gorm.DB, projectId, caseId, platformId int64, scoreType int, user *model.User) (reportUser *model.User, err error) {
maps := make(map[string]interface{})
// // 获取项目关联平台
// projectPlatformDao := dao.ProjectPlatformDao{}
// maps["project_id"] = projectId
// maps["platform_id"] = platformId
// projectPlatform, err := projectPlatformDao.GetProjectPlatform(maps)
// if err != nil {
// return err
// }
// // 检测福利开关
// if projectPlatform.IsWelfare == 0 {
// // 福利未开
// return nil
// }
// // 获取需发放积分
// score := 0
// appScoreTypeStr := "" // 积分发放原因-app
// superScoreTypeStr := "" // 积分发放原因-超级袋鼠
// nodeName := "" // 获取积分节点名称
// if scoreType == 1 {
// // 完成阅读
// score = projectPlatform.CompleteRead
// appScoreTypeStr = "互动病例-完成阅读"
// superScoreTypeStr = "调研奖励(完成阅读)"
// nodeName = "学习"
// } else if scoreType == 2 {
// // 阅读时间满足
// score = projectPlatform.CompleteReadTime
// appScoreTypeStr = "互动病例-阅读时间满足"
// superScoreTypeStr = "调研奖励(阅读质量)"
// nodeName = "阅读达标"
// } else if scoreType == 3 {
// // 优质留言
// score = projectPlatform.FirstHighQuality
// appScoreTypeStr = "互动病例-优质留言"
// superScoreTypeStr = "调研奖励(社区贡献)"
// nodeName = "优质留言"
// } else if scoreType == 4 {
// // 再次优质留言
// score = projectPlatform.OnceMoreHighQuality
// appScoreTypeStr = "互动病例-优质留言"
// superScoreTypeStr = "调研奖励(社区贡献)"
// nodeName = "优质留言"
// }
recordScoreDao := dao.RecordScoreDao{}
// 检测是否有相同手机号用户
userDao := dao.UserDao{}
maps = make(map[string]interface{})
maps["mobile_encryption"] = user.MobileEncryption
users, err := userDao.GetUserList(maps)
if err != nil {
return user,nil
}
for _, m := range users {
// 检测积分是否已在其他平台发放过
maps = make(map[string]interface{})
maps["project_id"] = projectId
maps["case_id"] = caseId
maps["user_id"] = m.UserId
recordScore, _ := recordScoreDao.GetRecordScoreUseTx(tx, maps)
if recordScore != nil {
if recordScore.PlatformId != platformId {
// 由其他平台进行发放积分 修改平台id为其他平台id
platformId = recordScore.PlatformId
user = m
}
}
// 检测该类型积分是否已经发放(其他平台也算)
maps = make(map[string]interface{})
maps["project_id"] = projectId
maps["case_id"] = caseId
maps["platform_id"] = platformId
maps["user_id"] = m.UserId
maps["type"] = scoreType
recordScore, _ = recordScoreDao.GetRecordScore(maps)
if recordScore != nil {
// 积分已发放过
return user,nil
}
}
// 获取项目关联平台
projectPlatformDao := dao.ProjectPlatformDao{}
maps = make(map[string]interface{})
maps["project_id"] = projectId
maps["platform_id"] = platformId
projectPlatform, err := projectPlatformDao.GetProjectPlatform(maps)
if err != nil {
return user,err
}
// 检测福利开关
if projectPlatform.IsWelfare == 0 {
// 福利未开
return user,nil
}
// 获取需发放积分
score := 0
appScoreTypeStr := "" // 积分发放原因-app
superScoreTypeStr := "" // 积分发放原因-超级袋鼠
nodeName := "" // 获取积分节点名称
if scoreType == 1 {
// 完成阅读
score = projectPlatform.CompleteRead
appScoreTypeStr = "互动病例-完成阅读"
superScoreTypeStr = "调研奖励(完成阅读)"
nodeName = "学习"
} else if scoreType == 2 {
// 阅读时间满足
score = projectPlatform.CompleteReadTime
appScoreTypeStr = "互动病例-阅读时间满足"
superScoreTypeStr = "调研奖励(阅读质量)"
nodeName = "阅读达标"
} else if scoreType == 3 {
// 优质留言
score = projectPlatform.FirstHighQuality
appScoreTypeStr = "互动病例-优质留言"
superScoreTypeStr = "调研奖励(社区贡献)"
nodeName = "优质留言"
} else if scoreType == 4 {
// 再次优质留言
score = projectPlatform.OnceMoreHighQuality
appScoreTypeStr = "互动病例-优质留言"
superScoreTypeStr = "调研奖励(社区贡献)"
nodeName = "优质留言"
}
// 默认为白名单用户
isWhite := true
if projectPlatform.IsWhite == 1 {
projectPlatformWhiteService := ProjectPlatformWhiteService{}
isWhite, err = projectPlatformWhiteService.CheckProjectPlatformWhiteByUser(user, projectId, platformId)
if err != nil {
return user,err
}
}
// 佳动力需求:非白名单用户也需要请求积分记录
// 当用户为非白名单时,重置积分数
if isWhite == false {
score = 0
}
// 获取病例关联平台数据
casePlatformDao := dao.CasePlatformDao{}
maps = make(map[string]interface{})
maps["case_id"] = caseId
maps["platform_id"] = platformId
casePlatform, err := casePlatformDao.GetCasePlatform(maps)
if err != nil {
return user,err
}
// 检测全部积分是否已发放完毕
remainingScore := projectPlatform.SingleCaseScore - casePlatform.IssuedScore
if remainingScore <= 0 {
// 积分已发放完毕
return user,nil
}
// 新增发放记录-每发一次记录一次
recordScore := &model.RecordScore{
ProjectId: projectId,
CaseId: caseId,
PlatformId: platformId,
UserId: user.UserId,
UserName: user.UserName,
Type: scoreType,
NodeName: nodeName,
Score: score,
}
recordScore, err = recordScoreDao.AddRecordScore(tx, recordScore)
if err != nil {
return user,err
}
// 获取用户参与记录
caseUserDao := dao.CaseUserDao{}
maps = make(map[string]interface{})
maps["case_id"] = caseId
maps["platform_id"] = platformId
maps["user_id"] = user.UserId
caseUser, _ := caseUserDao.GetCaseUserUseTx(tx, maps)
if caseUser == nil {
return user,errors.New("用户还未完成该病例阅读,请稍后再试")
}
// 累计用户领取积分数据
err = caseUserDao.Inc(tx, caseUser.CaseUserId, "total_score", score)
if err != nil {
return user,err
}
// 累计平台发放积分数据
err = casePlatformDao.Inc(tx, casePlatform.CasePlatformId, "issued_score", score)
if err != nil {
return user,err
}
// 累计发放积分数据
caseDao := dao.CaseDao{}
err = caseDao.Inc(tx, caseId, "issued_score", score)
if err != nil {
return user,err
}
// 发放积分-
if platformId != 1 && platformId != 2 {
return user,errors.New("积分发放失败")
}
// 肝胆相照
if platformId == 1 && score > 0 {
_, err = app.ReportUserScore(appScoreTypeStr, user.UserIden, score)
if err != nil {
return user,err
}
}
// 超级袋鼠
if platformId == 2 {
// 获取病例数据
caseDao := dao.CaseDao{}
result, err := caseDao.GetCaseById(caseId)
if err != nil {
return user,err
}
_, err = superKangaroo.ReportUserScore(caseId, user.UserIden, superScoreTypeStr, recordScore, result)
if err != nil {
return user,err
}
}
return user,nil
}
// ReportCaseRecord 上报用户参与情况-只上报优质留言
func (r *UserService) ReportCaseRecord(tx *gorm.DB, projectId, caseId int64, user *model.User) (err error) {
caseUserDao := dao.CaseUserDao{}
maps := make(map[string]interface{})
maps["case_id"] = caseId
maps["user_id"] = user.UserId
caseUser, err := caseUserDao.GetCaseUser(maps)
if err != nil {
return err
}
recordScoreDao := dao.RecordScoreDao{}
caseCommentDao := dao.CaseCommentDao{}
// 获取积分发放记录
maps = make(map[string]interface{})
maps["project_id"] = projectId
maps["case_id"] = caseId
maps["platform_id"] = caseUser.PlatformId
maps["user_id"] = user.UserId
recordScores, _ := recordScoreDao.GetRecordScoreListUseTx(tx, maps)
// 获取用户评论
maps = make(map[string]interface{})
maps["case_id"] = caseId
maps["platform_id"] = caseUser.PlatformId
maps["user_id"] = user.UserId
maps["status"] = 1
caseComments, _ := caseCommentDao.GetCaseCommentList(maps)
// 组装请求数据
requestData := superKangaroo.ReportCaseRecordRequest{
CaseUserId: fmt.Sprintf("%d", caseUser.CaseUserId),
Sid: fmt.Sprintf("%d", caseUser.CaseId),
TslUid: user.UserIden,
Credit1: 0,
Credit2: 0,
Credit3: 0,
Credit4: 0,
HasRemark: 0,
Remark: nil,
}
// 积分
for _, v3 := range recordScores {
if v3.Type == 1 {
requestData.Credit1 = v3.Score
}
if v3.Type == 2 {
requestData.Credit2 = v3.Score
}
if v3.Type == 3 {
requestData.Credit4 = v3.Score
}
}
// 评论
if len(caseComments) > 0 {
requestData.Remark = make([]*superKangaroo.RemarkRequest, len(caseComments))
requestData.HasRemark = 1
for i2, comment := range caseComments {
remarkDto := &superKangaroo.RemarkRequest{
Remark: comment.Content,
CreateTime: time.Time(comment.CreatedAt).Format("2006-01-02 15:04:05"),
}
requestData.Remark[i2] = remarkDto
}
}
_, err = superKangaroo.ReportCaseRecord(requestData)
if err != nil {
return err
}
return nil
}