590 lines
15 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 (
"errors"
"fmt"
"gorm.io/gorm"
"hepa-calc-api/api/dao"
"hepa-calc-api/api/model"
"hepa-calc-api/extend/aliyun"
"hepa-calc-api/extend/app"
"hepa-calc-api/utils"
"io"
"math/rand"
"net/http"
"time"
)
type UserService struct {
}
// HandleUserAvatar 处理用户头像
func (r *UserService) HandleUserAvatar(wxAvatar string) (avatar 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
}
// CheckUserMember 检测用户会员
func (r *UserService) CheckUserMember(user *model.User) bool {
if user.IsMember == 0 {
return false
}
now := time.Now()
t := time.Time(*user.MemberExpireDate)
if t.Before(now) {
return false
}
return true
}
// CheckUserBuyMember 检测用户是否购买过会员
func (r *UserService) CheckUserBuyMember(userId int64) bool {
orderMemberDao := dao.OrderMemberDao{}
orderMember, _ := orderMemberDao.GetUserFirstTimeBuyOrderMember(userId)
if orderMember == nil {
return false
}
return true
}
// CheckUserBuySingle 检测用户是否购买过单项产品
func (r *UserService) CheckUserBuySingle(userId int64) bool {
orderSingleDao := dao.OrderSingleDao{}
orderSingle, _ := orderSingleDao.GetUserFirstTimeBuyOrderSingle(userId)
if orderSingle == nil {
return false
}
return true
}
// AddUserMemberValidDate 增加用户会员过期时间
func (r *UserService) AddUserMemberValidDate(tx *gorm.DB, user *model.User, d int) bool {
userData := make(map[string]interface{})
if user.IsMember == 0 {
userData["is_member"] = 1
}
var t time.Time
if user.MemberExpireDate == nil {
t = time.Now()
} else {
t = time.Time(*user.MemberExpireDate)
}
userData["is_member"] = t.Add(time.Duration(d) * 24 * time.Hour)
userDao := dao.UserDao{}
err := userDao.EditUserById(tx, user.UserId, userData)
if err != nil {
return false
}
return true
}
// AddUserSingleSubmitCount 增加用户单项提交次数
func (r *UserService) AddUserSingleSubmitCount(tx *gorm.DB, userId int64) (bool, error) {
userDao := dao.UserDao{}
err := userDao.Inc(tx, userId, "single_submit_count", 1)
if err != nil {
return false, err
}
return true, nil
}
// AddUserSinglePayCount 增加用户单项支付次数
func (r *UserService) AddUserSinglePayCount(tx *gorm.DB, userId int64) (bool, error) {
userDao := dao.UserDao{}
err := userDao.Inc(tx, userId, "single_pay_count", 1)
if err != nil {
return false, err
}
return true, nil
}
// AddUserMemberBuyCount 增加用户会员购买次数
func (r *UserService) AddUserMemberBuyCount(tx *gorm.DB, userId int64) (bool, error) {
userDao := dao.UserDao{}
err := userDao.Inc(tx, userId, "member_buy_count", 1)
if err != nil {
return false, err
}
return true, nil
}
// HandleAppUserInfo 处理app用户数据
func (r *UserService) HandleAppUserInfo(tx *gorm.DB, user *model.User, userInfo *model.UserInfo) error {
appUserInfo, err := app.GetInfoByMobile(user.Mobile)
if err != nil {
return err
}
// 对比处理用户数据
userData := make(map[string]interface{}) // 用户数据
userInfoData := make(map[string]interface{}) // 用户详情数据
// 出生日期/年龄
if appUserInfo.Data.Birthday != "" {
if user.Birthday != nil {
birthday := time.Time(*user.Birthday).Format("2006-01-02")
if appUserInfo.Data.Birthday != birthday {
userData["birthday"] = appUserInfo.Data.Birthday
}
} else {
userData["birthday"] = appUserInfo.Data.Birthday
}
// 年龄
age, err := utils.CalculateAge(appUserInfo.Data.Birthday)
if err != nil {
return err
}
userData["age"] = age
}
// 是否怀孕 1无计划 2计划中 3已怀孕 4家有宝宝
if appUserInfo.Data.IsPregnant != nil {
if userInfo.IsPregnant != nil {
if *appUserInfo.Data.IsPregnant != *userInfo.IsPregnant {
userInfoData["is_pregnant"] = appUserInfo.Data.IsPregnant
}
} else {
userInfoData["is_pregnant"] = appUserInfo.Data.IsPregnant
}
// 预产期
if appUserInfo.Data.ExpectedDateOfChildbirth != "" {
userInfoData["expected_date"] = appUserInfo.Data.ExpectedDateOfChildbirth
}
}
// 性别
if appUserInfo.Data.Sex != nil {
if user.Sex != nil {
if *appUserInfo.Data.Sex != *user.Sex {
userData["sex"] = appUserInfo.Data.Sex
}
} else {
userData["sex"] = appUserInfo.Data.Sex
}
}
// 体重
if appUserInfo.Data.Weight != nil && *appUserInfo.Data.Weight != 0 {
weight := fmt.Sprintf("%d", *appUserInfo.Data.Weight)
if userInfo.Weight != "" {
if weight != userInfo.Weight {
userInfoData["weight"] = weight
}
} else {
userInfoData["weight"] = weight
}
}
// 身高
if appUserInfo.Data.Height != nil && *appUserInfo.Data.Height != 0 {
height := fmt.Sprintf("%d", *appUserInfo.Data.Height)
if userInfo.Height != "" {
if height != userInfo.Height {
userInfoData["height"] = height
}
} else {
userInfoData["height"] = height
}
}
// 省份 id
if appUserInfo.Data.ProvinceID != nil {
// 获取省份数据
baseAreaDao := dao.BaseAreaDao{}
if userInfo.ProvinceId != nil {
if *appUserInfo.Data.ProvinceID != *userInfo.ProvinceId {
userInfoData["province_id"] = appUserInfo.Data.ProvinceID
baseArea, err := baseAreaDao.GetBaseAreaById(int64(*appUserInfo.Data.ProvinceID))
if err != nil {
return err
}
userInfoData["province"] = baseArea.Name
}
} else {
userInfoData["province_id"] = appUserInfo.Data.ProvinceID
baseArea, err := baseAreaDao.GetBaseAreaById(int64(*appUserInfo.Data.ProvinceID))
if err != nil {
return err
}
userInfoData["province"] = baseArea.Name
}
}
// 城市 id
if appUserInfo.Data.CityID != nil {
// 获取城市数据
baseAreaDao := dao.BaseAreaDao{}
if userInfo.CityId != nil {
if *appUserInfo.Data.CityID != *userInfo.CityId {
userInfoData["city_id"] = appUserInfo.Data.CityID
baseArea, err := baseAreaDao.GetBaseAreaById(int64(*appUserInfo.Data.CityID))
if err != nil {
return err
}
userInfoData["city"] = baseArea.Name
}
} else {
userInfoData["city_id"] = appUserInfo.Data.CityID
baseArea, err := baseAreaDao.GetBaseAreaById(int64(*appUserInfo.Data.CityID))
if err != nil {
return err
}
userInfoData["city"] = baseArea.Name
}
}
// 市区 id
if appUserInfo.Data.CountyID != nil {
// 获取区县数据
baseAreaDao := dao.BaseAreaDao{}
if userInfo.CountyId != nil {
if *appUserInfo.Data.CountyID != *userInfo.CountyId {
userInfoData["county_id"] = appUserInfo.Data.CountyID
baseArea, err := baseAreaDao.GetBaseAreaById(int64(*appUserInfo.Data.CountyID))
if err != nil {
return err
}
userInfoData["county"] = baseArea.Name
}
} else {
userInfoData["county_id"] = appUserInfo.Data.CountyID
baseArea, err := baseAreaDao.GetBaseAreaById(int64(*appUserInfo.Data.CountyID))
if err != nil {
return err
}
userInfoData["county"] = baseArea.Name
}
}
// 家族病史
if appUserInfo.Data.IsHBV != nil {
// 有无 肝硬化或肝癌家族史 0无1有2未知
// 是否存在家族病史0:未知 1:是 2:否)
// 转换双方状态
if *appUserInfo.Data.IsHBV == 0 {
*appUserInfo.Data.IsHBV = 2
} else if *appUserInfo.Data.IsHBV == 1 {
*appUserInfo.Data.IsHBV = 1
} else if *appUserInfo.Data.IsHBV == 2 {
*appUserInfo.Data.IsHBV = 0
}
if userInfo.IsFamilyHistory != nil {
if *appUserInfo.Data.IsHBV != *userInfo.IsFamilyHistory {
userInfoData["is_family_history"] = appUserInfo.Data.IsHBV
}
} else {
userInfoData["is_family_history"] = appUserInfo.Data.IsHBV
}
}
// 民族
if appUserInfo.Data.NationUUID != "" {
// 获取民族数据
baseNationDao := dao.BaseNationDao{}
baseNation, err := baseNationDao.GetBaseNationByAppIden(appUserInfo.Data.NationUUID)
if err != nil {
return err
}
if userInfo.NationId != nil {
if baseNation.NationId != *userInfo.NationId {
userInfoData["nation_id"] = baseNation.NationId
}
} else {
userInfoData["nation_id"] = baseNation.NationId
}
}
// 患者 uuid
if appUserInfo.Data.PatientUUID != "" {
if user.AppIden != "" {
if appUserInfo.Data.PatientUUID != user.AppIden {
userData["app_iden"] = appUserInfo.Data.PatientUUID
}
} else {
userData["app_iden"] = appUserInfo.Data.PatientUUID
}
}
// 姓名
if appUserInfo.Data.Name != "" {
if user.UserName != "" {
if appUserInfo.Data.Name != user.UserName {
userData["user_name"] = appUserInfo.Data.Name
}
} else {
userData["user_name"] = appUserInfo.Data.Name
}
}
// 修改用户数据
if len(userData) > 0 {
userDao := dao.UserDao{}
err := userDao.EditUserById(tx, user.UserId, userData)
if err != nil {
return err
}
}
// 修改用户详情数据
if len(userInfoData) > 0 {
userInfoDao := dao.UserInfoDao{}
err := userInfoDao.EditUserInfoById(tx, userInfo.UserInfoId, userInfoData)
if err != nil {
return err
}
}
return nil
}
// HandleAppUserCase 处理app用户病例数据
func (r *UserService) HandleAppUserCase(tx *gorm.DB, user *model.User) error {
appUserCase, err := app.GetUserCaseByAppIden(user.AppIden)
if err != nil {
return err
}
// 用户无病例数据
if appUserCase.Data == nil {
return nil
}
// 获取用户病例数据
userCaseDao := dao.UserCaseDao{}
userCase, _ := userCaseDao.GetUserCaseByUserId(user.UserId)
if userCase == nil {
// 未添加用户病例数据
userCase = &model.UserCase{}
userCase.UserId = user.UserId
// 是否过敏史
if appUserCase.Data.IsAllergy != nil {
userCase.IsAllergyHistory = appUserCase.Data.IsAllergy
// 过敏史描述
if appUserCase.Data.AllergyInfo != "" {
userCase.AllergyHistory = appUserCase.Data.AllergyInfo
}
}
// 是否服药
if appUserCase.Data.IsMedication != nil {
userCase.IsMedication = appUserCase.Data.IsMedication
// 服药名称
if appUserCase.Data.MedicationInfo != "" {
userCase.Medication = appUserCase.Data.MedicationInfo
}
}
// 是否去医院
if appUserCase.Data.IsHospital != nil {
userCase.IsHospital = appUserCase.Data.IsHospital
}
// 慢性疾病
if appUserCase.Data.OtherDisease != "" {
userCase.ChronicDisease = appUserCase.Data.OtherDisease
}
// 目前肝脏状态
if appUserCase.Data.LiverStatus != "" {
userCase.LiverStatus = appUserCase.Data.LiverStatus
}
userCase, err = userCaseDao.AddUserCase(tx, userCase)
if err != nil {
return err
}
} else {
// 对比处理用户数据
userCaseData := make(map[string]interface{}) // 用户病例数据
// 是否过敏史
if appUserCase.Data.IsAllergy != nil {
if userCase.IsAllergyHistory != nil {
if *appUserCase.Data.IsAllergy != *userCase.IsAllergyHistory {
userCaseData["is_allergy_history"] = appUserCase.Data.IsAllergy
}
} else {
userCaseData["is_allergy_history"] = appUserCase.Data.IsAllergy
}
// 过敏史描述
if appUserCase.Data.AllergyInfo != "" {
if userCase.AllergyHistory != "" {
if appUserCase.Data.AllergyInfo != userCase.AllergyHistory {
userCaseData["allergy_history"] = appUserCase.Data.AllergyInfo
}
} else {
userCaseData["allergy_history"] = appUserCase.Data.AllergyInfo
}
}
}
// 是否服药
if appUserCase.Data.IsMedication != nil {
if userCase.IsMedication != nil {
if *appUserCase.Data.IsMedication != *userCase.IsMedication {
userCaseData["is_medication"] = appUserCase.Data.IsMedication
}
} else {
userCaseData["is_medication"] = appUserCase.Data.IsMedication
}
// 服药名称
if appUserCase.Data.MedicationInfo != "" {
if userCase.Medication != "" {
if appUserCase.Data.MedicationInfo != userCase.Medication {
userCaseData["medication"] = appUserCase.Data.MedicationInfo
}
} else {
userCaseData["medication"] = appUserCase.Data.MedicationInfo
}
}
}
// 是否去医院
if appUserCase.Data.IsHospital != nil {
if userCase.IsHospital != nil {
if *appUserCase.Data.IsHospital != *userCase.IsHospital {
userCaseData["is_hospital"] = appUserCase.Data.IsHospital
}
} else {
userCaseData["is_hospital"] = appUserCase.Data.IsHospital
}
}
// 慢性疾病
if appUserCase.Data.OtherDisease != "" {
if userCase.ChronicDisease != "" {
if appUserCase.Data.OtherDisease != userCase.ChronicDisease {
userCaseData["chronic_disease"] = appUserCase.Data.OtherDisease
}
} else {
userCaseData["chronic_disease"] = appUserCase.Data.OtherDisease
}
}
// 目前肝脏状态
if appUserCase.Data.LiverStatus != "" {
if userCase.LiverStatus != "" {
if appUserCase.Data.LiverStatus != userCase.LiverStatus {
userCaseData["liver_status"] = appUserCase.Data.LiverStatus
}
} else {
userCaseData["liver_status"] = appUserCase.Data.LiverStatus
}
}
// 修改用户病例数据
if len(userCaseData) > 0 {
err := userCaseDao.EditUserCaseById(tx, userCase.UserCaseId, userCaseData)
if err != nil {
return err
}
}
if len(appUserCase.Data.DiseasesList) > 0 {
userCaseDiseaseItemDao := dao.UserCaseDiseaseItemDao{}
// 删除所患疾病列表
maps := make(map[string]interface{})
maps["user_case_id"] = userCase.UserCaseId
err := userCaseDiseaseItemDao.DeleteUserCaseDiseaseItem(tx, maps)
if err != nil {
return err
}
}
}
// 所患疾病列表
if len(appUserCase.Data.DiseasesList) > 0 {
for _, data := range appUserCase.Data.DiseasesList {
userCaseDiseaseItemDao := dao.UserCaseDiseaseItemDao{}
baseDiseaseClassDao := dao.BaseDiseaseClassDao{}
// 获取基础数据-疾病分类
baseDiseaseClass, err := baseDiseaseClassDao.GetBaseDiseaseClassByAppIden(data.UUID)
if err != nil {
return err
}
// 新增所患疾病列表
userCaseDiseaseItem := &model.UserCaseDiseaseItem{
UserCaseId: userCase.UserCaseId,
DiseaseClassId: baseDiseaseClass.DiseaseClassId,
AppIden: data.UUID,
Duration: data.Year,
Genotype: data.Info,
}
userCaseDiseaseItem, err = userCaseDiseaseItemDao.AddUserCaseDiseaseItem(tx, userCaseDiseaseItem)
if err != nil {
return err
}
}
}
return nil
}