pc.go 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912
  1. package pc
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/gin-gonic/gin"
  6. "hongze/hongze_yb/controller/response"
  7. userLogic "hongze/hongze_yb/logic/user"
  8. pcModels "hongze/hongze_yb/models/response/pc"
  9. "hongze/hongze_yb/models/tables/customer_comment"
  10. "hongze/hongze_yb/models/tables/rddp/classify"
  11. "hongze/hongze_yb/models/tables/rddp/msg_code"
  12. "hongze/hongze_yb/models/tables/rddp/report"
  13. "hongze/hongze_yb/models/tables/rddp/report_chapter"
  14. "hongze/hongze_yb/models/tables/rddp/session"
  15. "hongze/hongze_yb/models/tables/wx_user"
  16. "hongze/hongze_yb/models/tables/wx_user_log"
  17. "hongze/hongze_yb/models/tables/yb_activity"
  18. "hongze/hongze_yb/models/tables/yb_pc_suncode"
  19. "hongze/hongze_yb/services"
  20. "hongze/hongze_yb/services/pc"
  21. userService "hongze/hongze_yb/services/user"
  22. "hongze/hongze_yb/services/wechat"
  23. "hongze/hongze_yb/utils"
  24. "strconv"
  25. "time"
  26. )
  27. // LatestNews 研报首页最新资讯
  28. func LatestNews(c *gin.Context) {
  29. reqChartPermissionId := c.DefaultQuery("chart_permission_id", "")
  30. if reqChartPermissionId == "" {
  31. response.Fail("请输入权限ID", c)
  32. return
  33. }
  34. chartPermissionId, err := strconv.Atoi(reqChartPermissionId)
  35. if err != nil {
  36. response.Fail("权限ID格式错误", c)
  37. return
  38. }
  39. userinfo := userService.GetInfoByClaims(c)
  40. list, err := pc.GetLatestReportList(userinfo, chartPermissionId)
  41. if err != nil {
  42. response.Fail("获取报告失败", c)
  43. return
  44. }
  45. //recommendList, err := pcModels.GetLatestReportList()
  46. //if err != nil {
  47. // response.Fail("获取报告详情失败"+err.Error(), c)
  48. // return
  49. //}
  50. response.OkData("查询成功", list, c)
  51. return
  52. }
  53. // Banner 上新公告banner图
  54. func Banner(c *gin.Context) {
  55. var resp pcModels.LatestReleaseResp
  56. activityItem, err := yb_activity.GetLatestActivity()
  57. if err != nil {
  58. response.Fail(err.Error(), c)
  59. return
  60. }
  61. reportItem, err := report.GetLatestReport()
  62. if err != nil {
  63. response.Fail(err.Error(), c)
  64. return
  65. }
  66. imgMap := map[string]string{
  67. "晨报": utils.ALIYUN_YBIMG_HOST + "day.png",
  68. "周报": utils.ALIYUN_YBIMG_HOST + "week.png",
  69. "双周报": utils.ALIYUN_YBIMG_HOST + "two_week.png",
  70. "月报": utils.ALIYUN_YBIMG_HOST + "month.png",
  71. "草根调研": utils.ALIYUN_YBIMG_HOST + "cgdy.png",
  72. "需求报告": utils.ALIYUN_YBIMG_HOST + "xqbg.png",
  73. "宏观报告": utils.ALIYUN_YBIMG_HOST + "hgbg.png",
  74. "日度点评": utils.ALIYUN_YBIMG_HOST + "rddp.png",
  75. "数据点评": utils.ALIYUN_YBIMG_HOST + "sjdp.png",
  76. "碳市场价格周报": utils.ALIYUN_YBIMG_HOST + "coal.png",
  77. "行业调研": utils.ALIYUN_YBIMG_HOST + "hydy.png",
  78. "百家谈": utils.ALIYUN_YBIMG_HOST + "bjt.png",
  79. "会议纪要": utils.ALIYUN_YBIMG_HOST + "hyjy.png",
  80. "大事点评": utils.ALIYUN_YBIMG_HOST + "dsdp.png",
  81. "年报合集": utils.ALIYUN_YBIMG_HOST + "nbhj.png",
  82. }
  83. if activityItem.CreateTime.Before(reportItem.PublishTime) {
  84. resp.ActivityOrReport = 1
  85. resp.ReportId = reportItem.ReportId
  86. resp.ClassifyIdSecond = reportItem.ClassifyIdSecond
  87. resp.ImgUrl = imgMap[reportItem.ClassifyNameFirst]
  88. } else {
  89. resp.ActivityOrReport = 0
  90. resp.Activity = activityItem
  91. resp.ImgUrl = utils.ALIYUN_YBIMG_HOST + "activity.png"
  92. }
  93. response.OkData("查询成功", resp, c)
  94. return
  95. }
  96. // LatestRelease 上新公告
  97. func LatestRelease(c *gin.Context) {
  98. classifyIdString := c.DefaultQuery("ClassifyId", "")
  99. if classifyIdString == "" {
  100. response.Fail("请输入classifyId", c)
  101. return
  102. }
  103. classifyId, err := strconv.Atoi(classifyIdString)
  104. if err != nil {
  105. response.Fail("请输入正确classifyId", c)
  106. return
  107. }
  108. classifyInfo, err := classify.GetByClassifyId(classifyId)
  109. if err != nil {
  110. response.Fail("分类查询出错", c)
  111. return
  112. }
  113. response.OkData("查询成功", classifyInfo, c)
  114. return
  115. }
  116. // ClassifyDetail 专栏详情
  117. func ClassifyDetail(c *gin.Context) {
  118. reqClassifyIdSecond := c.DefaultQuery("classify_id_second", "")
  119. if reqClassifyIdSecond == "" {
  120. response.Fail("请输入二级分类标识", c)
  121. return
  122. }
  123. classifyIdSecond, err := strconv.Atoi(reqClassifyIdSecond)
  124. if err != nil {
  125. response.Fail("请输入正确的二级分类标识", c)
  126. return
  127. }
  128. userinfo := userService.GetInfoByClaims(c)
  129. detail, err := pc.GetClassifyDetail(userinfo, classifyIdSecond)
  130. if err != nil {
  131. response.Fail(err.Error(), c)
  132. return
  133. }
  134. response.OkData("查询成功", detail, c)
  135. return
  136. }
  137. // ClassifyDetailBanner 专栏详情banner图
  138. func ClassifyDetailBanner(c *gin.Context) {
  139. reqReportId := c.DefaultQuery("reportId", "")
  140. classifyName := c.DefaultQuery("classify_name_first", "")
  141. if reqReportId == "" {
  142. response.Fail("请输入二级分类标识", c)
  143. return
  144. }
  145. reportId, err := strconv.Atoi(reqReportId)
  146. if err != nil {
  147. response.Fail("报告ID格式有误", c)
  148. return
  149. }
  150. var bannerResp *pcModels.DetailBannerResp
  151. if classifyName == "周报" || classifyName == "晨报" {
  152. chapterItem, err := report_chapter.GetLatestChapterByClassifyName(classifyName)
  153. if err != nil {
  154. response.Fail("查询最新一期晨周报失败"+err.Error(), c)
  155. return
  156. }
  157. resp := &pcModels.DetailBannerResp{
  158. ReportId: chapterItem.ReportId,
  159. ClassifyNameFirst: chapterItem.ClassifyNameFirst,
  160. ClassifyIdFirst: chapterItem.ClassifyIdFirst,
  161. Stage: chapterItem.Stage,
  162. ImgUrl: "",
  163. Type: "报告合集",
  164. }
  165. bannerResp = resp
  166. } else {
  167. reportInfo, err := report.GetByReportId(reportId)
  168. if err != nil {
  169. response.Fail("报告查询出错", c)
  170. return
  171. }
  172. if reportInfo.Id == 0 {
  173. response.Fail("报告不存在", c)
  174. return
  175. }
  176. if reportInfo.State != 2 {
  177. response.Fail("报告未发布", c)
  178. return
  179. }
  180. reportItem, err := report.GetLatestReportByClassifyName(classifyName, reportInfo.ClassifyIdSecond)
  181. if err != nil {
  182. response.Fail("获取报告详情失败"+err.Error(), c)
  183. return
  184. }
  185. resp := &pcModels.DetailBannerResp{
  186. ReportId: reportItem.ReportId,
  187. Stage: reportItem.Stage,
  188. VipTitle: reportItem.VipTitle,
  189. Author: reportItem.Author,
  190. ReportAuthor: reportItem.ReportAuthor,
  191. ImgUrl: "",
  192. ClassifyNameFirst: reportItem.ClassifyNameFirst,
  193. ClassifyIdFirst: reportItem.ClassifyIdFirst,
  194. ClassifyNameSecond: reportItem.ClassifyNameSecond,
  195. ClassifyIdSecond: reportItem.ClassifyIdSecond,
  196. }
  197. if classifyName == "月报" || classifyName == "双周报" || classifyName == "会议纪要" || classifyName == "大事点评" || classifyName == "年报合集" {
  198. resp.Type = "报告合集"
  199. } else {
  200. resp.Type = "专栏详情"
  201. }
  202. bannerResp = resp
  203. }
  204. //有人的用人的底图,和上新公告图片不完全一样
  205. firstNameMap := map[string]string{
  206. "晨报": utils.ALIYUN_YBIMG_HOST + "day.png",
  207. "周报": utils.ALIYUN_YBIMG_HOST + "week.png",
  208. "双周报": utils.ALIYUN_YBIMG_HOST + "two_week.png",
  209. "月报": utils.ALIYUN_YBIMG_HOST + "month.png",
  210. "会议纪要": utils.ALIYUN_YBIMG_HOST + "hyjy.png",
  211. "大事点评": utils.ALIYUN_YBIMG_HOST + "dsdp.png",
  212. "年报合集": utils.ALIYUN_YBIMG_HOST + "nbhj.png",
  213. //"草根调研": utils.ALIYUN_YBIMG_HOST + "hy.png",
  214. //"需求报告": utils.ALIYUN_YBIMG_HOST + "lxt.png",
  215. //"碳市场价格周报": utils.ALIYUN_YBIMG_HOST + "sjx.png",
  216. //"行业调研": utils.ALIYUN_YBIMG_HOST + "qp.png",
  217. }
  218. //secondNameMap := map[string]string{
  219. // //宏观报告
  220. // "宏观周期观察": utils.ALIYUN_YBIMG_HOST + "gx.png",
  221. // "房地产市场跟踪": utils.ALIYUN_YBIMG_HOST + "gx.png",
  222. // "货币政策跟踪": utils.ALIYUN_YBIMG_HOST + "gx.png",
  223. // "全球宏观经济周度回顾": utils.ALIYUN_YBIMG_HOST + "ldb.png",
  224. // "宏观点评": utils.ALIYUN_YBIMG_HOST + "zzh.png",
  225. // //日度点评
  226. // "知白守黑日评": utils.ALIYUN_YBIMG_HOST + "wxy.png",
  227. // "有声有色日度闲": utils.ALIYUN_YBIMG_HOST + "qp.png",
  228. // "化里化外日评": utils.ALIYUN_YBIMG_HOST + "qmz.png",
  229. // "每日经济数据备忘录": utils.ALIYUN_YBIMG_HOST + "ldb.png",
  230. // "股债日评": utils.ALIYUN_YBIMG_HOST + "zzh.png",
  231. // "贵金属复盘": utils.ALIYUN_YBIMG_HOST + "hx.png",
  232. // //数据点评
  233. // "钢材周度数据点评": utils.ALIYUN_YBIMG_HOST + "wxy.png",
  234. // "甲醇开工数据点评": utils.ALIYUN_YBIMG_HOST + "lqx.png",
  235. // "短纤数据点评": utils.ALIYUN_YBIMG_HOST + "zyy.png",
  236. // "玻璃数据点评": utils.ALIYUN_YBIMG_HOST + "gwy.png",
  237. // "聚烯烃数据点评": utils.ALIYUN_YBIMG_HOST + "lqx.png",
  238. // "铜行业数据点评": utils.ALIYUN_YBIMG_HOST + "yf.png",
  239. // "国际钢材市场数据点评": utils.ALIYUN_YBIMG_HOST + "bx.png",
  240. // "废钢周度数据点评": utils.ALIYUN_YBIMG_HOST + "bx.png",
  241. // "PP数据点评": utils.ALIYUN_YBIMG_HOST + "lqx.png",
  242. // "PVC数据点评": utils.ALIYUN_YBIMG_HOST + "lyx.png",
  243. // "BOPP数据点评": utils.ALIYUN_YBIMG_HOST + "lqx.png",
  244. // "塑编数据点评": utils.ALIYUN_YBIMG_HOST + "lqx.png",
  245. // "铁矿库存数据点评": utils.ALIYUN_YBIMG_HOST + "hk.png",
  246. // "宏观数据点评": utils.ALIYUN_YBIMG_HOST + "zzh.png",
  247. // "铝数据点评": utils.ALIYUN_YBIMG_HOST + "yf.png",
  248. // "甲醇库存数据点评": utils.ALIYUN_YBIMG_HOST + "lqx.png",
  249. // "玻璃纯碱数据点评": utils.ALIYUN_YBIMG_HOST + "gwy.png",
  250. // "乙二醇数据点评": utils.ALIYUN_YBIMG_HOST + "zyy.png",
  251. // "纯碱数据点评": utils.ALIYUN_YBIMG_HOST + "gwy.png",
  252. // "COVID-19跟踪": utils.ALIYUN_YBIMG_HOST + "lxt.png",
  253. // "双焦数据点评": utils.ALIYUN_YBIMG_HOST + "zs.png",
  254. // "苯乙烯库存数据点评": utils.ALIYUN_YBIMG_HOST + "cy.png",
  255. // "苯乙烯数据点评": utils.ALIYUN_YBIMG_HOST + "cy.png",
  256. // "苯乙烯简评": utils.ALIYUN_YBIMG_HOST + "cy.png",
  257. // "EIA天然气库存点评": utils.ALIYUN_YBIMG_HOST + "wyy.png",
  258. // "美国油气钻机数据点评": utils.ALIYUN_YBIMG_HOST + "wyy.png",
  259. // "OPEC+产量点评": utils.ALIYUN_YBIMG_HOST + "hyy.png",
  260. // "原油船期数数据跟踪": utils.ALIYUN_YBIMG_HOST + "wyy.png",
  261. // "EIA原油库存点评": utils.ALIYUN_YBIMG_HOST + "hyy.png",
  262. // "苯乙烯开工数据点评": utils.ALIYUN_YBIMG_HOST + "cy.png",
  263. // "聚酯数据点评": utils.ALIYUN_YBIMG_HOST + "qc.png",
  264. // "铁矿航运数据点评": utils.ALIYUN_YBIMG_HOST + "hk.png",
  265. // //百家谈
  266. // "能化百家谈": utils.ALIYUN_YBIMG_HOST + "qmz.png",
  267. // "有色百家谈": utils.ALIYUN_YBIMG_HOST + "qp.png",
  268. // "黑色百家谈": utils.ALIYUN_YBIMG_HOST + "wxy.png",
  269. //}
  270. authorMap := map[string]string{
  271. "白昕": utils.ALIYUN_YBIMG_HOST + "bx.png",
  272. "曹阳": utils.ALIYUN_YBIMG_HOST + "cy.png",
  273. "曾硕": utils.ALIYUN_YBIMG_HOST + "zs.png",
  274. "曾滢月": utils.ALIYUN_YBIMG_HOST + "zyy.png",
  275. "程品": utils.ALIYUN_YBIMG_HOST + "cp.png",
  276. "高雯宇": utils.ALIYUN_YBIMG_HOST + "gwy.png",
  277. "高昕": utils.ALIYUN_YBIMG_HOST + "gx.png",
  278. "高吟": utils.ALIYUN_YBIMG_HOST + "gy.png",
  279. "陈聪聪": utils.ALIYUN_YBIMG_HOST + "ccc.png",
  280. "何凯": utils.ALIYUN_YBIMG_HOST + "hk.png",
  281. "黄鑫": utils.ALIYUN_YBIMG_HOST + "hx.png",
  282. "黄逸赟": utils.ALIYUN_YBIMG_HOST + "hyy.png",
  283. "黄溢": utils.ALIYUN_YBIMG_HOST + "hy.png",
  284. "李灵": utils.ALIYUN_YBIMG_HOST + "ll.png",
  285. "林秋馨": utils.ALIYUN_YBIMG_HOST + "lqx.png",
  286. "刘鼎邦": utils.ALIYUN_YBIMG_HOST + "ldb.png",
  287. "钱鹏": utils.ALIYUN_YBIMG_HOST + "qp.png",
  288. "刘艺羡": utils.ALIYUN_YBIMG_HOST + "lyx.png",
  289. "戚明之": utils.ALIYUN_YBIMG_HOST + "qmz.png",
  290. "秦钏": utils.ALIYUN_YBIMG_HOST + "qc.png",
  291. "施琪": utils.ALIYUN_YBIMG_HOST + "sq.png",
  292. "王存响": utils.ALIYUN_YBIMG_HOST + "wcx.png",
  293. "王沛": utils.ALIYUN_YBIMG_HOST + "wp.png",
  294. "苏畅": utils.ALIYUN_YBIMG_HOST + "sc.png",
  295. "史瑾璇": utils.ALIYUN_YBIMG_HOST + "sjx.png",
  296. "王亚丹": utils.ALIYUN_YBIMG_HOST + "wyd.png",
  297. "虞风": utils.ALIYUN_YBIMG_HOST + "yf.png",
  298. "魏忻悦": utils.ALIYUN_YBIMG_HOST + "wxy.png",
  299. "王艺滢": utils.ALIYUN_YBIMG_HOST + "wyy.png",
  300. "姚昕泽": utils.ALIYUN_YBIMG_HOST + "yxz.png",
  301. "章左昊": utils.ALIYUN_YBIMG_HOST + "zzh.png",
  302. "李晓瞳": utils.ALIYUN_YBIMG_HOST + "lxt.png",
  303. "弘则FICC无锡调研团队": utils.ALIYUN_YBIMG_HOST + "qp.png",
  304. "弘则能化组": utils.ALIYUN_YBIMG_HOST + "qmz.png",
  305. "弘则有色团队": utils.ALIYUN_YBIMG_HOST + "qp.png",
  306. "弘则黑色团队": utils.ALIYUN_YBIMG_HOST + "wxy.png",
  307. "弘则宏观团队": utils.ALIYUN_YBIMG_HOST + "zzh.png",
  308. }
  309. if url, ok := firstNameMap[bannerResp.ClassifyNameFirst]; ok {
  310. bannerResp.ImgUrl = url
  311. } else if url, ok = authorMap[bannerResp.ReportAuthor]; ok {
  312. bannerResp.ImgUrl = url
  313. }
  314. response.OkData("查询成功", bannerResp, c)
  315. return
  316. }
  317. // Recommend 报告详情页更多推荐
  318. func Recommend(c *gin.Context) {
  319. reqReportId := c.DefaultQuery("reportId", "")
  320. classifyName := c.DefaultQuery("classify_name_first", "")
  321. if reqReportId == "" {
  322. response.Fail("请输入二级分类标识", c)
  323. return
  324. }
  325. reportId, err := strconv.Atoi(reqReportId)
  326. if err != nil {
  327. response.Fail("报告ID格式有误", c)
  328. return
  329. }
  330. var recommendResp []*pcModels.RecommendResp
  331. if classifyName == "周报" || classifyName == "晨报" {
  332. recommendList, err := report_chapter.GetWeekRecommendList(reportId, classifyName)
  333. if err != nil {
  334. response.Fail("获取报告详情失败"+err.Error(), c)
  335. return
  336. }
  337. for _, chapter := range recommendList {
  338. resp := &pcModels.RecommendResp{
  339. ReportId: chapter.ReportId,
  340. ReportChapterID: chapter.ReportChapterId,
  341. Title: chapter.Title,
  342. Stage: chapter.Stage,
  343. ClassifyNameFirst: chapter.ClassifyNameFirst,
  344. ClassifySecondFirst: "",
  345. }
  346. recommendResp = append(recommendResp, resp)
  347. }
  348. } else {
  349. reportInfo, err := report.GetByReportId(reportId)
  350. if err != nil {
  351. response.Fail("报告查询出错", c)
  352. return
  353. }
  354. if reportInfo.Id == 0 {
  355. response.Fail("报告不存在", c)
  356. return
  357. }
  358. if reportInfo.State != 2 {
  359. response.Fail("报告未发布", c)
  360. return
  361. }
  362. reportType := 0
  363. if reportInfo.ClassifyNameFirst == "权益研报" {
  364. reportType = 1
  365. } else {
  366. reportType = 2
  367. }
  368. recommendList, err := pcModels.GetRecommendList(reportId, reportType, reportInfo.ClassifyIdSecond)
  369. if err != nil {
  370. response.Fail("获取报告详情失败"+err.Error(), c)
  371. return
  372. }
  373. for _, chapter := range recommendList {
  374. resp := &pcModels.RecommendResp{
  375. ReportId: chapter.Id,
  376. ReportChapterID: 0,
  377. Title: chapter.Title,
  378. Stage: chapter.Stage,
  379. ClassifyNameFirst: chapter.ClassifyNameFirst,
  380. ClassifySecondFirst: chapter.ClassifyNameSecond,
  381. }
  382. recommendResp = append(recommendResp, resp)
  383. }
  384. }
  385. response.OkData("查询成功", recommendResp, c)
  386. return
  387. }
  388. // ClassifyFirstList Ficc 菜单
  389. func ClassifyFirstList(c *gin.Context) {
  390. userinfo := userService.GetInfoByClaims(c)
  391. classList, err := pc.GetClassifyFirstList(userinfo)
  392. if err != nil {
  393. response.Fail(err.Error(), c)
  394. return
  395. }
  396. response.OkData("查询成功", classList, c)
  397. return
  398. }
  399. // CustomerComment 客户评价
  400. func CustomerComment(c *gin.Context) {
  401. lists, err := customer_comment.GetCustomerComment()
  402. if err != nil {
  403. response.Fail(err.Error(), c)
  404. return
  405. }
  406. response.OkData("查询成功", lists, c)
  407. return
  408. }
  409. // GetSunCode 获取太阳码
  410. // @Tags 公共模块
  411. // @Summary 获取分享海报
  412. // @Description 获取分享海报
  413. // @Param request body services.SunCodeReq true "type json string"
  414. // @Success 200 {object} string "获取成功"
  415. // @failure 400 {string} string "获取失败"
  416. // @Router /pc/getSunCode [post]
  417. func GetSunCode(c *gin.Context) {
  418. var req services.SunCodeReq
  419. if c.ShouldBind(&req) != nil {
  420. response.Fail("参数异常", c)
  421. return
  422. }
  423. var sunCodeUrl string
  424. //先查,查不到再去生成上传
  425. item, err := yb_pc_suncode.GetYbPcSunCode(req.CodeScene, req.CodePage)
  426. if err != nil && err != utils.ErrNoRow {
  427. response.FailMsg("获取太阳码失败", err.Error(), c)
  428. return
  429. }
  430. if item != nil && item.SuncodeURL != "" {
  431. sunCodeUrl = item.SuncodeURL
  432. }
  433. if sunCodeUrl == "" {
  434. sunCodeUrl, err = services.PcCreateAndUploadSunCode(req.CodeScene, req.CodePage)
  435. if err != nil {
  436. response.FailMsg("生成太阳码失败", err.Error(), c)
  437. return
  438. }
  439. }
  440. response.OkData("查询成功", sunCodeUrl, c)
  441. return
  442. }
  443. // @Title pc端微信登录接口
  444. // @Description pc端微信登录接口
  445. // @Param Code query string true "微信唯一编码code"
  446. // @Success 200 {object} models.WxLoginResp
  447. // @router /pc/login [get]
  448. func WechatLogin(c *gin.Context) {
  449. var resp pcModels.LoginResp
  450. var token string
  451. var userId int
  452. var isBind bool
  453. code := c.DefaultQuery("Code", "")
  454. if code == "" {
  455. response.Fail("code参数错误", c)
  456. return
  457. }
  458. item, err := wechat.PcWxGetUserOpenIdByCode(code)
  459. if err != nil {
  460. response.Fail(err.Error(), c)
  461. return
  462. }
  463. fmt.Println("token:", item.AccessToken)
  464. fmt.Println("token:", item.Errmsg)
  465. fmt.Println("token:", item.Errcode)
  466. if item.Errcode != 0 {
  467. response.Fail(item.Errmsg, c)
  468. return
  469. }
  470. openId := item.Openid
  471. //wxUserInfo, err := wx_app.GetSession(code)
  472. //if err != nil {
  473. // response.Fail("获取失败,Err:"+err.Error(), c)
  474. // return
  475. //}
  476. //获取用户信息
  477. wxPcUserInfo, err := wechat.PcWxGetUserInfo(openId, item.AccessToken)
  478. if err != nil {
  479. response.Fail(err.Error(), c)
  480. return
  481. }
  482. if wxPcUserInfo.Errcode != 0 {
  483. response.Fail(err.Error(), c)
  484. return
  485. }
  486. unionId := item.Unionid
  487. //sessionKey := wxUserInfo.SessionKey
  488. //needUpdateSessionKey := true //是否更新sessionKey
  489. QUERY_WX_USER:
  490. wxUser, wxUserErr := userService.GetWxUserItemByOpenId(openId)
  491. if wxUserErr == userService.ERR_NO_USER_RECORD { //没有用户openid记录
  492. _, recordErr := userService.AddUserRecord(openId, unionId, "", "", "", "", "", "", "", 3, 0, 0)
  493. //如果插入失败,那么直接将错误信息返回
  494. if recordErr != nil {
  495. err = recordErr
  496. return
  497. }
  498. //needUpdateSessionKey = false //因为是新增用户微信信息,所以不需要更新sessionKey的数据了
  499. //插入成功后,需要重新查询该用户,并进入下面的逻辑
  500. goto QUERY_WX_USER
  501. } else if wxUserErr == userService.ERR_USER_NOT_BIND {
  502. // 未绑定则去查询unionId是否已经绑定了用户(其他平台,不区分平台),有相应的手机号邮箱信息则自动绑定
  503. platformUser, platformErr := userService.GetFirstWxUserItemByUnionId(unionId)
  504. if platformErr == nil {
  505. // 当公众号用户存在时
  506. if platformUser.Mobile != "" || platformUser.Email != "" {
  507. // 有手机号或邮箱则绑定信息则自动绑定并新增wx_user
  508. countryCode := 0
  509. if platformUser.CountryCode != "" {
  510. countryCode, _ = strconv.Atoi(platformUser.CountryCode)
  511. }
  512. tempToken, tempUser, tempErr, errMsg := userService.BindWxUser(openId, platformUser.Mobile, platformUser.Email, "", 3, countryCode, 1)
  513. if tempErr != nil {
  514. err = errors.New("自动绑定公众号用户失败,Err:" + tempErr.Error() + ", errMsg:" + errMsg)
  515. return
  516. }
  517. token = tempToken
  518. userId = int(tempUser.UserID)
  519. isBind = true
  520. }
  521. }
  522. } else if wxUserErr != nil {
  523. err = wxUserErr
  524. return
  525. }
  526. //更新微信用户的sessionKey
  527. //if needUpdateSessionKey {
  528. // _ = user_record.ModifySessionKeyByOpenid(openId, sessionKey)
  529. //}
  530. // 如果已经登录注册绑定的情况下/或者首次登录且为弘则研究公众号用户
  531. if wxUserErr == nil {
  532. userId = int(wxUser.UserID)
  533. // 如果账户有绑定了手机号或者邮箱,那么标记为已绑定
  534. if wxUser.Mobile != "" || wxUser.Email != "" {
  535. isBind = true
  536. }
  537. }
  538. //获取登录token
  539. tokenItem, tokenErr := session.GetTokenByOpenId(openId)
  540. if tokenErr != nil && tokenErr != utils.ErrNoRow {
  541. err = errors.New("登录失败,获取token失败:" + tokenErr.Error())
  542. return
  543. }
  544. fmt.Println("AccessToken:", item.AccessToken)
  545. fmt.Println("tokenItem:", tokenItem.AccessToken)
  546. if tokenErr != nil && tokenErr == utils.ErrNoRow {
  547. timeUnix := time.Now().Unix()
  548. timeUnixStr := strconv.FormatInt(timeUnix, 10)
  549. token = utils.MD5(openId) + utils.MD5(timeUnixStr)
  550. fmt.Println("token:", tokenItem.AccessToken)
  551. //新增session
  552. {
  553. sessionItem := &session.Session{
  554. OpenID: openId,
  555. UserID: int64(userId),
  556. CreatedTime: time.Now(),
  557. LastUpdatedTime: time.Now(),
  558. ExpireTime: time.Now().AddDate(0, 3, 0),
  559. AccessToken: token,
  560. }
  561. sessionErr := sessionItem.Create()
  562. if err != nil {
  563. err = errors.New("登录失败,新增用户session信息失败:" + sessionErr.Error())
  564. return
  565. }
  566. }
  567. } else {
  568. token = tokenItem.AccessToken
  569. //如果联系人编号不为空,且联系人编号与session里面的联系人编号不一致的时候,需要做session变更
  570. //if userId > 0 && tokenItem.UserID != int64(userId) {
  571. // _ = tokenItem.UpdateSession(int64(userId), time.Now().AddDate(0, 1, 0))
  572. //}
  573. //if userId > 0 {
  574. //}
  575. _ = tokenItem.UpdateSession(int64(userId), time.Now().AddDate(0, 1, 0))
  576. }
  577. //新增登录日志
  578. {
  579. loginLog := &wx_user_log.WxUserLog{
  580. UserID: userId,
  581. OpenID: openId,
  582. UnionID: unionId,
  583. CreateTime: time.Now(),
  584. Handle: "yb_login",
  585. Remark: token,
  586. }
  587. go loginLog.Create()
  588. }
  589. resp.IsBind = isBind
  590. resp.Token = token
  591. response.OkData("查询成功", resp, c)
  592. return
  593. }
  594. // @Title 登录
  595. // @Description 登录接口
  596. // @Param request body models.LoginReq true "type json string"
  597. // @Success 200 {object} models.LoginResp
  598. // @router /pc/pcLogin [post]
  599. func PcLogin(c *gin.Context) {
  600. var req pcModels.PcLoginReq
  601. if c.ShouldBind(&req) != nil {
  602. response.Fail("参数异常", c)
  603. return
  604. }
  605. userId := 0
  606. var isAdd bool
  607. if req.LoginType == 1 {
  608. if req.Mobile == "" {
  609. response.Fail("请输入手机号", c)
  610. return
  611. }
  612. if req.SmsCode == "" {
  613. response.Fail("请输入有效手机验证码", c)
  614. return
  615. }
  616. item, err := msg_code.GetMsgCode(req.Mobile, req.SmsCode)
  617. if err != nil {
  618. if err == utils.ErrNoRow {
  619. response.Fail("校验验证码失败,Err:" + err.Error(), c)
  620. return
  621. } else {
  622. response.Fail("校验验证码失败,Err:" + err.Error(), c)
  623. return
  624. }
  625. }
  626. if item == nil {
  627. response.Fail("手机验证码错误,请重新输入", c)
  628. return
  629. }
  630. wxUser, err := wx_user.GetByMobile(req.Mobile)
  631. if err != nil {
  632. if err == utils.ErrNoRow {
  633. isAdd = true
  634. } else {
  635. response.Fail("根据手机号获取用户信息失败,Err:" + err.Error(), c)
  636. return
  637. }
  638. }
  639. if wxUser == nil {
  640. isAdd = true
  641. } else {
  642. userId = int(wxUser.UserID)
  643. }
  644. //BindMobile(openId, mobile string, userId, loginType int) (err error) {
  645. //newUserId, err = models.BindMobile(openId, req.Mobile, userId, req.LoginType)
  646. } else if req.LoginType == 2 {
  647. if req.Email == "" {
  648. response.Fail("邮箱不能为空,请输入邮箱", c)
  649. return
  650. }
  651. if !utils.ValidateEmailFormatat(req.Email) {
  652. response.Fail("邮箱格式错误,请重新输入", c)
  653. return
  654. }
  655. if req.SmsCode == "" {
  656. response.Fail("请输入有效验证码", c)
  657. return
  658. }
  659. item, err := msg_code.GetMsgCode(req.Email, req.SmsCode)
  660. if err != nil {
  661. if err == utils.ErrNoRow {
  662. response.Fail("校验验证码失败,Err:" + err.Error(), c)
  663. return
  664. } else {
  665. response.Fail("校验验证码失败,Err:" + err.Error(), c)
  666. return
  667. }
  668. }
  669. if item == nil {
  670. response.Fail("邮箱证码错误,请重新输入:", c)
  671. return
  672. }
  673. wxUser, err := wx_user.GetByEmail(req.Email)
  674. if err != nil {
  675. if err == utils.ErrNoRow {
  676. isAdd = true
  677. } else {
  678. response.Fail("根据邮箱获取用户信息失败,Err:" + err.Error(), c)
  679. return
  680. }
  681. }
  682. if wxUser == nil {
  683. isAdd = true
  684. } else {
  685. userId = int(wxUser.UserID)
  686. }
  687. } else {
  688. response.Fail("无效的登录方式,loginType:" + strconv.Itoa(req.LoginType), c)
  689. }
  690. if isAdd {
  691. user := new(wx_user.WxUser)
  692. user.CompanyID = 1
  693. user.CreatedTime = time.Now()
  694. user.FirstLogin = 1
  695. user.Enabled = 1
  696. user.Email = req.Email
  697. user.Mobile = req.Mobile
  698. if req.LoginType == 1 {
  699. user.BindAccount = user.Mobile
  700. } else {
  701. user.BindAccount = user.Email
  702. }
  703. user.RegisterTime = time.Now()
  704. user.LoginTime = time.Now()
  705. user.RegisterPlatform = 2
  706. if req.IsFreeLogin {
  707. user.IsFreeLogin = 1
  708. }else {
  709. user.IsFreeLogin = 0
  710. }
  711. lastId, err := user.Add()
  712. if err != nil {
  713. response.Fail("登录失败,新增客户信息失败,Err:" + err.Error(), c)
  714. return
  715. }
  716. fmt.Println("lastId:", lastId)
  717. userId = int(lastId)
  718. timeUnix := time.Now().Unix()
  719. timeUnixStr := strconv.FormatInt(timeUnix, 10)
  720. token := utils.MD5(strconv.Itoa(userId)) + utils.MD5(timeUnixStr)
  721. //新增session
  722. {
  723. session := new(session.Session)
  724. session.UserID = int64(userId)
  725. session.CreatedTime = time.Now()
  726. session.LastUpdatedTime = time.Now()
  727. session.ExpireTime = time.Now().AddDate(0, 3, 0)
  728. session.AccessToken = token
  729. err = session.Create()
  730. if err != nil {
  731. response.Fail("登录失败,新增用户session信息失败:" + err.Error(), c)
  732. return
  733. }
  734. }
  735. } else {
  736. user := new(wx_user.WxUser)
  737. user.UserID = uint64(userId)
  738. if req.IsFreeLogin {
  739. user.IsFreeLogin = 1
  740. }else {
  741. user.IsFreeLogin = 0
  742. }
  743. err := user.Update([]string{"is_free_login"})
  744. if err != nil {
  745. response.Fail("登录失败,修改登录信息失败,Err:" + err.Error(), c)
  746. return
  747. }
  748. }
  749. if userId == 0 {
  750. response.Fail("登录失败,id为 0", c)
  751. return
  752. }
  753. err := wx_user.ModifyFirstLogin(uint64(userId))
  754. if err != nil {
  755. response.Fail("登录失败,判断权限失败:" + err.Error(), c)
  756. return
  757. }
  758. var token string
  759. tokenItem, err := session.GetTokenByUid(userId)
  760. if err != nil && err != utils.ErrNoRow {
  761. response.Fail("登录失败,获取token失败:" + err.Error(), c)
  762. return
  763. }
  764. if tokenItem == nil || (err != nil && err == utils.ErrNoRow) {
  765. timeUnix := time.Now().Unix()
  766. timeUnixStr := strconv.FormatInt(timeUnix, 10)
  767. token = utils.MD5(strconv.Itoa(userId)) + utils.MD5(timeUnixStr)
  768. //新增session
  769. {
  770. session := new(session.Session)
  771. session.UserID = int64(userId)
  772. session.CreatedTime = time.Now()
  773. session.LastUpdatedTime = time.Now()
  774. session.ExpireTime = time.Now().AddDate(0, 3, 0)
  775. session.AccessToken = token
  776. err = session.Create()
  777. if err != nil {
  778. response.Fail("登录失败,新增用户session信息失败:" + err.Error(), c)
  779. return
  780. }
  781. }
  782. } else {
  783. token = tokenItem.AccessToken
  784. }
  785. //新增登录日志
  786. {
  787. loginLog := new(wx_user_log.WxUserLog)
  788. loginLog.UserID = userId
  789. loginLog.Mobile = req.Mobile
  790. loginLog.Email = req.Email
  791. loginLog.Handle = "pc_login"
  792. loginLog.CreateTime = time.Now()
  793. go loginLog.Create()
  794. }
  795. response.OkData("登录成功", token, c)
  796. }
  797. // GetSmsCode 获取短信验证码接口
  798. // @Tags 用户模块
  799. // @Summary 获取短信验证码
  800. // @Description 获取短信验证码接口
  801. // @Security ApiKeyAuth
  802. // @securityDefinitions.basic BasicAuth
  803. // @Param mobile query string true "手机号"
  804. // @Param area_num query string true "手机国际区号(中国大陆:86)"
  805. // @Accept json
  806. // @Product json
  807. // @Success 200 {string} string 获取验证码成功
  808. // @Failure 400 {string} string 手机号不能为空,请输入手机号
  809. // @Router /pc_code/get_sms_code [get]
  810. func GetSmsCode(c *gin.Context) {
  811. mobile := c.DefaultQuery("mobile", "")
  812. areaNum := c.DefaultQuery("area_num", "")
  813. err, errMsg := userLogic.PcSendSmsCode(mobile, areaNum)
  814. if err != nil {
  815. if errMsg != "" {
  816. errMsg = "获取验证码失败"
  817. }
  818. response.Fail(errMsg, c)
  819. return
  820. }
  821. response.Ok("获取验证码成功", c)
  822. }
  823. // GetEmailCode 获取邮箱验证码接口
  824. // @Tags 用户模块
  825. // @Summary 获取邮箱验证码
  826. // @Description 获取邮箱验证码
  827. // @Security ApiKeyAuth
  828. // @securityDefinitions.basic BasicAuth
  829. // @Param email query string true "电子邮箱账号"
  830. // @Accept json
  831. // @Product json
  832. // @Success 200 {string} string 获取验证码成功
  833. // @Failure 400 {string} string 请输入邮箱地址
  834. // @Router /pc_code/get_email_code [get]
  835. func GetEmailCode(c *gin.Context) {
  836. email := c.DefaultQuery("email", "")
  837. if email == "" {
  838. response.Fail("请输入邮箱地址", c)
  839. return
  840. }
  841. if !utils.ValidateEmailFormatat(email) {
  842. response.Fail("邮箱格式错误,请重新输入", c)
  843. return
  844. }
  845. err, errMsg := userLogic.PcSendEmailCode(email)
  846. if err != nil {
  847. if errMsg != "" {
  848. errMsg = "获取验证码失败"
  849. }
  850. response.Fail(errMsg, c)
  851. return
  852. }
  853. response.Ok("获取验证码成功", c)
  854. }