base_from_smm.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  1. /**
  2. * @Author: jgl
  3. * @Date: 2021/9/14 11:15
  4. */
  5. package data
  6. import (
  7. "errors"
  8. "eta_gn/eta_api/models/data_manage"
  9. "eta_gn/eta_api/models/system"
  10. "eta_gn/eta_api/utils"
  11. "time"
  12. )
  13. type YsIndex struct {
  14. Code int64 `json:"code"`
  15. Data struct {
  16. Apis []struct {
  17. Aid int64 `json:"aid"`
  18. APILabel string `json:"api_label"`
  19. APIStartTime string `json:"api_start_time"`
  20. APIType int64 `json:"api_type"`
  21. APITypeAll string `json:"api_type_all"`
  22. APIUpdate int64 `json:"api_update"`
  23. APIUpdateTime string `json:"api_update_time"`
  24. APIUpdateType string `json:"api_update_type"`
  25. AuthDur int64 `json:"auth_dur"`
  26. AuthDurType string `json:"auth_dur_type"`
  27. AuthLang string `json:"auth_lang"`
  28. AuthModule string `json:"auth_module"`
  29. EditPerson string `json:"edit_person"`
  30. EditTime string `json:"edit_time"`
  31. Enable string `json:"enable"`
  32. FinishTime string `json:"finish_time"`
  33. Interface string `json:"interface"`
  34. Name string `json:"name"`
  35. StartTime string `json:"start_time"`
  36. Type1 string `json:"type_1"`
  37. Type2 string `json:"type_2"`
  38. Type3 string `json:"type_3"`
  39. } `json:"apis"`
  40. Types []struct {
  41. Name string `json:"name"`
  42. Tid int64 `json:"tid"`
  43. } `json:"types"`
  44. } `json:"data"`
  45. Msg string `json:"msg"`
  46. }
  47. const (
  48. dataUrl = "https://dataapi.smm.cn/GetData/" //data url (中文)
  49. //dataUrl = "https://dataapi.smm.cn/GetDataEn/" //data url (english edition)
  50. authUrl = "https://platform.smm.cn/usercenter/auth" // auth url (for all)
  51. )
  52. type TokenResp struct {
  53. Code int `json:"Code"`
  54. Msg string `json:"Msg"`
  55. Data TokenData `json:"Data"`
  56. }
  57. type TokenData struct {
  58. Token string `json:"Token"`
  59. }
  60. // request response
  61. type DataResp struct {
  62. Code int `json:"Code"`
  63. Msg string `json:"Msg"`
  64. Data *ApiData `json:"Data"`
  65. }
  66. // api data response
  67. type ApiData struct {
  68. Status int `json:"Status"` //0 no permission,1 ok
  69. Field []ApiField `json:"Field"`
  70. Content [][]string `json:"Content"`
  71. }
  72. // api title
  73. type ApiField struct {
  74. Unit string `json:"Unit"`
  75. Info string `json:"Info"`
  76. Name string `json:"Name"`
  77. ColumnType string `json:"ColumnType"`
  78. ColIndex uint `json:"ColIndex"`
  79. IsDate string `json:"IsDate"`
  80. }
  81. type YsResult struct {
  82. Code int64 `json:"Code"`
  83. Data struct {
  84. CompanyList []interface{} `json:"CompanyList"`
  85. Content [][]string `json:"Content"`
  86. Field []struct {
  87. ColIndex int64 `json:"ColIndex"`
  88. ColumnType string `json:"ColumnType"`
  89. Info string `json:"Info"`
  90. IsDate string `json:"IsDate"`
  91. Name string `json:"Name"`
  92. Unit string `json:"Unit"`
  93. DBColName string `json:"db_col_name"`
  94. } `json:"Field"`
  95. CountPage int64 `json:"count_page"`
  96. CurrentPage int64 `json:"current_page"`
  97. Frequency string `json:"frequency"`
  98. Mindate string `json:"mindate"`
  99. PageNum int64 `json:"page_num"`
  100. Status int64 `json:"status"`
  101. TotalNum int64 `json:"total_num"`
  102. } `json:"Data"`
  103. Msg string `json:"Msg"`
  104. }
  105. // AddSmmClassify 添加SMM分类
  106. func AddSmmClassify(classifyName string, parentId, sysUserId int, sysUserName, lang string) (classifyInfo *data_manage.BaseFromSmmClassify, err error, errMsg string) {
  107. // 校验分类名称相同的数量
  108. {
  109. var count int
  110. switch lang {
  111. case utils.EnLangVersion:
  112. count, err = data_manage.GetBaseFromSmmClassifyEnCount(classifyName, parentId)
  113. default:
  114. count, err = data_manage.GetBaseFromSmmClassifyCount(classifyName, parentId)
  115. }
  116. if err != nil {
  117. errMsg = `判断名称是否已存在失败`
  118. return
  119. }
  120. if count > 0 {
  121. errMsg = `分类名称已存在,请重新输入`
  122. err = errors.New(errMsg)
  123. return
  124. }
  125. }
  126. level := 1
  127. if parentId > 0 {
  128. parentClassify, e := data_manage.GetBaseFromSmmClassifyById(parentId)
  129. if e != nil {
  130. if utils.IsErrNoRow(e) {
  131. err = e
  132. errMsg = `一级分类不存在`
  133. return
  134. }
  135. err = e
  136. errMsg = `查询一级分类失败`
  137. return
  138. }
  139. level = parentClassify.Level + 1
  140. }
  141. classifyInfo = &data_manage.BaseFromSmmClassify{
  142. ClassifyName: classifyName,
  143. ClassifyNameEn: classifyName,
  144. ParentId: parentId,
  145. SysUserId: sysUserId,
  146. SysUserRealName: sysUserName,
  147. Sort: 0,
  148. Level: level,
  149. ModifyTime: time.Now(),
  150. CreateTime: time.Now(),
  151. }
  152. classifyId, err := data_manage.AddBaseFromSmmClassify(classifyInfo)
  153. if err != nil {
  154. errMsg = "保存分类失败"
  155. return
  156. }
  157. classifyInfo.ClassifyId = int(classifyId)
  158. //更新sort为classifyId
  159. err = data_manage.UpdateBaseFromSmmClassifySort(int(classifyId))
  160. return
  161. }
  162. // EditSmmClassify 编辑Smm分类
  163. func EditSmmClassify(classifyId int, classifyName, lang string, sysUser *system.Admin) (err error, errMsg string) {
  164. item, err := data_manage.GetBaseFromSmmClassifyById(classifyId)
  165. if err != nil {
  166. errMsg = `保存失败`
  167. return
  168. }
  169. switch lang {
  170. case utils.EnLangVersion:
  171. // 名字相同,那么就直接返回
  172. if item.ClassifyNameEn == classifyName {
  173. return
  174. }
  175. // 判断名称是否已存在
  176. count, tmpErr := data_manage.GetBaseFromSmmClassifyEnCount(classifyName, item.ParentId)
  177. if tmpErr != nil {
  178. err = tmpErr
  179. errMsg = "判断名称是否已存在失败"
  180. return
  181. }
  182. if count > 0 {
  183. errMsg = "分类名称已存在,请重新输入"
  184. err = errors.New(errMsg)
  185. return
  186. }
  187. // 修改数据
  188. err = data_manage.EditBaseFromSmmClassifyEn(classifyId, classifyName)
  189. if err != nil {
  190. errMsg = "保存失败"
  191. }
  192. default:
  193. // 名字相同,那么就直接返回
  194. if item.ClassifyName == classifyName {
  195. return
  196. }
  197. // 判断名称是否已存在
  198. count, tmpErr := data_manage.GetBaseFromSmmClassifyCount(classifyName, item.ParentId)
  199. if tmpErr != nil {
  200. err = tmpErr
  201. errMsg = "判断名称是否已存在失败"
  202. return
  203. }
  204. if count > 0 {
  205. errMsg = "分类名称已存在,请重新输入"
  206. err = errors.New(errMsg)
  207. return
  208. }
  209. // 修改数据
  210. err = data_manage.EditBaseFromSmmClassify(classifyId, classifyName)
  211. if err != nil {
  212. errMsg = "保存失败"
  213. }
  214. }
  215. return
  216. }
  217. // MoveSmmClassify 移动Smm分类
  218. func MoveSmmClassify(classifyId, parentClassifyId, prevClassifyId, nextClassifyId int) (err error, errMsg string) {
  219. //判断分类是否存在
  220. classifyInfo, err := data_manage.GetBaseFromSmmClassifyById(classifyId)
  221. if err != nil {
  222. errMsg = "移动失败"
  223. err = errors.New("获取分类信息失败,Err:" + err.Error())
  224. return
  225. }
  226. updateCol := make([]string, 0)
  227. //判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
  228. if classifyInfo.ParentId != parentClassifyId && parentClassifyId != 0 {
  229. parentClassifyInfo, tmpErr := data_manage.GetBaseFromSmmClassifyById(parentClassifyId)
  230. if tmpErr != nil {
  231. errMsg = "移动失败"
  232. err = errors.New("获取上级分类信息失败,Err:" + tmpErr.Error())
  233. return
  234. }
  235. classifyInfo.ParentId = parentClassifyInfo.ClassifyId
  236. classifyInfo.Level = parentClassifyInfo.Level + 1
  237. updateCol = append(updateCol, "ParentId", "Level")
  238. }
  239. var currentSort, prevSort, nextSort int
  240. currentSort = classifyInfo.Sort
  241. var prevClassify *data_manage.BaseFromSmmClassify
  242. var nextClassify *data_manage.BaseFromSmmClassify
  243. //如果有传入 上一个兄弟节点分类id
  244. if prevClassifyId > 0 {
  245. prevClassify, err = data_manage.GetBaseFromSmmClassifyById(prevClassifyId)
  246. if err != nil {
  247. if utils.IsErrNoRow(err) {
  248. errMsg = "移动失败"
  249. err = errors.New("上一个兄弟节点分类信息不存在" + err.Error())
  250. return
  251. }
  252. errMsg = "移动失败"
  253. err = errors.New("获取上一个兄弟节点分类信息失败,Err:" + err.Error())
  254. return
  255. }
  256. prevSort = prevClassify.Sort
  257. }
  258. if nextClassifyId > 0 {
  259. //下一个兄弟节点
  260. nextClassify, err = data_manage.GetBaseFromSmmClassifyById(nextClassifyId)
  261. if err != nil {
  262. if utils.IsErrNoRow(err) {
  263. errMsg = "移动失败"
  264. err = errors.New("下一个兄弟节点分类信息不存在" + err.Error())
  265. return
  266. }
  267. errMsg = "移动失败"
  268. err = errors.New("获取下一个兄弟节点分类信息失败,Err:" + err.Error())
  269. return
  270. }
  271. nextSort = nextClassify.Sort
  272. }
  273. // 修改历史数据中的排序为0的情况
  274. if prevSort == 0 && nextSort == 0 { //目标是让当前分类处于目录的最顶部
  275. //更新为0排序的数据为当前最小排序
  276. if nextClassify != nil {
  277. minSort, e := data_manage.GetSmmIndexClassifyMinSort(parentClassifyId)
  278. if e != nil {
  279. errMsg = "移动失败"
  280. err = errors.New("获取下一个兄弟节点分类信息失败,Err:" + e.Error())
  281. return
  282. }
  283. if minSort > 1 {
  284. minSort -= 1
  285. }
  286. nextClassify.Sort = minSort
  287. err = nextClassify.Update([]string{"Sort"})
  288. if err != nil {
  289. errMsg = "移动失败"
  290. err = errors.New("更新下一个兄弟节点分类信息失败,Err:" + err.Error())
  291. return
  292. }
  293. nextSort = minSort
  294. }
  295. }
  296. //移到两个排序值中间操作
  297. if prevSort >= currentSort {
  298. //往下移动
  299. err = data_manage.MoveDownSmmIndexClassifyBySort(parentClassifyId, prevSort, currentSort)
  300. if err != nil {
  301. err = errors.New("向下移动出错:" + err.Error())
  302. return
  303. }
  304. classifyInfo.Sort = prevSort
  305. } else if nextSort <= currentSort && nextSort != 0 {
  306. //往上移动
  307. err = data_manage.MoveUpSmmIndexClassifyBySort(parentClassifyId, nextSort, currentSort)
  308. if err != nil {
  309. err = errors.New("向上移动出错:" + err.Error())
  310. return
  311. }
  312. classifyInfo.Sort = nextSort
  313. }
  314. classifyInfo.ModifyTime = time.Now()
  315. updateCol = append(updateCol, "Sort", "ModifyTime")
  316. err = classifyInfo.Update(updateCol)
  317. if err != nil {
  318. errMsg = "移动失败"
  319. err = errors.New("修改失败,Err:" + err.Error())
  320. return
  321. }
  322. return
  323. }
  324. // DelSmmClassify 删除SMM分类
  325. func DelSmmClassify(classifyId int, sysUser *system.Admin) (err error, errMsg string) {
  326. //判断分类是否存在
  327. classifyInfo, err := data_manage.GetBaseFromSmmClassifyById(classifyId)
  328. if err != nil {
  329. errMsg = "删除失败"
  330. err = errors.New("获取分类信息失败,Err:" + err.Error())
  331. return
  332. }
  333. // 需要删除的分类id集合
  334. classifyIdList := make([]int, 0)
  335. classifyIdList = append(classifyIdList, classifyId)
  336. // 查找所有的子集id
  337. if classifyInfo.ParentId <= 0 {
  338. childrenClassifyInfoList, tmpErr := data_manage.GetBaseFromSmmClassifyByParentId(classifyId)
  339. if tmpErr != nil {
  340. errMsg = "删除失败"
  341. err = errors.New("获取分类信息失败,Err:" + tmpErr.Error())
  342. return
  343. }
  344. for _, v := range childrenClassifyInfoList {
  345. classifyIdList = append(classifyIdList, v.ClassifyId)
  346. }
  347. }
  348. // 获取分类下的所有指标
  349. count, err := data_manage.GetBaseFromSmmIndexCountByClassifyIds(classifyIdList)
  350. if err != nil {
  351. errMsg = "删除失败"
  352. err = errors.New("获取分类下的指标信息失败,Err:" + err.Error())
  353. return
  354. }
  355. if count > 0 {
  356. errMsg = "该分类下有指标,不可删除"
  357. err = errors.New("该分类下有指标,不可删除")
  358. return
  359. }
  360. // 删除对应的分类
  361. err = data_manage.DeleteSmmClassifyByClassifyId(classifyIdList)
  362. if err != nil {
  363. return
  364. }
  365. return
  366. }
  367. // MoveSmmData2 移动SMM指标
  368. func MoveSmmData2(indexId, classifyId, prevIndexId, nextIndexId int) (err error, errMsg string) {
  369. //分类信息
  370. smmIndex, err := data_manage.GetBaseFromSmmIndexByIndexId(indexId)
  371. if err != nil {
  372. errMsg = `获取数据失败`
  373. if utils.IsErrNoRow(err) {
  374. errMsg = `该指标未入库`
  375. err = nil
  376. }
  377. return
  378. }
  379. //判断分类是否存在
  380. if classifyId > 0 {
  381. _, err = data_manage.GetBaseFromSmmClassifyById(classifyId)
  382. if err != nil {
  383. errMsg = "移动失败"
  384. err = errors.New("获取分类信息失败,Err:" + err.Error())
  385. if utils.IsErrNoRow(err) {
  386. errMsg = "找不到该分类"
  387. err = nil
  388. }
  389. return
  390. }
  391. }
  392. //如果改变了分类,那么移动该图表数据
  393. if smmIndex.ClassifyId != classifyId {
  394. tmpErr := data_manage.MoveBaseFromSmmIndex(indexId, classifyId)
  395. if tmpErr != nil {
  396. errMsg = "移动失败"
  397. err = errors.New("移动失败,Err:" + tmpErr.Error())
  398. return
  399. }
  400. }
  401. //移动排序
  402. updateCol := make([]string, 0)
  403. var currentSort, prevSort, nextSort int
  404. currentSort = smmIndex.Sort
  405. //如果有传入 上一个兄弟节点分类id
  406. var prevIndex *data_manage.BaseFromSmmIndex
  407. var nextIndex *data_manage.BaseFromSmmIndex
  408. if prevIndexId > 0 {
  409. prevIndex, err = data_manage.GetBaseFromSmmIndexByIndexId(prevIndexId)
  410. if err != nil {
  411. if utils.IsErrNoRow(err) {
  412. errMsg = "移动失败"
  413. err = errors.New("上一个兄弟节点指标信息不存在" + err.Error())
  414. return
  415. }
  416. errMsg = "移动失败"
  417. err = errors.New("获取上一个兄弟节点指标信息失败,Err:" + err.Error())
  418. return
  419. }
  420. prevSort = prevIndex.Sort
  421. }
  422. if nextIndexId > 0 {
  423. //下一个兄弟节点
  424. nextIndex, err = data_manage.GetBaseFromSmmIndexByIndexId(nextIndexId)
  425. if err != nil {
  426. if utils.IsErrNoRow(err) {
  427. errMsg = "移动失败"
  428. err = errors.New("下一个兄弟节点指标信息不存在" + err.Error())
  429. return
  430. }
  431. errMsg = "移动失败"
  432. err = errors.New("获取下一个兄弟节点指标信息失败,Err:" + err.Error())
  433. return
  434. }
  435. nextSort = nextIndex.Sort
  436. }
  437. // 修改历史数据中的排序为0的情况
  438. if prevSort == 0 && nextSort == 0 { //目标是让当前分类处于目录的最顶部, 但是历史数据里下个节点的sort为0的情况
  439. //更新为0排序的数据为当前最小排序
  440. if nextIndex != nil {
  441. minSort, e := data_manage.GetBaseFromSmmIndexMinSortByClassifyId(classifyId)
  442. if e != nil {
  443. errMsg = "移动失败"
  444. err = errors.New("获取下一个兄弟节点分类信息失败,Err:" + e.Error())
  445. return
  446. }
  447. if minSort > 1 {
  448. minSort -= 1
  449. }
  450. nextIndex.Sort = minSort
  451. err = nextIndex.Update([]string{"Sort"})
  452. if err != nil {
  453. errMsg = "移动失败"
  454. err = errors.New("更新下一个兄弟节点分类信息失败,Err:" + err.Error())
  455. return
  456. }
  457. nextSort = minSort
  458. }
  459. }
  460. //移到两个排序值中间操作
  461. if prevSort >= currentSort {
  462. //往下移动
  463. err = data_manage.MoveDownSmmIndexBySort(classifyId, prevSort, currentSort)
  464. if err != nil {
  465. err = errors.New("向下移动出错:" + err.Error())
  466. return
  467. }
  468. smmIndex.Sort = prevSort
  469. } else if nextSort <= currentSort && nextSort != 0 {
  470. //往上移动
  471. err = data_manage.MoveUpSmmIndexBySort(classifyId, nextSort, currentSort)
  472. if err != nil {
  473. err = errors.New("向上移动出错:" + err.Error())
  474. return
  475. }
  476. smmIndex.Sort = nextSort
  477. }
  478. //更新
  479. smmIndex.ModifyTime = time.Now()
  480. updateCol = append(updateCol, "Sort", "ModifyTime")
  481. err = smmIndex.Update(updateCol)
  482. if err != nil {
  483. errMsg = "移动失败"
  484. err = errors.New("修改失败,Err:" + err.Error())
  485. return
  486. }
  487. return
  488. }
  489. // EditSmmIndex 编辑SMM指标
  490. func EditSmmIndex(indexId, classifyId int, sysUser *system.Admin) (baseFromSmmIndex *data_manage.BaseFromSmmIndex, err error, errMsg string) {
  491. baseFromSmmIndex, err = data_manage.GetBaseFromSmmIndexByIndexId(indexId)
  492. if err != nil {
  493. errMsg = `获取数据失败`
  494. if utils.IsErrNoRow(err) {
  495. errMsg = `该指标未入库`
  496. err = nil
  497. }
  498. return
  499. }
  500. baseFromSmmIndex.ClassifyId = classifyId
  501. baseFromSmmIndex.ModifyTime = time.Now()
  502. err = baseFromSmmIndex.Update([]string{"ClassifyId", "ModifyTime"})
  503. if err != nil {
  504. errMsg = "保存分类失败"
  505. }
  506. return
  507. }
  508. // DelSmmData 删除SMM指标
  509. func DelSmmData(indexId int) (err error, errMsg string) {
  510. baseFromSmmIndex, err := data_manage.GetBaseFromSmmIndexByIndexId(indexId)
  511. if err != nil {
  512. errMsg = `获取数据失败`
  513. if utils.IsErrNoRow(err) {
  514. errMsg = `该指标未入库`
  515. err = nil
  516. }
  517. return
  518. }
  519. // 获取已经加入到EDB指标库的Smm指标
  520. edbInfo, err := data_manage.GetEdbInfoByEdbCode(utils.DATA_SOURCE_YS, baseFromSmmIndex.IndexCode)
  521. if err != nil && !utils.IsErrNoRow(err) {
  522. errMsg = "删除失败"
  523. err = errors.New("获取分类下的指标信息失败,Err:" + err.Error())
  524. return
  525. }
  526. if edbInfo != nil {
  527. errMsg = "当前指标已被引用,不可删除"
  528. err = nil
  529. return
  530. }
  531. // 删除对应的分类和指标
  532. err = data_manage.DeleteBaseFromSmmIndexById(indexId)
  533. if err != nil {
  534. return
  535. }
  536. return
  537. }
  538. // ResetSmmData 指标数据清除分类接口
  539. func ResetSmmData(indexId int) (err error, errMsg string) {
  540. smmIndex, err := data_manage.GetBaseFromSmmIndexByIndexId(indexId)
  541. if err != nil {
  542. errMsg = `获取数据失败`
  543. if utils.IsErrNoRow(err) {
  544. errMsg = `该指标未入库`
  545. err = nil
  546. }
  547. return
  548. }
  549. // 更新指标在未分类下的排序,永远排在未分类的最后一个
  550. //移动排序
  551. classifyId := 0
  552. updateCol := make([]string, 0)
  553. var currentSort, prevSort int
  554. currentSort = smmIndex.Sort
  555. //未分类的最大的sort值
  556. prevSort, err = data_manage.GetBaseFromSmmIndexMaxSortByClassifyId(classifyId)
  557. if err != nil {
  558. errMsg = "移动失败"
  559. err = errors.New("获取上一个兄弟节点指标信息失败,Err:" + err.Error())
  560. return
  561. }
  562. //如果前面一个节点的sort值比当前大,则当前节点往下移动
  563. if prevSort >= currentSort {
  564. //往下移动
  565. err = data_manage.MoveDownSmmIndexBySort(classifyId, prevSort, currentSort)
  566. if err != nil {
  567. err = errors.New("向下移动出错:" + err.Error())
  568. return
  569. }
  570. smmIndex.Sort = prevSort
  571. }
  572. //更新
  573. smmIndex.ModifyTime = time.Now()
  574. smmIndex.ClassifyId = classifyId
  575. updateCol = append(updateCol, "Sort", "ModifyTime", "ClassifyId")
  576. err = smmIndex.Update(updateCol)
  577. if err != nil {
  578. errMsg = "移动失败"
  579. err = errors.New("修改失败,Err:" + err.Error())
  580. return
  581. }
  582. return
  583. }