394 lines
10 KiB
Go
394 lines
10 KiB
Go
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
|
||
}
|