eta_forum_hub.go 28 KB

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