eta_forum_hub.go 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936
  1. package eta_forum
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/models/data_manage"
  5. "eta/eta_api/models/data_manage/chart_theme"
  6. "eta/eta_api/models/system"
  7. "eta/eta_api/services/alarm_msg"
  8. "eta/eta_api/utils"
  9. "fmt"
  10. "strconv"
  11. "time"
  12. )
  13. type UploadChartToForumReq struct {
  14. ChartInfoId int `description:"图表ID"`
  15. Description string `description:"逻辑简述"`
  16. }
  17. type UpdateChartToForumReq struct {
  18. ChartInfoId int `description:"图表ID"`
  19. }
  20. type ChartSaveLibReq struct {
  21. ChartInfo *data_manage.ChartInfo
  22. Description []*data_manage.ChartDescriptionReq `description:"逻辑简述"`
  23. EdbInfoList []*data_manage.EdbInfo
  24. ChartThemeList []*chart_theme.ChartTheme
  25. EdbInfoDataList []*AddEdbDataReq
  26. ChartEdbMapping []*data_manage.ChartEdbMapping
  27. EdbInfoCalculateMapping []*data_manage.EdbInfoCalculateMapping
  28. ChartSeries []*data_manage.ChartSeries
  29. ChartSeriesEdbMapping []*data_manage.ChartSeriesEdbMapping
  30. CreatorInfo *system.Admin //创建者的账号信息
  31. UploaderInfo *system.Admin //上传者的账号信息
  32. }
  33. type ChartSaveLibResp struct {
  34. Ret int
  35. Msg string
  36. ErrMsg string
  37. ErrCode string
  38. Data *data_manage.AddChartInfoResp
  39. Success bool `description:"true 执行成功,false 执行失败"`
  40. IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
  41. IsAddLog bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
  42. }
  43. type AddEdbDataReq struct {
  44. EdbCode string
  45. EdbType int
  46. DataList []*data_manage.EdbDataBase
  47. }
  48. type DeleteChartReq struct {
  49. ChartInfoId int `description:"图表id"`
  50. }
  51. // UploadChart 上传图表接口
  52. func UploadChart(chartInfoId int, description string, uploaderInfo *system.Admin) (err error, errMsg string) {
  53. // 设置缓存 防止重复上传
  54. cacheKey := "eta_forum_task:UploadChart:" + strconv.Itoa(chartInfoId)
  55. if utils.Rc.Get(cacheKey) != nil {
  56. err = fmt.Errorf("系统处理中,请稍后重试!")
  57. return
  58. }
  59. utils.Rc.SetNX(cacheKey, 1, 30*time.Second)
  60. defer func() {
  61. if err != nil {
  62. go alarm_msg.SendAlarmMsg(fmt.Sprintf("上传图表至社区失败:Err:%v,ErrMsg:%s", err, errMsg), 3)
  63. }
  64. utils.Rc.Delete(cacheKey)
  65. }()
  66. // 查询图表信息
  67. chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
  68. if err != nil {
  69. if utils.IsErrNoRow(err) {
  70. errMsg = "图表不存在"
  71. err = fmt.Errorf(errMsg)
  72. return
  73. }
  74. errMsg = "获取图表信息失败"
  75. err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
  76. return
  77. }
  78. if chartInfo.ForumChartInfoId > 0 {
  79. errMsg = "该图表已上传至社区,无法再次上传"
  80. err = fmt.Errorf(errMsg)
  81. return
  82. }
  83. //查询图表主题
  84. //查询图表指标
  85. //获取原图表关联的指标信息列表
  86. chartMappingList, err := data_manage.GetChartMappingList(chartInfoId)
  87. if err != nil {
  88. errMsg = "获取图表关联的指标信息失败"
  89. err = fmt.Errorf("获取图表关联的指标信息失败,Err:" + err.Error())
  90. return
  91. }
  92. edbIds := make([]int, 0)
  93. for _, v := range chartMappingList {
  94. edbIds = append(edbIds, v.EdbInfoId)
  95. }
  96. chartSeriesList := make([]*data_manage.ChartSeries, 0)
  97. chartSeriesEdbList := make([]*data_manage.ChartSeriesEdbMapping, 0)
  98. if chartInfo.ChartType == utils.CHART_TYPE_SECTION_COMBINE {
  99. chartSeriesList, err = data_manage.GetChartSeriesByChartInfoId(chartInfoId)
  100. if err != nil {
  101. errMsg = "获取图表关联的系列信息失败"
  102. err = fmt.Errorf("获取图表关联的系列信息失败,Err:" + err.Error())
  103. return
  104. }
  105. chartSeriesEdbList, err = data_manage.GetChartSeriesEdbByChartInfoId(chartInfoId)
  106. if err != nil {
  107. errMsg = "获取图表关联的系列指标信息失败"
  108. err = fmt.Errorf("获取图表关联的系列指标信息失败,Err:" + err.Error())
  109. return
  110. }
  111. }
  112. var (
  113. edbInfoList []*data_manage.EdbInfo
  114. edbMappingList []*data_manage.EdbInfoCalculateMapping
  115. edbInfoDataList []*AddEdbDataReq
  116. )
  117. //查询指标详情
  118. edbInfoList, edbMappingList, edbInfoDataList, err = GetEdbListByEdbInfoId(edbIds)
  119. if err != nil {
  120. errMsg = "获取指标详情失败"
  121. err = fmt.Errorf("获取指标详情失败,Err:" + err.Error())
  122. return
  123. }
  124. descriptionList, err, errMsg := getChartDescriptionWithAdminNameByChartInfoId(chartInfoId)
  125. if err != nil {
  126. errMsg = "获取图表简介失败"
  127. err = fmt.Errorf("获取图表简介失败,Err:" + err.Error())
  128. return
  129. }
  130. req := new(ChartSaveLibReq)
  131. req.ChartInfo = chartInfo
  132. req.ChartEdbMapping = chartMappingList
  133. req.EdbInfoList = edbInfoList
  134. req.EdbInfoDataList = edbInfoDataList
  135. req.EdbInfoCalculateMapping = edbMappingList
  136. req.Description = descriptionList
  137. req.ChartSeries = chartSeriesList
  138. req.ChartSeriesEdbMapping = chartSeriesEdbList
  139. // 查询创建者信息
  140. creatorInfo, _ := system.GetSysAdminById(chartInfo.SysUserId)
  141. if creatorInfo != nil {
  142. req.CreatorInfo = creatorInfo
  143. }
  144. req.UploaderInfo = uploaderInfo
  145. // 添加计算指标
  146. reqJson, err := json.Marshal(req)
  147. if err != nil {
  148. errMsg = "参数解析异常"
  149. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  150. return
  151. }
  152. respItem, err := ChartSaveLib(string(reqJson))
  153. if err != nil {
  154. errMsg = "上传失败"
  155. err = fmt.Errorf("上传失败,Err:" + err.Error())
  156. return
  157. }
  158. if respItem.Ret != 200 {
  159. errMsg = "上传失败"
  160. err = fmt.Errorf(respItem.ErrMsg)
  161. return
  162. }
  163. if respItem.Data != nil && respItem.Data.ChartInfoId != 0 {
  164. // 更新社区返回的图表ID
  165. err = data_manage.SetForumChartInfoId(chartInfoId, respItem.Data.ChartInfoId, utils.ChartClassifyResourceStatusUp)
  166. if err != nil {
  167. errMsg = "更新图表ID失败"
  168. err = fmt.Errorf("更新图表ID失败,Err:" + err.Error())
  169. return
  170. }
  171. }
  172. return
  173. }
  174. // UpdateChart 更新社区里的图表接口
  175. func UpdateChart(chartInfoId int) (err error, errMsg string) {
  176. // 设置缓存 防止重复更新
  177. cacheKey := "eta_forum_task:UpdateChart:" + strconv.Itoa(chartInfoId)
  178. if utils.Rc.Get(cacheKey) != nil {
  179. err = fmt.Errorf("系统处理中,请稍后重试!")
  180. return
  181. }
  182. utils.Rc.SetNX(cacheKey, 1, 30*time.Second)
  183. defer func() {
  184. if err != nil {
  185. go alarm_msg.SendAlarmMsg(fmt.Sprintf("同步图表信息至社区失败:Err:%v,ErrMsg:%s", err, errMsg), 3)
  186. }
  187. utils.Rc.Delete(cacheKey)
  188. }()
  189. // 查询图表信息
  190. chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
  191. if err != nil {
  192. if utils.IsErrNoRow(err) {
  193. errMsg = "图表不存在"
  194. err = fmt.Errorf(errMsg)
  195. return
  196. }
  197. errMsg = "获取图表信息失败"
  198. err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
  199. return
  200. }
  201. if chartInfo.ForumChartInfoId <= 0 {
  202. errMsg = "该图表未上传至社区"
  203. err = fmt.Errorf(errMsg)
  204. return
  205. }
  206. //查询图表主题
  207. //查询图表指标
  208. //获取原图表关联的指标信息列表
  209. chartMappingList, err := data_manage.GetChartMappingList(chartInfoId)
  210. if err != nil {
  211. errMsg = "获取图表关联的指标信息失败"
  212. err = fmt.Errorf("获取图表关联的指标信息失败,Err:" + err.Error())
  213. return
  214. }
  215. edbIds := make([]int, 0)
  216. for _, v := range chartMappingList {
  217. edbIds = append(edbIds, v.EdbInfoId)
  218. }
  219. chartSeriesList := make([]*data_manage.ChartSeries, 0)
  220. chartSeriesEdbList := make([]*data_manage.ChartSeriesEdbMapping, 0)
  221. if chartInfo.ChartType == utils.CHART_TYPE_SECTION_COMBINE {
  222. chartSeriesList, err = data_manage.GetChartSeriesByChartInfoId(chartInfoId)
  223. if err != nil {
  224. errMsg = "获取图表关联的系列信息失败"
  225. err = fmt.Errorf("获取图表关联的系列信息失败,Err:" + err.Error())
  226. return
  227. }
  228. chartSeriesEdbList, err = data_manage.GetChartSeriesEdbByChartInfoId(chartInfoId)
  229. if err != nil {
  230. errMsg = "获取图表关联的系列指标信息失败"
  231. err = fmt.Errorf("获取图表关联的系列指标信息失败,Err:" + err.Error())
  232. return
  233. }
  234. }
  235. var (
  236. edbInfoList []*data_manage.EdbInfo
  237. edbMappingList []*data_manage.EdbInfoCalculateMapping
  238. edbInfoDataList []*AddEdbDataReq
  239. )
  240. //查询指标详情
  241. edbInfoList, edbMappingList, edbInfoDataList, err = GetEdbListByEdbInfoId(edbIds)
  242. if err != nil {
  243. errMsg = "获取指标详情失败"
  244. err = fmt.Errorf("获取指标详情失败,Err:" + err.Error())
  245. return
  246. }
  247. descriptionList, err, errMsg := getChartDescriptionWithAdminNameByChartInfoId(chartInfoId)
  248. if err != nil {
  249. errMsg = "获取图表简介失败"
  250. err = fmt.Errorf("获取图表简介失败,Err:" + err.Error())
  251. return
  252. }
  253. req := new(ChartSaveLibReq)
  254. req.ChartInfo = chartInfo
  255. req.ChartInfo.ChartInfoId = chartInfo.ForumChartInfoId
  256. req.ChartEdbMapping = chartMappingList
  257. req.EdbInfoList = edbInfoList
  258. req.EdbInfoDataList = edbInfoDataList
  259. req.EdbInfoCalculateMapping = edbMappingList
  260. req.ChartSeries = chartSeriesList
  261. req.ChartSeriesEdbMapping = chartSeriesEdbList
  262. req.Description = descriptionList
  263. // 查询创建者信息
  264. creatorInfo, _ := system.GetSysAdminById(chartInfo.SysUserId)
  265. if creatorInfo != nil {
  266. req.CreatorInfo = creatorInfo
  267. }
  268. // 添加计算指标
  269. reqJson, err := json.Marshal(req)
  270. if err != nil {
  271. errMsg = "参数解析异常"
  272. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  273. return
  274. }
  275. respItem, err := ChartUpdateLib(string(reqJson))
  276. if err != nil {
  277. errMsg = "更新失败"
  278. err = fmt.Errorf("上传失败,Err:" + err.Error())
  279. return
  280. }
  281. if respItem.Ret != 200 {
  282. errMsg = "更新失败"
  283. err = fmt.Errorf(respItem.ErrMsg)
  284. return
  285. }
  286. return
  287. }
  288. func GetEdbListByEdbInfoId(edbInfoIds []int) (edbInfoList []*data_manage.EdbInfo, edbMappingList []*data_manage.EdbInfoCalculateMapping, edbInfoDataList []*AddEdbDataReq, err error) {
  289. //查询指标信息
  290. //查询指标映射
  291. //查询所有指标数据
  292. //查询这个指标相关的mapping信息放到数组里,
  293. //将得到的指标ID信息放到数组里
  294. chartEdbInfoIdMap := make(map[int]struct{}) //只查询图表上直接相关的指标数据
  295. hasFindMap := make(map[int]struct{})
  296. edbInfoIdMap := make(map[int]struct{})
  297. edbMappingList = make([]*data_manage.EdbInfoCalculateMapping, 0)
  298. edbMappingMap := make(map[int]struct{})
  299. for _, edbInfoId := range edbInfoIds {
  300. chartEdbInfoIdMap[edbInfoId] = struct{}{}
  301. edbMappingList, err = traceEdbInfoByEdbInfoId(edbInfoId, hasFindMap, edbInfoIdMap, edbMappingList, edbMappingMap)
  302. if err != nil {
  303. err = fmt.Errorf(" traceEdbInfoByEdbInfoId err: %s", err.Error())
  304. return
  305. }
  306. }
  307. // 指标信息map
  308. edbInfoIdList := make([]int, 0)
  309. for k, _ := range edbInfoIdMap {
  310. edbInfoIdList = append(edbInfoIdList, k)
  311. }
  312. edbInfoList, err = data_manage.GetEdbInfoByIdList(edbInfoIdList)
  313. if err != nil {
  314. err = fmt.Errorf(" GetEdbInfoByIdList err: %s", err.Error())
  315. return
  316. }
  317. for _, v := range edbInfoList {
  318. if _, ok := chartEdbInfoIdMap[v.EdbInfoId]; !ok {
  319. continue
  320. }
  321. var dataList []*data_manage.EdbDataBase
  322. if v.Source == utils.DATA_SOURCE_BUSINESS && utils.UseMongo {
  323. dataList, err = data_manage.GetEdbDataBaseMongoByEdbInfoId(v.EdbInfoId, v.Source, v.SubSource)
  324. } else if v.Source == utils.DATA_SOURCE_THS && v.SubSource == utils.DATA_SUB_SOURCE_HIGH_FREQUENCY && utils.UseMongo {
  325. dataList, err = data_manage.GetThsHfEdbDataBaseMongoByEdbInfoId(v.EdbInfoId, v.Source, v.SubSource)
  326. } else {
  327. dataList, err = data_manage.GetEdbDataBaseByEdbInfoId(v.EdbInfoId, v.Source, v.SubSource)
  328. }
  329. if err != nil {
  330. err = fmt.Errorf("查询指标数据失败 Err: %s", err.Error())
  331. return
  332. }
  333. tmp := new(AddEdbDataReq)
  334. tmp.EdbCode = v.EdbCode
  335. tmp.EdbType = v.EdbType
  336. tmp.DataList = dataList
  337. edbInfoDataList = append(edbInfoDataList, tmp)
  338. }
  339. return
  340. }
  341. // traceEdbInfoByEdbInfoId 指标追溯
  342. func traceEdbInfoByEdbInfoId(edbInfoId int, hasFindMap map[int]struct{}, edbInfoIdMap map[int]struct{}, edbMappingList []*data_manage.EdbInfoCalculateMapping, edbMappingMap map[int]struct{}) (newEdbMappingList []*data_manage.EdbInfoCalculateMapping, err error) {
  343. newEdbMappingList = edbMappingList
  344. _, ok := hasFindMap[edbInfoId]
  345. if ok {
  346. return
  347. }
  348. if _, ok1 := edbInfoIdMap[edbInfoId]; !ok1 {
  349. edbInfoIdMap[edbInfoId] = struct{}{}
  350. }
  351. edbInfoMappingList, e := data_manage.GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId)
  352. if e != nil {
  353. err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoId err: %s", e.Error())
  354. return
  355. }
  356. if len(edbInfoMappingList) > 0 {
  357. fromEdbInfoIdList := make([]int, 0)
  358. for _, v := range edbInfoMappingList {
  359. fromEdbInfoIdList = append(fromEdbInfoIdList, v.FromEdbInfoId)
  360. if _, ok1 := edbInfoIdMap[v.FromEdbInfoId]; !ok1 {
  361. edbInfoIdMap[v.FromEdbInfoId] = struct{}{}
  362. }
  363. if _, ok2 := edbMappingMap[v.EdbInfoCalculateMappingId]; !ok2 {
  364. edbMappingMap[v.EdbInfoCalculateMappingId] = struct{}{}
  365. tmp := &data_manage.EdbInfoCalculateMapping{
  366. EdbInfoCalculateMappingId: v.EdbInfoCalculateMappingId,
  367. EdbInfoId: v.EdbInfoId,
  368. Source: v.Source,
  369. SourceName: v.SourceName,
  370. EdbCode: v.EdbCode,
  371. FromEdbInfoId: v.FromEdbInfoId,
  372. FromEdbCode: v.FromEdbCode,
  373. FromEdbName: v.FromEdbName,
  374. FromSource: v.FromSource,
  375. FromSourceName: v.FromSourceName,
  376. FromTag: v.FromTag,
  377. Sort: v.Sort,
  378. CreateTime: v.CreateTime,
  379. ModifyTime: v.ModifyTime,
  380. }
  381. newEdbMappingList = append(newEdbMappingList, tmp)
  382. }
  383. if edbInfoId != v.FromEdbInfoId && (v.FromEdbType == 2 || v.FromEdbInfoType == 1) {
  384. // 查过了就不查了
  385. if _, ok2 := hasFindMap[v.FromEdbInfoId]; !ok2 {
  386. newEdbMappingList, e = traceEdbInfoByEdbInfoId(v.FromEdbInfoId, hasFindMap, edbInfoIdMap, newEdbMappingList, edbMappingMap)
  387. if e != nil {
  388. err = fmt.Errorf("traceEdbInfoByEdbInfoId err: %s", e.Error())
  389. return
  390. }
  391. }
  392. }
  393. hasFindMap[v.FromEdbInfoId] = struct{}{}
  394. }
  395. }
  396. hasFindMap[edbInfoId] = struct{}{}
  397. return
  398. }
  399. // DeleteChart 上传图表接口
  400. func DeleteChart(chartInfoId int) (err error, errMsg string) {
  401. // 设置缓存 防止重复撤回
  402. cacheKey := "eta_forum_task:DeleteChart:" + strconv.Itoa(chartInfoId)
  403. if utils.Rc.Get(cacheKey) != nil {
  404. err = fmt.Errorf("系统处理中,请稍后重试!")
  405. return
  406. }
  407. utils.Rc.SetNX(cacheKey, 1, 30*time.Second)
  408. defer func() {
  409. if err != nil {
  410. go alarm_msg.SendAlarmMsg(fmt.Sprintf("撤回图表失败:%v,ErrMsg:%s", err, errMsg), 3)
  411. }
  412. utils.Rc.Delete(cacheKey)
  413. }()
  414. // 查询图表信息
  415. chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
  416. if err != nil {
  417. if utils.IsErrNoRow(err) {
  418. errMsg = "图表不存在"
  419. err = fmt.Errorf(errMsg)
  420. return
  421. }
  422. errMsg = "获取图表信息失败"
  423. err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
  424. return
  425. }
  426. if chartInfo.ForumChartInfoId <= 0 {
  427. errMsg = "该图表未上传至社区,无需撤回"
  428. err = fmt.Errorf(errMsg)
  429. return
  430. }
  431. req := new(DeleteChartReq)
  432. req.ChartInfoId = chartInfo.ForumChartInfoId
  433. // 添加计算指标
  434. reqJson, err := json.Marshal(req)
  435. if err != nil {
  436. errMsg = "参数解析异常"
  437. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  438. return
  439. }
  440. respItem, err := ChartDeleteLib(string(reqJson))
  441. if err != nil {
  442. errMsg = "撤回失败"
  443. err = fmt.Errorf("撤回失败,Err:" + err.Error())
  444. return
  445. }
  446. if respItem.Ret != 200 {
  447. errMsg = "撤回失败"
  448. err = fmt.Errorf(respItem.ErrMsg)
  449. return
  450. }
  451. // 更新社区返回的图表ID
  452. err = data_manage.SetForumChartInfoId(chartInfoId, 0, utils.ChartClassifyResourceStatusDown)
  453. if err != nil {
  454. errMsg = "撤回失败"
  455. err = fmt.Errorf("更新图表ID失败,Err:" + err.Error())
  456. return
  457. }
  458. return
  459. }
  460. // DeleteChart 上传图表接口
  461. func DeleteChartByForumChartInfoId(forumChartInfoId int) (err error, errMsg string) {
  462. // 查询图表信息
  463. req := new(DeleteChartReq)
  464. req.ChartInfoId = forumChartInfoId
  465. // 添加计算指标
  466. reqJson, err := json.Marshal(req)
  467. if err != nil {
  468. errMsg = "参数解析异常"
  469. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  470. return
  471. }
  472. respItem, err := ChartDeleteLib(string(reqJson))
  473. if err != nil {
  474. errMsg = "撤回失败"
  475. err = fmt.Errorf("撤回失败,Err:" + err.Error())
  476. return
  477. }
  478. if respItem.Ret != 200 {
  479. errMsg = "撤回失败"
  480. err = fmt.Errorf(respItem.ErrMsg)
  481. return
  482. }
  483. return
  484. }
  485. type AdminSaveReq struct {
  486. *system.Admin
  487. BusinessCode string `description:"商家编码"`
  488. }
  489. // 上传管理员信息
  490. func AdminSave(adminId int) (err error) {
  491. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  492. return
  493. }
  494. //查询用户信息
  495. adminInfo, err := system.GetSysAdminById(adminId)
  496. if err != nil {
  497. if utils.IsErrNoRow(err) {
  498. err = fmt.Errorf("用户不存在")
  499. return
  500. }
  501. err = fmt.Errorf("获取用户信息失败,Err:" + err.Error())
  502. return
  503. }
  504. var req AdminSaveReq
  505. req.Admin = adminInfo
  506. req.BusinessCode = utils.BusinessCode
  507. reqJson, err := json.Marshal(req)
  508. if err != nil {
  509. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  510. return
  511. }
  512. respItem, err := AdminSaveLib(string(reqJson))
  513. if err != nil {
  514. err = fmt.Errorf("上传管理员信息失败,Err:" + err.Error())
  515. return
  516. }
  517. if respItem.Ret != 200 {
  518. err = fmt.Errorf("上传管理员信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
  519. return
  520. }
  521. return
  522. }
  523. type AdminDeleteReq struct {
  524. AdminName string
  525. BusinessCode string `description:"商家编码"`
  526. }
  527. // 上传管理员信息
  528. func AdminDelete(adminName string) (err error) {
  529. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  530. return
  531. }
  532. var req AdminDeleteReq
  533. req.AdminName = adminName
  534. req.BusinessCode = utils.BusinessCode
  535. reqJson, err := json.Marshal(req)
  536. if err != nil {
  537. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  538. return
  539. }
  540. respItem, err := AdminDeleteLib(string(reqJson))
  541. if err != nil {
  542. err = fmt.Errorf("删除管理员信息失败,Err:" + err.Error())
  543. return
  544. }
  545. if respItem.Ret != 200 {
  546. err = fmt.Errorf("删除管理员信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
  547. return
  548. }
  549. return
  550. }
  551. type ChartThemeReq struct {
  552. *chart_theme.ChartTheme
  553. BusinessCode string `description:"商家编码"`
  554. }
  555. // 上传主题信息
  556. func ChartThemeSave(theme *chart_theme.ChartTheme) (err error) {
  557. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  558. return
  559. }
  560. var req ChartThemeReq
  561. req.ChartTheme = theme
  562. req.BusinessCode = utils.BusinessCode
  563. reqJson, err := json.Marshal(req)
  564. if err != nil {
  565. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  566. return
  567. }
  568. respItem, err := ChartThemeSaveLib(string(reqJson))
  569. if err != nil {
  570. err = fmt.Errorf("上传图表主题信息失败,Err:" + err.Error())
  571. return
  572. }
  573. if respItem.Ret != 200 {
  574. err = fmt.Errorf("上传图表主题信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
  575. return
  576. }
  577. return
  578. }
  579. // ChartThemeTypeSave 上传主题类型信息
  580. func ChartThemeTypeSave(theme *chart_theme.ChartThemeType) (err error) {
  581. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  582. return
  583. }
  584. //req.BusinessCode = utils.BusinessCode
  585. reqJson, err := json.Marshal(theme)
  586. if err != nil {
  587. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  588. return
  589. }
  590. respItem, err := ChartThemeTypeSaveLib(string(reqJson))
  591. if err != nil {
  592. err = fmt.Errorf("上传图表主题信息失败,Err:" + err.Error())
  593. return
  594. }
  595. if respItem.Ret != 200 {
  596. err = fmt.Errorf("上传图表主题信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
  597. return
  598. }
  599. return
  600. }
  601. // ChartBatchUpdate 批量上传和更新图表信息
  602. func ChartBatchUpdateAndUpload(chartClassifyInfo *data_manage.ChartClassify, sysUser *system.Admin) (err error) {
  603. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  604. return
  605. }
  606. var tmpErr []error
  607. deleteCache := true
  608. cacheKey := "eta_forum_task:EtaForumChartUpdateByClassifyId:" + strconv.Itoa(chartClassifyInfo.ChartClassifyId)
  609. defer func() {
  610. if deleteCache {
  611. _ = utils.Rc.Delete(cacheKey)
  612. }
  613. stack := ""
  614. if err != nil {
  615. stack = fmt.Sprintln(stack + err.Error())
  616. }
  617. if len(tmpErr) > 0 {
  618. for _, v := range tmpErr {
  619. stack = fmt.Sprintln(stack + v.Error())
  620. }
  621. }
  622. if stack != "" {
  623. utils.FileLog.Error("批量更新资源库图表信息失败"+"<br/>"+stack)
  624. go alarm_msg.SendAlarmMsg("批量更新资源库图表信息失败"+"<br/>"+stack, 3)
  625. }
  626. }()
  627. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  628. deleteCache = false
  629. err = fmt.Errorf("系统处理中,请稍后重试!")
  630. return
  631. }
  632. chartClassifyInfoList, err := data_manage.GetChartClassifyByLevelPath(chartClassifyInfo.LevelPath, chartClassifyInfo.Source)
  633. if err != nil {
  634. return
  635. }
  636. chartClassifyIdList := make([]string, 0)
  637. upChartClassifyIdList := make([]string, 0)
  638. for _, v := range chartClassifyInfoList {
  639. chartClassifyIdList = append(chartClassifyIdList, strconv.Itoa(v.ChartClassifyId))
  640. if v.ResourceStatus == utils.ChartClassifyResourceStatusUp {
  641. upChartClassifyIdList = append(upChartClassifyIdList, strconv.Itoa(v.ChartClassifyId))
  642. }
  643. }
  644. condition := " and forum_chart_info_id > 0 and source=1 and chart_classify_id in ?"
  645. // 查询需要更新的图表信息总数
  646. total, err := data_manage.GetChartInfoCountByCondition(condition, []interface{}{chartClassifyIdList})
  647. if err != nil {
  648. return
  649. }
  650. if total > 0 {
  651. // 更新图表数据
  652. offset := 0
  653. pageSize := 100
  654. success := 0
  655. // 循环更新100个图表数据
  656. for i := 0; offset < total; i++ {
  657. // 查询需要更新的图表信息
  658. chartInfos, e := data_manage.GetChartInfoListByCondition(condition, []interface{}{chartClassifyIdList}, offset, pageSize)
  659. if e != nil {
  660. err = fmt.Errorf("查询需要更新的图表信息失败: %v", e)
  661. return
  662. }
  663. // 循环更新图表数据
  664. for _, chartInfo := range chartInfos {
  665. // 更新图表数据
  666. er, msg := UpdateChart(chartInfo.ChartInfoId)
  667. if er != nil {
  668. er = fmt.Errorf("图表ID %d, 更新图表数据失败: %s, %v", chartInfo.ChartInfoId, msg, er)
  669. tmpErr = append(tmpErr, er)
  670. continue
  671. }
  672. success += 1
  673. }
  674. offset = (i + 1) * pageSize
  675. }
  676. utils.FileLog.Info("更新图表数据完成, 更新图表数据总数:", success)
  677. }
  678. // 批量上传已经上架的分类下的图表到资源库中
  679. // 查询需要新增的图表ID
  680. condition = " and source=1 and forum_chart_info_id=0 and resource_status !=2 and chart_classify_id in ?"
  681. total, err = data_manage.GetChartInfoCountByCondition(condition, []interface{}{upChartClassifyIdList})
  682. if err != nil {
  683. return
  684. }
  685. if total == 0 {
  686. return
  687. }
  688. offset := 0
  689. pageSize := 100
  690. success := 0
  691. for i := 0; offset < total; i++ {
  692. chartInfos, e := data_manage.GetChartInfoListByCondition(condition, []interface{}{upChartClassifyIdList}, offset, pageSize)
  693. if e != nil {
  694. err = fmt.Errorf("查询需要新增的图表信息失败: %v", e)
  695. return
  696. }
  697. // 循环更新图表数据
  698. for _, chartInfo := range chartInfos {
  699. // 更新图表数据
  700. er, msg := UploadChart(chartInfo.ChartInfoId, "", sysUser)
  701. if er != nil {
  702. er = fmt.Errorf("图表ID %d, 上传图表数据失败: %s, %v", chartInfo.ChartInfoId, msg, er)
  703. tmpErr = append(tmpErr, er)
  704. continue
  705. }
  706. success += 1
  707. }
  708. offset = (i + 1) * pageSize
  709. }
  710. utils.FileLog.Info("批量上传已经上架的分类下的图表到资源库中完成, 新增图表数据总数:", success)
  711. return
  712. }
  713. // 批量删除资源库图表信息
  714. func ChartInfoDeleteBatch(chartClassifyInfo *data_manage.ChartClassify, sysUser *system.Admin) (err error) {
  715. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  716. return
  717. }
  718. var tmpErr []error
  719. deleteCache := true
  720. cacheKey := "eta_forum_task:ChartInfoDeleteBatch:" + strconv.Itoa(chartClassifyInfo.ChartClassifyId)
  721. defer func() {
  722. if deleteCache {
  723. _ = utils.Rc.Delete(cacheKey)
  724. }
  725. stack := ""
  726. if err != nil {
  727. stack = fmt.Sprintln(stack + err.Error())
  728. }
  729. if len(tmpErr) > 0 {
  730. for _, v := range tmpErr {
  731. stack = fmt.Sprintln(stack + v.Error())
  732. }
  733. }
  734. if stack != "" {
  735. utils.FileLog.Error("批量删除资源库图表信息失败"+"<br/>"+stack)
  736. go alarm_msg.SendAlarmMsg("批量删除资源库图表信息失败"+"<br/>"+stack, 3)
  737. }
  738. }()
  739. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  740. deleteCache = false
  741. err = fmt.Errorf("系统处理中,请稍后重试!")
  742. return
  743. }
  744. // 查询所有子分类
  745. chartClassifyInfoList, err := data_manage.GetChartClassifyByLevelPath(chartClassifyInfo.LevelPath, chartClassifyInfo.Source)
  746. if err != nil {
  747. return
  748. }
  749. if len(chartClassifyInfoList) == 0 {
  750. return
  751. }
  752. chartClassifyIdList := make([]string, 0)
  753. for _, v := range chartClassifyInfoList {
  754. chartClassifyIdList = append(chartClassifyIdList, strconv.Itoa(v.ChartClassifyId))
  755. }
  756. // 批量删除图表信息
  757. condition := " AND source=? AND chart_classify_id in ? AND forum_chart_info_id > 0"
  758. total, err := data_manage.GetChartInfoCountByCondition(condition, []interface{}{chartClassifyInfo.Source, chartClassifyIdList})
  759. if err != nil {
  760. return
  761. }
  762. if total == 0 {
  763. return
  764. }
  765. offset := 0
  766. pageSize := 100
  767. success := 0
  768. // 循环更新100个图表数据
  769. for i := 0; offset < total; i++ {
  770. // 查询需要更新的图表信息
  771. chartInfos, e := data_manage.GetChartInfoListByCondition(condition, []interface{}{chartClassifyInfo.Source, chartClassifyIdList}, offset, pageSize)
  772. if e != nil {
  773. err = fmt.Errorf("查询需要更新的图表信息失败: %v", e)
  774. return
  775. }
  776. // 循环更新图表数据
  777. for _, chartInfo := range chartInfos {
  778. // 删除图表数据
  779. er, msg := DeleteChart(chartInfo.ChartInfoId)
  780. if er != nil {
  781. er = fmt.Errorf("图表ID %d, 删除图表数据失败: %s, %v", chartInfo.ChartInfoId, msg, er)
  782. tmpErr = append(tmpErr, er)
  783. continue
  784. }
  785. success += 1
  786. }
  787. offset = (i + 1) * pageSize
  788. }
  789. fmt.Println("删除图表数据完成, 删除图表数据总数:", success)
  790. return
  791. }
  792. // 修改分类状态,一键上架至资源库
  793. func SetChartClassifyResourceStatusUp(chartClassifyInfo *data_manage.ChartClassify, sysUser *system.Admin) (errMsg string, err error) {
  794. if chartClassifyInfo.ResourceStatus == utils.ChartClassifyResourceStatusUp {
  795. errMsg = "分类状态已为已上架, 无需重复操作"
  796. err = fmt.Errorf("%s", errMsg)
  797. return
  798. }
  799. // 判断是否是精选资源
  800. if chartClassifyInfo.IsSelected != utils.ChartClassifyIsSelected {
  801. errMsg = "分类状态已为已上架, 无需重复操作"
  802. err = fmt.Errorf("%s", errMsg)
  803. return
  804. }
  805. // 查询分类下的所有图表信息
  806. err = data_manage.UpdateChartClassifyResourceStatus(chartClassifyInfo.Source, utils.ChartClassifyResourceStatusUp, chartClassifyInfo.LevelPath)
  807. if err != nil {
  808. errMsg = "更新分类状态失败"
  809. err = fmt.Errorf("更新分类状态失败,Err:%w", err)
  810. return
  811. }
  812. go ChartBatchUpdateAndUpload(chartClassifyInfo, sysUser)
  813. return
  814. }
  815. // 修改分类,一键从资源库下架
  816. func SetChartClassifyResourceStatusDown(chartClassifyInfo *data_manage.ChartClassify, sysUser *system.Admin) (errMsg string, err error) {
  817. if chartClassifyInfo.ResourceStatus == utils.ChartClassifyResourceStatusDown {
  818. errMsg = "分类状态已为已下架, 无需重复操作"
  819. err = fmt.Errorf("%s", errMsg)
  820. return
  821. }
  822. // 查询分类下的所有图表信息
  823. err = data_manage.UpdateChartClassifyResourceStatus(chartClassifyInfo.Source, utils.ChartClassifyResourceStatusDown, chartClassifyInfo.LevelPath)
  824. if err != nil {
  825. errMsg = "更新分类状态失败"
  826. err = fmt.Errorf("更新分类状态失败,Err:%w", err)
  827. return
  828. }
  829. go ChartInfoDeleteBatch(chartClassifyInfo, sysUser)
  830. return
  831. }
  832. func getChartDescriptionWithAdminNameByChartInfoId(chartInfoId int) (list []*data_manage.ChartDescriptionReq, err error, errMsg string) {
  833. descriptionList, err := data_manage.GetChartDescriptionByChartInfoId(chartInfoId)
  834. if err != nil {
  835. errMsg = "获取图表简介失败"
  836. err = fmt.Errorf("获取图表简介失败,Err:" + err.Error())
  837. return
  838. }
  839. // 查询创建者信息
  840. adminIdList := make([]int, 0)
  841. for _, v := range descriptionList {
  842. adminIdList = append(adminIdList, v.SysUserId)
  843. }
  844. adminList, err := system.GetAdminListByIdList(adminIdList)
  845. if err != nil {
  846. errMsg = "获取创建者信息失败"
  847. err = fmt.Errorf("获取创建者信息失败,Err:" + err.Error())
  848. return
  849. }
  850. adminMap := make(map[int]string)
  851. for _, v := range adminList {
  852. adminMap[v.AdminId] = v.AdminName
  853. }
  854. for _, v := range descriptionList {
  855. adminName, ok := adminMap[v.SysUserId]
  856. if !ok {
  857. adminName = ""
  858. }
  859. list = append(list, &data_manage.ChartDescriptionReq{
  860. ChartInfoId: v.ChartInfoId,
  861. Description: v.Description,
  862. AdminName: adminName,
  863. SysUserId: v.SysUserId,
  864. SysUserRealName: v.SysUserRealName,
  865. ModifyTime: v.ModifyTime,
  866. CreateTime: v.CreateTime,
  867. })
  868. }
  869. return
  870. }