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
+69
View File
@@ -0,0 +1,69 @@
package service
import (
"case-api/api/dao"
)
type BasicSensitiveWordService struct {
}
type TrieNode struct {
Children map[rune]*TrieNode
IsEnd bool
}
type Trie struct {
Root *TrieNode
}
func (t *Trie) Insert(word string) {
node := t.Root
for _, ch := range word {
if node.Children[ch] == nil {
node.Children[ch] = &TrieNode{Children: make(map[rune]*TrieNode)}
}
node = node.Children[ch]
}
node.IsEnd = true
}
func (t *Trie) Filter(comment string) (s string, isSensitive int) {
runes := []rune(comment)
n := len(runes)
for i := 0; i < n; i++ {
node := t.Root
j := i
for j < n && node.Children[runes[j]] != nil {
node = node.Children[runes[j]]
j++
if node.IsEnd {
for k := i; k < j; k++ {
runes[k] = '*'
isSensitive = 1
}
break
}
}
}
return string(runes), isSensitive
}
// Filter 过滤敏感词
func (r *BasicSensitiveWordService) Filter(comment string) (s string, isSensitive int) {
basicSensitiveWordDao := dao.BasicSensitiveWordDao{}
maps := make(map[string]interface{})
basicSensitiveWords, _ := basicSensitiveWordDao.GetBasicSensitiveWordList(maps)
if len(basicSensitiveWords) <= 0 {
return comment, isSensitive
}
trie := &Trie{Root: &TrieNode{Children: make(map[rune]*TrieNode)}}
for _, word := range basicSensitiveWords {
trie.Insert(word.Word)
}
comment, isSensitive = trie.Filter(comment)
trie = &Trie{}
return comment, isSensitive
}
+64
View File
@@ -0,0 +1,64 @@
package service
import (
"case-api/api/dao"
"errors"
"gorm.io/gorm"
)
type CaseService struct {
}
// AddCaseMessageNum 增加病例留言人数
func (r *CaseService) AddCaseMessageNum(tx *gorm.DB, caseId, casePlatformId int64) (err error) {
// 增加病例多平台留言人数
caseDao := dao.CaseDao{}
err = caseDao.Inc(tx, caseId, "message_num", 1)
if err != nil {
return errors.New("评论失败")
}
// 增加用户所属平台留言人数
casePlatformDao := dao.CasePlatformDao{}
err = casePlatformDao.Inc(tx, casePlatformId, "message_num", 1)
if err != nil {
return errors.New("评论失败")
}
return nil
}
// AddCaseJoinNum 增加病例参加人数
func (r *CaseService) AddCaseJoinNum(tx *gorm.DB, caseId, casePlatformId int64, isWhite bool) (err error) {
caseDao := dao.CaseDao{}
casePlatformDao := dao.CasePlatformDao{}
// 增加病例多平台参加总人数
err = caseDao.Inc(tx, caseId, "join_num", 1)
if err != nil {
return errors.New("评论失败")
}
// 增加用户所属平台参加人数
err = casePlatformDao.Inc(tx, casePlatformId, "join_num", 1)
if err != nil {
return errors.New("评论失败")
}
// 白名单
if isWhite == true {
// 增加病例多平台白名单参加总人数
err = caseDao.Inc(tx, caseId, "join_white_num", 1)
if err != nil {
return errors.New("评论失败")
}
// 增加用户所属平台白名单参加人数
err = casePlatformDao.Inc(tx, casePlatformId, "join_white_num", 1)
if err != nil {
return errors.New("评论失败")
}
}
return nil
}
+54
View File
@@ -0,0 +1,54 @@
package service
import "case-api/api/dao"
type ProjectService struct {
}
// GetProjectIsHaveWelfare 获取项目福利存在情况
func (r *ProjectService) GetProjectIsHaveWelfare(projectId, platformId int64) bool {
var isHaveWelfare bool
// 获取项目关联平台
projectPlatformDao := dao.ProjectPlatformDao{}
maps := make(map[string]interface{})
maps["project_id"] = projectId
maps["platform_id"] = platformId
projectPlatform, _ := projectPlatformDao.GetProjectPlatform(maps)
if projectPlatform == nil {
return false
}
// 获取项目关联病例
caseDao := dao.CaseDao{}
maps = make(map[string]interface{})
maps["project_id"] = projectId
results, _ := caseDao.GetCaseList(maps)
if len(results) > 0 {
casePlatformDao := dao.CasePlatformDao{}
for _, result := range results {
if result.CaseStatus != 1 {
continue
}
// 获取病例平台表
maps = make(map[string]interface{})
maps["case_id"] = result.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 {
isHaveWelfare = true
}
}
}
}
return isHaveWelfare
}
+130
View File
@@ -0,0 +1,130 @@
package service
import (
"case-api/api/dao"
"case-api/api/model"
"case-api/utils"
)
// ProjectPlatformWhiteService 项目关联平台白名单
type ProjectPlatformWhiteService struct {
}
// CheckProjectPlatformWhiteByUser 检测用户是否属于白名单
func (r *ProjectPlatformWhiteService) CheckProjectPlatformWhiteByUser(user *model.User, projectId, platformId int64) (b bool, err error) {
// 获取项目关联平台数据
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 false, err
}
// 肝胆相照平台,如果没有开启白名单,默认返回用户属于白名单
if projectPlatform.PlatformId == 1 && projectPlatform.IsWhite == 0 {
return true, err
}
// 白名单-医生
projectPlatformDoctorDao := dao.ProjectPlatformDoctorDao{}
maps = make(map[string]interface{})
maps["project_platform_id"] = projectPlatform.ProjectPlatformId
maps["user_id"] = user.UserId
projectPlatformDoctor, _ := projectPlatformDoctorDao.GetProjectPlatformDoctor(maps)
if projectPlatformDoctor != nil {
if projectPlatformDoctor.Status == 1 {
return true, err
}
}
// 获取用户医院数据
basicHospitalDao := dao.BasicHospitalDao{}
basicHospital, err := basicHospitalDao.GetBasicHospitalById(user.HospitalId)
if err != nil {
return false, err
}
// 白名单-医院
projectPlatformHospitalDao := dao.ProjectPlatformHospitalDao{}
maps = make(map[string]interface{})
maps["project_platform_id"] = projectPlatform.ProjectPlatformId
maps["hospital_id"] = user.HospitalId
projectPlatformHospital, _ := projectPlatformHospitalDao.GetProjectPlatformHospital(maps)
if projectPlatformHospital != nil {
if projectPlatformHospital.Status == 1 {
return true, err
}
}
// 白名单-动态
projectPlatformDynamicDao := dao.ProjectPlatformDynamicDao{}
maps = make(map[string]interface{})
maps["project_platform_id"] = projectPlatform.ProjectPlatformId
projectPlatformDynamics, _ := projectPlatformDynamicDao.GetProjectPlatformDynamicPreloadList(maps)
if len(projectPlatformDynamics) > 0 {
area := true
level := true
title := true
department := true
for _, dynamic := range projectPlatformDynamics {
if dynamic.Status == 2 {
continue
}
if dynamic.DynamicType == "area" {
area = false
}
if dynamic.DynamicType == "level" {
level = false
}
if dynamic.DynamicType == "title" {
title = false
}
if dynamic.DynamicType == "department" {
department = false
}
for _, item := range dynamic.ProjectPlatformDynamicItem {
// 省份
if dynamic.DynamicType == "area" {
if basicHospital.Province == item.ItemValue {
area = true
}
}
// 医院等级
if dynamic.DynamicType == "level" {
if basicHospital.HospitalLevel == item.ItemValue {
level = true
}
}
// 职称
if dynamic.DynamicType == "title" {
if utils.DoctorTitleToString(user.Title) == item.ItemValue {
title = true
}
}
// 科室
if dynamic.DynamicType == "department" {
if user.DepartmentName == item.ItemValue {
department = true
}
}
}
}
if area == true && level == true && title == true && department == true {
return true, err
}
}
return false, err
}
+35
View File
@@ -0,0 +1,35 @@
package service
import (
"case-api/extend/aliyun"
"errors"
"net/http"
)
type PublicService struct {
}
// GetUserIP 获取用户ip
func (r *PublicService) GetUserIP(h *http.Request) string {
forwarded := h.Header.Get("X-FORWARDED-FOR")
if forwarded != "" {
return forwarded
}
return h.RemoteAddr
}
// GetOssSign 获取oss签名
func (a *PublicService) GetOssSign(scene int) (*aliyun.GetOssSignResponse, error) {
var dir string
if scene == 1 {
dir = dir + "user/avatar/"
}
if dir == "" {
return nil, errors.New("获取签名失败")
}
// 生成签名
ossSign, _ := aliyun.GetOssSign(dir)
return ossSign, nil
}
+784
View File
@@ -0,0 +1,784 @@
package service
import (
"case-api/api/dao"
"case-api/api/model"
"case-api/api/requests"
"case-api/extend/aliyun"
"case-api/extend/app"
"case-api/extend/superKangaroo"
"case-api/utils"
"errors"
"fmt"
"gorm.io/gorm"
"io"
"math/rand"
"net/http"
"strconv"
"strings"
"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
}
// GetUserInfo 获取用户数据-不存在时注册,存在时更新
func (r *UserService) GetUserInfo(tx *gorm.DB, req requests.Login) (user *model.User, err error) {
userDao := dao.UserDao{}
basicHospitalDao := dao.BasicHospitalDao{}
// 佳动力
if req.Source == 3 {
// 获取用户数据
maps := make(map[string]interface{})
if req.UserIden != "" {
maps["user_iden"] = req.UserIden // 以此字段来判别是否同一个用户
}
if req.UnionId != "" {
maps["union_id"] = req.UnionId // 以此字段来判别是否同一个用户
}
user, _ = userDao.GetUser(maps)
if user != nil {
// 获取用户医院
basicHospital, err := basicHospitalDao.GetBasicHospitalById(user.HospitalId)
if err != nil {
return nil, err
}
// 修改用户医院
basicHospitalData := make(map[string]interface{})
if basicHospital.HospitalName != req.HospitalName {
basicHospitalData["hospital_name"] = req.HospitalName
}
if len(basicHospitalData) > 0 {
err = basicHospitalDao.EditBasicHospitalById(tx, user.HospitalId, basicHospitalData)
if err != nil {
return nil, err
}
}
// 修改用户
userData := make(map[string]interface{})
if user.UserName != req.DoctorName {
userData["user_name"] = req.HospitalName
user.UserName = req.HospitalName
}
if user.MobileEncryption != req.MobileEncryption {
userData["mobile_encryption"] = req.MobileEncryption
}
if user.Title != utils.DoctorTitleToInt(req.Title) {
userData["title"] = utils.DoctorTitleToInt(req.Title)
}
if user.DepartmentName != req.DepartmentName {
userData["department_name"] = req.DepartmentName
}
if user.Address != req.Address {
userData["address"] = req.Address
}
if len(userData) > 0 {
err = userDao.EditUserById(tx, user.UserId, userData)
if err != nil {
return nil, err
}
}
// 处理用户白名单
err = r.HandleUserWhite(tx, req.IsWhite, req.PlatformKey, req.ProjectId, user.UserId)
if err != nil {
return nil, err
}
} else {
// 佳动力
// 检测医院是否存在
maps = make(map[string]interface{})
maps["source"] = 3
maps["hospital_name"] = req.HospitalName
basicHospital, _ := basicHospitalDao.GetBasicHospital(maps)
if basicHospital == nil {
// 添加医院
hospital := &model.BasicHospital{
HospitalName: req.HospitalName,
Source: req.Source,
HospitalLevel: "未知",
DoctorNumber: 0,
Province: "",
City: "",
County: "",
Address: "",
}
basicHospital, err = basicHospitalDao.AddBasicHospital(tx, hospital)
if err != nil {
return nil, err
}
}
// 添加用户
user = &model.User{
UserIden: req.UserIden,
UserName: req.DoctorName,
UserMobile: "",
MobileEncryption: req.MobileEncryption,
Status: 1,
RegisterSource: 3,
OpenId: "",
UnionId: "",
Sex: 0,
Avatar: "",
Title: utils.DoctorTitleToInt(req.Title),
DepartmentName: req.DepartmentName,
HospitalId: basicHospital.HospitalId,
Address: req.Address,
}
user, err = userDao.AddUser(tx, user)
if err != nil {
return nil, err
}
// 添加医院拥有医生人数
err = basicHospitalDao.Inc(tx, basicHospital.HospitalId, "doctor_number", 1)
if err != nil {
return nil, err
}
// 处理用户白名单
err = r.HandleUserWhite(tx, req.IsWhite, req.PlatformKey, req.ProjectId, user.UserId)
if err != nil {
return nil, err
}
}
}
if req.Source == 2 {
// 获取医生数据-app
user, err = r.GetAppUserInfo(tx, req)
if err != nil {
return nil, err
}
}
return user, nil
}
// AddCaseUserAnswer 增加用户答题记录
func (r *UserService) AddCaseUserAnswer(tx *gorm.DB, caseId, platformId, userId, caseUserId int64, answers []*requests.Answer) (err error) {
// 检测是否已经答题
caseUserAnswerDao := dao.CaseUserAnswerDao{}
maps := make(map[string]interface{})
maps["case_user_id"] = caseUserId
caseUserAnswer, _ := caseUserAnswerDao.GetCaseUserAnswer(maps)
if caseUserAnswer != nil {
return nil
}
// 新增答题记录
caseItemQuestionDao := dao.CaseItemQuestionDao{}
statCaseQuestionDao := dao.StatCaseQuestionDao{}
for _, answer := range answers {
questionId, err := strconv.ParseInt(answer.QuestionId, 10, 64)
if err != nil {
return err
}
// 获取题目数据
caseItemQuestion, err := caseItemQuestionDao.GetCaseItemQuestionById(questionId)
if err != nil {
return err
}
// 问答题不处理
if caseItemQuestion.QuestionType == 3 {
continue
}
if answer.OptionId == "" {
return errors.New("失败")
}
caseUserAnswer = &model.CaseUserAnswer{
CaseUserId: caseUserId,
PlatformId: platformId,
QuestionId: questionId,
UserId: userId,
Answer: answer.Answer,
IsTrue: 0,
}
// 判断是否正确
if caseItemQuestion.QuestionAnswer == answer.Answer {
caseUserAnswer.IsTrue = 1
}
_, err = caseUserAnswerDao.AddCaseUserAnswer(tx, caseUserAnswer)
if err != nil {
return err
}
// 处理回答统计
optionIds := strings.Split(answer.OptionId, ",")
for _, option := range optionIds {
optionId, err := strconv.ParseInt(option, 10, 64)
if err != nil {
return err
}
maps = make(map[string]interface{})
maps["case_id"] = caseId
maps["question_id"] = answer.QuestionId
maps["option_id"] = optionId
statCaseQuestion, _ := statCaseQuestionDao.GetStatCaseQuestion(maps)
if statCaseQuestion == nil {
// 新增回答统计
statCaseQuestion = &model.StatCaseQuestion{
CaseId: caseId,
QuestionId: questionId,
OptionId: optionId,
SelectNum: 1,
}
_, err := statCaseQuestionDao.AddStatCaseQuestion(tx, statCaseQuestion)
if err != nil {
return err
}
} else {
// 增加回答统计数量
err = statCaseQuestionDao.Inc(tx, statCaseQuestion.StatId, "select_num", 1)
if err != nil {
return err
}
}
}
}
return nil
}
// ReportCaseUserAnswer 上报用户答题记录
func (r *UserService) ReportCaseUserAnswer(caseId, caseUserId int64, user *model.User, caseUser *model.CaseUser) (err error) {
// 获取答题记录
caseUserAnswerDao := dao.CaseUserAnswerDao{}
maps := make(map[string]interface{})
maps["case_user_id"] = caseUserId
caseUserAnswers, err := caseUserAnswerDao.GetCaseUserAnswerPreloadList(maps)
if err != nil {
return err
}
// 上报用户答题数据
_, err = superKangaroo.ReportUserAnswerScore(caseId, user.UserIden, caseUserAnswers, caseUser)
if err != nil {
return err
}
return nil
}
// ReportUserScore 发放积分
// scoreType : 积分类型(1:完成阅读 2:阅读时间满足 3:优质留言 4:再次优质留言 )
func (r *UserService) ReportUserScore(tx *gorm.DB, projectId, caseId, platformId int64, scoreType int, user *model.User) (err error) {
// 获取项目关联平台
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 err
}
// 检测福利开关
if projectPlatform.IsWelfare == 0 {
// 福利未开
return nil
}
// 检测白名单
if projectPlatform.IsWhite == 1 {
projectPlatformWhiteService := ProjectPlatformWhiteService{}
isWhite, err := projectPlatformWhiteService.CheckProjectPlatformWhiteByUser(user, projectId, platformId)
if err != nil {
return err
}
// 非白名单用户,无需发放积分
if isWhite == false {
return nil
}
}
// 获取需发放积分
reportScore := 0
appScoreTypeStr := "" // 积分发放原因-app
superScoreTypeStr := "" // 积分发放原因-超级袋鼠
nodeName := "" // 获取积分节点名称
if scoreType == 1 {
// 完成阅读
reportScore = projectPlatform.CompleteRead
appScoreTypeStr = "互动病例-完成阅读"
superScoreTypeStr = "调研奖励(完成阅读)"
nodeName = "学习"
} else if scoreType == 2 {
// 阅读时间满足
reportScore = projectPlatform.CompleteReadTime
appScoreTypeStr = "互动病例-阅读时间满足"
superScoreTypeStr = "调研奖励(阅读质量)"
nodeName = "阅读达标"
} else if scoreType == 3 {
// 优质留言
reportScore = projectPlatform.FirstHighQuality
appScoreTypeStr = "互动病例-优质留言"
superScoreTypeStr = "调研奖励(社区贡献)"
nodeName = "优质留言"
} else if scoreType == 4 {
// 再次优质留言
reportScore = 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 nil
}
for _, m := range users {
// 检测该类型积分是否已经发放(其他平台也算)
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 nil
}
}
// 获取病例关联平台数据
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 err
}
// 检测全部积分是否已发放完毕
remainingScore := projectPlatform.SingleCaseScore - casePlatform.IssuedScore
if remainingScore <= 0 {
// 积分已发放完毕
return nil
}
// 新增发放记录-每发一次记录一次
recordScore := &model.RecordScore{
ProjectId: projectId,
CaseId: caseId,
PlatformId: platformId,
UserId: user.UserId,
UserName: user.UserName,
Type: scoreType,
NodeName: nodeName,
Score: reportScore,
}
recordScore, err = recordScoreDao.AddRecordScore(tx, recordScore)
if err != nil {
return 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 errors.New("积分发放失败")
}
// 累计用户领取积分数据
err = caseUserDao.Inc(tx, caseUser.CaseUserId, "total_score", reportScore)
if err != nil {
return err
}
// 累计平台发放积分数据
err = casePlatformDao.Inc(tx, casePlatform.CasePlatformId, "issued_score", reportScore)
if err != nil {
return err
}
// 累计发放积分数据
caseDao := dao.CaseDao{}
err = caseDao.Inc(tx, caseId, "issued_score", reportScore)
if err != nil {
return err
}
// 发放积分-
if platformId != 1 && platformId != 2 {
return errors.New("积分发放失败")
}
// 肝胆相照
if platformId == 1 {
_, err = app.ReportUserScore(appScoreTypeStr, user.UserIden, reportScore)
if err != nil {
return err
}
}
// 超级袋鼠
if platformId == 2 {
// 获取病例数据
caseDao := dao.CaseDao{}
result, err := caseDao.GetCaseById(caseId)
if err != nil {
return err
}
_, err = superKangaroo.ReportUserScore(caseId, user.UserIden, superScoreTypeStr, recordScore, result)
if err != nil {
return err
}
}
return nil
}
// GetAppUserInfo 获取医生数据-app
func (r *UserService) GetAppUserInfo(tx *gorm.DB, req requests.Login) (user *model.User, err error) {
userDao := dao.UserDao{}
// 医院唯一标识
var hospitalIden string
var g *app.GetDoctorInfoResponse
// 手机号
if req.MobileEncryption != "" {
g, err = app.GetDoctorInfoByMobile(req.MobileEncryption)
if err != nil {
return nil, err
}
}
// uuid
if req.UserIden != "" {
g, err = app.GetDoctorInfoByUuid(req.UserIden)
if err != nil {
return nil, err
}
}
// UnionId
if req.UnionId != "" {
g, err = app.GetDoctorInfoByUnionId(req.UnionId)
if err != nil {
return nil, err
}
}
// token
if req.Token != "" {
g, err = app.GetDoctorInfoByToken(req.Token)
if err != nil {
return nil, err
}
}
maps := make(map[string]interface{})
maps["user_iden"] = g.Data.Uuid // 以此字段来判别是否同一个用户
user, _ = userDao.GetUser(maps)
if user == nil {
// 肝胆相照
user = &model.User{
UserIden: g.Data.Uuid,
UserName: g.Data.RealName,
UserMobile: g.Data.Mobile,
MobileEncryption: utils.GenerateMD5(g.Data.Mobile),
Status: 1,
RegisterSource: 2,
OpenId: "",
UnionId: req.UnionId,
Sex: 0,
Avatar: "",
Title: utils.DoctorTitleToInt(g.Data.PositionName),
DepartmentName: g.Data.OfficeName,
Address: g.Data.ProvName,
}
user, err = userDao.AddUser(tx, user)
if err != nil {
return nil, err
}
} else {
userData := make(map[string]interface{})
if user.UserName != g.Data.RealName {
userData["user_name"] = g.Data.RealName
}
if user.UserMobile != g.Data.Mobile {
userData["user_mobile"] = g.Data.Mobile
userData["mobile_encryption"] = utils.GenerateMD5(g.Data.Mobile)
}
if user.Title != utils.DoctorTitleToInt(g.Data.PositionName) {
userData["title"] = utils.DoctorTitleToInt(g.Data.PositionName)
}
if user.DepartmentName != g.Data.OfficeName {
userData["department_name"] = g.Data.OfficeName
}
if user.Address != g.Data.ProvName {
userData["address"] = g.Data.ProvName
}
if len(userData) > 0 {
err = userDao.EditUserById(tx, user.UserId, userData)
if err != nil {
return nil, err
}
}
}
hospitalIden = g.Data.HospitalUuid
if hospitalIden == "" {
return nil, errors.New("失败")
}
// 检测医院是否存在
basicHospitalDao := dao.BasicHospitalDao{}
maps = make(map[string]interface{})
maps["source"] = 2
maps["hospital_iden"] = hospitalIden
basicHospital, _ := basicHospitalDao.GetBasicHospital(maps)
if basicHospital == nil {
// 获取医院数据
gHospital, err := app.GetHospitalByUuid(hospitalIden)
if err != nil {
return nil, err
}
// 添加医院
hospital := &model.BasicHospital{
HospitalIden: hospitalIden,
HospitalName: gHospital.Data.Name,
Source: req.Source,
HospitalLevel: gHospital.Data.Level,
DoctorNumber: gHospital.Data.ExpertNum,
Province: gHospital.Data.ProvName,
City: "",
County: "",
Address: "",
}
basicHospital, err = basicHospitalDao.AddBasicHospital(tx, hospital)
if err != nil {
return nil, err
}
}
// 修改用户所属医院
if basicHospital.HospitalId != user.HospitalId {
maps = make(map[string]interface{})
dataMaps := make(map[string]interface{})
dataMaps["hospital_id"] = basicHospital.HospitalId
err = userDao.EditUserById(tx, user.UserId, dataMaps)
if err != nil {
return nil, err
}
}
return user, nil
}
// HandleUserWhite 处理用户白名单
func (r *UserService) HandleUserWhite(tx *gorm.DB, isWhite int, platformKey, projectId string, userId int64) error {
platformDao := dao.PlatformDao{}
maps := make(map[string]interface{})
maps["platform_key"] = platformKey
platform, err := platformDao.GetPlatform(maps)
if err != nil {
return err
}
projectPlatformDao := dao.ProjectPlatformDao{}
maps = make(map[string]interface{})
maps["project_id"] = projectId
maps["platform_id"] = platform.PlatformId
projectPlatform, err := projectPlatformDao.GetProjectPlatform(maps)
if err != nil {
return err
}
// 获取白名单数据
ProjectPlatformDoctorDao := dao.ProjectPlatformDoctorDao{}
maps = make(map[string]interface{})
maps["project_platform_id"] = projectPlatform.ProjectPlatformId
maps["user_id"] = userId
projectPlatformDoctor, _ := ProjectPlatformDoctorDao.GetProjectPlatformDoctor(maps)
if projectPlatformDoctor == nil {
// 新增白名单
if isWhite == 1 {
projectPlatformDoctor = &model.ProjectPlatformDoctor{
ProjectPlatformId: projectPlatform.ProjectPlatformId,
UserId: userId,
}
projectPlatformDoctor, err = ProjectPlatformDoctorDao.AddProjectPlatformDoctor(tx, projectPlatformDoctor)
if err != nil {
return err
}
}
} else {
// 删除白名单
if isWhite == 0 {
maps = make(map[string]interface{})
maps["project_platform_id"] = projectPlatform.ProjectPlatformId
maps["user_id"] = userId
err = ProjectPlatformDoctorDao.DeleteProjectPlatformDoctor(tx, maps)
if err != nil {
return err
}
}
}
return nil
}
// ReportUserScore 获取需发放积分用户 -- 需考虑相同手机号的用户
func (r *UserService) getReportScoreUser(tx *gorm.DB, projectId, caseId, platformId int64, scoreType int, user *model.User) (u *model.User, id int64) {
// 检测是否有相同手机号用户
userDao := dao.UserDao{}
maps := make(map[string]interface{})
maps["mobile_encryption"] = user.MobileEncryption
users, err := userDao.GetUserList(maps)
if err != nil {
return nil, platformId
}
if len(users) > 2 {
// 存在相同手机号用户
for _, m := range users {
if m.UserId == user.UserId {
continue
}
// 检测积分是否已在其他平台发放过
recordScoreDao := dao.RecordScoreDao{}
maps = make(map[string]interface{})
maps["project_id"] = projectId
maps["case_id"] = caseId
maps["user_id"] = user.UserId
recordScore, _ := recordScoreDao.GetRecordScoreUseTx(tx, maps)
if recordScore != nil {
if recordScore.PlatformId != platformId {
// 由其他平台进行发放积分 修改平台id为其他平台id
return user, recordScore.PlatformId
}
}
// 检测该类型积分是否已经发放
maps = make(map[string]interface{})
maps["project_id"] = projectId
maps["case_id"] = caseId
maps["platform_id"] = platformId
maps["user_id"] = user.UserId
maps["type"] = scoreType
recordScore, _ = recordScoreDao.GetRecordScore(maps)
if recordScore != nil {
// 积分已发放过
return nil, platformId
}
}
}
return user, platformId
}
// CheckUserIsJoinCase 检测用户是否已参与过病例 -- 需考虑相同手机号的用户
func (r *UserService) CheckUserIsJoinCase(caseId int64, mobileEncryption string) (isJoin bool) {
// 获取全部相同手机号
userDao := dao.UserDao{}
maps := make(map[string]interface{})
maps["mobile_encryption"] = mobileEncryption
users, err := userDao.GetUserList(maps)
if err != nil {
return true
}
caseUserDao := dao.CaseUserDao{}
// 存在相同手机号用户
for _, m := range users {
// 检测积分是否已在其他平台发放过
maps = make(map[string]interface{})
maps["case_id"] = caseId
maps["user_id"] = m.UserId
caseUser, _ := caseUserDao.GetCaseUser(maps)
if caseUser != nil {
return true
}
}
return false
}