This commit is contained in:
2025-03-07 17:23:50 +08:00
commit 4605e853c0
181 changed files with 17685 additions and 0 deletions
+54
View File
@@ -0,0 +1,54 @@
package service
import "case-admin-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
}
+169
View File
@@ -0,0 +1,169 @@
package service
import (
"case-admin-api/api/dao"
"case-admin-api/api/model"
"case-admin-api/utils"
"gorm.io/gorm"
)
// ProjectPlatformWhiteService 项目关联平台白名单
type ProjectPlatformWhiteService struct {
}
// DeleteProjectPlatformWhite 删除平台白名单数据
func (r *ProjectPlatformWhiteService) DeleteProjectPlatformWhite(tx *gorm.DB, whiteType int, platformId int64) error {
if whiteType == 1 {
projectPlatformHospitalDao := dao.ProjectPlatformHospitalDao{}
err := projectPlatformHospitalDao.DeleteProjectPlatformHospitalByPlatformId(tx, platformId)
if err != nil {
return err
}
} else if whiteType == 2 {
projectPlatformDoctorDao := dao.ProjectPlatformDoctorDao{}
err := projectPlatformDoctorDao.DeleteProjectPlatformDoctorByPlatformId(tx, platformId)
if err != nil {
return err
}
} else if whiteType == 3 {
projectPlatformDynamicDao := dao.ProjectPlatformDynamicDao{}
maps := make(map[string]interface{})
maps["platform_id"] = platformId
projectPlatformDynamic, err := projectPlatformDynamicDao.GetProjectPlatformDynamic(maps)
if err != nil && projectPlatformDynamic != nil {
// 删除明细
projectPlatformDynamicItemDao := dao.ProjectPlatformDynamicItemDao{}
err = projectPlatformDynamicItemDao.DeleteProjectPlatformDynamicItemByWhiteDynamicId(tx, projectPlatformDynamic.WhiteDynamicId)
if err != nil {
return err
}
err = projectPlatformDynamicDao.DeleteProjectPlatformDynamicByPlatformId(tx, platformId)
if err != nil {
return err
}
}
}
return nil
}
// 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
}
+261
View File
@@ -0,0 +1,261 @@
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) (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["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 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
}
+252
View File
@@ -0,0 +1,252 @@
package service
import (
"case-admin-api/api/model"
"case-admin-api/config"
"case-admin-api/extend/aliyun"
"case-admin-api/utils"
"fmt"
"math/rand"
"time"
)
// ExportService 导出
type ExportService struct {
}
// ProjectPlatformHospitalData 关联平台-白名单-医院数据
type ProjectPlatformHospitalData struct {
HospitalName string // 医院名称
HospitalLevel string // 医院等级
DoctorNumber int // 医生数量
Province string // 省份
City string // 城市
County string // 区县
Address string // 地址
CreatedAt string // 创建时间
}
// ProjectPlatformDoctorData 关联平台-白名单-医生数据
type ProjectPlatformDoctorData struct {
UserName string // 姓名
Province string // 省份
HospitalName string // 医院名称
DepartmentName string // 科室名称
Title string // 医生职称(1:主任医师 2:主任中医师 3:副主任医师 4:副主任中医师 5:主治医师 6:住院医师)
CreatedAt string // 加入时间
}
// StatsCaseUserData 病例参与用户
type StatsCaseUserData struct {
UserName string // 姓名
Title string // 省份
DepartmentName string // 科室
HospitalName string // 医院
Area string // 省份
PlatformName string // 平台名称
TotalScore int // 领取总积分
StartTime string // 开始参与时间
EndTime string // 结束参与时间
}
// ProjectPlatformHospital 医院白名单
func (r *ExportService) ProjectPlatformHospital(projectPlatformHospitals []*model.ProjectPlatformHospital) (string, error) {
header := []utils.HeaderCellData{
{Value: "医院名称", CellType: "string", NumberFmt: "", ColWidth: 25},
{Value: "医院等级", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "医生数量", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "省份", CellType: "string", NumberFmt: "", ColWidth: 25},
{Value: "城市", CellType: "string", NumberFmt: "", ColWidth: 25},
{Value: "区县", CellType: "string", NumberFmt: "", ColWidth: 25},
{Value: "地址", CellType: "string", NumberFmt: "", ColWidth: 30},
{Value: "创建时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30},
}
var dataSlice []interface{}
for _, v := range projectPlatformHospitals {
var createdAt string
if v.CreatedAt != (model.LocalTime{}) {
createdAt = time.Time(v.CreatedAt).Format("2006-01-02 15:04:05")
}
projectPlatformHospitalData := ProjectPlatformHospitalData{
HospitalName: v.BasicHospital.HospitalName,
HospitalLevel: v.BasicHospital.HospitalLevel,
DoctorNumber: v.BasicHospital.DoctorNumber,
Province: v.BasicHospital.Province,
City: v.BasicHospital.City,
County: v.BasicHospital.County,
Address: v.BasicHospital.Address,
CreatedAt: createdAt,
}
dataSlice = append(dataSlice, projectPlatformHospitalData)
}
file, err := utils.Export(header, dataSlice)
if err != nil {
return "", err
}
ossPath := "dev/"
if config.C.Env == "prod" {
ossPath = "prod/"
}
// 设置文件名字
now := time.Now()
dateTimeString := now.Format("20060102150405") // 当前时间字符串
rand.New(rand.NewSource(time.Now().UnixNano())) // 设置随机数
ossPath = ossPath + "export/医院白名单" + dateTimeString + fmt.Sprintf("%d", rand.Intn(9000)+1000) + ".xlsx"
// 上传oss
_, err = aliyun.PutObjectByte(ossPath, file.Bytes())
if err != nil {
return "", err
}
ossPath = utils.AddOssDomain("/" + ossPath)
return ossPath, nil
}
// ProjectPlatformDoctor 医生白名单
func (r *ExportService) ProjectPlatformDoctor(projectPlatformDoctors []*model.ProjectPlatformDoctor) (string, error) {
header := []utils.HeaderCellData{
{Value: "姓名", CellType: "string", NumberFmt: "", ColWidth: 25},
{Value: "省份", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "医院名称", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "科室名称", CellType: "string", NumberFmt: "", ColWidth: 25},
{Value: "医生职称", CellType: "string", NumberFmt: "", ColWidth: 25},
{Value: "加入时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30},
}
var dataSlice []interface{}
for _, v := range projectPlatformDoctors {
var createdAt string
if v.CreatedAt != (model.LocalTime{}) {
createdAt = time.Time(v.CreatedAt).Format("2006-01-02 15:04:05")
}
projectPlatformDoctorData := ProjectPlatformDoctorData{
UserName: v.User.UserName,
Province: v.User.Hospital.Province,
HospitalName: v.User.Hospital.HospitalName,
DepartmentName: v.User.DepartmentName,
Title: utils.DoctorTitleToString(v.User.Title),
CreatedAt: createdAt,
}
dataSlice = append(dataSlice, projectPlatformDoctorData)
}
file, err := utils.Export(header, dataSlice)
if err != nil {
return "", err
}
ossPath := "dev/"
if config.C.Env == "prod" {
ossPath = "prod/"
}
// 设置文件名字
now := time.Now()
dateTimeString := now.Format("20060102150405") // 当前时间字符串
rand.New(rand.NewSource(time.Now().UnixNano())) // 设置随机数
ossPath = ossPath + "export/医生白名单" + dateTimeString + fmt.Sprintf("%d", rand.Intn(9000)+1000) + ".xlsx"
// 上传oss
_, err = aliyun.PutObjectByte(ossPath, file.Bytes())
if err != nil {
return "", err
}
ossPath = utils.AddOssDomain("/" + ossPath)
return ossPath, nil
}
// StatsCaseUser 病例参与用户
func (r *ExportService) StatsCaseUser(statsCaseUsers []*model.CaseUser) (string, error) {
header := []utils.HeaderCellData{
{Value: "姓名", CellType: "string", NumberFmt: "", ColWidth: 25},
{Value: "职称", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "科室", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "医院", CellType: "string", NumberFmt: "", ColWidth: 25},
{Value: "省份", CellType: "string", NumberFmt: "", ColWidth: 25},
{Value: "平台名称", CellType: "string", NumberFmt: "", ColWidth: 18},
{Value: "领取总积分", CellType: "string", NumberFmt: "", ColWidth: 25},
{Value: "开始参与时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30},
{Value: "结束参与时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30},
}
var dataSlice []interface{}
for _, v := range statsCaseUsers {
var startTime string
if v.CreatedAt != (model.LocalTime{}) {
startTime = time.Time(v.StartTime).Format("2006-01-02 15:04:05")
}
var endTime string
if v.CreatedAt != (model.LocalTime{}) {
endTime = time.Time(v.EndTime).Format("2006-01-02 15:04:05")
}
statsCaseUserData := StatsCaseUserData{
UserName: "",
Title: "",
DepartmentName: "",
HospitalName: "",
Area: "",
TotalScore: v.TotalScore,
StartTime: startTime,
EndTime: endTime,
}
// 加载数据-平台名称
if v.Platform != nil {
statsCaseUserData.PlatformName = v.Platform.PlatformName
}
if v.User != nil {
// 加载数据-科室
statsCaseUserData.DepartmentName = v.User.DepartmentName
// 加载数据-职称
statsCaseUserData.Title = utils.DoctorTitleToString(v.User.Title)
// 加载数据-用户名称
statsCaseUserData.UserName = v.User.UserName
// 加载数据-省份
if v.User.Hospital != nil {
statsCaseUserData.Area = v.User.Hospital.Province
statsCaseUserData.HospitalName = v.User.Hospital.HospitalName
}
}
dataSlice = append(dataSlice, statsCaseUserData)
}
file, err := utils.Export(header, dataSlice)
if err != nil {
return "", err
}
ossPath := "dev/"
if config.C.Env == "prod" {
ossPath = "prod/"
}
// 设置文件名字
now := time.Now()
dateTimeString := now.Format("20060102150405") // 当前时间字符串
rand.New(rand.NewSource(time.Now().UnixNano())) // 设置随机数
ossPath = ossPath + "export/参与用户" + dateTimeString + fmt.Sprintf("%d", rand.Intn(9000)+1000) + ".xlsx"
// 上传oss
_, err = aliyun.PutObjectByte(ossPath, file.Bytes())
if err != nil {
return "", err
}
ossPath = utils.AddOssDomain("/" + ossPath)
return ossPath, nil
}