user.go 17 KB

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