wechat_article.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. package rag
  2. import (
  3. "database/sql"
  4. "eta/eta_api/global"
  5. "eta/eta_api/utils"
  6. "fmt"
  7. "strings"
  8. "time"
  9. )
  10. type WechatArticle struct {
  11. WechatArticleId int `gorm:"column:wechat_article_id;type:int(10) UNSIGNED;primaryKey;not null;" description:""`
  12. WechatPlatformId int `gorm:"column:wechat_platform_id;type:int(11);comment:归属公众号id;default:0;" description:"归属公众号id"`
  13. FakeId string `gorm:"column:fake_id;type:varchar(255);comment:公众号唯一id;" description:"公众号唯一id"`
  14. Title string `gorm:"column:title;type:varchar(255);comment:标题;" description:"标题"`
  15. Link string `gorm:"column:link;type:varchar(255);comment:链接;" description:"链接"`
  16. CoverUrl string `gorm:"column:cover_url;type:varchar(255);comment:公众号封面;" description:"公众号封面"`
  17. Description string `gorm:"column:description;type:varchar(255);comment:描述;" description:"描述"`
  18. Content string `gorm:"column:content;type:longtext;comment:报告详情;" description:"报告详情"`
  19. TextContent string `gorm:"column:text_content;type:text;comment:文本内容;" description:"文本内容"`
  20. AbstractStatus int `gorm:"column:abstract_status;type:tinyint(4);comment:摘要生成情况,-1:生成失败,0:待生成,1:已生成;default:0;" description:"摘要生成情况,-1:生成失败,0:待生成,1:已生成"`
  21. Country string `gorm:"column:country;type:varchar(255);comment:国家;" description:"国家"`
  22. Province string `gorm:"column:province;type:varchar(255);comment:省;" description:"省"`
  23. City string `gorm:"column:city;type:varchar(255);comment:市;" description:"市"`
  24. ArticleCreateTime time.Time `gorm:"column:article_create_time;type:datetime;comment:报告创建时间;default:NULL;" description:"报告创建时间"`
  25. VectorKey string `gorm:"column:vector_key;type:varchar(255);comment:向量key标识;" description:"向量key标识"`
  26. IsDeleted int `gorm:"column:is_deleted;type:tinyint(4);comment:是否删除,0:未删除,1: 已删除;default:0;" description:"是否删除,0:未删除,1: 已删除"`
  27. ModifyTime time.Time `gorm:"column:modify_time;type:datetime;comment:修改时间;default:NULL;" description:"修改时间"`
  28. CreateTime time.Time `gorm:"column:create_time;type:datetime;comment:入库时间;default:NULL;" description:"入库时间"`
  29. }
  30. // TableName get sql table name.获取数据库表名
  31. func (m *WechatArticle) TableName() string {
  32. return "wechat_article"
  33. }
  34. // WechatArticleColumns get sql column name.获取数据库列名
  35. var WechatArticleColumns = struct {
  36. WechatArticleID string
  37. WechatPlatformID string
  38. FakeID string
  39. Title string
  40. Link string
  41. CoverURL string
  42. Description string
  43. Content string
  44. TextContent string
  45. AbstractStatus string
  46. Country string
  47. Province string
  48. City string
  49. ArticleCreateTime string
  50. IsDeleted string
  51. ModifyTime string
  52. CreateTime string
  53. }{
  54. WechatArticleID: "wechat_article_id",
  55. WechatPlatformID: "wechat_platform_id",
  56. FakeID: "fake_id",
  57. Title: "title",
  58. Link: "link",
  59. CoverURL: "cover_url",
  60. Description: "description",
  61. Content: "content",
  62. TextContent: "text_content",
  63. AbstractStatus: "abstract_status",
  64. Country: "country",
  65. Province: "province",
  66. City: "city",
  67. ArticleCreateTime: "article_create_time",
  68. IsDeleted: "is_deleted",
  69. ModifyTime: "modify_time",
  70. CreateTime: "create_time",
  71. }
  72. type WechatArticleView struct {
  73. WechatArticleId int `gorm:"column:wechat_article_id;type:int(10) UNSIGNED;primaryKey;not null;" description:""`
  74. WechatPlatformId int `gorm:"column:wechat_platform_id;type:int(11);comment:归属公众号id;default:0;" description:"归属公众号id"`
  75. FakeId string `gorm:"column:fake_id;type:varchar(255);comment:公众号唯一id;" description:"公众号唯一id"`
  76. Title string `gorm:"column:title;type:varchar(255);comment:标题;" description:"标题"`
  77. Link string `gorm:"column:link;type:varchar(255);comment:链接;" description:"链接"`
  78. CoverUrl string `gorm:"column:cover_url;type:varchar(255);comment:公众号封面;" description:"公众号封面"`
  79. Description string `gorm:"column:description;type:varchar(255);comment:描述;" description:"描述"`
  80. Content string `gorm:"column:content;type:longtext;comment:报告详情;" description:"报告详情"`
  81. TextContent string `gorm:"column:text_content;type:text;comment:文本内容;" description:"文本内容"`
  82. AbstractStatus int `gorm:"column:abstract_status;type:tinyint(4);comment:摘要生成情况,-1:生成失败,0:待生成,1:已生成;default:0;" description:"摘要生成情况,-1:生成失败,0:待生成,1:已生成"`
  83. Abstract string `gorm:"column:abstract;type:text;comment:摘要;" description:"摘要"`
  84. Country string `gorm:"column:country;type:varchar(255);comment:国家;" description:"国家"`
  85. Province string `gorm:"column:province;type:varchar(255);comment:省;" description:"省"`
  86. City string `gorm:"column:city;type:varchar(255);comment:市;" description:"市"`
  87. ArticleCreateTime string `gorm:"column:article_create_time;type:datetime;comment:报告创建时间;default:NULL;" description:"报告创建时间"`
  88. ModifyTime string `gorm:"column:modify_time;type:datetime;comment:修改时间;default:NULL;" description:"修改时间"`
  89. CreateTime string `gorm:"column:create_time;type:datetime;comment:入库时间;default:NULL;" description:"入库时间"`
  90. WechatPlatformName string `gorm:"column:title;type:varchar(255);comment:标题;" description:"微信公众号名称"`
  91. WechatPlatformRoundHeadImg string `gorm:"column:round_head_img;type:varchar(255);comment:头像;" description:"微信公众号头像"`
  92. TagName string `gorm:"column:tag_name;type:varchar(255);comment:标签名称;" description:"标签名称"`
  93. TagId int `gorm:"column:tag_id;type:varchar(255);comment:标签id;" description:"标签id"`
  94. }
  95. func (m *WechatArticle) ToView() WechatArticleView {
  96. var articleCreateTime, modifyTime, createTime string
  97. if !m.ArticleCreateTime.IsZero() {
  98. articleCreateTime = m.ArticleCreateTime.Format(utils.FormatDateTime)
  99. }
  100. if !m.CreateTime.IsZero() {
  101. createTime = m.CreateTime.Format(utils.FormatDateTime)
  102. }
  103. if !m.ModifyTime.IsZero() {
  104. modifyTime = m.ModifyTime.Format(utils.FormatDateTime)
  105. }
  106. return WechatArticleView{
  107. WechatArticleId: m.WechatArticleId,
  108. WechatPlatformId: m.WechatPlatformId,
  109. FakeId: m.FakeId,
  110. Title: m.Title,
  111. Link: m.Link,
  112. CoverUrl: m.CoverUrl,
  113. Description: m.Description,
  114. Content: m.Content,
  115. TextContent: m.TextContent,
  116. AbstractStatus: m.AbstractStatus,
  117. Country: m.Country,
  118. Province: m.Province,
  119. City: m.City,
  120. ArticleCreateTime: articleCreateTime,
  121. ModifyTime: modifyTime,
  122. CreateTime: createTime,
  123. WechatPlatformName: "",
  124. WechatPlatformRoundHeadImg: "",
  125. }
  126. }
  127. func (m *WechatArticle) ListToViewList(list []*WechatArticle) (wechatArticleViewList []WechatArticleView) {
  128. wechatArticleViewList = make([]WechatArticleView, 0)
  129. for _, v := range list {
  130. wechatArticleViewList = append(wechatArticleViewList, v.ToView())
  131. }
  132. return
  133. }
  134. func (m *WechatArticle) Create() (err error) {
  135. err = global.DbMap[utils.DbNameAI].Create(&m).Error
  136. return
  137. }
  138. func (m *WechatArticle) Update(updateCols []string) (err error) {
  139. err = global.DbMap[utils.DbNameAI].Select(updateCols).Updates(&m).Error
  140. return
  141. }
  142. func (m *WechatArticle) GetById(id int) (item *WechatArticle, err error) {
  143. err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s = ?", WechatArticleColumns.WechatArticleID), id).First(&item).Error
  144. return
  145. }
  146. func GetArticleById(id int) (item *WechatArticle, err error) {
  147. err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s = ?", WechatArticleColumns.WechatArticleID), id).First(&item).Error
  148. return
  149. }
  150. func (m *WechatArticle) GetByLink(link string) (item *WechatArticle, err error) {
  151. err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s = ?", WechatArticleColumns.Link), link).First(&item).Error
  152. return
  153. }
  154. func (m *WechatArticle) GetListByCondition(field, condition string, pars []interface{}, startSize, pageSize int) (items []*WechatArticle, err error) {
  155. if field == "" {
  156. field = "*"
  157. }
  158. sqlStr := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 AND is_deleted=0 %s order by article_create_time desc,wechat_article_id desc LIMIT ?,?`, field, m.TableName(), condition)
  159. pars = append(pars, startSize, pageSize)
  160. err = global.DbMap[utils.DbNameAI].Raw(sqlStr, pars...).Find(&items).Error
  161. return
  162. }
  163. func (m *WechatArticle) GetCountByCondition(condition string, pars []interface{}) (total int, err error) {
  164. var intNull sql.NullInt64
  165. sqlStr := fmt.Sprintf(`SELECT COUNT(1) total FROM %s WHERE 1=1 AND is_deleted=0 %s`, m.TableName(), condition)
  166. err = global.DbMap[utils.DbNameAI].Raw(sqlStr, pars...).Scan(&intNull).Error
  167. if err == nil && intNull.Valid {
  168. total = int(intNull.Int64)
  169. }
  170. return
  171. }
  172. func (m *WechatArticle) GetPageListByCondition(condition string, pars []interface{}, startSize, pageSize int) (total int, items []*WechatArticle, err error) {
  173. total, err = m.GetCountByCondition(condition, pars)
  174. if err != nil {
  175. return
  176. }
  177. if total > 0 {
  178. items, err = m.GetListByCondition(`wechat_article_id,wechat_platform_id,fake_id,title,link,cover_url,description,country,province,city,article_create_time,modify_time,create_time`, condition, pars, startSize, pageSize)
  179. }
  180. return
  181. }
  182. type WechatArticleAndPlatform struct {
  183. WechatArticleId int `gorm:"column:wechat_article_id;type:int(10) UNSIGNED;primaryKey;not null;" description:""`
  184. WechatPlatformId int `gorm:"column:wechat_platform_id;type:int(11);comment:归属公众号id;default:0;" description:"归属公众号id"`
  185. FakeId string `gorm:"column:fake_id;type:varchar(255);comment:公众号唯一id;" description:"公众号唯一id"`
  186. Title string `gorm:"column:title;type:varchar(255);comment:标题;" description:"标题"`
  187. Link string `gorm:"column:link;type:varchar(255);comment:链接;" description:"链接"`
  188. CoverUrl string `gorm:"column:cover_url;type:varchar(255);comment:公众号封面;" description:"公众号封面"`
  189. Description string `gorm:"column:description;type:varchar(255);comment:描述;" description:"描述"`
  190. Content string `gorm:"column:content;type:longtext;comment:报告详情;" description:"报告详情"`
  191. TextContent string `gorm:"column:text_content;type:text;comment:文本内容;" description:"文本内容"`
  192. Abstract string `gorm:"column:abstract;type:text;comment:摘要;" description:"摘要"`
  193. Country string `gorm:"column:country;type:varchar(255);comment:国家;" description:"国家"`
  194. Province string `gorm:"column:province;type:varchar(255);comment:省;" description:"省"`
  195. City string `gorm:"column:city;type:varchar(255);comment:市;" description:"市"`
  196. ArticleCreateTime time.Time `gorm:"column:article_create_time;type:datetime;comment:报告创建时间;default:NULL;" description:"报告创建时间"`
  197. IsDeleted int `gorm:"column:is_deleted;type:tinyint(4);comment:是否删除,0:未删除,1: 已删除;default:0;" description:"是否删除,0:未删除,1: 已删除"`
  198. ModifyTime time.Time `gorm:"column:modify_time;type:datetime;comment:修改时间;default:NULL;" description:"修改时间"`
  199. CreateTime time.Time `gorm:"column:create_time;type:datetime;comment:入库时间;default:NULL;" description:"入库时间"`
  200. Nickname string `gorm:"column:nickname;type:varchar(255);comment:公众号名称;" description:"nickname"` // 公众号名称
  201. Alias string `gorm:"column:alias;type:varchar(255);comment:别名;" description:"alias"` // 别名
  202. RoundHeadImg string `gorm:"column:round_head_img;type:varchar(255);comment:头像;" description:"round_head_img"` // 头像
  203. }
  204. func (m *WechatArticleAndPlatform) ToView() WechatArticleView {
  205. var articleCreateTime, modifyTime, createTime string
  206. if !m.ArticleCreateTime.IsZero() {
  207. articleCreateTime = m.ArticleCreateTime.Format(utils.FormatDateTime)
  208. }
  209. if !m.CreateTime.IsZero() {
  210. createTime = m.CreateTime.Format(utils.FormatDateTime)
  211. }
  212. if !m.ModifyTime.IsZero() {
  213. modifyTime = m.ModifyTime.Format(utils.FormatDateTime)
  214. }
  215. return WechatArticleView{
  216. WechatArticleId: m.WechatArticleId,
  217. WechatPlatformId: m.WechatPlatformId,
  218. FakeId: m.FakeId,
  219. Title: m.Title,
  220. Link: m.Link,
  221. CoverUrl: m.CoverUrl,
  222. Description: m.Description,
  223. Content: m.Content,
  224. TextContent: m.TextContent,
  225. Abstract: m.Abstract,
  226. Country: m.Country,
  227. Province: m.Province,
  228. City: m.City,
  229. ArticleCreateTime: articleCreateTime,
  230. ModifyTime: modifyTime,
  231. CreateTime: createTime,
  232. WechatPlatformName: m.Nickname,
  233. WechatPlatformRoundHeadImg: m.RoundHeadImg,
  234. }
  235. }
  236. func (m *WechatArticle) ArticleAndPlatformListToViewList(list []*WechatArticleAndPlatform) (wechatArticleViewList []WechatArticleView) {
  237. wechatArticleViewList = make([]WechatArticleView, 0)
  238. for _, v := range list {
  239. wechatArticleViewList = append(wechatArticleViewList, v.ToView())
  240. }
  241. return
  242. }
  243. func (m *WechatArticle) GetListByPlatformCondition(field, condition string, pars []interface{}, startSize, pageSize int) (items []*WechatArticleAndPlatform, err error) {
  244. if field == "" {
  245. field = "*"
  246. }
  247. sqlStr := fmt.Sprintf(`SELECT %s FROM %s AS a
  248. JOIN wechat_platform AS b ON a.wechat_platform_id=b.wechat_platform_id
  249. WHERE 1=1 AND a.is_deleted=0 %s order by a.article_create_time DESC,a.wechat_article_id DESC LIMIT ?,?`, field, m.TableName(), condition)
  250. pars = append(pars, startSize, pageSize)
  251. err = global.DbMap[utils.DbNameAI].Raw(sqlStr, pars...).Find(&items).Error
  252. return
  253. }
  254. func (m *WechatArticle) GetCountByPlatformCondition(condition string, pars []interface{}) (total int, err error) {
  255. var intNull sql.NullInt64
  256. sqlStr := fmt.Sprintf(`SELECT COUNT(1) total FROM %s AS a
  257. JOIN wechat_platform AS b ON a.wechat_platform_id=b.wechat_platform_id
  258. WHERE 1=1 AND a.is_deleted=0 %s`, m.TableName(), condition)
  259. err = global.DbMap[utils.DbNameAI].Raw(sqlStr, pars...).Scan(&intNull).Error
  260. if err == nil && intNull.Valid {
  261. total = int(intNull.Int64)
  262. }
  263. return
  264. }
  265. func (m *WechatArticle) GetPageListByPlatformCondition(condition string, pars []interface{}, startSize, pageSize int) (total int, items []*WechatArticleAndPlatform, err error) {
  266. total, err = m.GetCountByPlatformCondition(condition, pars)
  267. if err != nil {
  268. return
  269. }
  270. if total > 0 {
  271. items, err = m.GetListByPlatformCondition(`a.wechat_article_id,a.wechat_platform_id,a.fake_id,a.title,a.link,a.cover_url,a.description,a.country,a.province,a.city,a.article_create_time,a.modify_time,a.create_time,b.nickname,b.round_head_img`, condition, pars, startSize, pageSize)
  272. }
  273. return
  274. }
  275. type DafWechatArticleItem struct {
  276. WechatArticleId int `gorm:"column:wechat_article_id;type:int(10) UNSIGNED;primaryKey;not null;" description:""`
  277. Title string `gorm:"column:title;type:varchar(255);comment:标题;" description:"标题"`
  278. TextContent string `gorm:"column:text_content;type:text;comment:文本内容;" description:"文本内容"`
  279. }
  280. func (m *WechatArticle) ToDAFView() *DafWechatArticleItem {
  281. return &DafWechatArticleItem{
  282. WechatArticleId: m.WechatArticleId,
  283. Title: m.Title,
  284. TextContent: m.TextContent,
  285. }
  286. }
  287. func FetchArticleDafTagMappingList(lastId int, excludeIds []int, fetchSize int) (items []*DafWechatArticleItem, id int, err error) {
  288. var articleList []*WechatArticle
  289. if len(excludeIds) == 0 {
  290. err = global.DbMap[utils.DbNameAI].Model(&WechatArticle{}).Select("wechat_article_id,title,text_content").Where("wechat_article_id > ? and is_deleted=?", lastId, 0).Order("wechat_article_id asc").Limit(fetchSize).Find(&articleList).Error
  291. } else {
  292. err = global.DbMap[utils.DbNameAI].Model(&WechatArticle{}).Select("wechat_article_id,title,text_content").Where("wechat_article_id > ? and wechat_article_id not in (?) and is_deleted=?", lastId, excludeIds, 0).Order("wechat_article_id asc").Limit(fetchSize).Find(&articleList).Error
  293. }
  294. if err != nil {
  295. return
  296. }
  297. for _, article := range articleList {
  298. items = append(items, article.ToDAFView())
  299. }
  300. if len(articleList) > 1 {
  301. id = articleList[len(articleList)-1].WechatArticleId
  302. }
  303. return
  304. }
  305. func GetArticleByTags(labels []string, daysBefore int, fetchSize int, sourceList []string) (items []*DafWechatArticleItem, err error) {
  306. var tagSql = `select article_id from article_dfa_tag_mapping where (`
  307. for i := 0; i < len(labels); i++ {
  308. if i == 0 {
  309. tagSql += fmt.Sprintf(`find_in_set('%s', tag_name)`, labels[i])
  310. } else {
  311. tagSql += fmt.Sprintf(` or find_in_set('%s', tag_name)`, labels[i])
  312. }
  313. }
  314. tagSql += `)`
  315. endDate := time.Now()
  316. startDate := endDate.AddDate(0, 0, -daysBefore)
  317. var limitedCondition string
  318. if fetchSize > 0 {
  319. limitedCondition = fmt.Sprintf("limit 0,%d", fetchSize)
  320. }
  321. var sourceCondition string
  322. if len(sourceList) > 0 {
  323. sourceCondition = fmt.Sprintf("and source in (%s)", strings.Join(sourceList, ","))
  324. }
  325. var dateCondition = fmt.Sprintf("and article_create_time between '%s' and '%s'", startDate.Format(utils.FormatDate), endDate.Format(utils.FormatDate))
  326. var sql = fmt.Sprintf(`select text_content from wechat_article where wechat_article_id in (%s) and is_deleted = 0 %s order by article_create_time desc %s`, tagSql, sourceCondition, limitedCondition)
  327. var sqlWithDays = fmt.Sprintf(`select text_content from wechat_article where wechat_article_id in (%s) and is_deleted = 0 %s %s %s `, tagSql, dateCondition, sourceCondition, limitedCondition)
  328. err = global.DbMap[utils.DbNameAI].Raw(sqlWithDays).Find(&items).Error
  329. if err != nil {
  330. return
  331. }
  332. if len(items) == 0 {
  333. err = global.DbMap[utils.DbNameAI].Raw(sql).Find(&items).Error
  334. }
  335. return
  336. }