pc.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633
  1. package pc
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/gin-gonic/gin"
  6. "hongze/hongze_yb/controller/response"
  7. pcModels "hongze/hongze_yb/models/response/pc"
  8. "hongze/hongze_yb/models/tables/customer_comment"
  9. "hongze/hongze_yb/models/tables/rddp/classify"
  10. "hongze/hongze_yb/models/tables/rddp/report"
  11. "hongze/hongze_yb/models/tables/rddp/report_chapter"
  12. "hongze/hongze_yb/models/tables/rddp/session"
  13. "hongze/hongze_yb/models/tables/wx_user_log"
  14. "hongze/hongze_yb/models/tables/yb_activity"
  15. "hongze/hongze_yb/models/tables/yb_pc_suncode"
  16. "hongze/hongze_yb/services"
  17. "hongze/hongze_yb/services/pc"
  18. userService "hongze/hongze_yb/services/user"
  19. "hongze/hongze_yb/services/wechat"
  20. "hongze/hongze_yb/utils"
  21. "strconv"
  22. "time"
  23. )
  24. // LatestNews 研报首页最新资讯
  25. func LatestNews(c *gin.Context) {
  26. reqChartPermissionId := c.DefaultQuery("chart_permission_id", "")
  27. if reqChartPermissionId == "" {
  28. response.Fail("请输入权限ID", c)
  29. return
  30. }
  31. chartPermissionId, err := strconv.Atoi(reqChartPermissionId)
  32. if err != nil {
  33. response.Fail("权限ID格式错误", c)
  34. return
  35. }
  36. userinfo := userService.GetInfoByClaims(c)
  37. list, err := pc.GetLatestReportList(userinfo, chartPermissionId)
  38. if err != nil {
  39. response.Fail("获取报告失败", c)
  40. return
  41. }
  42. //recommendList, err := pcModels.GetLatestReportList()
  43. //if err != nil {
  44. // response.Fail("获取报告详情失败"+err.Error(), c)
  45. // return
  46. //}
  47. response.OkData("查询成功", list, c)
  48. return
  49. }
  50. // Banner 上新公告banner图
  51. func Banner(c *gin.Context) {
  52. var resp pcModels.LatestReleaseResp
  53. activityItem, err := yb_activity.GetLatestActivity()
  54. if err != nil {
  55. response.Fail(err.Error(), c)
  56. return
  57. }
  58. reportItem, err := report.GetLatestReport()
  59. if err != nil {
  60. response.Fail(err.Error(), c)
  61. return
  62. }
  63. imgMap := map[string]string{
  64. "晨报": utils.ALIYUN_YBIMG_HOST + "day.png",
  65. "周报": utils.ALIYUN_YBIMG_HOST + "week.png",
  66. "双周报": utils.ALIYUN_YBIMG_HOST + "two_week.png",
  67. "月报": utils.ALIYUN_YBIMG_HOST + "month.png",
  68. "草根调研": utils.ALIYUN_YBIMG_HOST + "cgdy.png",
  69. "需求报告": utils.ALIYUN_YBIMG_HOST + "xqbg.png",
  70. "宏观报告": utils.ALIYUN_YBIMG_HOST + "hgbg.png",
  71. "日度点评": utils.ALIYUN_YBIMG_HOST + "rddp.png",
  72. "数据点评": utils.ALIYUN_YBIMG_HOST + "sjdp.png",
  73. "碳市场价格周报": utils.ALIYUN_YBIMG_HOST + "coal.png",
  74. "行业调研": utils.ALIYUN_YBIMG_HOST + "hydy.png",
  75. "百家谈": utils.ALIYUN_YBIMG_HOST + "bjt.png",
  76. "会议纪要": utils.ALIYUN_YBIMG_HOST + "hyjy.png",
  77. "大事点评": utils.ALIYUN_YBIMG_HOST + "dsdp.png",
  78. "年报合集": utils.ALIYUN_YBIMG_HOST + "nbhj.png",
  79. }
  80. if activityItem.CreateTime.Before(reportItem.PublishTime) {
  81. resp.ActivityOrReport = 1
  82. resp.ReportId = reportItem.ReportId
  83. resp.ClassifyIdSecond = reportItem.ClassifyIdSecond
  84. resp.ImgUrl = imgMap[reportItem.ClassifyNameFirst]
  85. } else {
  86. resp.ActivityOrReport = 0
  87. resp.Activity = activityItem
  88. resp.ImgUrl = utils.ALIYUN_YBIMG_HOST + "activity.png"
  89. }
  90. response.OkData("查询成功", resp, c)
  91. return
  92. }
  93. // LatestRelease 上新公告
  94. func LatestRelease(c *gin.Context) {
  95. classifyIdString := c.DefaultQuery("ClassifyId", "")
  96. if classifyIdString == "" {
  97. response.Fail("请输入classifyId", c)
  98. return
  99. }
  100. classifyId, err := strconv.Atoi(classifyIdString)
  101. if err != nil {
  102. response.Fail("请输入正确classifyId", c)
  103. return
  104. }
  105. classifyInfo, err := classify.GetByClassifyId(classifyId)
  106. if err != nil {
  107. response.Fail("分类查询出错", c)
  108. return
  109. }
  110. response.OkData("查询成功", classifyInfo, c)
  111. return
  112. }
  113. // ClassifyDetail 专栏详情
  114. func ClassifyDetail(c *gin.Context) {
  115. reqClassifyIdSecond := c.DefaultQuery("classify_id_second", "")
  116. if reqClassifyIdSecond == "" {
  117. response.Fail("请输入二级分类标识", c)
  118. return
  119. }
  120. classifyIdSecond, err := strconv.Atoi(reqClassifyIdSecond)
  121. if err != nil {
  122. response.Fail("请输入正确的二级分类标识", c)
  123. return
  124. }
  125. userinfo := userService.GetInfoByClaims(c)
  126. detail, err := pc.GetClassifyDetail(userinfo, classifyIdSecond)
  127. if err != nil {
  128. response.Fail(err.Error(), c)
  129. return
  130. }
  131. response.OkData("查询成功", detail, c)
  132. return
  133. }
  134. // ClassifyDetailBanner 专栏详情banner图
  135. func ClassifyDetailBanner(c *gin.Context) {
  136. reqReportId := c.DefaultQuery("reportId", "")
  137. classifyName := c.DefaultQuery("classify_name_first", "")
  138. if reqReportId == "" {
  139. response.Fail("请输入二级分类标识", c)
  140. return
  141. }
  142. reportId, err := strconv.Atoi(reqReportId)
  143. if err != nil {
  144. response.Fail("报告ID格式有误", c)
  145. return
  146. }
  147. var bannerResp *pcModels.DetailBannerResp
  148. if classifyName == "周报" || classifyName == "晨报" {
  149. chapterItem, err := report_chapter.GetLatestChapterByClassifyName(classifyName)
  150. if err != nil {
  151. response.Fail("查询最新一期晨周报失败"+err.Error(), c)
  152. return
  153. }
  154. resp := &pcModels.DetailBannerResp{
  155. ReportId: chapterItem.ReportId,
  156. ClassifyNameFirst: chapterItem.ClassifyNameFirst,
  157. ClassifyIdFirst: chapterItem.ClassifyIdFirst,
  158. Stage: chapterItem.Stage,
  159. ImgUrl: "",
  160. Type: "报告合集",
  161. }
  162. bannerResp = resp
  163. } else {
  164. reportInfo, err := report.GetByReportId(reportId)
  165. if err != nil {
  166. response.Fail("报告查询出错", c)
  167. return
  168. }
  169. if reportInfo.Id == 0 {
  170. response.Fail("报告不存在", c)
  171. return
  172. }
  173. if reportInfo.State != 2 {
  174. response.Fail("报告未发布", c)
  175. return
  176. }
  177. reportItem, err := report.GetLatestReportByClassifyName(classifyName, reportInfo.ClassifyIdSecond)
  178. if err != nil {
  179. response.Fail("获取报告详情失败"+err.Error(), c)
  180. return
  181. }
  182. resp := &pcModels.DetailBannerResp{
  183. ReportId: reportItem.ReportId,
  184. Stage: reportItem.Stage,
  185. VipTitle: reportItem.VipTitle,
  186. Author: reportItem.Author,
  187. ReportAuthor: reportItem.ReportAuthor,
  188. ImgUrl: "",
  189. ClassifyNameFirst: reportItem.ClassifyNameFirst,
  190. ClassifyIdFirst: reportItem.ClassifyIdFirst,
  191. ClassifyNameSecond: reportItem.ClassifyNameSecond,
  192. ClassifyIdSecond: reportItem.ClassifyIdSecond,
  193. }
  194. if classifyName == "月报" || classifyName == "双周报" || classifyName == "会议纪要" || classifyName == "大事点评" || classifyName == "年报合集" {
  195. resp.Type = "报告合集"
  196. } else {
  197. resp.Type = "专栏详情"
  198. }
  199. bannerResp = resp
  200. }
  201. //有人的用人的底图,和上新公告图片不完全一样
  202. firstNameMap := map[string]string{
  203. "晨报": utils.ALIYUN_YBIMG_HOST + "day.png",
  204. "周报": utils.ALIYUN_YBIMG_HOST + "week.png",
  205. "双周报": utils.ALIYUN_YBIMG_HOST + "two_week.png",
  206. "月报": utils.ALIYUN_YBIMG_HOST + "month.png",
  207. "会议纪要": utils.ALIYUN_YBIMG_HOST + "hyjy.png",
  208. "大事点评": utils.ALIYUN_YBIMG_HOST + "dsdp.png",
  209. "年报合集": utils.ALIYUN_YBIMG_HOST + "nbhj.png",
  210. //"草根调研": utils.ALIYUN_YBIMG_HOST + "hy.png",
  211. //"需求报告": utils.ALIYUN_YBIMG_HOST + "lxt.png",
  212. //"碳市场价格周报": utils.ALIYUN_YBIMG_HOST + "sjx.png",
  213. //"行业调研": utils.ALIYUN_YBIMG_HOST + "qp.png",
  214. }
  215. //secondNameMap := map[string]string{
  216. // //宏观报告
  217. // "宏观周期观察": utils.ALIYUN_YBIMG_HOST + "gx.png",
  218. // "房地产市场跟踪": utils.ALIYUN_YBIMG_HOST + "gx.png",
  219. // "货币政策跟踪": utils.ALIYUN_YBIMG_HOST + "gx.png",
  220. // "全球宏观经济周度回顾": utils.ALIYUN_YBIMG_HOST + "ldb.png",
  221. // "宏观点评": utils.ALIYUN_YBIMG_HOST + "zzh.png",
  222. // //日度点评
  223. // "知白守黑日评": utils.ALIYUN_YBIMG_HOST + "wxy.png",
  224. // "有声有色日度闲": utils.ALIYUN_YBIMG_HOST + "qp.png",
  225. // "化里化外日评": utils.ALIYUN_YBIMG_HOST + "qmz.png",
  226. // "每日经济数据备忘录": utils.ALIYUN_YBIMG_HOST + "ldb.png",
  227. // "股债日评": utils.ALIYUN_YBIMG_HOST + "zzh.png",
  228. // "贵金属复盘": utils.ALIYUN_YBIMG_HOST + "hx.png",
  229. // //数据点评
  230. // "钢材周度数据点评": utils.ALIYUN_YBIMG_HOST + "wxy.png",
  231. // "甲醇开工数据点评": utils.ALIYUN_YBIMG_HOST + "lqx.png",
  232. // "短纤数据点评": utils.ALIYUN_YBIMG_HOST + "zyy.png",
  233. // "玻璃数据点评": utils.ALIYUN_YBIMG_HOST + "gwy.png",
  234. // "聚烯烃数据点评": utils.ALIYUN_YBIMG_HOST + "lqx.png",
  235. // "铜行业数据点评": utils.ALIYUN_YBIMG_HOST + "yf.png",
  236. // "国际钢材市场数据点评": utils.ALIYUN_YBIMG_HOST + "bx.png",
  237. // "废钢周度数据点评": utils.ALIYUN_YBIMG_HOST + "bx.png",
  238. // "PP数据点评": utils.ALIYUN_YBIMG_HOST + "lqx.png",
  239. // "PVC数据点评": utils.ALIYUN_YBIMG_HOST + "lyx.png",
  240. // "BOPP数据点评": utils.ALIYUN_YBIMG_HOST + "lqx.png",
  241. // "塑编数据点评": utils.ALIYUN_YBIMG_HOST + "lqx.png",
  242. // "铁矿库存数据点评": utils.ALIYUN_YBIMG_HOST + "hk.png",
  243. // "宏观数据点评": utils.ALIYUN_YBIMG_HOST + "zzh.png",
  244. // "铝数据点评": utils.ALIYUN_YBIMG_HOST + "yf.png",
  245. // "甲醇库存数据点评": utils.ALIYUN_YBIMG_HOST + "lqx.png",
  246. // "玻璃纯碱数据点评": utils.ALIYUN_YBIMG_HOST + "gwy.png",
  247. // "乙二醇数据点评": utils.ALIYUN_YBIMG_HOST + "zyy.png",
  248. // "纯碱数据点评": utils.ALIYUN_YBIMG_HOST + "gwy.png",
  249. // "COVID-19跟踪": utils.ALIYUN_YBIMG_HOST + "lxt.png",
  250. // "双焦数据点评": utils.ALIYUN_YBIMG_HOST + "zs.png",
  251. // "苯乙烯库存数据点评": utils.ALIYUN_YBIMG_HOST + "cy.png",
  252. // "苯乙烯数据点评": utils.ALIYUN_YBIMG_HOST + "cy.png",
  253. // "苯乙烯简评": utils.ALIYUN_YBIMG_HOST + "cy.png",
  254. // "EIA天然气库存点评": utils.ALIYUN_YBIMG_HOST + "wyy.png",
  255. // "美国油气钻机数据点评": utils.ALIYUN_YBIMG_HOST + "wyy.png",
  256. // "OPEC+产量点评": utils.ALIYUN_YBIMG_HOST + "hyy.png",
  257. // "原油船期数数据跟踪": utils.ALIYUN_YBIMG_HOST + "wyy.png",
  258. // "EIA原油库存点评": utils.ALIYUN_YBIMG_HOST + "hyy.png",
  259. // "苯乙烯开工数据点评": utils.ALIYUN_YBIMG_HOST + "cy.png",
  260. // "聚酯数据点评": utils.ALIYUN_YBIMG_HOST + "qc.png",
  261. // "铁矿航运数据点评": utils.ALIYUN_YBIMG_HOST + "hk.png",
  262. // //百家谈
  263. // "能化百家谈": utils.ALIYUN_YBIMG_HOST + "qmz.png",
  264. // "有色百家谈": utils.ALIYUN_YBIMG_HOST + "qp.png",
  265. // "黑色百家谈": utils.ALIYUN_YBIMG_HOST + "wxy.png",
  266. //}
  267. authorMap := map[string]string{
  268. "白昕": utils.ALIYUN_YBIMG_HOST + "bx.png",
  269. "曹阳": utils.ALIYUN_YBIMG_HOST + "cy.png",
  270. "曾硕": utils.ALIYUN_YBIMG_HOST + "zs.png",
  271. "曾滢月": utils.ALIYUN_YBIMG_HOST + "zyy.png",
  272. "程品": utils.ALIYUN_YBIMG_HOST + "cp.png",
  273. "高雯宇": utils.ALIYUN_YBIMG_HOST + "gwy.png",
  274. "高昕": utils.ALIYUN_YBIMG_HOST + "gx.png",
  275. "高吟": utils.ALIYUN_YBIMG_HOST + "gy.png",
  276. "陈聪聪": utils.ALIYUN_YBIMG_HOST + "ccc.png",
  277. "何凯": utils.ALIYUN_YBIMG_HOST + "hk.png",
  278. "黄鑫": utils.ALIYUN_YBIMG_HOST + "hx.png",
  279. "黄逸赟": utils.ALIYUN_YBIMG_HOST + "hyy.png",
  280. "黄溢": utils.ALIYUN_YBIMG_HOST + "hy.png",
  281. "李灵": utils.ALIYUN_YBIMG_HOST + "ll.png",
  282. "林秋馨": utils.ALIYUN_YBIMG_HOST + "lqx.png",
  283. "刘鼎邦": utils.ALIYUN_YBIMG_HOST + "ldb.png",
  284. "钱鹏": utils.ALIYUN_YBIMG_HOST + "qp.png",
  285. "刘艺羡": utils.ALIYUN_YBIMG_HOST + "lyx.png",
  286. "戚明之": utils.ALIYUN_YBIMG_HOST + "qmz.png",
  287. "秦钏": utils.ALIYUN_YBIMG_HOST + "qc.png",
  288. "施琪": utils.ALIYUN_YBIMG_HOST + "sq.png",
  289. "王存响": utils.ALIYUN_YBIMG_HOST + "wcx.png",
  290. "王沛": utils.ALIYUN_YBIMG_HOST + "wp.png",
  291. "苏畅": utils.ALIYUN_YBIMG_HOST + "sc.png",
  292. "史瑾璇": utils.ALIYUN_YBIMG_HOST + "sjx.png",
  293. "王亚丹": utils.ALIYUN_YBIMG_HOST + "wyd.png",
  294. "虞风": utils.ALIYUN_YBIMG_HOST + "yf.png",
  295. "魏忻悦": utils.ALIYUN_YBIMG_HOST + "wxy.png",
  296. "王艺滢": utils.ALIYUN_YBIMG_HOST + "wyy.png",
  297. "姚昕泽": utils.ALIYUN_YBIMG_HOST + "yxz.png",
  298. "章左昊": utils.ALIYUN_YBIMG_HOST + "zzh.png",
  299. "李晓曈": utils.ALIYUN_YBIMG_HOST + "lxt.png",
  300. "弘则FICC无锡调研团队": utils.ALIYUN_YBIMG_HOST + "qp.png",
  301. "弘则能化组": utils.ALIYUN_YBIMG_HOST + "qmz.png",
  302. "弘则有色团队": utils.ALIYUN_YBIMG_HOST + "qp.png",
  303. "弘则黑色团队": utils.ALIYUN_YBIMG_HOST + "wxy.png",
  304. "弘则宏观团队": utils.ALIYUN_YBIMG_HOST + "zzh.png",
  305. }
  306. if url, ok := firstNameMap[bannerResp.ClassifyNameFirst]; ok {
  307. bannerResp.ImgUrl = url
  308. } else if url, ok = authorMap[bannerResp.ReportAuthor]; ok {
  309. bannerResp.ImgUrl = url
  310. }
  311. response.OkData("查询成功", bannerResp, c)
  312. return
  313. }
  314. // Recommend 报告详情页更多推荐
  315. func Recommend(c *gin.Context) {
  316. reqReportId := c.DefaultQuery("reportId", "")
  317. classifyName := c.DefaultQuery("classify_name_first", "")
  318. if reqReportId == "" {
  319. response.Fail("请输入二级分类标识", c)
  320. return
  321. }
  322. reportId, err := strconv.Atoi(reqReportId)
  323. if err != nil {
  324. response.Fail("报告ID格式有误", c)
  325. return
  326. }
  327. var recommendResp []*pcModels.RecommendResp
  328. if classifyName == "周报" || classifyName == "晨报" {
  329. recommendList, err := report_chapter.GetWeekRecommendList(reportId, classifyName)
  330. if err != nil {
  331. response.Fail("获取报告详情失败"+err.Error(), c)
  332. return
  333. }
  334. for _, chapter := range recommendList {
  335. resp := &pcModels.RecommendResp{
  336. ReportId: chapter.ReportId,
  337. ReportChapterID: chapter.ReportChapterId,
  338. Title: chapter.Title,
  339. Stage: chapter.Stage,
  340. ClassifyNameFirst: chapter.ClassifyNameFirst,
  341. ClassifySecondFirst: "",
  342. }
  343. recommendResp = append(recommendResp, resp)
  344. }
  345. } else {
  346. reportInfo, err := report.GetByReportId(reportId)
  347. if err != nil {
  348. response.Fail("报告查询出错", c)
  349. return
  350. }
  351. if reportInfo.Id == 0 {
  352. response.Fail("报告不存在", c)
  353. return
  354. }
  355. if reportInfo.State != 2 {
  356. response.Fail("报告未发布", c)
  357. return
  358. }
  359. reportType := 0
  360. if reportInfo.ClassifyNameFirst == "权益研报" {
  361. reportType = 1
  362. } else {
  363. reportType = 2
  364. }
  365. recommendList, err := pcModels.GetRecommendList(reportId, reportType, reportInfo.ClassifyIdSecond)
  366. if err != nil {
  367. response.Fail("获取报告详情失败"+err.Error(), c)
  368. return
  369. }
  370. for _, chapter := range recommendList {
  371. resp := &pcModels.RecommendResp{
  372. ReportId: chapter.Id,
  373. ReportChapterID: 0,
  374. Title: chapter.Title,
  375. Stage: chapter.Stage,
  376. ClassifyNameFirst: chapter.ClassifyNameFirst,
  377. ClassifySecondFirst: chapter.ClassifyNameSecond,
  378. }
  379. recommendResp = append(recommendResp, resp)
  380. }
  381. }
  382. response.OkData("查询成功", recommendResp, c)
  383. return
  384. }
  385. // ClassifyFirstList Ficc 菜单
  386. func ClassifyFirstList(c *gin.Context) {
  387. userinfo := userService.GetInfoByClaims(c)
  388. classList, err := pc.GetClassifyFirstList(userinfo)
  389. if err != nil {
  390. response.Fail(err.Error(), c)
  391. return
  392. }
  393. response.OkData("查询成功", classList, c)
  394. return
  395. }
  396. // CustomerComment 客户评价
  397. func CustomerComment(c *gin.Context) {
  398. lists, err := customer_comment.GetCustomerComment()
  399. if err != nil {
  400. response.Fail(err.Error(), c)
  401. return
  402. }
  403. response.OkData("查询成功", lists, c)
  404. return
  405. }
  406. // GetSunCode 获取太阳码
  407. // @Tags 公共模块
  408. // @Summary 获取分享海报
  409. // @Description 获取分享海报
  410. // @Param request body services.SunCodeReq true "type json string"
  411. // @Success 200 {object} string "获取成功"
  412. // @failure 400 {string} string "获取失败"
  413. // @Router /pc/getSunCode [post]
  414. func GetSunCode(c *gin.Context) {
  415. var req services.SunCodeReq
  416. if c.ShouldBind(&req) != nil {
  417. response.Fail("参数异常", c)
  418. return
  419. }
  420. var sunCodeUrl string
  421. //先查,查不到再去生成上传
  422. item, err := yb_pc_suncode.GetYbPcSunCode(req.CodeScene, req.CodePage)
  423. sunCodeUrl = item.SuncodeURL
  424. if err != nil && err != utils.ErrNoRow {
  425. response.Fail(err.Error(), c)
  426. return
  427. }
  428. if sunCodeUrl == "" {
  429. sunCodeUrl, err = services.PcCreateAndUploadSunCode(req.CodeScene, req.CodePage)
  430. if err != nil {
  431. response.Fail(err.Error(), c)
  432. return
  433. }
  434. }
  435. response.OkData("查询成功", sunCodeUrl, c)
  436. return
  437. }
  438. // @Title pc端微信登录接口
  439. // @Description pc端微信登录接口
  440. // @Param Code query string true "微信唯一编码code"
  441. // @Success 200 {object} models.WxLoginResp
  442. // @router /pc/login [get]
  443. func WechatLogin(c *gin.Context) {
  444. var resp pcModels.LoginResp
  445. var token string
  446. var userId int
  447. var isBind bool
  448. code := c.DefaultQuery("Code", "")
  449. if code == "" {
  450. response.Fail("code参数错误", c)
  451. return
  452. }
  453. item, err := wechat.PcWxGetUserOpenIdByCode(code)
  454. if err != nil {
  455. response.Fail(err.Error(), c)
  456. return
  457. }
  458. fmt.Println("token:", item.AccessToken)
  459. fmt.Println("token:", item.Errmsg)
  460. fmt.Println("token:", item.Errcode)
  461. if item.Errcode != 0 {
  462. response.Fail(item.Errmsg, c)
  463. return
  464. }
  465. openId := item.Openid
  466. //wxUserInfo, err := wx_app.GetSession(code)
  467. //if err != nil {
  468. // response.Fail("获取失败,Err:"+err.Error(), c)
  469. // return
  470. //}
  471. //获取用户信息
  472. wxPcUserInfo, err := wechat.PcWxGetUserInfo(openId, item.AccessToken)
  473. if err != nil {
  474. response.Fail(err.Error(), c)
  475. return
  476. }
  477. if wxPcUserInfo.Errcode != 0 {
  478. response.Fail(err.Error(), c)
  479. return
  480. }
  481. unionId := item.Unionid
  482. //sessionKey := wxUserInfo.SessionKey
  483. //needUpdateSessionKey := true //是否更新sessionKey
  484. QUERY_WX_USER:
  485. wxUser, wxUserErr := userService.GetWxUserItemByOpenId(openId)
  486. if wxUserErr == userService.ERR_NO_USER_RECORD { //没有用户openid记录
  487. _, recordErr := userService.AddUserRecord(openId, unionId, "", "", "", "", "", "", "", 3, 0, 0)
  488. //如果插入失败,那么直接将错误信息返回
  489. if recordErr != nil {
  490. err = recordErr
  491. return
  492. }
  493. //needUpdateSessionKey = false //因为是新增用户微信信息,所以不需要更新sessionKey的数据了
  494. //插入成功后,需要重新查询该用户,并进入下面的逻辑
  495. goto QUERY_WX_USER
  496. } else if wxUserErr == userService.ERR_USER_NOT_BIND {
  497. // 未绑定则去查询unionId是否已经绑定了用户(其他平台,不区分平台),有相应的手机号邮箱信息则自动绑定
  498. platformUser, platformErr := userService.GetFirstWxUserItemByUnionId(unionId)
  499. if platformErr == nil {
  500. // 当公众号用户存在时
  501. if platformUser.Mobile != "" || platformUser.Email != "" {
  502. // 有手机号或邮箱则绑定信息则自动绑定并新增wx_user
  503. countryCode := 0
  504. if platformUser.CountryCode != "" {
  505. countryCode, _ = strconv.Atoi(platformUser.CountryCode)
  506. }
  507. tempToken, tempUser, tempErr, errMsg := userService.BindWxUser(openId, platformUser.Mobile, platformUser.Email, "", 3, countryCode, 1)
  508. if tempErr != nil {
  509. err = errors.New("自动绑定公众号用户失败,Err:" + tempErr.Error() + ", errMsg:" + errMsg)
  510. return
  511. }
  512. token = tempToken
  513. userId = int(tempUser.UserID)
  514. isBind = true
  515. return
  516. }
  517. }
  518. } else if wxUserErr != nil {
  519. err = wxUserErr
  520. return
  521. }
  522. //更新微信用户的sessionKey
  523. //if needUpdateSessionKey {
  524. // _ = user_record.ModifySessionKeyByOpenid(openId, sessionKey)
  525. //}
  526. // 如果已经登录注册绑定的情况下/或者首次登录且为弘则研究公众号用户
  527. if wxUserErr == nil {
  528. userId = int(wxUser.UserID)
  529. // 如果账户有绑定了手机号或者邮箱,那么标记为已绑定
  530. if wxUser.Mobile != "" || wxUser.Email != "" {
  531. isBind = true
  532. }
  533. }
  534. //获取登录token
  535. tokenItem, tokenErr := session.GetTokenByOpenId(openId)
  536. if tokenErr != nil && tokenErr != utils.ErrNoRow {
  537. err = errors.New("登录失败,获取token失败:" + tokenErr.Error())
  538. return
  539. }
  540. fmt.Println("AccessToken:", item.AccessToken)
  541. fmt.Println("tokenItem:", tokenItem.AccessToken)
  542. if tokenErr != nil && tokenErr == utils.ErrNoRow {
  543. timeUnix := time.Now().Unix()
  544. timeUnixStr := strconv.FormatInt(timeUnix, 10)
  545. token = utils.MD5(openId) + utils.MD5(timeUnixStr)
  546. fmt.Println("token:", tokenItem.AccessToken)
  547. //新增session
  548. {
  549. sessionItem := &session.Session{
  550. OpenID: openId,
  551. UserID: int64(userId),
  552. CreatedTime: time.Now(),
  553. LastUpdatedTime: time.Now(),
  554. ExpireTime: time.Now().AddDate(0, 3, 0),
  555. AccessToken: token,
  556. }
  557. sessionErr := sessionItem.Create()
  558. if err != nil {
  559. err = errors.New("登录失败,新增用户session信息失败:" + sessionErr.Error())
  560. return
  561. }
  562. }
  563. } else {
  564. token = tokenItem.AccessToken
  565. //如果联系人编号不为空,且联系人编号与session里面的联系人编号不一致的时候,需要做session变更
  566. //if userId > 0 && tokenItem.UserID != int64(userId) {
  567. // _ = tokenItem.UpdateSession(int64(userId), time.Now().AddDate(0, 1, 0))
  568. //}
  569. //if userId > 0 {
  570. //}
  571. _ = tokenItem.UpdateSession(int64(userId), time.Now().AddDate(0, 1, 0))
  572. }
  573. //新增登录日志
  574. {
  575. loginLog := &wx_user_log.WxUserLog{
  576. UserID: userId,
  577. OpenID: openId,
  578. UnionID: unionId,
  579. CreateTime: time.Now(),
  580. Handle: "yb_login",
  581. Remark: token,
  582. }
  583. go loginLog.Create()
  584. }
  585. resp.IsBind = isBind
  586. resp.Token = token
  587. response.OkData("查询成功", resp, c)
  588. return
  589. }