summary_manage.go 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  1. package cygx
  2. import (
  3. "fmt"
  4. "github.com/PuerkitoBio/goquery"
  5. "github.com/beego/beego/v2/client/orm"
  6. "github.com/rdlucklib/rdluck_tools/paging"
  7. "hongze/hz_crm_api/utils"
  8. "html"
  9. "strconv"
  10. "strings"
  11. "time"
  12. )
  13. type SummaryManageAddRep struct {
  14. ArticleId int `description:"文章ID,等于0新增,大于0修改"`
  15. ArticleTypeId int `description:"文章类型ID"`
  16. ChartPermissionIds string `description:"行业ID ,多个用 , 隔开"`
  17. IndustryName string `description:"产业名称"`
  18. SubjectName string `description:"标的名称,多标的 用 , 隔开"`
  19. Title string `description:"标题"`
  20. Abstract string `description:"摘要"`
  21. Body string `description:"内容"`
  22. SellerAndMobile string `description:"销售和手机号"`
  23. DoType int `description:"操作类型 0,保存 、1,发布"`
  24. Department string `description:"作者"`
  25. IndustrialManagementIds string `description:"产业id 多个用 , 隔开"`
  26. IndustrialSubjectIds string `description:"标的id 多个用 , 隔开"`
  27. PublishDate string `description:"发布时间 列如 2020-03-23"`
  28. ReportLink string `description:"报告链接"`
  29. }
  30. type SummaryManageEditDetail struct {
  31. SummaryManageId int `description:"纪要ID 等于0新增纪要,大于0修改纪要"`
  32. ArticleId int `description:"文章ID"`
  33. //ChartPermissionId int `description:"行业ID"`
  34. ChartPermissionIds string `description:"行业ID ,多个用 , 隔开"`
  35. Title string `description:"标题"`
  36. Abstract string `description:"摘要"`
  37. Body string `description:"内容"`
  38. SellerAndMobile string `description:"销售和手机号"`
  39. SubjectName string `description:"标的名称"`
  40. IndustryName string `description:"产业名称"`
  41. PublishStatus int `description:"发布状态,0未发布 ,1已发布"`
  42. ListIndustrial []*IndustrialActivityGroupManagementRep
  43. ListSubject []*SubjectActivityGroupManagementRep
  44. }
  45. type SummaryManageIdRep struct {
  46. ArticleId int `description:"文章ID"`
  47. }
  48. type CygxArticle struct {
  49. SummaryManageId int `orm:"column(id);pk"`
  50. CategoryName string `description:"行业分类名称"`
  51. CategoryId int `description:"行业分类ID"`
  52. CategoryIdTwo int `description:"分类id用作修改匹配类型使用"`
  53. ArticleId int `description:"文章ID"`
  54. Title string `description:"标题"`
  55. Abstract string `description:"摘要"`
  56. Body string `description:"内容"`
  57. BodyText string `description:"内容"`
  58. PublishStatus int `description:"发布状态,0未发布 ,1已发布"`
  59. PublishDate time.Time `description:"发布时间"`
  60. CreateDate time.Time `description:"创建时间"`
  61. LastUpdatedTime time.Time `description:"更新时间"`
  62. IsSummary int `description:"是否属于纪要库 1是、0否"`
  63. IsReport int `description:"是否属于报告 1是、0否"`
  64. ReportType int `description:"'报告类型,1行业报告,2产业报告'"`
  65. Source int `description:"来源 0策略平台同步,1小程序后台添加"`
  66. MatchTypeName string `description:"匹配类型名称"`
  67. ArticleIdMd5 string `description:"ID,md5值"`
  68. UpdateFrequency string `description:"更新周期"`
  69. SellerAndMobile string `description:"销售和手机号"`
  70. Department string `description:"作者"`
  71. ExpertBackground string `description:"专家背景"`
  72. ExpertNumber string `description:"专家编号"`
  73. InterviewDate string `description:"访谈日期"`
  74. FileLink string `description:"下载预览链接"`
  75. ChartPermissionIds string `description:"行业ID ,多个用 , 隔开"`
  76. DepartmentId int `description:"作者ID"`
  77. Periods string `description:"期数"`
  78. ReportLink string `description:"报告链接"`
  79. ArticleType string `description:"文章类型 文章类型,lyjh:路演精华 "`
  80. HavePublish int `description:"是否发布过,1是 ,0 否"`
  81. IsClass int `description:"是否归类过,1是 ,0 否"`
  82. SubCategoryName string `description:"主题名称"`
  83. LinkArticleId int `description:"报告ID链接"`
  84. AdminId int `description:"销售/管理员ID"`
  85. AdminName string `description:"销售/管理员姓名"`
  86. ArticleTypeId int `description:"文章类型ID"`
  87. ArticleTypeName string `description:"文章类型名称"`
  88. Annotation string `description:"核心观点"`
  89. VisibleRange int `description:"设置可见范围1全部,0内部"`
  90. //NickName string `description:"作者昵称"`
  91. ChartPermissionId int `description:"行业id"`
  92. ChartPermissionName string `description:"行业名称"`
  93. }
  94. type CygxArticleResp struct {
  95. SummaryManageId int `orm:"column(id);pk"`
  96. CategoryName string `description:"行业分类名称"`
  97. CategoryId int `description:"行业分类ID"`
  98. CategoryIdTwo int `description:"行业分类ID"`
  99. ArticleId int `description:"文章ID"`
  100. Title string `description:"标题"`
  101. Abstract string `description:"摘要"`
  102. Body string `description:"内容"`
  103. BodyText string `description:"内容"`
  104. PublishStatus int `description:"发布状态,0未发布 ,1已发布"`
  105. PublishDate time.Time `description:"发布时间"`
  106. CreateDate time.Time `description:"创建时间"`
  107. LastUpdatedTime time.Time `description:"更新时间"`
  108. IsSummary int `description:"是否属于纪要库 1是、0否"`
  109. IsReport int `description:"是否属于报告 1是、0否"`
  110. Source int `description:"来源 0策略平台同步,1小程序后台添加"`
  111. ArticleIdMd5 string `description:"ID,md5值"`
  112. UpdateFrequency string `description:"更新周期"`
  113. SellerAndMobile string `description:"销售和手机号"`
  114. Department string `description:"作者"`
  115. ExpertBackground string `description:"专家背景"`
  116. ExpertNumber string `description:"专家编号"`
  117. InterviewDate string `description:"访谈日期"`
  118. FileLink string `description:"下载预览链接"`
  119. ChartPermissionIds string `description:"行业ID ,多个用 , 隔开"`
  120. DepartmentId int `description:"作者ID"`
  121. Periods string `description:"期数"`
  122. ReportLink string `description:"报告链接"`
  123. ArticleType string `description:"文章类型 文章类型,lyjh:路演精华 "`
  124. HavePublish int `description:"是否发布过,1是 ,0 否"`
  125. IsClass int `description:"是否归类过,1是 ,0 否"`
  126. IsClassFail int `description:"是否自动归类失败,1是 ,0 否"`
  127. SubCategoryName string `description:"主题名称"`
  128. LinkArticleId int `description:"报告ID链接"`
  129. NickName string `description:"作者昵称"`
  130. HeadImgUrl string `description:"作者头像"`
  131. SubjectIds string `description:"报告所关联的标的"`
  132. AdminId int `description:"销售/管理员ID"`
  133. AdminName string `description:"销售/管理员姓名"`
  134. Annotation string `description:"核心观点"`
  135. VisibleRange int `description:"设置可见范围1全部,0内部"`
  136. TopTime int `description:"置顶时间"`
  137. }
  138. type GetSummaryManageListRep struct {
  139. Paging *paging.PagingItem `description:"分页数据"`
  140. List []*CygxArticleList
  141. }
  142. type ElasticTestArticleDetail struct {
  143. ArticleId int `description:"报告id"`
  144. Title string `description:"标题"`
  145. BodyText string `description:"内容"`
  146. PublishDate string `description:"发布时间"`
  147. ExpertBackground string `description:"专家背景"`
  148. CategoryId string `description:"文章分类"`
  149. Abstract string `description:"摘要"`
  150. Annotation string `description:"核心观点"`
  151. }
  152. // 添加文章
  153. func AddArticle(item *CygxArticle) (newId int64, err error) {
  154. o := orm.NewOrmUsingDB("hz_cygx")
  155. newId, err = o.Insert(item)
  156. fmt.Println(newId)
  157. return
  158. }
  159. //item.ExpertBackground = expertContentStr
  160. //item.ExpertNumber = expertNumStr
  161. //item.InterviewDate = interviewDateStr
  162. //item.FileLink = fileLink
  163. // 修改文章
  164. func EditArticle(item *CygxArticle, oldPublishStatus int) (err error) {
  165. o := orm.NewOrmUsingDB("hz_cygx")
  166. if oldPublishStatus == 1 {
  167. sql := `UPDATE cygx_article SET category_name=?, title=?, abstract=?, body=?, body_text=?, publish_status=?,last_updated_time = ?,seller_and_mobile=?,expert_background =?, expert_number=? ,interview_date=?, file_link=? ,chart_permission_ids =? WHERE id=? AND source = 1`
  168. _, err = o.Raw(sql, item.CategoryName, item.Title, item.Abstract, item.Body, item.BodyText, item.PublishStatus, item.LastUpdatedTime, item.SellerAndMobile, item.ExpertBackground, item.ExpertNumber, item.InterviewDate, item.FileLink, item.ChartPermissionIds, item.SummaryManageId).Exec()
  169. } else {
  170. if item.PublishStatus == 1 {
  171. sql := `UPDATE cygx_article SET category_name=?, title=?, abstract=?, body=?, body_text=?, publish_status=?, publish_date =? ,last_updated_time = ?,seller_and_mobile=?,expert_background =?, expert_number=? ,interview_date=?, file_link=?,chart_permission_ids =? WHERE id=? AND source = 1`
  172. _, err = o.Raw(sql, item.CategoryName, item.Title, item.Abstract, item.Body, item.BodyText, item.PublishStatus, item.PublishDate, item.LastUpdatedTime, item.SellerAndMobile, item.ExpertBackground, item.ExpertNumber, item.InterviewDate, item.FileLink, item.ChartPermissionIds, item.SummaryManageId).Exec()
  173. } else {
  174. sql := `UPDATE cygx_article SET category_name=?, title=?, abstract=?, body=?, body_text=?, publish_status=?,last_updated_time = ?, publish_date = '' ,seller_and_mobile=?,expert_background =?, expert_number=? ,interview_date=?, file_link=?,chart_permission_ids =? WHERE id=? AND source = 1`
  175. _, err = o.Raw(sql, item.CategoryName, item.Title, item.Abstract, item.Body, item.BodyText, item.PublishStatus, item.LastUpdatedTime, item.SellerAndMobile, item.ExpertBackground, item.ExpertNumber, item.InterviewDate, item.FileLink, item.ChartPermissionIds, item.SummaryManageId).Exec()
  176. }
  177. }
  178. return
  179. }
  180. func GetMaxArticleIdInfo() (item *ArticleDetail, err error) {
  181. o := orm.NewOrmUsingDB("hz_cygx")
  182. sql := `SELECT * FROM cygx_article ORDER BY article_id desc LIMIT 1`
  183. err = o.Raw(sql).QueryRow(&item)
  184. return
  185. }
  186. // 通过纪要ID获取文章详情
  187. func GetArticleIdInfoBySummaryManageId(summaryManageId int) (item *CygxArticleResp, err error) {
  188. o := orm.NewOrmUsingDB("hz_cygx")
  189. sql := `SELECT art.* ,dm.nick_name FROM cygx_article as art
  190. LEFT JOIN cygx_article_department as dm ON dm.department_id = art.department_id WHERE id=? AND source = 1`
  191. err = o.Raw(sql, summaryManageId).QueryRow(&item)
  192. return
  193. }
  194. // 通过文章ID获取文章、以及所关联的标的详情
  195. func GetArticleInfoOtherByArticleId(articleId int) (item *CygxArticleResp, err error) {
  196. o := orm.NewOrmUsingDB("hz_cygx")
  197. sql := `SELECT art.* ,dm.nick_name ,dm.img_url as head_img_url FROM cygx_article as art
  198. LEFT JOIN cygx_article_department as dm ON dm.department_id = art.department_id WHERE article_id=? `
  199. err = o.Raw(sql, articleId).QueryRow(&item)
  200. return
  201. }
  202. // 通过纪要ID获取文章详情
  203. func GetArticleIdInfoByArticleId(articleId int) (item *CygxArticle, err error) {
  204. o := orm.NewOrmUsingDB("hz_cygx")
  205. sql := `SELECT * FROM cygx_article WHERE article_id= ?`
  206. err = o.Raw(sql, articleId).QueryRow(&item)
  207. return
  208. }
  209. func GetReportContentTextSub(content string) (contentSub string, err error) {
  210. content = html.UnescapeString(content)
  211. doc, err := goquery.NewDocumentFromReader(strings.NewReader(content))
  212. docText := doc.Text()
  213. bodyRune := []rune(docText)
  214. bodyRuneLen := len(bodyRune)
  215. if bodyRuneLen > 200 {
  216. bodyRuneLen = 200
  217. }
  218. body := string(bodyRune[:bodyRuneLen])
  219. contentSub = body
  220. return
  221. }
  222. // 修改发布状态
  223. func PublishAndCancel(item *CygxArticle) (err error) {
  224. sql := `UPDATE cygx_article SET publish_status=? ,admin_id =? ,admin_name =? WHERE article_id=? `
  225. o := orm.NewOrmUsingDB("hz_cygx")
  226. _, err = o.Raw(sql, item.PublishStatus, item.AdminId, item.AdminName, item.ArticleId).Exec()
  227. return
  228. }
  229. // 修改发布状态
  230. func ArticleVisibleRange(item *CygxArticle) (err error) {
  231. sql := `UPDATE cygx_article SET visible_range=? ,admin_id =? ,admin_name =? WHERE article_id=? `
  232. o := orm.NewOrmUsingDB("hz_cygx")
  233. _, err = o.Raw(sql, item.VisibleRange, item.AdminId, item.AdminName, item.ArticleId).Exec()
  234. return
  235. }
  236. // 修改发布状态
  237. func UpdateIsClassFail(item *CygxArticleResp) (err error) {
  238. sql := `UPDATE cygx_article SET is_class_fail=0 WHERE article_id=? `
  239. o := orm.NewOrmUsingDB("hz_cygx")
  240. _, err = o.Raw(sql, item.ArticleId).Exec()
  241. return
  242. }
  243. // 通过纪要ID获取文章详情
  244. func GetArticleIdInfoBySummaryManageIdEdit(summaryManageId int) (item *CygxArticle, err error) {
  245. o := orm.NewOrmUsingDB("hz_cygx")
  246. sql := `SELECT * FROM cygx_article WHERE id=? AND source = 1`
  247. err = o.Raw(sql, summaryManageId).QueryRow(&item)
  248. return
  249. }
  250. // 删除数据
  251. func DeleteSummaryManage(summaryManageId int) (err error) {
  252. o := orm.NewOrmUsingDB("hz_cygx")
  253. sql := ` DELETE FROM cygx_article WHERE id=? AND source = 1`
  254. _, err = o.Raw(sql, summaryManageId).Exec()
  255. return
  256. }
  257. type CygxArticleList struct {
  258. ArticleId int `description:"报告id"`
  259. CategoryName string `description:"行业分类名称"`
  260. Title string `description:"标题"`
  261. Abstract string `description:"摘要"`
  262. Body string `description:"内容"`
  263. PublishStatus int `description:"发布状态,0未发布 ,1已发布"`
  264. PublishDate string `description:"发布时间"`
  265. LastUpdatedTime string `description:"更新时间"`
  266. ArticleIdMd5 string `description:"ID,md5值"`
  267. Pv int `description:"PV"`
  268. Uv int `description:"UV"`
  269. CommentNum int `description:"留言总数"`
  270. CollectionNum int `description:"收藏"`
  271. NickName string `description:"作者昵称"`
  272. DepartmentId int `description:"作者ID"`
  273. IndustryName string `description:"产业名称"`
  274. SubjectName string `description:"标的名称"`
  275. ArticleTypeId int `description:"文章类型ID"`
  276. ArticleTypeName string `description:"文章类型名称"`
  277. VisibleRange int `description:"设置可见范围1全部,0内部"`
  278. TopTime int `description:"置顶时间"`
  279. }
  280. // 列表
  281. func GetSummaryManageList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxArticleList, err error) {
  282. o := orm.NewOrmUsingDB("hz_cygx")
  283. sql := ` SELECT
  284. (SELECT COUNT(1) FROM cygx_article_history_record_newpv AS h WHERE h.article_id=art.article_id AND h.company_id != ` + strconv.Itoa(utils.HZ_COMPANY_ID) + ` ) AS pv,
  285. (SELECT COUNT(DISTINCT h.user_id) FROM cygx_article_history_record_newpv AS h WHERE h.article_id=art.article_id AND h.company_id != ` + strconv.Itoa(utils.HZ_COMPANY_ID) + ` ) AS uv,
  286. (SELECT COUNT(1) FROM cygx_article_comment AS k WHERE k.article_id=art.article_id) AS comment_num,
  287. (SELECT COUNT(1) FROM cygx_article_collect AS c WHERE c.article_id = art.article_id ) AS collection_num,
  288. (SELECT GROUP_CONCAT(DISTINCT s.subject_name SEPARATOR '/') FROM cygx_industrial_subject as s WHERE s.industrial_management_id = m.industrial_management_id) AS subject_name ,
  289. art.title ,art.category_name ,art.publish_date ,art.id,art.last_updated_time,art.publish_status,art.abstract,art.body,art.article_id_md5 ,art.article_id,dm.nick_name , art.department_id,m.industry_name,art.article_type_id,art.article_type_name,art.visible_range,art.top_time
  290. FROM cygx_article as art
  291. LEFT JOIN cygx_article_department as dm ON dm.department_id = art.department_id
  292. LEFT JOIN cygx_industrial_article_group_management as mg ON mg.article_id = art.article_id
  293. LEFT JOIN cygx_industrial_management as m ON m.industrial_management_id = mg.industrial_management_id`
  294. if condition != "" {
  295. sql += condition
  296. }
  297. sql += ` LIMIT ?,?`
  298. _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
  299. return
  300. }
  301. // 列表
  302. func GetSummaryManageListInit(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxArticleList, err error) {
  303. o := orm.NewOrmUsingDB("hz_cygx")
  304. sql := `SELECT
  305. art.title,
  306. art.article_id,
  307. dm.nick_name,
  308. art.top_time
  309. FROM
  310. cygx_article AS art
  311. INNER JOIN cygx_article_department AS dm ON dm.department_id = art.department_id`
  312. if condition != "" {
  313. sql += condition
  314. }
  315. sql += ` LIMIT ?,?`
  316. _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
  317. return
  318. }
  319. // 列表
  320. func GetCygxArticleList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxReportArticle, err error) {
  321. o := orm.NewOrmUsingDB("hz_cygx")
  322. sql := ` SELECT *
  323. FROM cygx_article as art WHERE 1 =1 `
  324. if condition != "" {
  325. sql += condition
  326. } else {
  327. return
  328. }
  329. sql += ` LIMIT ?,?`
  330. _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
  331. return
  332. }
  333. type CygxArticleSubjectList struct {
  334. ArticleId int `description:"报告id"`
  335. SubjectName string `description:"标的名称"`
  336. }
  337. // 文章标的列表
  338. func GetArticleSubjectList(articleId string) (items []*CygxArticleSubjectList, err error) {
  339. if articleId == "" {
  340. articleId = "0"
  341. }
  342. o := orm.NewOrmUsingDB("hz_cygx")
  343. sql := ` SELECT GROUP_CONCAT( DISTINCT s.subject_name SEPARATOR '/' ) AS subject_name,
  344. sg.article_id
  345. FROM
  346. cygx_industrial_article_group_subject AS sg
  347. LEFT JOIN cygx_industrial_subject AS s ON s.industrial_subject_id = sg.industrial_subject_id
  348. WHERE
  349. sg.article_id IN (` + articleId + `)
  350. GROUP BY sg.article_id`
  351. _, err = o.Raw(sql).QueryRows(&items)
  352. return
  353. }
  354. // 获取文章数量
  355. func GetASummaryManageCount(condition string, pars []interface{}) (count int, err error) {
  356. sqlCount := ` SELECT COUNT(1) AS count FROM cygx_article as art `
  357. if condition != "" {
  358. sqlCount += condition
  359. }
  360. o := orm.NewOrmUsingDB("hz_cygx")
  361. err = o.Raw(sqlCount, pars).QueryRow(&count)
  362. return
  363. }
  364. // body 解析
  365. func BodyAnalysis(body string) (expertNumStr, expertContentStr, interviewDateStr, fileLink string) {
  366. body = html.UnescapeString(body)
  367. doc, err := goquery.NewDocumentFromReader(strings.NewReader(body))
  368. if err != nil {
  369. fmt.Println("create doc err:", err.Error())
  370. return
  371. }
  372. var expertNumArr []string
  373. var expertContentArr []string
  374. var interviewDateArr []string
  375. doc.Find("p").Each(func(i int, s *goquery.Selection) {
  376. contentTxt := s.Text()
  377. if strings.Contains(contentTxt, "#访谈时间:") || strings.Contains(contentTxt, "访谈时间:") {
  378. interviewDate := s.Next().Text()
  379. interviewDateArr = append(interviewDateArr, interviewDate)
  380. }
  381. if strings.Contains(contentTxt, "#专家评价") || strings.Contains(contentTxt, "专家评价") {
  382. expertContent := s.Next().Text()
  383. //Powered 是编辑器传过来的字段
  384. if expertContent == "" || strings.Contains(expertContent, "Powered") {
  385. expertContent = contentTxt
  386. }
  387. //如果内容中最前的文字是 "专家" 这个词,则认为这句话是专家背景
  388. if !strings.Contains(expertContent, "专家评价") && strings.Contains(expertContent, "专家") && strings.Index(expertContent, "专家") == 0 {
  389. expertContentArr = append(expertContentArr, expertContent)
  390. }
  391. if expertContent != "" {
  392. rightIndex := strings.Index(expertContent, ")")
  393. if rightIndex == 0 {
  394. rightIndex = strings.Index(expertContent, ")")
  395. }
  396. if rightIndex > 0 {
  397. expertNum := expertContent[:rightIndex]
  398. expertNum = strings.Replace(expertNum, "(", "", -1)
  399. expertNum = strings.Replace(expertNum, "(", "", -1)
  400. expertNum = strings.Replace(expertNum, "专家评价", "", -1)
  401. if expertNum != "" {
  402. expertNumArr = append(expertNumArr, expertNum)
  403. rightIndex = rightIndex
  404. expertContentStr := expertContent[rightIndex:]
  405. expertContentStr = strings.Replace(expertContentStr, ")", "", -1)
  406. expertContentStr = strings.TrimLeft(expertContentStr, ":")
  407. expertContentStr = strings.TrimRight(expertContentStr, "(推荐")
  408. expertContentArr = append(expertContentArr, expertContentStr)
  409. }
  410. }
  411. if !strings.Contains(contentTxt, "(") || !strings.Contains(contentTxt, "(") {
  412. expertContentArr = append(expertContentArr, expertContent)
  413. }
  414. }
  415. }
  416. })
  417. if len(expertContentArr) == 0 {
  418. doc.Find("pre").Each(func(i int, s *goquery.Selection) {
  419. contentTxt := s.Text()
  420. if strings.Contains(contentTxt, "#访谈时间:") || strings.Contains(contentTxt, "访谈时间:") {
  421. interviewDate := s.Next().Text()
  422. numStar := strings.Index(contentTxt, " #访谈时间:")
  423. numEnd := strings.Index(contentTxt, " #纪要详情:")
  424. interviewDate = contentTxt[numStar+19 : numEnd]
  425. if interviewDate != "" {
  426. interviewDateArr = append(interviewDateArr, interviewDate)
  427. }
  428. }
  429. if strings.Contains(contentTxt, "#专家评价") || strings.Contains(contentTxt, "专家评价") {
  430. expertContent := s.Next().Text()
  431. if expertContent == "" {
  432. expertContent = contentTxt
  433. }
  434. if expertContent != "" {
  435. expertIsHave := strings.Index(expertContent, "专家评价")
  436. if expertIsHave > 0 {
  437. expertContent = expertContent[expertIsHave:]
  438. rightIndex := strings.Index(expertContent, ")")
  439. if rightIndex == 0 {
  440. rightIndex = strings.Index(expertContent, ")")
  441. }
  442. if rightIndex > 0 {
  443. expertNum := expertContent[:rightIndex]
  444. expertNum = strings.Replace(expertNum, "(", "", -1)
  445. expertNum = strings.Replace(expertNum, "(", "", -1)
  446. expertNum = strings.Replace(expertNum, "专家评价", "", -1)
  447. expertNum = strings.Replace(expertNum, ":", "", -1)
  448. expertNum = strings.Replace(expertNum, ":", "", -1)
  449. if expertNum != "" {
  450. expertNumArr = append(expertNumArr, expertNum)
  451. rightIndex = rightIndex
  452. expertContentStr := expertContent[rightIndex:]
  453. expertContentStr = strings.Replace(expertContentStr, ")", "", -1)
  454. expertContentStr = strings.TrimLeft(expertContentStr, ":")
  455. expertContentStr = strings.TrimRight(expertContentStr, "(推荐")
  456. if expertContentStr != "" {
  457. expertContentArr = append(expertContentArr, expertContentStr)
  458. }
  459. }
  460. }
  461. }
  462. if !strings.Contains(contentTxt, "(") || !strings.Contains(contentTxt, "(") {
  463. expertContentArr = append(expertContentArr, expertContent)
  464. }
  465. }
  466. }
  467. })
  468. }
  469. if len(expertNumArr) > 0 {
  470. expertNumStr = expertNumArr[0]
  471. if expertNumStr != "" {
  472. expertNumStr = strings.Replace(expertNumStr, "#:", "", -1)
  473. expertNumStr = strings.Replace(expertNumStr, "# ", "", -1)
  474. expertNumStr = strings.Trim(expertNumStr, "")
  475. }
  476. }
  477. if len(expertContentArr) > 0 {
  478. expertContentStr = expertContentArr[0]
  479. }
  480. if len(expertContentStr) > 600 {
  481. strnum := strings.Index(expertContentStr, "#专家评价:")
  482. content := expertContentStr[strnum:]
  483. strnum2 := strings.Index(content, "(")
  484. content = content[strnum2+9:] //中文括号3位 专家编号6位
  485. expertContentStr = content
  486. }
  487. if len(interviewDateArr) > 0 {
  488. interviewDateStr = interviewDateArr[0]
  489. }
  490. return
  491. }
  492. // 列表
  493. func GetCygxArticleCollectionList(articleId int) (items []*CygxDepartmentFllowList, err error) {
  494. o := orm.NewOrmUsingDB("hz_cygx")
  495. sql := `SELECT
  496. f.*
  497. FROM
  498. cygx_article_collect AS f
  499. WHERE
  500. f.article_id = ?
  501. GROUP BY f.id`
  502. _, err = o.Raw(sql, articleId).QueryRows(&items)
  503. return
  504. }
  505. type ArticleHistoryRep struct {
  506. ArticleId int `description:"文章ID"`
  507. RealName string `description:"姓名"`
  508. Mobile string `description:"手机号"`
  509. CompanyName string `description:"公司名称"`
  510. CompanyId int `description:"文章ID"`
  511. SellerName string `description:"所属销售"`
  512. StopTime string `description:"阅读停留时间"`
  513. CreateTime string `description:"创建时间"`
  514. Ly string `description:"创建时间"`
  515. Source string `description:"创建时间"`
  516. PublishDate string `description:"创建时间"`
  517. Title string `description:"标题"`
  518. }
  519. // 列表
  520. func GetArticleHistoryList(articleId int, condition string) (items []*ArticleHistoryRep, err error) {
  521. o := orm.NewOrmUsingDB("hz_cygx")
  522. sql := `SELECT
  523. h.*
  524. FROM
  525. cygx_article_history_record_all AS h
  526. WHERE
  527. h.article_id = ?
  528. AND h.platfor = 1 AND h.is_del = 0 `
  529. if condition != "" {
  530. sql = sql + condition + ` group by mobile `
  531. }
  532. _, err = o.Raw(sql, articleId).QueryRows(&items)
  533. return
  534. }
  535. // 列表
  536. func GetArticleHistoryListInitss() (items []*ArticleHistoryRep, err error) {
  537. o := orm.NewOrmUsingDB("hz_cygx")
  538. sql := `SELECT
  539. s.mobile,
  540. s.real_name,
  541. s.company_name,
  542. s.create_time,
  543. a.title,
  544. a.publish_date
  545. FROM
  546. cygx_article_history_record_all AS s
  547. INNER JOIN cygx_article AS a ON a.article_id = s.article_id
  548. WHERE
  549. s.article_id IN ( SELECT article_id FROM cygx_article WHERE chart_permission_id = 53 AND publish_status = 1 )
  550. AND s.company_id IN ( 1012, 5599, 15184, 5468, 8728 )
  551. AND s.is_del = 0
  552. LIMIT 1000 `
  553. _, err = o.Raw(sql).QueryRows(&items)
  554. return
  555. }
  556. func GetArticleHistoryListInitss5349() (items []*ArticleHistoryRep, err error) {
  557. o := orm.NewOrmUsingDB("hz_cygx")
  558. sql := `SELECT
  559. s.mobile,
  560. s.real_name,
  561. s.company_name,
  562. s.create_time,
  563. a.title,
  564. a.publish_date
  565. FROM
  566. cygx_article_history_record_all AS s
  567. INNER JOIN cygx_article AS a ON a.article_id = s.article_id
  568. WHERE
  569. 1 = 1
  570. AND s.company_id IN ( 5349 )
  571. AND s.create_time >= '2025-04-01'
  572. AND s.create_time <= '2025-05-01'
  573. AND s.is_del = 0
  574. LIMIT 1000 `
  575. _, err = o.Raw(sql).QueryRows(&items)
  576. return
  577. }
  578. // 列表
  579. func GetArticleHistoryList121(articleId int, condition string) (items []*ArticleHistoryRep, err error) {
  580. o := orm.NewOrmUsingDB("hz_cygx")
  581. sql := `SELECT
  582. h.*
  583. FROM
  584. cygx_article_history_record_all AS h
  585. WHERE
  586. h.article_id = ? AND h.is_del = 0 `
  587. if condition != "" {
  588. sql = sql + condition
  589. }
  590. _, err = o.Raw(sql, articleId).QueryRows(&items)
  591. return
  592. }
  593. // 列表
  594. func GetArticleHistoryList_H(articleId int, condition string) (items []*ArticleHistoryRep, err error) {
  595. o := orm.NewOrmUsingDB("hz_cygx")
  596. sql := `SELECT
  597. h.*
  598. FROM
  599. cygx_article_history_record_all AS h
  600. WHERE
  601. h.article_id = ?
  602. AND h.platfor = 1 AND h.is_del = 0 AND h.create_time <'2024-12-19 15:55' `
  603. if condition != "" {
  604. sql = sql + condition + ` group by mobile `
  605. }
  606. _, err = o.Raw(sql, articleId).QueryRows(&items)
  607. return
  608. }
  609. // 列表
  610. func GetArticleHistoryList_ZHouqi(articleId int, condition string) (items []*ArticleHistoryRep, err error) {
  611. o := orm.NewOrmUsingDB("hz_cygx")
  612. sql := `SELECT
  613. h.*
  614. FROM
  615. cygx_article_history_record_all AS h
  616. WHERE
  617. h.article_id = ?
  618. AND h.platfor = 1 AND h.is_del = 0 AND h.stop_time > 0 `
  619. if condition != "" {
  620. sql = sql + condition
  621. }
  622. _, err = o.Raw(sql, articleId).QueryRows(&items)
  623. return
  624. }
  625. // 列表
  626. func GetArticleHistoryListInit(ArticleIds, companyIds []int) (items []*ArticleHistoryRep, err error) {
  627. o := orm.NewOrmUsingDB("hz_cygx")
  628. sql := `SELECT
  629. h.*
  630. FROM
  631. cygx_article_history_record_all AS h
  632. WHERE
  633. 1=1
  634. AND h.platfor = 1 AND create_time >= '2023.09.01' AND create_time < '2024.09.02' AND h.is_del = 0 AND article_id IN (` + utils.GetOrmInReplace(len(ArticleIds)) + `) AND company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `) `
  635. sql += ` ORDER BY id DESC `
  636. _, err = o.Raw(sql, ArticleIds, companyIds).QueryRows(&items)
  637. return
  638. }
  639. // 用户阅读记录,不过滤弘则内部的
  640. func GetArticleHistoryListOld(articleId int, condition string) (items []*ArticleHistoryRep, err error) {
  641. o := orm.NewOrmUsingDB("hz_cygx")
  642. sql := `SELECT
  643. h.*
  644. FROM
  645. cygx_article_history_record AS h
  646. WHERE
  647. h.article_id = ?
  648. AND c.product_id = 2`
  649. if condition != "" {
  650. sql = sql + condition + ` GROUP BY h.id`
  651. }
  652. _, err = o.Raw(sql, articleId).QueryRows(&items)
  653. return
  654. }
  655. // 列表
  656. func GetSellerUserMobileList(condition string) (items []*ArticleHistoryRep, err error) {
  657. o := orm.NewOrm()
  658. sql := `SELECT mobile FROM wx_user as h WHERE h.mobile != '' ` + condition
  659. _, err = o.Raw(sql).QueryRows(&items)
  660. return
  661. }
  662. type ArticleTypeAndAbstract struct {
  663. Abstract string
  664. ArticleTypeId int
  665. }
  666. func GetArticleTypeAndAbstract() (list []*ArticleTypeAndAbstract, err error) {
  667. o := orm.NewOrmUsingDB("hz_cygx")
  668. sql := `SELECT
  669. *
  670. FROM
  671. ( SELECT abstract, article_type_id FROM cygx_article GROUP BY publish_date DESC ) AS a
  672. GROUP BY
  673. a.article_type_id `
  674. _, err = o.Raw(sql).QueryRows(&list)
  675. return
  676. }
  677. // 更新文章置顶时间
  678. func UpdateArticleTopTime(activityId, topTime int) (err error) {
  679. o := orm.NewOrmUsingDB("hz_cygx")
  680. sql := ` UPDATE cygx_article SET top_time=? WHERE article_id=?`
  681. _, err = o.Raw(sql, topTime, activityId).Exec()
  682. return
  683. }
  684. // 添加朋友圈分享封面图片
  685. func UpdateCygxArticleMomentsImg(momentsImg string, articleId int) (err error) {
  686. sql := `UPDATE cygx_article SET moments_img=? WHERE article_id=? `
  687. o := orm.NewOrmUsingDB("hz_cygx")
  688. _, err = o.Raw(sql, momentsImg, articleId).Exec()
  689. return
  690. }