user.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. package user
  2. import (
  3. "errors"
  4. userReq "hongze/hongze_yb/models/request/user"
  5. admin2 "hongze/hongze_yb/models/tables/admin"
  6. "hongze/hongze_yb/models/tables/chart_permission"
  7. "hongze/hongze_yb/models/tables/company"
  8. "hongze/hongze_yb/models/tables/company_product"
  9. "hongze/hongze_yb/models/tables/rddp/msg_code"
  10. "hongze/hongze_yb/models/tables/research_group_relation"
  11. "hongze/hongze_yb/models/tables/wx_user"
  12. "hongze/hongze_yb/models/tables/yb_apply_record"
  13. "hongze/hongze_yb/models/tables/yb_message"
  14. "hongze/hongze_yb/services"
  15. companyService "hongze/hongze_yb/services/company"
  16. "hongze/hongze_yb/services/user"
  17. "hongze/hongze_yb/utils"
  18. "strings"
  19. "time"
  20. )
  21. // SendSmsCode 发送手机短信
  22. func SendSmsCode(openid, mobile, areaNum string) (err error, errMsg string) {
  23. if mobile == "" {
  24. err = errors.New("请输入手机号")
  25. return
  26. }
  27. msgCode := utils.GetRandDigit(4)
  28. var result bool
  29. if areaNum == "86" || areaNum == "" || areaNum == "0" {
  30. //国内的短信
  31. result = services.SendSmsCode(mobile, msgCode)
  32. } else {
  33. //国际短信
  34. result = services.SendSmsCodeGj(mobile, msgCode, areaNum)
  35. }
  36. //发送成功
  37. if result {
  38. item := &msg_code.MsgCode{
  39. OpenID: openid,
  40. Mobile: mobile,
  41. Code: msgCode,
  42. ExpiredIn: time.Now().Add(15 * time.Minute).Unix(),
  43. Enabled: 1,
  44. CreatedTime: time.Time{},
  45. LastUpdatedTime: time.Time{},
  46. }
  47. err = item.Create()
  48. } else {
  49. err = errors.New("短信发送失败")
  50. }
  51. return
  52. }
  53. // SendEmailCode 发送邮件
  54. func SendEmailCode(openid, email string) (err error, errMsg string) {
  55. if email == "" {
  56. err = errors.New("请输入邮箱地址")
  57. return
  58. }
  59. if !utils.ValidateEmailFormatat(email) {
  60. err = errors.New("邮箱格式错误,请重新输入")
  61. return
  62. }
  63. msgCode := utils.GetRandDigit(4)
  64. content := "尊敬的用户:</br>您好,感谢您使用弘则研究,您正在进行邮箱验证,本次请求的验证码为:" + msgCode + "(为了保障您账号的安全性,请在15分钟内完成验证。)</br>弘则研究团队 </br>" + time.Now().Format(utils.FormatDateCN)
  65. title := "弘则研究登陆验证"
  66. //发送邮件
  67. result, err := services.SendEmailByHz(title, content, email)
  68. if result {
  69. item := &msg_code.MsgCode{
  70. OpenID: openid,
  71. Mobile: email,
  72. Code: msgCode,
  73. ExpiredIn: time.Now().Add(15 * time.Minute).Unix(),
  74. Enabled: 1,
  75. CreatedTime: time.Time{},
  76. LastUpdatedTime: time.Time{},
  77. }
  78. err = item.Create()
  79. } else {
  80. err = errors.New("发送失败,Err:" + err.Error())
  81. }
  82. return
  83. }
  84. type CompanyPermission struct {
  85. Name string `json:"name" description:"分类名称"`
  86. PermissionList []PermissionList `json:"permission_list" description:"权限列表"`
  87. }
  88. type PermissionList struct {
  89. Name string `json:"name" description:"权限名称"`
  90. StartDate time.Time `json:"start_date" description:"开始日期"`
  91. EndDate time.Time `json:"end_date" description:"结束日期"`
  92. Status string `json:"status" description:"状态"`
  93. }
  94. type Detail struct {
  95. CompanyName string `json:"company_name" description:"客户名称(公司名称)"`
  96. Status string `json:"status" description:"客户状态"`
  97. IsSuspend int8 `json:"is_suspend" description:"启用与否字段:1:暂停,0:启用"`
  98. RealName string `json:"real_name" description:"用户名称"`
  99. Mobile string `json:"mobile" description:"手机号"`
  100. Email string `json:"email" description:"邮箱"`
  101. SellerName string `json:"seal_name" description:"所属销售名称"`
  102. SellerMobile string `json:"seal_mobile" description:"所属销售手机号"`
  103. PermissionList []CompanyPermission `json:"permission_list" description:"权限列表"`
  104. IsInner int `json:"is_inner" description:"是否为内部员工"`
  105. IsResearcher int `json:"is_researcher" description:"是否为研究员"`
  106. AdminInfo *admin2.Admin `json:"admin_info" description:"系统管理员信息"`
  107. UnRead int64 `json:"un_read" description:"消息未读数"`
  108. NickName string `json:"nick_name" description:"用户昵称"`
  109. HeadImgUrl string `json:"head_img_url" description:"用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空"`
  110. UserId uint64 `json:"user_id" description:"用户ID"`
  111. }
  112. // GetUserInfo 获取用户我的页面详情数据
  113. func GetUserInfo(userInfo user.UserInfo) (userDetail Detail, err error, errMsg string) {
  114. list := make([]CompanyPermission, 0)
  115. companyName := userInfo.Note
  116. status := ``
  117. var isSuspend int8
  118. sellerName := ``
  119. sellerMobile := ``
  120. if userInfo.CompanyID > 1 {
  121. companyInfo, tmpErr := company.GetByCompanyId(userInfo.CompanyID)
  122. if tmpErr != nil {
  123. err = tmpErr
  124. if tmpErr == utils.ErrNoRow {
  125. err = errors.New("找不到该客户")
  126. errMsg = "找不到该客户"
  127. return
  128. }
  129. errMsg = "系统异常4001"
  130. return
  131. }
  132. companyName = companyInfo.CompanyName
  133. companyProduct, tmpErr := company_product.GetByCompany2ProductId(userInfo.CompanyID, 1)
  134. //如果有ficc权限,那么就去查询相关权限
  135. if tmpErr == nil {
  136. status = companyProduct.Status //产品状态
  137. isSuspend = companyProduct.IsSuspend
  138. //销售信息
  139. adminInfo, tmpErr := admin2.GetByAdminId(companyProduct.SellerID)
  140. if tmpErr == nil {
  141. sellerName = adminInfo.RealName
  142. sellerMobile = adminInfo.Mobile
  143. }
  144. //获取所有的权限分类列表
  145. allPermissionList, tmpErr := companyService.GetPermissionListByProductId(1)
  146. if tmpErr != nil {
  147. err = tmpErr
  148. return
  149. }
  150. permissionClassMap := make(map[int]*chart_permission.ChartPermission)
  151. for _, chartPermission := range allPermissionList {
  152. permissionClassMap[int(chartPermission.ChartPermissionID)] = chartPermission
  153. }
  154. // 获取权限列表
  155. permissionList, tmpErr := companyService.GetValidPermissionByCompany2ProductId(userInfo.CompanyID, 1)
  156. if tmpErr != nil {
  157. err = tmpErr
  158. return
  159. }
  160. permissionMap := make(map[string][]PermissionList)
  161. for _, permission := range permissionList {
  162. chartPermission, ok := permissionClassMap[permission.ChartPermissionID]
  163. if ok {
  164. tmpPermission := PermissionList{
  165. Name: chartPermission.PermissionName,
  166. StartDate: permission.StartDate,
  167. EndDate: permission.EndDate,
  168. Status: permission.Status,
  169. }
  170. if tmpPermissionList, ok2 := permissionMap[chartPermission.ClassifyName]; ok2 {
  171. permissionMap[chartPermission.ClassifyName] = append(tmpPermissionList, tmpPermission)
  172. } else {
  173. tmpPermissionList := make([]PermissionList, 0)
  174. permissionMap[chartPermission.ClassifyName] = append(tmpPermissionList, tmpPermission)
  175. }
  176. }
  177. }
  178. for name, tmpPermissionList := range permissionMap {
  179. list = append(list, CompanyPermission{
  180. Name: name,
  181. PermissionList: tmpPermissionList,
  182. })
  183. }
  184. }
  185. }
  186. // 是否为内部员工
  187. isInner := 0
  188. ok, adminInfo, err := user.GetAdminByUserInfo(userInfo)
  189. if err != nil {
  190. err = errors.New("获取用户系统管理员信息失败")
  191. errMsg = "系统异常4002"
  192. return
  193. }
  194. if ok {
  195. isInner = 1
  196. }
  197. // 查询消息未读数
  198. unRead, err := yb_message.GetUnreadByUserId(userInfo.UserID)
  199. if err != nil {
  200. errMsg = "查询消息未读数失败"
  201. return
  202. }
  203. headimgurl := userInfo.Headimgurl
  204. if headimgurl == "" {
  205. headimgurl = utils.DEFAULT_HONGZE_USER_LOGO
  206. }
  207. // 查询是否为研究员
  208. isResearcher := 0
  209. if isInner == 1 {
  210. researchGroupList, e := research_group_relation.GetResearchGroupRelationByAdminId(int(adminInfo.AdminID))
  211. if e != nil {
  212. errMsg = "查询是否为研究员失败"
  213. err = errors.New("用户身份信息有误")
  214. return
  215. }
  216. if len(researchGroupList) > 0 {
  217. isResearcher = 1
  218. }
  219. }
  220. userDetail = Detail{
  221. CompanyName: companyName, //客户名称(公司名称)
  222. Status: status, //产品状态
  223. IsSuspend: isSuspend, //是否启用
  224. RealName: userInfo.RealName,
  225. Mobile: userInfo.Mobile,
  226. Email: userInfo.Email,
  227. SellerName: sellerName,
  228. SellerMobile: sellerMobile,
  229. PermissionList: list, //权限列表
  230. IsInner: isInner, // 是否为内部员工
  231. IsResearcher: isResearcher, // 是否为研究员
  232. AdminInfo: adminInfo, // 系统管理员信息
  233. UnRead: unRead,
  234. NickName: userInfo.NickName,
  235. HeadImgUrl: headimgurl,
  236. UserId: userInfo.UserID,
  237. }
  238. return
  239. }
  240. // SetUserInfo 设置用户的个人信息,头像和昵称
  241. func SetUserInfo(userInfo user.UserInfo, req userReq.SetUserInfoReq) (err error) {
  242. // todo 用户如果没有设置头像,用默认头像也允许上传
  243. // 校验昵称长度
  244. // 校验头像地址是否正确
  245. if !strings.Contains(req.HeadImgUrl, "http://") && !strings.Contains(req.HeadImgUrl, "https://") {
  246. err = errors.New("上传头像出错")
  247. return
  248. }
  249. wxUser := userInfo.WxUser
  250. wxUser.NickName = req.NickName
  251. wxUser.Headimgurl = req.HeadImgUrl
  252. err = wxUser.Update([]string{"nick_name", "headimgurl"})
  253. if err != nil {
  254. err = errors.New("更新用户信息操作失败")
  255. return
  256. }
  257. return
  258. }
  259. type Record struct {
  260. BusinessCardURL string `json:"business_card_url" description:"名片"`
  261. RealName string `json:"real_name" description:"姓名"`
  262. CompanyName string `json:"company_name" description:"客户备注的公司名称"`
  263. Mobile string `json:"mobile" description:"手机号"`
  264. }
  265. // GetLastApplyInfo 获取最近的一套申请记录
  266. func GetLastApplyInfo(userId int) (record Record, err error) {
  267. recordInfo, err := yb_apply_record.GetLastNotOpRecordByUserId(userId)
  268. if err != nil {
  269. if err == utils.ErrNoRow {
  270. err = nil
  271. }
  272. return
  273. }
  274. record = Record{
  275. BusinessCardURL: recordInfo.BusinessCardURL,
  276. RealName: recordInfo.RealName,
  277. CompanyName: recordInfo.CompanyName,
  278. Mobile: recordInfo.Mobile,
  279. }
  280. return
  281. }
  282. // Apply 客户申请
  283. func Apply(userId int, companyId int64, mobile, email string, applyInfo userReq.ApplyReq) (ybApplyRecord *yb_apply_record.YbApplyRecord, err error) {
  284. sellerName := ``
  285. status := `潜在用户`
  286. companyName := applyInfo.CompanyName
  287. tmpmYbApplyRecord, err := yb_apply_record.GetLastNotOpRecordByUserId(userId)
  288. if err == nil {
  289. ybApplyRecord = tmpmYbApplyRecord // 申请来源每一种只存在一条数据
  290. return
  291. } else {
  292. if err != utils.ErrNoRow {
  293. return
  294. }
  295. }
  296. // 联系人信息
  297. wxUserInfo, err := wx_user.GetByUserId(userId)
  298. if err != nil {
  299. return
  300. }
  301. if companyId > 1 {
  302. //客户信息
  303. companyInfo, tmpErr := company.GetByCompanyId(companyId)
  304. if tmpErr != nil {
  305. err = tmpErr
  306. return
  307. }
  308. companyName = companyInfo.CompanyName
  309. //客户产品权限
  310. companyProductList, tmpErr := company_product.GetListByCompanyId(companyId)
  311. if tmpErr != nil {
  312. err = tmpErr
  313. return
  314. }
  315. sellerNameList := make([]string, 0)
  316. statusList := make([]string, 0)
  317. for _, companyProductInfo := range companyProductList {
  318. if companyProductInfo.ProductID == 2 && status == "潜在用户" {
  319. status = "权益用户"
  320. }
  321. if companyProductInfo.ProductID == 1 {
  322. sellerName = companyProductInfo.SellerName
  323. status = companyProductInfo.Status
  324. if companyProductInfo.IsSuspend == 1 {
  325. status = `试用暂停`
  326. }
  327. }
  328. }
  329. if len(sellerNameList) > 0 && len(statusList) > 0 {
  330. sellerName = strings.Join(sellerNameList, ",")
  331. status = strings.Join(statusList, ",")
  332. }
  333. }
  334. ybApplyRecord = &yb_apply_record.YbApplyRecord{
  335. UserID: userId,
  336. BusinessCardURL: applyInfo.BusinessCardUrl,
  337. RealName: applyInfo.RealName,
  338. CompanyName: applyInfo.CompanyName,
  339. Mobile: mobile,
  340. Email: email,
  341. Permission: applyInfo.Permission,
  342. SellerName: sellerName,
  343. Status: status,
  344. CompanyIDPay: int(companyId),
  345. CompanyNamePay: companyName,
  346. CreateTime: time.Now(),
  347. Source: applyInfo.Source,
  348. SourceAgent: applyInfo.SourceAgent,
  349. FromPage: applyInfo.FromPage,
  350. }
  351. err = ybApplyRecord.Create()
  352. if err != nil {
  353. return
  354. }
  355. // 修改客户信息
  356. wxUserInfo.RealName = applyInfo.RealName
  357. wxUserInfo.Note = applyInfo.CompanyName
  358. wxUserInfo.IsNote = 1
  359. applyMethod := wxUserInfo.ApplyMethod //0:未申请,1:已付费客户申请试用,2:非客户申请试用
  360. applyMethod = 2
  361. if sellerName != "" {
  362. applyMethod = 1
  363. }
  364. wxUserInfo.ApplyMethod = applyMethod
  365. _ = wxUserInfo.Update([]string{"RealName", "Note", "IsNote", "ApplyMethod"})
  366. return
  367. }
  368. // GetUserTabBar 获取用户小程序TabBar
  369. func GetUserTabBar(userInfo user.UserInfo, version string) (list []string, err error) {
  370. // user-我的; activity-活动; chart-图表; report-研报; buy-已购; question-问答; pricedriven-价格驱动;
  371. list = []string{"activity", "user", "chart"}
  372. if version == "yb3.0" {
  373. list = []string{"activity", "user", "chart", "report"}
  374. }
  375. if version == "yb5.0" {
  376. list = []string{"activity", "question", "chart", "report"}
  377. }
  378. if version == "yb6.0" {
  379. list = []string{"report", "pricedriven", "activity", "question", "chart"}
  380. }
  381. companyProduct, tmpErr := company_product.GetByCompany2ProductId(userInfo.CompanyID, 1)
  382. if tmpErr != nil {
  383. if tmpErr == utils.ErrNoRow {
  384. err = nil
  385. }
  386. return
  387. }
  388. // 已购仅付费用户可见
  389. if version != "yb6.0" {
  390. if strings.Contains("永续,正式", companyProduct.Status) {
  391. list = append(list, "buy")
  392. }
  393. }
  394. return
  395. }
  396. // PcSendSmsCode 发送手机短信
  397. func PcSendSmsCode(mobile, areaNum string) (err error, errMsg string) {
  398. if mobile == "" {
  399. err = errors.New("请输入手机号")
  400. return
  401. }
  402. msgCode := utils.GetRandDigit(4)
  403. var result bool
  404. if areaNum == "86" || areaNum == "" || areaNum == "0" {
  405. //国内的短信
  406. result = services.SendSmsCode(mobile, msgCode)
  407. } else {
  408. //国际短信
  409. result = services.SendSmsCodeGj(mobile, msgCode, areaNum)
  410. }
  411. //发送成功
  412. if result {
  413. item := &msg_code.MsgCode{
  414. Mobile: mobile,
  415. Code: msgCode,
  416. ExpiredIn: time.Now().Add(15 * time.Minute).Unix(),
  417. Enabled: 1,
  418. CreatedTime: time.Time{},
  419. LastUpdatedTime: time.Time{},
  420. }
  421. err = item.Create()
  422. } else {
  423. err = errors.New("短信发送失败")
  424. }
  425. return
  426. }
  427. // PcSendEmailCode 发送邮件
  428. func PcSendEmailCode(email string) (err error, errMsg string) {
  429. if email == "" {
  430. err = errors.New("请输入邮箱地址")
  431. return
  432. }
  433. if !utils.ValidateEmailFormatat(email) {
  434. err = errors.New("邮箱格式错误,请重新输入")
  435. return
  436. }
  437. msgCode := utils.GetRandDigit(4)
  438. content := "尊敬的用户:</br>您好,感谢您使用弘则研究,您正在进行邮箱验证,本次请求的验证码为:" + msgCode + "(为了保障您账号的安全性,请在15分钟内完成验证。)</br>弘则研究团队 </br>" + time.Now().Format(utils.FormatDateCN)
  439. title := "弘则研究登陆验证"
  440. //发送邮件
  441. result, err := services.SendEmailByHz(title, content, email)
  442. if result {
  443. item := &msg_code.MsgCode{
  444. Mobile: email,
  445. Code: msgCode,
  446. ExpiredIn: time.Now().Add(15 * time.Minute).Unix(),
  447. Enabled: 1,
  448. CreatedTime: time.Time{},
  449. LastUpdatedTime: time.Time{},
  450. }
  451. err = item.Create()
  452. } else {
  453. err = errors.New("发送失败,Err:" + err.Error())
  454. }
  455. return
  456. }