report.go 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005
  1. package models
  2. import (
  3. "github.com/beego/beego/v2/client/orm"
  4. "github.com/rdlucklib/rdluck_tools/paging"
  5. "hongze/hongze_clpt/utils"
  6. "strconv"
  7. "time"
  8. )
  9. type IndustrialManagementList struct {
  10. Paging *paging.PagingItem
  11. List []*IndustrialManagement
  12. }
  13. type IndustrialManagement struct {
  14. IndustrialManagementId int `orm:"column(industrial_management_id);pk" description:"产业id"`
  15. IndustryName string `description:"产业名称"`
  16. ChartPermissionId int `description:"权限id"`
  17. ChartPermissionName string `description:"权限名称"`
  18. LayoutTime string `description:"布局时间"`
  19. UpdateTime string `description:"更新时间"`
  20. IsRed bool `description:"是否标记红点"`
  21. IsHot bool `description:"是否是热门"`
  22. IsFollow bool `description:"是否关注"`
  23. IsNew bool `description:"是否展示 NEW 标签"`
  24. IsShowRoadshow bool `description:"是否展示 微路演 标签"`
  25. ArticleReadNum int `description:"文章阅读数量"`
  26. ArticleId int `description:"文章id"`
  27. Source int `description:"来源 1:弘则资源包(报告)、2:研选主题(报告)"`
  28. IndustrialSubjectList []*IndustrialSubject `description:"标的列表"`
  29. MinReportTime string `description:"报告最早发布时间"`
  30. IndustryVideo *MicroVideoSimpleInfo
  31. AuthInfo *UserPermissionAuthInfo
  32. }
  33. type MicroVideoSimpleInfo struct {
  34. Id int `description:"视频ID"`
  35. Title string `description:"标题"`
  36. ResourceUrl string `description:"链接"`
  37. BackgroundImg string `description:"背景图"`
  38. PlaySeconds int `description:"音视频时长"`
  39. DetailImgUrl string `description:"产业详情页背景图"`
  40. ChartPermissionId int `description:"行业ID"`
  41. ChartPermissionName string `description:"行业名称"`
  42. }
  43. type TacticsListResp struct {
  44. Paging *paging.PagingItem
  45. MatchTypeName string `description:"匹配类型"`
  46. CategoryImgUrlPc string `description:"图片"`
  47. List []*HomeArticle
  48. }
  49. type TacticsListTimeResp struct {
  50. Paging *paging.PagingItem
  51. MatchTypeName string `description:"匹配类型"`
  52. CategoryImgUrlPc string `description:"图片"`
  53. List []*TimeLineReportItem
  54. }
  55. // 报告搜索start
  56. type ReoprtSearchResp struct {
  57. Paging *paging.PagingItem
  58. ListHz []*ArticleResearchResp `description:"弘则报告"`
  59. ListYx []*ArticleResearchResp `description:"研选报告"`
  60. }
  61. // 搜索资源包 start
  62. type SearchResourceResp struct {
  63. ListHz []*IndustrialManagement `description:"弘则"`
  64. ListYx []*IndustrialManagement `description:"研选"`
  65. }
  66. type ArticleIdReq struct {
  67. ArticleId int `description:"文章id"`
  68. PlaySeconds int `description:"播放时长"`
  69. PageRouter string `description:"页面路径"`
  70. ReportType int `description:"2本周研究汇总、3上周纪要汇总"`
  71. }
  72. // 获取列表数量
  73. func GetReoprtSearchCount(condition string) (count int, err error) {
  74. o := orm.NewOrm()
  75. sql := `SELECT
  76. COUNT( 1 ) AS count
  77. FROM
  78. cygx_article AS a
  79. WHERE
  80. 1 = 1
  81. AND a.article_id < 1000000 `
  82. if condition != "" {
  83. sql += condition
  84. }
  85. err = o.Raw(sql).QueryRow(&count)
  86. return
  87. }
  88. func GetReoprtSearchCountYx(condition string) (count int, err error) {
  89. o := orm.NewOrm()
  90. sql := `SELECT
  91. COUNT( 1 ) AS count
  92. FROM
  93. cygx_article AS a
  94. WHERE
  95. 1 = 1`
  96. if condition != "" {
  97. sql += condition
  98. }
  99. err = o.Raw(sql).QueryRow(&count)
  100. return
  101. }
  102. func GetReoprtSearchCountHz(condition string) (count int, err error) {
  103. o := orm.NewOrm()
  104. sql := `SELECT
  105. COUNT( 1 ) AS count
  106. FROM
  107. cygx_article AS a
  108. WHERE
  109. 1 = 1`
  110. if condition != "" {
  111. sql += condition
  112. }
  113. err = o.Raw(sql).QueryRow(&count)
  114. return
  115. }
  116. // 列表
  117. func GetReoprtSearchList(condition string, userId, startSize, pageSize int) (items []*ArticleCollectionResp, err error) {
  118. o := orm.NewOrm()
  119. sql := `SELECT
  120. a.article_id,
  121. a.title,
  122. a.body,
  123. a.abstract,
  124. a.annotation,
  125. a.category_id,
  126. a.category_name,
  127. date_format( a.publish_date, '%Y-%m-%d' ) AS publish_date,
  128. m.industry_name,
  129. m.industrial_management_id,
  130. ( SELECT count( 1 ) FROM cygx_article_history_record_newpv AS h WHERE h.article_id = a.article_id ) AS pv,
  131. ( SELECT count( 1 ) FROM cygx_article_collect AS ac WHERE ac.article_id = a.article_id ) AS collect_num,
  132. ( SELECT count( 1 ) FROM cygx_article_collect AS ac WHERE ac.article_id = a.article_id AND user_id = ?) AS my_collect_num
  133. FROM
  134. cygx_article AS a
  135. LEFT JOIN cygx_industrial_article_group_management AS mg ON mg.article_id = a.article_id
  136. LEFT JOIN cygx_industrial_management AS m ON m.industrial_management_id = mg.industrial_management_id
  137. WHERE
  138. 1 = 1 `
  139. if condition != "" {
  140. sql += condition
  141. }
  142. sql += ` GROUP BY a.article_id ORDER BY a.publish_date DESC LIMIT ?,? `
  143. _, err = o.Raw(sql, userId, startSize, pageSize).QueryRows(&items)
  144. return
  145. } //end
  146. // 获取行业报告列表
  147. func GetReportAndproductIndustrylList(categoryId, startSize, pageSize int) (items []*HomeArticle, total int, err error) {
  148. o := orm.NewOrm()
  149. sql := `SELECT
  150. art.article_id,
  151. art.title,
  152. art.publish_date,
  153. 1 AS resource
  154. FROM
  155. cygx_article AS art
  156. WHERE
  157. art.publish_status = 1
  158. AND category_id IN ( SELECT category_id_celue FROM cygx_report_mapping_group WHERE id_cygx = ` + strconv.Itoa(categoryId) + ` ) UNION ALL
  159. SELECT
  160. art.product_interior_id AS article_id,
  161. art.title,
  162. art.publish_time AS publish_date,
  163. 2 AS resource
  164. FROM
  165. cygx_product_interior AS art
  166. WHERE
  167. art.STATUS = 1
  168. AND art.visible_range = 1
  169. AND art.match_type_id = ` + strconv.Itoa(categoryId)
  170. totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
  171. err = o.Raw(totalSql).QueryRow(&total)
  172. sql += ` ORDER BY publish_date DESC LIMIT ?,? `
  173. _, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
  174. return
  175. }
  176. // 获取行业报告列表
  177. func GetReportAndproductIndustrylListimg(categoryId, userId, startSize, pageSize int) (items []*ArticleListResp, total int, err error) {
  178. o := orm.NewOrm()
  179. sql := `SELECT
  180. art.article_id,
  181. art.body,
  182. art.annotation,
  183. art.abstract,
  184. art.category_id,
  185. art.title,
  186. art.publish_date,
  187. 1 AS resource ,
  188. ( SELECT COUNT( 1 ) FROM cygx_article_history_record AS rec WHERE rec.user_id = ` + strconv.Itoa(userId) + ` AND rec.article_id = art.article_id ) AS readnum
  189. FROM
  190. cygx_article AS art
  191. WHERE
  192. art.publish_status = 1
  193. AND category_id IN ( SELECT category_id_celue FROM cygx_report_mapping_group WHERE id_cygx = ` + strconv.Itoa(categoryId) + ` ) UNION ALL
  194. SELECT
  195. art.product_interior_id AS article_id,
  196. art.body,
  197. "",
  198. art.abstract,
  199. 0 as category_id,
  200. art.title,
  201. art.publish_time AS publish_date,
  202. 2 AS resource ,
  203. ( SELECT COUNT( 1 ) FROM cygx_product_interior_history AS rec WHERE rec.user_id = ` + strconv.Itoa(userId) + ` AND rec.product_interior_id = art.product_interior_id ) AS readnum
  204. FROM
  205. cygx_product_interior AS art
  206. WHERE
  207. art.STATUS = 1
  208. AND art.visible_range = 1
  209. AND art.match_type_id = ` + strconv.Itoa(categoryId)
  210. totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
  211. err = o.Raw(totalSql).QueryRow(&total)
  212. sql += ` ORDER BY publish_date DESC LIMIT ?,? `
  213. _, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
  214. return
  215. }
  216. // 列表
  217. func GetSearchResourceList(condition string) (items []*IndustrialManagement, err error) {
  218. o := orm.NewOrm()
  219. sql := `SELECT
  220. m.industry_name,
  221. m.chart_permission_id,
  222. m.industrial_management_id,
  223. MAX( a.publish_date ) as publish_date_order,
  224. MIN( a.publish_date ) AS min_report_time,
  225. date_format( MAX( a.publish_date ), '%Y-%m-%d' ) AS publish_date
  226. FROM
  227. cygx_industrial_management AS m
  228. INNER JOIN cygx_industrial_article_group_management AS mg ON mg.industrial_management_id = m.industrial_management_id
  229. INNER JOIN cygx_article AS a ON a.article_id = mg.article_id AND a.article_type != 'lyjh'
  230. WHERE
  231. 1 = 1
  232. AND publish_status = 1 ` + condition + ` GROUP BY m.industrial_management_id ORDER BY publish_date_order DESC `
  233. _, err = o.Raw(sql).QueryRows(&items)
  234. return
  235. }
  236. // 标的列表
  237. func GetThemeHeatSubjectList(condition string) (items []*IndustrialSubject, err error) {
  238. o := orm.NewOrm()
  239. sql := `SELECT
  240. m.subject_name,
  241. m.industrial_management_id,
  242. m.industrial_subject_id
  243. FROM
  244. cygx_article AS a
  245. INNER JOIN cygx_industrial_article_group_subject AS mg ON mg.article_id = a.article_id
  246. INNER JOIN cygx_industrial_subject AS m ON m.industrial_subject_id = mg.industrial_subject_id
  247. WHERE
  248. 1 = 1`
  249. if condition != "" {
  250. sql += condition
  251. }
  252. sql += ` AND publish_status = 1
  253. GROUP BY
  254. m.industrial_subject_id
  255. ORDER BY
  256. publish_date DESC`
  257. _, err = o.Raw(sql).QueryRows(&items)
  258. return
  259. } //end
  260. // 产业下所关联的文章分类列表
  261. func IndustrialToArticleCategory(industrialManagementId, chartPermissionId int) (items []*IndustrialToArticleCategoryRep, err error) {
  262. o := orm.NewOrm()
  263. sql := `SELECT map.match_type_name,map.category_id
  264. FROM cygx_report_mapping AS map
  265. INNER JOIN cygx_article AS art ON art.category_id = map.category_id
  266. INNER JOIN cygx_industrial_article_group_management AS man_g ON man_g.article_id = art.article_id
  267. WHERE map.report_type = 2
  268. AND map.is_report = 1
  269. AND art.is_report = 1
  270. AND art.publish_status = 1
  271. AND man_g.industrial_management_id =?
  272. AND map.chart_permission_id = ?
  273. GROUP BY map.match_type_name`
  274. _, err = o.Raw(sql, industrialManagementId, chartPermissionId).QueryRows(&items)
  275. return
  276. }
  277. // 产业下所关联的文章、产品内测分类列表 2023-04-14
  278. func IndustrialToArticleAndProductInteriorCategoryNew(industrialManagementId int) (items []*IndustrialToArticleCategoryRep, err error) {
  279. o := orm.NewOrm()
  280. sql := `SELECT
  281. map.match_type_name,
  282. map.id AS category_id
  283. FROM
  284. cygx_report_mapping_cygx AS map
  285. INNER JOIN cygx_report_mapping_group AS g ON g.id_cygx = map.id
  286. INNER JOIN cygx_report_mapping_celue AS cl ON cl.category_id = g.category_id_celue
  287. INNER JOIN cygx_article AS art ON art.category_id = cl.category_id
  288. INNER JOIN cygx_industrial_article_group_management AS man_g ON man_g.article_id = art.article_id
  289. WHERE
  290. 1 = 1
  291. AND map.report_type = 2
  292. AND map.is_report = 1
  293. AND art.is_report = 1
  294. AND art.publish_status = 1
  295. AND man_g.industrial_management_id = ?
  296. GROUP BY
  297. map.match_type_name UNION ALL
  298. SELECT
  299. map.match_type_name,
  300. map.id AS category_id
  301. FROM
  302. cygx_report_mapping_cygx AS map
  303. INNER JOIN cygx_industrial_management AS im ON im.chart_permission_id = map.chart_permission_id
  304. INNER JOIN cygx_product_interior AS art ON art.match_type_id = map.id
  305. INNER JOIN cygx_product_interior_industrial_group_management AS man_g ON man_g.product_interior_id = art.product_interior_id
  306. WHERE
  307. 1 = 1
  308. AND art.STATUS = 1
  309. AND art.visible_range = 1
  310. AND man_g.industrial_management_id = ?
  311. GROUP BY
  312. map.match_type_name`
  313. _, err = o.Raw(sql, industrialManagementId, industrialManagementId).QueryRows(&items)
  314. return
  315. }
  316. // 获取产业报告列表
  317. func GetReportAndproductInteriorIndustrialList(pars []interface{}, categoryId, industrialManagementId, userId, startSize, pageSize int) (items []*ArticleListResp, total int, err error) {
  318. o := orm.NewOrm()
  319. sql := `SELECT
  320. art.article_id,
  321. art.body,
  322. art.annotation,
  323. art.abstract,
  324. art.category_id,
  325. art.title,
  326. art.publish_date,
  327. ( SELECT COUNT( 1 ) FROM cygx_article_history_record AS rec WHERE rec.user_id = ` + strconv.Itoa(userId) + ` AND rec.article_id = art.article_id ) AS readnum ,
  328. 1 AS resource
  329. FROM
  330. cygx_article AS art
  331. INNER JOIN cygx_industrial_article_group_management AS man_g ON man_g.article_id = art.article_id
  332. WHERE
  333. art.publish_status = 1
  334. AND category_id IN ( SELECT category_id_celue FROM cygx_report_mapping_group WHERE id_cygx = ` + strconv.Itoa(categoryId) + ` )
  335. AND art.is_class = 1
  336. AND man_g.industrial_management_id =` + strconv.Itoa(industrialManagementId) + `
  337. GROUP BY
  338. art.article_id UNION ALL
  339. SELECT
  340. art.product_interior_id AS article_id,
  341. art.body,
  342. "",
  343. art.abstract,
  344. 0 as category_id,
  345. art.title,
  346. art.publish_time AS publish_date,
  347. ( SELECT COUNT( 1 ) FROM cygx_product_interior_history AS rec WHERE rec.user_id = ` + strconv.Itoa(userId) + ` AND rec.product_interior_id = art.product_interior_id ) AS readnum ,
  348. 2 AS resource
  349. FROM
  350. cygx_product_interior AS art
  351. INNER JOIN cygx_product_interior_industrial_group_management AS man_g ON man_g.product_interior_id = art.product_interior_id
  352. WHERE
  353. art.STATUS = 1
  354. AND art.visible_range = 1
  355. AND art.match_type_id = ` + strconv.Itoa(categoryId) + `
  356. AND man_g.industrial_management_id = ` + strconv.Itoa(industrialManagementId) + `
  357. GROUP BY
  358. art.product_interior_id `
  359. totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
  360. err = o.Raw(totalSql, pars).QueryRow(&total)
  361. sql += ` ORDER BY publish_date DESC LIMIT ?,? `
  362. _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
  363. return
  364. }
  365. // 判断用户是否阅读该产业下,某一分类的文章
  366. func IndustrialUserRecordArticleCount(userId, industrialManagementId, categoryId int) (count int, err error) {
  367. o := orm.NewOrm()
  368. sql := `SELECT
  369. COUNT(1) count
  370. FROM
  371. cygx_article_history_record
  372. WHERE
  373. article_id = ( SELECT article_id FROM cygx_article WHERE article_id IN (SELECT article_id FROM cygx_industrial_article_group_management WHERE industrial_management_id = ? ) AND article_id < 1000000 AND category_id IN (SELECT
  374. category_id
  375. FROM
  376. cygx_report_mapping
  377. WHERE
  378. chart_permission_id = any( SELECT chart_permission_id FROM cygx_report_mapping WHERE category_id = ? )
  379. AND match_type_name = any( SELECT match_type_name FROM cygx_report_mapping WHERE category_id = ? ) ) ORDER BY publish_date DESC LIMIT 0, 1 )
  380. AND user_id = ? `
  381. err = o.Raw(sql, industrialManagementId, categoryId, categoryId, userId).QueryRow(&count)
  382. return
  383. }
  384. // 获取最新文章
  385. func GetNewIndustrialUserRecordArticle(industrialManagementId, categoryId int) (item *ArticleDetail, err error) {
  386. o := orm.NewOrm()
  387. sql := ` SELECT * FROM cygx_article WHERE article_id IN (SELECT article_id FROM cygx_industrial_article_group_management WHERE industrial_management_id = ? ) AND category_id IN (SELECT
  388. category_id
  389. FROM
  390. cygx_report_mapping
  391. WHERE
  392. chart_permission_id = any( SELECT chart_permission_id FROM cygx_report_mapping WHERE category_id = ? )
  393. AND match_type_name = any( SELECT match_type_name FROM cygx_report_mapping WHERE category_id = ? ) ) ORDER BY publish_date DESC LIMIT 0, 1`
  394. err = o.Raw(sql, industrialManagementId, categoryId, categoryId).QueryRow(&item)
  395. return
  396. }
  397. // 列表
  398. func GetReoprtSearchListHz(condition string, userId int) (items []*ArticleCollectionResp, err error) {
  399. o := orm.NewOrm()
  400. sql := `SELECT
  401. a.article_id,
  402. a.title,
  403. a.annotation,
  404. date_format( a.publish_date, '%Y-%m-%d' ) AS publish_date,
  405. m.industry_name,
  406. m.industrial_management_id,
  407. ( SELECT count( 1 ) FROM cygx_article_history_record_newpv AS h WHERE h.article_id = a.article_id ) AS pv,
  408. ( SELECT count( 1 ) FROM cygx_article_collect AS ac WHERE ac.article_id = a.article_id ) AS collect_num,
  409. ( SELECT count( 1 ) FROM cygx_article_collect AS ac WHERE ac.article_id = a.article_id AND user_id = ?) AS my_collect_num
  410. FROM
  411. cygx_article AS a
  412. LEFT JOIN cygx_industrial_article_group_management AS mg ON mg.article_id = a.article_id
  413. LEFT JOIN cygx_industrial_management AS m ON m.industrial_management_id = mg.industrial_management_id
  414. WHERE
  415. 1 = 1 `
  416. if condition != "" {
  417. sql += condition
  418. }
  419. _, err = o.Raw(sql, userId).QueryRows(&items)
  420. return
  421. } //end
  422. // 产业列表
  423. func GetSearchResourceListHz(condition string, startSize, pageSize int) (items []*IndustrialManagementHotResp, err error) {
  424. o := orm.NewOrm()
  425. sql := `SELECT
  426. m.industry_name,
  427. m.industrial_management_id,
  428. MAX( a.publish_date ) as publish_date_order,
  429. date_format( MAX( a.publish_date ), '%Y-%m-%d' ) AS publish_date
  430. FROM
  431. cygx_industrial_management AS m
  432. INNER JOIN cygx_industrial_article_group_management AS mg ON mg.industrial_management_id = m.industrial_management_id
  433. INNER JOIN cygx_article AS a ON a.article_id = mg.article_id AND a.article_type != 'lyjh'
  434. WHERE
  435. 1 = 1
  436. AND publish_status = 1 ` + condition + ` GROUP BY m.industrial_management_id ORDER BY publish_date_order DESC `
  437. if startSize > 0 || pageSize > 0 {
  438. sql += ` LIMIT ` + strconv.Itoa(startSize) + "," + strconv.Itoa(pageSize)
  439. }
  440. _, err = o.Raw(sql).QueryRows(&items)
  441. return
  442. }
  443. // 用户收藏榜start
  444. type IndustrialManagementHotResp struct {
  445. IndustrialManagementId int `orm:"column(industrial_management_id);pk" description:"产业id"`
  446. IndustryName string `description:"产业名称"`
  447. IsFollow bool `description:"是否关注"`
  448. FllowNum int `description:"关注数量"`
  449. IsNew bool `description:"是否新标签"`
  450. IsHot bool `description:"是否新标签"`
  451. PublishDate string `description:"发布时间"`
  452. ArticleReadNum int `description:"文章阅读数量"`
  453. Source int `description:"来源 1:弘则资源包(报告)、2:研选主题(报告)"`
  454. MinReportTime string `description:"报告最早发布时间"`
  455. IndustrialSubjectList []*IndustrialSubject `description:"标的列表"`
  456. }
  457. // 搜索资源包 start
  458. type SearchReportAndResourceResp struct {
  459. ListHzResource []*IndustrialManagement `description:"弘则资源包"`
  460. ListHzReport []*ArticleCollectionResp `description:"弘则报告"`
  461. Paging *paging.PagingItem `description:"弘则报告分页"`
  462. }
  463. // 报告收藏榜单列表
  464. func GetReportCollectionBillboardList(limit int, pars []interface{}, condition string) (items []*ArticleListResp, err error) {
  465. o := orm.NewOrm()
  466. sql := `SELECT
  467. ac.id,
  468. a.article_id,
  469. a.category_id,
  470. a.title,
  471. a.annotation,
  472. a.publish_date,
  473. m.chart_permission_name,
  474. COUNT(ac.id) AS collection_num
  475. FROM
  476. cygx_article AS a
  477. INNER JOIN cygx_report_mapping AS m ON m.category_id = a.category_id_two
  478. INNER JOIN cygx_article_collect AS ac ON ac.article_id = a.article_id
  479. WHERE
  480. 1 = 1
  481. AND a.publish_status = 1 `
  482. if condition != "" {
  483. sql += condition
  484. }
  485. sql += ` GROUP BY a.article_id ORDER BY collection_num DESC, ac.id DESC, a.publish_date DESC`
  486. sql += ` LIMIT ?`
  487. _, err = o.Raw(sql, pars, limit).QueryRows(&items)
  488. return
  489. }
  490. // 研选报告收藏榜单列表
  491. func GetReportCollectionBillboardListYx(limit int, pars []interface{}, condition string) (items []*ArticleListResp, err error) {
  492. o := orm.NewOrm()
  493. sql := `SELECT
  494. ac.id,
  495. a.category_id,
  496. '买方研选' as chart_permission_name,
  497. a.article_id,
  498. a.title,
  499. a.body,
  500. a.annotation,
  501. a.abstract,
  502. a.publish_date,
  503. a.article_type_id,
  504. d.nick_name,
  505. d.department_id,
  506. ( SELECT count( 1 ) FROM cygx_article_history_record_newpv AS h WHERE h.article_id = a.article_id ) AS pv,
  507. ( SELECT count( 1 ) FROM cygx_article_collect AS ac INNER JOIN wx_user as u ON u.user_id = ac.user_id WHERE ac.article_id = a.article_id ) AS collect_num,
  508. ( SELECT count( 1 ) FROM cygx_article_collect AS ac INNER JOIN wx_user as u ON u.user_id = ac.user_id WHERE ac.article_id = a.article_id AND DATE_SUB( CURDATE(), INTERVAL 30 DAY ) <= date( ac.create_time ) ) AS collection_num
  509. FROM
  510. cygx_article AS a
  511. INNER JOIN cygx_article_collect AS ac ON ac.article_id = a.article_id
  512. INNER JOIN cygx_industrial_article_group_management AS mg ON mg.article_id = a.article_id
  513. INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = mg.industrial_management_id
  514. INNER JOIN cygx_article_department AS d ON d.department_id = a.department_id
  515. WHERE
  516. 1 = 1
  517. AND a.publish_status = 1 `
  518. if condition != "" {
  519. sql += condition
  520. }
  521. sql += ` GROUP BY a.article_id ORDER BY collection_num DESC, a.publish_date DESC`
  522. sql += ` LIMIT ?`
  523. _, err = o.Raw(sql, pars, limit).QueryRows(&items)
  524. return
  525. }
  526. // 获取产业报告+晨会点评列表
  527. func GetTimeLineReportIndustrialList(industrialManagementId, startSize, pageSize int) (items []*ArticleListResp, total int, err error) {
  528. o := orm.NewOrm()
  529. sql := `SELECT
  530. a.id,
  531. a.article_id,
  532. a.title,
  533. a.publish_date
  534. FROM
  535. cygx_article AS a
  536. INNER JOIN cygx_industrial_article_group_management AS man_g ON man_g.article_id = a.article_id
  537. WHERE
  538. a.publish_status = 1
  539. AND a.is_class = 1
  540. AND man_g.industrial_management_id = ? GROUP BY a.article_id UNION ALL
  541. SELECT
  542. mmc.id,
  543. 0,
  544. mmc.content AS title,
  545. mm.meeting_time AS publish_data
  546. FROM
  547. cygx_morning_meeting_review_chapter AS mmc
  548. INNER JOIN cygx_morning_meeting_reviews AS mm
  549. WHERE
  550. mm.id = mmc.meeting_id
  551. AND mm.STATUS = 1
  552. AND mmc.industry_id = ? `
  553. totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
  554. err = o.Raw(totalSql, industrialManagementId, industrialManagementId).QueryRow(&total)
  555. sql += ` ORDER BY publish_date DESC LIMIT ?,? `
  556. _, err = o.Raw(sql, industrialManagementId, industrialManagementId, startSize, pageSize).QueryRows(&items)
  557. return
  558. }
  559. type TimeLineReportItem struct {
  560. Id int `description:"文章或晨报点评id"`
  561. ArticleId int `description:"文章id"`
  562. Title string `description:"标题"`
  563. //PublishTime string `description:"发布时间"`
  564. PublishDate string `description:"发布时间"`
  565. Content string `description:"内容"`
  566. VideoUrl string `description:"视频链接"`
  567. IsHaveVideo bool `description:"是否包含视频"`
  568. ImgUrlPc string `description:"pc图片"`
  569. SubCategoryName string `description:"二级分类"`
  570. IsRed bool `description:"是否标红"`
  571. Readnum int `description:"阅读数量"`
  572. }
  573. // 获取产业报告+晨会点评列表
  574. func GetTimeLineReportIndustrialListTime(userId, industrialManagementId, startSize, pageSize int) (items []*TimeLineReportItem, total int, err error) {
  575. o := orm.NewOrm()
  576. sql := `SELECT
  577. *
  578. FROM
  579. (
  580. SELECT
  581. a.article_id AS id,
  582. a.article_id,
  583. a.title,
  584. a.publish_date,
  585. a.video_url,
  586. a.sub_category_name,
  587. '' AS content,
  588. ( SELECT COUNT( 1 ) FROM cygx_article_history_record AS rec WHERE rec.user_id = ` + strconv.Itoa(userId) + ` AND rec.article_id = a.article_id ) AS readnum
  589. FROM
  590. cygx_article AS a
  591. INNER JOIN cygx_industrial_article_group_management AS man_g ON man_g.article_id = a.article_id
  592. WHERE
  593. a.publish_status = 1
  594. AND a.is_class = 1
  595. AND man_g.industrial_management_id = ? GROUP BY id UNION ALL
  596. SELECT
  597. mmc.id,
  598. 0 as article_id,
  599. mmc.content AS title,
  600. mm.publish_time AS publish_date,
  601. '' AS video_url,
  602. '时间线' AS sub_category_name,
  603. '' AS content,
  604. 0 AS readnum
  605. FROM
  606. cygx_morning_meeting_review_chapter AS mmc
  607. INNER JOIN cygx_morning_meeting_reviews AS mm
  608. WHERE
  609. mm.id = mmc.meeting_id
  610. AND mm.STATUS = 1
  611. AND mmc.industry_id = ?
  612. ) AS t`
  613. totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
  614. err = o.Raw(totalSql, industrialManagementId, industrialManagementId).QueryRow(&total)
  615. sql += ` ORDER BY
  616. t.publish_date DESC LIMIT ?,? `
  617. _, err = o.Raw(sql, industrialManagementId, industrialManagementId, startSize, pageSize).QueryRows(&items)
  618. return
  619. }
  620. // 获取产业报告+晨会点评列表
  621. func GetTimeLineReportIndustrialListRed(userId, industrialManagementId, startSize, pageSize int) (items []*TimeLineReportItem, err error) {
  622. o := orm.NewOrm()
  623. sql := `SELECT
  624. *
  625. FROM
  626. (
  627. SELECT
  628. a.article_id AS id,
  629. a.title,
  630. a.publish_date ,
  631. a.video_url,
  632. a.sub_category_name,
  633. '' AS content,
  634. ( SELECT COUNT( 1 ) FROM cygx_article_history_record AS rec WHERE rec.user_id = ` + strconv.Itoa(userId) + ` AND rec.article_id = a.article_id ) AS readnum
  635. FROM
  636. cygx_article AS a
  637. INNER JOIN cygx_industrial_article_group_management AS man_g ON man_g.article_id = a.article_id
  638. WHERE
  639. a.publish_status = 1
  640. AND a.is_class = 1
  641. AND man_g.industrial_management_id = ? GROUP BY id UNION ALL
  642. SELECT
  643. mmc.id,
  644. '' AS title,
  645. mm.publish_time AS publish_date,
  646. '' AS video_url,
  647. '时间线' AS sub_category_name,
  648. mmc.content,
  649. 0 AS readnum
  650. FROM
  651. cygx_morning_meeting_review_chapter AS mmc
  652. INNER JOIN cygx_morning_meeting_reviews AS mm
  653. WHERE
  654. mm.id = mmc.meeting_id
  655. AND mm.STATUS = 1
  656. AND mmc.industry_id = ?
  657. ) AS t
  658. `
  659. sql += ` ORDER BY
  660. t.publish_date DESC LIMIT ?,? `
  661. _, err = o.Raw(sql, industrialManagementId, industrialManagementId, startSize, pageSize).QueryRows(&items)
  662. return
  663. }
  664. type IndustrialPublishdate struct {
  665. PublishDate string `description:"发布时间"`
  666. IndustrialManagementId int `description:"产业D"`
  667. }
  668. // 标的列表
  669. func GetTimeLineReportIndustrialPublishdateList(industrialIdArr []int) (items []*IndustrialPublishdate, err error) {
  670. o := orm.NewOrm()
  671. sql := `SELECT
  672. mmc.id,
  673. 0,
  674. mmc.industry_id AS industrial_management_id,
  675. mmc.content AS title,
  676. MAX( mm.meeting_time ) AS publish_date
  677. FROM
  678. cygx_morning_meeting_review_chapter AS mmc
  679. INNER JOIN cygx_morning_meeting_reviews AS mm
  680. WHERE
  681. mm.id = mmc.meeting_id
  682. AND mm.STATUS = 1
  683. AND mmc.industry_id IN (` + utils.GetOrmInReplace(len(industrialIdArr)) + `)
  684. GROUP BY industrial_management_id ORDER BY publish_date DESC `
  685. _, err = o.Raw(sql, industrialIdArr).QueryRows(&items)
  686. return
  687. }
  688. // 报告榜单start
  689. type ArticleReportBillboardResp struct {
  690. ArticleId int `description:"文章id"`
  691. Title string `description:"标题"`
  692. PublishDate string `description:"发布时间"`
  693. PermissionName string `description:"行业名称"`
  694. DepartmentId int `description:"作者Id"`
  695. NickName string `description:"作者昵称"`
  696. IsCollect bool `description:"本人是否收藏"`
  697. Pv int `description:"PV"`
  698. CollectNum int `description:"收藏人数"`
  699. Source int `description:"来源 1:弘则资源包(报告)、2:研选主题(报告)"`
  700. List []*IndustrialManagementIdInt
  701. }
  702. type ArticleReportBillboardLIstPageResp struct {
  703. List []*ArticleReportBillboardResp
  704. Paging *paging.PagingItem
  705. }
  706. type ArticleResearchListResp struct {
  707. Paging *paging.PagingItem
  708. List []*ArticleResearchResp
  709. }
  710. type ArticleResearchResp struct {
  711. ArticleId int `description:"文章id"`
  712. Title string `description:"标题"`
  713. Annotation string `description:"核心观点"`
  714. Abstract string `description:"摘要"`
  715. PublishDate string `description:"发布时间"`
  716. DepartmentId int `description:"作者Id"`
  717. NickName string `description:"作者昵称"`
  718. IsCollect bool `description:"本人是否收藏"`
  719. Pv int `description:"PV"`
  720. CollectNum int `description:"收藏人数"`
  721. Source int `description:"来源 1:弘则资源包(报告)、2:研选主题(报告)"`
  722. ArticleTypeId int `description:"文章类型ID"`
  723. ArticleTypeName string `description:"类型名称"`
  724. ButtonStyle string `description:"按钮展示样式"`
  725. ImgUrlPc string `description:"图片链接"`
  726. List []*IndustrialManagementIdInt `description:"产业列表"`
  727. ListSubject []*IndustrialSubject `description:"标的列表"`
  728. }
  729. // 获取数量
  730. func GetArticleResearchCount(condition string, pars []interface{}) (count int, err error) {
  731. o := orm.NewOrm()
  732. sqlCount := `SELECT COUNT( 1 ) AS count FROM
  733. cygx_article AS a
  734. WHERE
  735. 1 = 1 AND a.publish_status = 1` + condition
  736. err = o.Raw(sqlCount, pars).QueryRow(&count)
  737. return
  738. }
  739. func GetArticleResearchList(condition string, pars []interface{}, startSize, pageSize, userId int) (items []*ArticleListResp, err error) {
  740. o := orm.NewOrm()
  741. sql := `SELECT
  742. a.article_id,
  743. a.title,
  744. a.body,
  745. a.annotation,
  746. a.abstract,
  747. a.publish_date,
  748. a.article_type_id,
  749. d.nick_name,
  750. d.department_id,
  751. ( SELECT count( 1 ) FROM cygx_article_history_record_newpv AS h WHERE h.article_id = a.article_id ) AS pv,
  752. ( SELECT count( 1 ) FROM cygx_article_collect AS ac INNER JOIN wx_user as u ON u.user_id = ac.user_id WHERE ac.article_id = a.article_id ) AS collect_num,
  753. ( SELECT count( 1 ) FROM cygx_article_collect AS ac INNER JOIN wx_user as u ON u.user_id = ac.user_id WHERE ac.article_id = a.article_id AND DATE_SUB( CURDATE(), INTERVAL 30 DAY ) <= date( ac.create_time ) ) AS collect_num_order,
  754. ( SELECT count( 1 ) FROM cygx_article_collect AS ac WHERE ac.article_id = a.article_id AND user_id = ? ) AS my_collect_num
  755. FROM
  756. cygx_article AS a
  757. LEFT JOIN cygx_industrial_article_group_management AS mg ON mg.article_id = a.article_id
  758. LEFT JOIN cygx_industrial_management AS m ON m.industrial_management_id = mg.industrial_management_id
  759. INNER JOIN cygx_article_department AS d ON d.department_id = a.department_id
  760. WHERE
  761. 1 = 1 AND a.publish_status = 1 `
  762. if condition != "" {
  763. sql += condition
  764. }
  765. sql += ` GROUP BY a.article_id ORDER BY a.publish_date DESC LIMIT ?,? `
  766. _, err = o.Raw(sql, userId, pars, startSize, pageSize).QueryRows(&items)
  767. return
  768. }
  769. func GetArticleResearchListHz(condition string, pars []interface{}, startSize, pageSize, userId int) (items []*ArticleListResp, err error) {
  770. o := orm.NewOrm()
  771. sql := `SELECT
  772. a.article_id,
  773. a.title,
  774. a.body,
  775. a.annotation,
  776. a.abstract,
  777. a.publish_date,
  778. a.category_id,
  779. a.article_type_id,
  780. ( SELECT count( 1 ) FROM cygx_article_history_record_newpv AS h WHERE h.article_id = a.article_id ) AS pv,
  781. ( SELECT count( 1 ) FROM cygx_article_collect AS ac INNER JOIN wx_user as u ON u.user_id = ac.user_id WHERE ac.article_id = a.article_id ) AS collect_num,
  782. ( SELECT count( 1 ) FROM cygx_article_collect AS ac INNER JOIN wx_user as u ON u.user_id = ac.user_id WHERE ac.article_id = a.article_id AND DATE_SUB( CURDATE(), INTERVAL 30 DAY ) <= date( ac.create_time ) ) AS collect_num_order,
  783. ( SELECT count( 1 ) FROM cygx_article_collect AS ac WHERE ac.article_id = a.article_id AND user_id = ? ) AS my_collect_num
  784. FROM
  785. cygx_article AS a
  786. LEFT JOIN cygx_industrial_article_group_management AS mg ON mg.article_id = a.article_id
  787. LEFT JOIN cygx_industrial_management AS m ON m.industrial_management_id = mg.industrial_management_id
  788. WHERE
  789. 1 = 1 AND a.publish_status = 1 `
  790. if condition != "" {
  791. sql += condition
  792. }
  793. sql += ` GROUP BY a.article_id ORDER BY a.publish_date DESC LIMIT ?,? `
  794. _, err = o.Raw(sql, userId, pars, startSize, pageSize).QueryRows(&items)
  795. return
  796. }
  797. type IndustrialManagementHotListResp struct {
  798. Paging *paging.PagingItem `description:"分页数据"`
  799. List []*IndustrialManagementHotResp
  800. }
  801. // 获取数量
  802. func GetThemeHeatListCount(condition string) (count int, err error) {
  803. o := orm.NewOrm()
  804. sql := `SELECT COUNT( DISTINCT m.industrial_management_id ) FROM
  805. cygx_industrial_management AS m
  806. LEFT JOIN cygx_industrial_article_group_management AS mg ON mg.industrial_management_id = m.industrial_management_id
  807. LEFT JOIN cygx_article AS a ON a.article_id = mg.article_id
  808. LEFT JOIN cygx_industrial_activity_group_management as ag ON ag.industrial_management_id = mg.industrial_management_id
  809. WHERE
  810. 1 = 1 AND a.publish_status = 1 ` + condition
  811. err = o.Raw(sql).QueryRow(&count)
  812. return
  813. }
  814. // 产业列表
  815. func GetThemeHeatList(userId int, condition, conditionOrder string, startSize, pageSize int) (items []*IndustrialManagementHotResp, err error) {
  816. o := orm.NewOrm()
  817. sql := `SELECT
  818. m.industry_name,
  819. m.industrial_management_id,
  820. m.article_read_num,
  821. MAX( a.publish_date ) AS publish_date,
  822. MIN(a.publish_date) AS min_report_time,
  823. ( SELECT count( 1 ) FROM cygx_industry_fllow AS f WHERE f.industrial_management_id = m.industrial_management_id AND user_id =? AND f.type = 1 ) AS fllow_num,
  824. m.yanxuan_article_read_num + m.activity_num AS sum_num
  825. FROM
  826. cygx_industrial_management AS m
  827. LEFT JOIN cygx_industrial_article_group_management AS mg ON mg.industrial_management_id = m.industrial_management_id
  828. LEFT JOIN cygx_article AS a ON a.article_id = mg.article_id
  829. LEFT JOIN cygx_industrial_activity_group_management as ag ON ag.industrial_management_id = mg.industrial_management_id
  830. WHERE
  831. 1 = 1
  832. AND publish_status = 1 ` + condition + ` GROUP BY m.industrial_management_id ` + conditionOrder + ` , last_updated_time DESC LIMIT ?,?`
  833. _, err = o.Raw(sql, userId, startSize, pageSize).QueryRows(&items)
  834. return
  835. }
  836. type GetThemeAericleListResp struct {
  837. ArticleId int `description:"文章id"`
  838. Title string `description:"标题"`
  839. PublishDate string `description:"发布时间"`
  840. SubjectName string `description:"标的名称"`
  841. IndustrialSubjectId int `description:"标的ID"`
  842. DepartmentId int `description:"作者Id"`
  843. NickName string `description:"作者昵称"`
  844. Pv int `description:"PV"`
  845. CollectNum int `description:"收藏人数"`
  846. FllowNum int `description:"关注数量"`
  847. MyCollectNum int `description:"本人是否收藏"`
  848. IsCollect bool `description:"本人是否收藏"`
  849. }
  850. // 主题详情start
  851. type GetThemeDetailResp struct {
  852. IndustrialManagementId int `description:"产业Id"`
  853. IndustryName string `description:"产业名称"`
  854. IsFollow bool `description:"是否关注"`
  855. ListSubject []*IndustrialSubject `description:"标的列表"`
  856. List []*ArticleResearchResp
  857. }
  858. // 主题详情start
  859. type GetThemeDetailListResp struct {
  860. ArticleId int `description:"文章id"`
  861. Title string `description:"标题"`
  862. PublishDate string `description:"发布时间"`
  863. SubjectName string `description:"标的名称"`
  864. IndustrialSubjectId int `description:"标的id"`
  865. DepartmentId int `description:"作者Id"`
  866. NickName string `description:"作者昵称"`
  867. Pv int `description:"PV"`
  868. CollectNum int `description:"收藏人数"`
  869. IndustrialManagementId int `description:"产业Id"`
  870. IndustryName string `description:"产业名称"`
  871. FllowNum int `description:"关注数量"`
  872. MyCollectNum int `description:"本人是否收藏"`
  873. IsCollect bool `description:"本人是否收藏"`
  874. }
  875. type GetThemeAericleListBuSubjectResp struct {
  876. SubjectName string `description:"标的名称"`
  877. List []*GetThemeAericleListResp
  878. }
  879. // 列表
  880. func GetThemeDetail(userId, industrialManagementId int, condition string) (items []*ArticleListResp, err error) {
  881. o := orm.NewOrm()
  882. sql := `SELECT
  883. a.article_id,
  884. a.title,
  885. a.body,
  886. a.annotation,
  887. a.abstract,
  888. a.publish_date,
  889. a.article_type_id,
  890. d.nick_name,
  891. d.department_id,
  892. ( SELECT count( 1 ) FROM cygx_article_history_record_newpv AS h WHERE h.article_id = a.article_id ) AS pv,
  893. ( SELECT count( 1 ) FROM cygx_article_collect AS ac WHERE ac.article_id = a.article_id ) AS collect_num,
  894. ( SELECT count( 1 ) FROM cygx_article_collect AS ac WHERE ac.article_id = a.article_id and user_id = ? ) AS my_collect_num
  895. FROM
  896. cygx_article AS a
  897. INNER JOIN cygx_industrial_article_group_management AS mg ON mg.article_id = a.article_id
  898. INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = mg.industrial_management_id
  899. INNER JOIN cygx_article_department AS d ON d.department_id = a.department_id
  900. WHERE
  901. 1 = 1
  902. AND m.industrial_management_id = ?
  903. AND publish_status = 1 ` + condition + `
  904. ORDER BY
  905. publish_date DESC`
  906. _, err = o.Raw(sql, userId, industrialManagementId).QueryRows(&items)
  907. return
  908. } //end
  909. func GetDepartmentlistCount(condition string) (count int, err error) {
  910. o := orm.NewOrm()
  911. sql := `SELECT
  912. count(*) AS count
  913. FROM
  914. (
  915. SELECT
  916. COUNT( 1 ) AS count
  917. FROM
  918. cygx_article_department AS d
  919. INNER JOIN cygx_article AS a ON d.department_id = a.department_id
  920. WHERE
  921. 1 = 1
  922. AND a.article_type_id > 0
  923. AND publish_status = 1
  924. GROUP BY
  925. d.department_id
  926. ) c `
  927. err = o.Raw(sql).QueryRow(&count)
  928. return
  929. }
  930. type IndustrialReadNum struct {
  931. IndustrialManagementId int `description:"产业id"`
  932. Readnum int `description:"阅读次数"`
  933. }
  934. // 获取该产业下文章的用户阅读次数-小红点用
  935. func GetReportIndustrialReadNumList(userId int, industrialIds string, createtime time.Time) (items []*IndustrialReadNum, err error) {
  936. o := orm.NewOrm()
  937. sql := `SELECT a.industrial_management_id, MIN(a.readnum) AS readnum FROM (
  938. SELECT man_g.industrial_management_id,( SELECT COUNT( 1 ) FROM cygx_article_history_record AS rec WHERE rec.user_id = ` + strconv.Itoa(userId) + ` AND rec.article_id = a.article_id ) AS readnum
  939. FROM
  940. cygx_article AS a
  941. INNER JOIN cygx_industrial_article_group_management as man_g ON man_g.article_id = a.article_id
  942. WHERE
  943. a.publish_status = 1
  944. AND a.is_class = 1
  945. AND man_g.industrial_management_id IN (` + industrialIds + `)
  946. AND a.publish_date > ?
  947. GROUP BY a.article_id ORDER BY publish_date DESC
  948. ) AS a GROUP BY industrial_management_id`
  949. _, err = o.Raw(sql, createtime).QueryRows(&items)
  950. return
  951. }