eta_forum_hub.go 27 KB

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