sa_doc.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. package semantic_analysis
  2. import (
  3. "eta_gn/eta_api/global"
  4. "eta_gn/eta_api/utils"
  5. "fmt"
  6. "github.com/rdlucklib/rdluck_tools/paging"
  7. "strings"
  8. "time"
  9. )
  10. //type SaDoc struct {
  11. // SaDocId int `orm:"column(sa_doc_id);pk" description:"文档ID"`
  12. // ClassifyId int `description:"文档分类ID"`
  13. // ClassifyName string `description:"分类名称"`
  14. // Title string `description:"标题"`
  15. // Theme string `description:"主题"`
  16. // CoverImg string `description:"封面图"`
  17. // ContentMd5 string `description:"内容md5, 用于内容去重"`
  18. // SysAdminId int `description:"创建人ID"`
  19. // SysAdminName string `description:"创建人姓名"`
  20. // Sort int `description:"排序"`
  21. // CreateTime time.Time `description:"创建时间"`
  22. // ModifyTime time.Time `description:"修改时间"`
  23. //}
  24. type SaDoc struct {
  25. SaDocId int `gorm:"primaryKey;column:sa_doc_id;type:int(10) unsigned;not null"` // 语义分析-文档Id
  26. ClassifyId int `gorm:"index:idx_classify_id;column:classify_id;type:int(10) unsigned;not null;default:0"` // 文档分类Id
  27. ClassifyName string `gorm:"column:classify_name;type:varchar(128);not null;default:''"` // 文档分类名称
  28. Title string `gorm:"column:title;type:varchar(255);not null;default:''"` // 文档标题
  29. Theme string `gorm:"column:theme;type:varchar(128);not null;default:''"` // 主题
  30. CoverImg string `gorm:"column:cover_img;type:varchar(255);not null;default:''"` // 封面图
  31. ContentMd5 string `gorm:"column:content_md5;type:char(32);not null;default:''"` // 内容md5后的字符串,用于内容去重
  32. SysAdminId int `gorm:"column:sys_admin_id;type:int(10) unsigned;not null;default:0"` // 创建人Id
  33. SysAdminName string `gorm:"column:sys_admin_name;type:varchar(128);not null;default:''"` // 创建人姓名
  34. Sort int `gorm:"column:sort;type:int(10) unsigned;not null;default:0"` // 排序
  35. CreateTime time.Time `gorm:"column:create_time;type:datetime"` // 创建时间
  36. ModifyTime time.Time `gorm:"column:modify_time;type:datetime"` // 更新时间
  37. }
  38. var SaDocColumns = struct {
  39. SaDocId string
  40. ClassifyId string
  41. ClassifyName string
  42. Title string
  43. Theme string
  44. CoverImg string
  45. ContentMd5 string
  46. SysAdminId string
  47. SysAdminName string
  48. Sort string
  49. CreateTime string
  50. ModifyTime string
  51. }{
  52. SaDocId: "sa_doc_id",
  53. ClassifyId: "classify_id",
  54. ClassifyName: "classify_name",
  55. Title: "title",
  56. Theme: "theme",
  57. CoverImg: "cover_img",
  58. ContentMd5: "content_md5",
  59. SysAdminId: "sys_admin_id",
  60. SysAdminName: "sys_admin_name",
  61. Sort: "sort",
  62. CreateTime: "create_time",
  63. ModifyTime: "modify_time",
  64. }
  65. func (m *SaDoc) TableName() string {
  66. return "sa_doc"
  67. }
  68. func (m *SaDoc) Create() (err error) {
  69. //// o := orm.NewOrm()
  70. //id, err := o.Insert(m)
  71. //if err != nil {
  72. // return
  73. //}
  74. //m.SaDocId = int(id)
  75. err = global.DEFAULT_DmSQL.Create(m).Error
  76. return
  77. }
  78. func (m *SaDoc) Update(cols []string) (err error) {
  79. //// o := orm.NewOrm()
  80. //_, err = o.Update(m, cols...)
  81. err = global.DEFAULT_DmSQL.Select(cols).Updates(m).Error
  82. return
  83. }
  84. func (m *SaDoc) Del() (err error) {
  85. //// o := orm.NewOrm()
  86. sql := `DELETE FROM sa_doc WHERE sa_doc_id = ? LIMIT 1`
  87. //_, err = o.Raw(sql, m.SaDocId).Exec()
  88. err = global.DEFAULT_DmSQL.Exec(sql, m.SaDocId).Error
  89. return
  90. }
  91. func (m *SaDoc) GetItemById(id int) (err error) {
  92. //// o := orm.NewOrm()
  93. sql := `SELECT * FROM sa_doc WHERE sa_doc_id = ? LIMIT 1`
  94. //err = o.Raw(sql, id).QueryRow(&m)
  95. err = global.DEFAULT_DmSQL.Raw(sql, id).First(&m).Error
  96. return
  97. }
  98. func (m *SaDoc) GetItemByCondition(condition string, pars []interface{}) (err error) {
  99. //// o := orm.NewOrm()
  100. sql := `SELECT * FROM sa_doc WHERE 1=1 `
  101. sql += condition
  102. sql += ` LIMIT 1`
  103. //err = o.Raw(sql, pars).QueryRow(&m)
  104. err = global.DEFAULT_DmSQL.Raw(sql, pars...).First(&m).Error
  105. return
  106. }
  107. func (m *SaDoc) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
  108. //// o := orm.NewOrm()
  109. sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
  110. //err = o.Raw(sql, pars).QueryRow(&count)
  111. err = global.DEFAULT_DmSQL.Raw(sql, pars...).Scan(&count).Error
  112. return
  113. }
  114. func (m *SaDoc) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*SaDoc, err error) {
  115. // o := orm.NewOrm()
  116. fields := strings.Join(fieldArr, ",")
  117. if len(fieldArr) == 0 {
  118. fields = `*`
  119. }
  120. order := `ORDER BY create_time DESC`
  121. if orderRule != "" {
  122. order = ` ORDER BY ` + orderRule
  123. }
  124. sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
  125. //_, err = o.Raw(sql, pars).QueryRows(&items)
  126. err = global.DEFAULT_DmSQL.Raw(sql, pars...).Find(&items).Error
  127. return
  128. }
  129. func (m *SaDoc) GetPageItemsByCondition(startSize, pageSize int, condition string, pars []interface{}, fieldArr []string, orderRule string) (total int, items []*SaDoc, err error) {
  130. // o := orm.NewOrm()
  131. fields := strings.Join(fieldArr, ",")
  132. if len(fieldArr) == 0 {
  133. fields = `*`
  134. }
  135. order := `ORDER BY create_time DESC`
  136. if orderRule != "" {
  137. order = ` ORDER BY ` + orderRule
  138. }
  139. sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
  140. totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z`
  141. //if err = o.Raw(totalSql, pars).QueryRow(&total); err != nil {
  142. // return
  143. //}
  144. err = global.DEFAULT_DmSQL.Raw(totalSql, pars...).Scan(&total).Error
  145. if err != nil {
  146. return
  147. }
  148. sql += ` LIMIT ?,?`
  149. //_, err = o.Raw(sql, pars...).QueryRows(&items)
  150. pars = append(pars, startSize, pageSize)
  151. err = global.DEFAULT_DmSQL.Raw(sql, pars...).Find(&items).Error
  152. return
  153. }
  154. // InsertSaDocAndSections 新增文档及段落
  155. func InsertSaDocAndSections(doc *SaDoc, sections []*SaDocSection) (err error) {
  156. //o := orm.NewOrm()
  157. //tx, err := o.Begin()
  158. //if err != nil {
  159. // return
  160. //}
  161. //defer func() {
  162. // if err != nil {
  163. // _ = tx.Rollback()
  164. // } else {
  165. // _ = tx.Commit()
  166. // }
  167. //}()
  168. //
  169. //lastId, err := tx.Insert(doc)
  170. //if err != nil {
  171. // return
  172. //}
  173. //doc.SaDocId = int(lastId)
  174. //
  175. //if len(sections) > 0 {
  176. // for i := range sections {
  177. // sections[i].DocId = int(lastId)
  178. // secId, e := tx.Insert(sections[i])
  179. // if e != nil {
  180. // err = e
  181. // return
  182. // }
  183. // sections[i].SaDocSectionId = int(secId)
  184. // }
  185. //}
  186. tx := global.DEFAULT_DmSQL.Begin()
  187. defer func() {
  188. if err != nil {
  189. _ = tx.Rollback()
  190. return
  191. }
  192. _ = tx.Commit()
  193. }()
  194. e := tx.Create(doc).Error
  195. if e != nil {
  196. err = fmt.Errorf("insert doc err: %v", e)
  197. return
  198. }
  199. if len(sections) > 0 {
  200. for i := range sections {
  201. sections[i].DocId = doc.SaDocId
  202. e = tx.Create(sections[i]).Error
  203. if e != nil {
  204. err = e
  205. return
  206. }
  207. }
  208. }
  209. return
  210. }
  211. // DelSaDocAndSections 删除文档和段落
  212. func DelSaDocAndSections(docId int) (err error) {
  213. //o := orm.NewOrm()
  214. //tx, err := o.Begin()
  215. //if err != nil {
  216. // return
  217. //}
  218. //defer func() {
  219. // if err != nil {
  220. // _ = tx.Rollback()
  221. // } else {
  222. // _ = tx.Commit()
  223. // }
  224. //}()
  225. //
  226. //sql := `DELETE FROM sa_doc WHERE sa_doc_id = ? LIMIT 1`
  227. //_, err = tx.Raw(sql, docId).Exec()
  228. //if err != nil {
  229. // return
  230. //}
  231. //sql = `DELETE FROM sa_doc_section WHERE doc_id = ?`
  232. //_, err = tx.Raw(sql, docId).Exec()
  233. tx := global.DEFAULT_DmSQL.Begin()
  234. defer func() {
  235. if err != nil {
  236. _ = tx.Rollback()
  237. return
  238. }
  239. _ = tx.Commit()
  240. }()
  241. sql := `DELETE FROM sa_doc WHERE sa_doc_id = ? LIMIT 1`
  242. e := tx.Exec(sql, docId).Error
  243. if e != nil {
  244. err = fmt.Errorf("delete doc err: %v", e)
  245. return
  246. }
  247. sql = `DELETE FROM sa_doc_section WHERE doc_id = ?`
  248. e = tx.Exec(sql, docId).Error
  249. if e != nil {
  250. err = fmt.Errorf("delete sections err: %v", e)
  251. return
  252. }
  253. return
  254. }
  255. type SaDocAddReq struct {
  256. Title string `description:"标题"`
  257. Theme string `description:"主题"`
  258. ClassifyId int `description:"文档分类ID"`
  259. Content string `description:"文档内容"`
  260. }
  261. type SaDocEditReq struct {
  262. SaDocId int `description:"文档ID"`
  263. Title string `description:"标题"`
  264. Theme string `description:"主题"`
  265. ClassifyId int `description:"文档分类ID"`
  266. SectionList []*SaDocSection `description:"段落列表"`
  267. }
  268. type SaDocDelReq struct {
  269. SaDocId int `description:"文档ID"`
  270. }
  271. type SaDocMoveReq struct {
  272. SaDocClassifyId int `description:"文档分类ID"`
  273. SaDocId int `description:"文档ID"`
  274. PrevSaDocId int `description:"上一个文档ID"`
  275. NextSaDocId int `description:"下一个文档ID"`
  276. }
  277. type SaDocPageListResp struct {
  278. List []*SaDocItem
  279. Paging *paging.PagingItem `description:"分页数据"`
  280. }
  281. type SaDocItem struct {
  282. SaDocId int `description:"文档ID"`
  283. ClassifyId int `description:"文档分类ID"`
  284. ClassifyName string `description:"分类名称"`
  285. Title string `description:"标题"`
  286. Theme string `description:"主题"`
  287. CoverImg string `description:"封面图"`
  288. SysAdminId int `description:"创建人ID"`
  289. SysAdminName string `description:"创建人姓名"`
  290. Sort int `description:"排序"`
  291. CreateTime string `description:"创建时间"`
  292. UseNum int `description:"引用数"`
  293. }
  294. type SaDocDetail struct {
  295. SaDocItem
  296. SectionList []*SaDocSectionItem
  297. }
  298. // UpdateSaDocClassifyByClassifyId 更新文档分类信息
  299. func UpdateSaDocClassifyByClassifyId(classifyId int, classifyName string) (err error) {
  300. // o := orm.NewOrm()
  301. sql := `UPDATE sa_doc SET classify_name = ? WHERE classify_id = ?`
  302. //_, err = o.Raw(sql, classifyName, classifyId).Exec()
  303. err = global.DEFAULT_DmSQL.Exec(sql, classifyName, classifyId).Error
  304. return
  305. }
  306. // UpdateSaDocAndSections 更新文档和段落
  307. func UpdateSaDocAndSections(docItem *SaDoc, insertSecs, updateSecs []*SaDocSection, delSecIds []int, updateCols, updateSecCols []string) (err error) {
  308. //o := orm.NewOrm()
  309. //tx, err := o.Begin()
  310. //if err != nil {
  311. // return
  312. //}
  313. //defer func() {
  314. // if err != nil {
  315. // _ = tx.Rollback()
  316. // } else {
  317. // _ = tx.Commit()
  318. // }
  319. //}()
  320. //
  321. //// 更新文档
  322. //if _, err = tx.Update(docItem, updateCols...); err != nil {
  323. // return
  324. //}
  325. //// 段落-新增/更新/删除
  326. //if len(insertSecs) > 0 {
  327. // if _, err = tx.InsertMulti(len(insertSecs), insertSecs); err != nil {
  328. // return
  329. // }
  330. //}
  331. //for _, s := range updateSecs {
  332. // if _, err = tx.Update(s, updateSecCols...); err != nil {
  333. // return
  334. // }
  335. //}
  336. //if len(delSecIds) > 0 {
  337. // sql := `DELETE FROM sa_doc_section WHERE doc_id = ? AND sa_doc_section_id IN (%s)`
  338. // sql = fmt.Sprintf(sql, utils.GetOrmInReplace(len(delSecIds)))
  339. // _, err = tx.Raw(sql, docItem.SaDocId, delSecIds).Exec()
  340. //}
  341. tx := global.DEFAULT_DmSQL.Begin()
  342. defer func() {
  343. if err != nil {
  344. _ = tx.Rollback()
  345. return
  346. }
  347. _ = tx.Commit()
  348. }()
  349. // 更新文档
  350. e := tx.Select(updateCols).Updates(docItem).Error
  351. if e != nil {
  352. err = fmt.Errorf("update doc err: %v", e)
  353. return
  354. }
  355. // 段落-新增/更新/删除
  356. if len(insertSecs) > 0 {
  357. e = tx.CreateInBatches(insertSecs, utils.MultiAddNum).Error
  358. if e != nil {
  359. err = fmt.Errorf("insert sections err: %v", e)
  360. return
  361. }
  362. }
  363. for _, s := range updateSecs {
  364. e = tx.Select(updateSecCols).Updates(s).Error
  365. if e != nil {
  366. err = fmt.Errorf("update section err: %v", e)
  367. return
  368. }
  369. }
  370. if len(delSecIds) > 0 {
  371. sql := `DELETE FROM sa_doc_section WHERE doc_id = ? AND sa_doc_section_id IN (%s)`
  372. sql = fmt.Sprintf(sql, utils.GetOrmInReplace(len(delSecIds)))
  373. e = tx.Exec(sql, docItem.SaDocId, delSecIds).Error
  374. if e != nil {
  375. err = fmt.Errorf("remove sections err: %v", e)
  376. }
  377. }
  378. return
  379. }
  380. // ElasticSaDoc ES-语义分析文档
  381. type ElasticSaDoc struct {
  382. SaDocId int `description:"文档ID"`
  383. SaDocSectionId int `description:"段落ID"`
  384. ClassifyId int `description:"分类ID"`
  385. ClassifyName string `description:"分类名称"`
  386. Title string `description:"标题"`
  387. Theme string `description:"主题"`
  388. BodyContent string `description:"内容"`
  389. Author string `description:"创建人"`
  390. CoverImg string `description:"封面图"`
  391. CreateTime string `description:"创建时间"`
  392. }
  393. // GetSaDocsWithUseNumByCondition 获取文档及引用数
  394. func GetSaDocsWithUseNumByCondition(condition string, pars []interface{}) (items []*SaDocItem, err error) {
  395. // o := orm.NewOrm()
  396. sql := `SELECT
  397. a.sa_doc_id,a.classify_id,a.classify_name,a.title,a.theme,a.cover_img,a.content_md5,a.sys_admin_id,a.sys_admin_name,a.sort,a.create_time,a.modify_time, COUNT(b.sa_compare_label_id) AS use_num
  398. FROM
  399. sa_doc AS a
  400. LEFT JOIN sa_compare_label AS b ON a.sa_doc_id = b.doc_id
  401. WHERE
  402. 1 = 1 %s
  403. GROUP BY
  404. a.sa_doc_id,a.classify_id,a.classify_name,a.title,a.theme,a.cover_img,a.content_md5,a.sys_admin_id,a.sys_admin_name,a.sort,a.create_time,a.modify_time
  405. ORDER BY
  406. a.sort ASC, a.create_time DESC, a.sa_doc_id ASC`
  407. sql = fmt.Sprintf(sql, condition)
  408. //_, err = o.Raw(sql, pars).QueryRows(&items)
  409. err = global.DEFAULT_DmSQL.Raw(sql, pars...).Find(&items).Error
  410. return
  411. }
  412. // UpdateSaDocSort 根据分类ID更新排序
  413. func UpdateSaDocSort(classifyId, nowSort int, prevId int, updateSort string) (err error) {
  414. // o := orm.NewOrm()
  415. sql := ` UPDATE sa_doc SET sort = ` + updateSort + ` WHERE classify_id = ? AND `
  416. if prevId > 0 {
  417. sql += ` ( sort > ? or ( sa_doc_id > ` + fmt.Sprint(prevId) + ` and sort = ` + fmt.Sprint(nowSort) + ` )) `
  418. }
  419. //_, err = o.Raw(sql, classifyId, nowSort).Exec()
  420. err = global.DEFAULT_DmSQL.Exec(sql, classifyId, nowSort).Error
  421. return
  422. }
  423. // GetFirstSortSaDoc 获取排序最前的文档
  424. func GetFirstSortSaDoc(classifyId int) (item *SaDoc, err error) {
  425. // o := orm.NewOrm()
  426. sql := ` SELECT * FROM sa_doc WHERE classify_id = ? ORDER BY sort ASC,sa_doc_id ASC LIMIT 1`
  427. //err = o.Raw(sql, classifyId).QueryRow(&item)
  428. err = global.DEFAULT_DmSQL.Raw(sql, classifyId).First(&item).Error
  429. return
  430. }