user_service.go 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. package user
  2. import (
  3. "errors"
  4. logger "eta/eta_mini_ht_api/common/component/log"
  5. "eta/eta_mini_ht_api/common/exception"
  6. analystService "eta/eta_mini_ht_api/domian/financial_analyst"
  7. userService "eta/eta_mini_ht_api/domian/user"
  8. "gorm.io/gorm"
  9. "sort"
  10. "sync"
  11. "time"
  12. )
  13. const (
  14. RiskValid = "valid"
  15. RiskExpired = "expired"
  16. RiskUnTest = "unTest"
  17. )
  18. type User struct {
  19. Id int `json:"id"`
  20. Username string `json:"username"`
  21. Mobile string `json:"mobile"`
  22. OpenId string `json:"openId,omitempty"`
  23. }
  24. type AnalystDetail struct {
  25. AnalystName string `json:"AnalystName"`
  26. HeadImgUrl string `json:"HeadImgUrl"`
  27. Introduction string `json:"Introduction"`
  28. Followed string `json:"Followed"`
  29. }
  30. type UserProfile struct {
  31. Mobile string `json:"mobile"`
  32. RiskLevel string `json:"riskLevel"`
  33. RiskLevelStatus string `json:"riskLevelStatus"`
  34. UserName string `json:"userName"`
  35. }
  36. func convertUserDTOToProfile(dto userService.UserDTO) (profile UserProfile) {
  37. profile = UserProfile{
  38. Mobile: dto.Mobile,
  39. RiskLevel: dto.RiskLevel,
  40. UserName: dto.Username,
  41. }
  42. if profile.UserName == "" {
  43. profile.UserName = dto.Mobile
  44. }
  45. if dto.RiskLevel == "" {
  46. profile.RiskLevelStatus = RiskUnTest
  47. return
  48. }
  49. date, err := time.Parse(time.DateOnly, dto.RiskValidEndDate)
  50. if err != nil {
  51. logger.Error("解析日期失败:%v", err)
  52. profile.RiskLevelStatus = RiskExpired
  53. return
  54. }
  55. currentDate := time.Now().Truncate(24 * time.Hour)
  56. expiryDate := date.Truncate(24 * time.Hour)
  57. if expiryDate.Before(currentDate) {
  58. profile.RiskLevelStatus = RiskExpired
  59. return
  60. }
  61. profile.RiskLevelStatus = RiskValid
  62. return
  63. }
  64. func GetUserProfile(userId int) (userProfile UserProfile, err error) {
  65. userDTO, err := userService.GetUserById(userId)
  66. if err != nil {
  67. if errors.Is(err, gorm.ErrRecordNotFound) {
  68. logger.Error("用户不存在,用户Id:%d", userId)
  69. err = exception.New(exception.TemplateUserNotFound)
  70. } else {
  71. logger.Error("获取用户信息失败:%v", err)
  72. err = exception.New(exception.TemplateUserFoundFailed)
  73. }
  74. return
  75. }
  76. userProfile = convertUserDTOToProfile(userDTO)
  77. return
  78. }
  79. func GetAnalystDetail(userId int, analystId int) (analystDetail AnalystDetail, err error) {
  80. analyst, err := analystService.GetAnalystById(analystId)
  81. if err != nil {
  82. logger.Error("研究员信息不存在:%v", err)
  83. err = exception.New(exception.AnalystNotFound)
  84. }
  85. analystDetail = convertToAnalystDetail(analyst)
  86. //研究员关注状态
  87. analystDetail.Followed = userService.GetFollowed(userId, analystId)
  88. return
  89. }
  90. func convertToAnalystDetail(dto analystService.FinancialAnalystDTO) AnalystDetail {
  91. return AnalystDetail{
  92. AnalystName: dto.Name,
  93. HeadImgUrl: dto.HeadImgUrl,
  94. Introduction: dto.Introduction,
  95. }
  96. }
  97. func FollowAnalystsByName(userId int, analystNames []string, followType string) (err error) {
  98. var followlist []userService.FollowDTO
  99. for _, analystName := range analystNames {
  100. FinancialAnalystDTO, followErr := analystService.GetAnalystByName(analystName)
  101. if followErr != nil {
  102. err = exception.New(exception.AnalystNotFound)
  103. }
  104. if FinancialAnalystDTO.Id == 0 || FinancialAnalystDTO.Name == "" {
  105. continue
  106. }
  107. followDTO := userService.FollowDTO{
  108. UserId: userId,
  109. AnalystId: FinancialAnalystDTO.Id,
  110. AnalystName: FinancialAnalystDTO.Name,
  111. FollowType: followType,
  112. }
  113. followlist = append(followlist, followDTO)
  114. }
  115. err = userService.FollowAnalystsByName(userId, followlist, followType)
  116. if err != nil {
  117. logger.Error("批量关注研究员失败:%v", err)
  118. err = exception.New(exception.BatchFollowingAnalystFailed)
  119. }
  120. return
  121. }
  122. func CheckFollowStatusByNames(userId int, names []string) (list []userService.FollowDTO, err error) {
  123. list, err = userService.CheckFollowStatusByNames(userId, names)
  124. if err != nil {
  125. logger.Error("获取关注状态失败:%v", err)
  126. err = exception.New(exception.CheckFollowStatusByNamesFailed)
  127. }
  128. return
  129. }
  130. func FollowAnalyst(userId int, analystId int, followType string) (err error) {
  131. FinancialAnalystDTO, err := analystService.GetAnalystById(analystId)
  132. if err != nil {
  133. err = exception.New(exception.AnalystNotFound)
  134. }
  135. if FinancialAnalystDTO.Id == 0 || FinancialAnalystDTO.Name == "" {
  136. err = exception.New(exception.AnalystNotFound)
  137. return
  138. }
  139. followDTO := userService.FollowDTO{
  140. UserId: userId,
  141. AnalystId: analystId,
  142. AnalystName: FinancialAnalystDTO.Name,
  143. FollowType: followType,
  144. }
  145. err = userService.FollowAnalyst(followDTO)
  146. if err != nil {
  147. logger.Error("关注研究员失败:%v", err)
  148. err = exception.New(exception.UserFollowAnalystFailed)
  149. }
  150. return
  151. }
  152. func GetFollowingAnalystList(userId int) (analysts []FollowAnalystDTO, err error) {
  153. logger.Info("用户ID:%d", userId)
  154. dtoList, err := userService.GetFollowingAnalystList(userId)
  155. if err != nil {
  156. logger.Error("获取关注列表失败:%v", err)
  157. err = exception.New(exception.GetFollowingAnalystListFailed)
  158. return
  159. }
  160. analysts, err = convertToAnalystList(dtoList)
  161. var wg sync.WaitGroup
  162. wg.Add(len(analysts))
  163. for i := 0; i < len(analysts); i++ {
  164. go func(followDTo *FollowAnalystDTO) {
  165. defer wg.Done()
  166. followDTo.NeedNotice = userService.NeedNotice(userId, followDTo.AnalystId)
  167. var analystsDTO analystService.FinancialAnalystDTO
  168. analystsDTO, err = analystService.GetAnalystById(followDTo.AnalystId)
  169. if err != nil {
  170. logger.Error("获取研究员信息失败")
  171. } else {
  172. followDTo.HeadImgUrl = analystsDTO.HeadImgUrl
  173. }
  174. }(&analysts[i])
  175. }
  176. wg.Wait()
  177. //排序
  178. sort.Slice(analysts, func(i, j int) bool {
  179. // 首先按 NeedNotice 排序
  180. if analysts[i].NeedNotice == analysts[j].NeedNotice {
  181. // 对于 NeedNotice 相同的情况下,进行倒序排列
  182. return analysts[i].FollowedTime.After(analysts[j].FollowedTime)
  183. }
  184. // NeedNotice 为 true 的排在 false 的前面
  185. return analysts[i].NeedNotice
  186. })
  187. //if err != nil {
  188. // logger.Error("转换研究员列表失败:%v", err)
  189. // err = exception.New(exception.TransferFollowingAnalystListFailed)
  190. //}
  191. return
  192. }
  193. func GetUnReadMessageList(userId int) (messages []userService.MyMessage, err error) {
  194. messages, err = userService.GetUnReadMessageList(userId)
  195. if err != nil {
  196. err = exception.New(exception.GetUserUnReadMsgFailed)
  197. }
  198. return
  199. }
  200. func ReadMessage(userId int, messageId int) bool {
  201. return userService.ReadMessage(userId, messageId)
  202. }
  203. func ReadMessages(userId int, analystId int) bool {
  204. return userService.ReadMessages(userId, analystId)
  205. }
  206. type FollowAnalystDTO struct {
  207. AnalystId int `json:"analystId"`
  208. AnalystName string `json:"analystName"`
  209. HeadImgUrl string `json:"headImgUrl"`
  210. FollowedTime time.Time `json:"followedTime"`
  211. NeedNotice bool `json:"needNotice"`
  212. }
  213. func convertToAnalystList(dtoList []userService.FollowDTO) (list []FollowAnalystDTO, err error) {
  214. for _, dto := range dtoList {
  215. analyst := FollowAnalystDTO{
  216. AnalystId: dto.AnalystId,
  217. AnalystName: dto.AnalystName,
  218. FollowedTime: dto.FollowedTime,
  219. NeedNotice: false,
  220. }
  221. list = append(list, analyst)
  222. }
  223. return
  224. }
  225. func FollowAnalystByName(userId int, analystName string, followType string) (err error) {
  226. FinancialAnalystDTO, err := analystService.GetAnalystByName(analystName)
  227. if err != nil {
  228. err = exception.New(exception.AnalystNotFound)
  229. }
  230. if FinancialAnalystDTO.Id == 0 || FinancialAnalystDTO.Name == "" {
  231. err = exception.New(exception.AnalystNotFound)
  232. return
  233. }
  234. followDTO := userService.FollowDTO{
  235. UserId: userId,
  236. AnalystId: FinancialAnalystDTO.Id,
  237. AnalystName: FinancialAnalystDTO.Name,
  238. FollowType: followType,
  239. }
  240. err = userService.FollowAnalyst(followDTO)
  241. if err != nil {
  242. logger.Error("关注研究员失败:%v", err)
  243. err = exception.New(exception.UserFollowAnalystFailed)
  244. }
  245. return
  246. }
  247. func FeedBack(userId int, mobile string, message string) (err error) {
  248. feedback := userService.FeedbackDTO{
  249. UserId: userId,
  250. Mobile: mobile,
  251. Message: message,
  252. }
  253. err = userService.FeedBack(feedback)
  254. if err != nil {
  255. err = exception.New(exception.FeedBackError)
  256. }
  257. return
  258. }
  259. func GetUserByMobile(mobile string) (user User, err error) {
  260. userDTO, err := userService.GetUserByMobile(mobile)
  261. if err != nil {
  262. if errors.Is(err, gorm.ErrRecordNotFound) {
  263. err = exception.New(exception.TemplateUserNotFound)
  264. } else {
  265. err = exception.New(exception.TemplateUserFoundFailed)
  266. }
  267. }
  268. user = convertToUser(userDTO)
  269. return
  270. }
  271. func GetUserByOpenId(openId string) (user User, err error) {
  272. userDTO, err := userService.GetUserByOpenId(openId)
  273. if err != nil {
  274. return
  275. }
  276. user = convertToUser(userDTO)
  277. return
  278. }
  279. func convertToUser(userDTO userService.UserDTO) User {
  280. return User{
  281. Id: userDTO.Id,
  282. Username: userDTO.Username,
  283. OpenId: userDTO.OpenId,
  284. Mobile: userDTO.Mobile,
  285. }
  286. }