eta_forum_hub.go 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931
  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. hasFindMap := make(map[int]struct{})
  295. edbInfoIdMap := make(map[int]struct{})
  296. edbMappingList = make([]*data_manage.EdbInfoCalculateMapping, 0)
  297. edbMappingMap := make(map[int]struct{})
  298. for _, edbInfoId := range edbInfoIds {
  299. edbMappingList, err = traceEdbInfoByEdbInfoId(edbInfoId, hasFindMap, edbInfoIdMap, edbMappingList, edbMappingMap)
  300. if err != nil {
  301. err = fmt.Errorf(" traceEdbInfoByEdbInfoId err: %s", err.Error())
  302. return
  303. }
  304. }
  305. // 指标信息map
  306. edbInfoIdList := make([]int, 0)
  307. for k, _ := range edbInfoIdMap {
  308. edbInfoIdList = append(edbInfoIdList, k)
  309. }
  310. edbInfoList, err = data_manage.GetEdbInfoByIdList(edbInfoIdList)
  311. if err != nil {
  312. err = fmt.Errorf(" GetEdbInfoByIdList err: %s", err.Error())
  313. return
  314. }
  315. for _, v := range edbInfoList {
  316. var dataList []*data_manage.EdbDataBase
  317. if v.Source == utils.DATA_SOURCE_BUSINESS && utils.UseMongo {
  318. dataList, err = data_manage.GetEdbDataBaseMongoByEdbInfoId(v.EdbInfoId, v.Source, v.SubSource)
  319. } else if v.Source == utils.DATA_SOURCE_THS && v.SubSource == utils.DATA_SUB_SOURCE_HIGH_FREQUENCY && utils.UseMongo {
  320. dataList, err = data_manage.GetThsHfEdbDataBaseMongoByEdbInfoId(v.EdbInfoId, v.Source, v.SubSource)
  321. } else {
  322. dataList, err = data_manage.GetEdbDataBaseByEdbInfoId(v.EdbInfoId, v.Source, v.SubSource)
  323. }
  324. if err != nil {
  325. err = fmt.Errorf("查询指标数据失败 Err: %s", err.Error())
  326. return
  327. }
  328. tmp := new(AddEdbDataReq)
  329. tmp.EdbCode = v.EdbCode
  330. tmp.EdbType = v.EdbType
  331. tmp.DataList = dataList
  332. edbInfoDataList = append(edbInfoDataList, tmp)
  333. }
  334. return
  335. }
  336. // traceEdbInfoByEdbInfoId 指标追溯
  337. 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) {
  338. newEdbMappingList = edbMappingList
  339. _, ok := hasFindMap[edbInfoId]
  340. if ok {
  341. return
  342. }
  343. if _, ok1 := edbInfoIdMap[edbInfoId]; !ok1 {
  344. edbInfoIdMap[edbInfoId] = struct{}{}
  345. }
  346. edbInfoMappingList, e := data_manage.GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId)
  347. if e != nil {
  348. err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoId err: %s", e.Error())
  349. return
  350. }
  351. if len(edbInfoMappingList) > 0 {
  352. fromEdbInfoIdList := make([]int, 0)
  353. for _, v := range edbInfoMappingList {
  354. fromEdbInfoIdList = append(fromEdbInfoIdList, v.FromEdbInfoId)
  355. if _, ok1 := edbInfoIdMap[v.FromEdbInfoId]; !ok1 {
  356. edbInfoIdMap[v.FromEdbInfoId] = struct{}{}
  357. }
  358. if _, ok2 := edbMappingMap[v.EdbInfoCalculateMappingId]; !ok2 {
  359. edbMappingMap[v.EdbInfoCalculateMappingId] = struct{}{}
  360. tmp := &data_manage.EdbInfoCalculateMapping{
  361. EdbInfoCalculateMappingId: v.EdbInfoCalculateMappingId,
  362. EdbInfoId: v.EdbInfoId,
  363. Source: v.Source,
  364. SourceName: v.SourceName,
  365. EdbCode: v.EdbCode,
  366. FromEdbInfoId: v.FromEdbInfoId,
  367. FromEdbCode: v.FromEdbCode,
  368. FromEdbName: v.FromEdbName,
  369. FromSource: v.FromSource,
  370. FromSourceName: v.FromSourceName,
  371. FromTag: v.FromTag,
  372. Sort: v.Sort,
  373. CreateTime: v.CreateTime,
  374. ModifyTime: v.ModifyTime,
  375. }
  376. newEdbMappingList = append(newEdbMappingList, tmp)
  377. }
  378. if edbInfoId != v.FromEdbInfoId && (v.FromEdbType == 2 || v.FromEdbInfoType == 1) {
  379. // 查过了就不查了
  380. if _, ok2 := hasFindMap[v.FromEdbInfoId]; !ok2 {
  381. newEdbMappingList, e = traceEdbInfoByEdbInfoId(v.FromEdbInfoId, hasFindMap, edbInfoIdMap, newEdbMappingList, edbMappingMap)
  382. if e != nil {
  383. err = fmt.Errorf("traceEdbInfoByEdbInfoId err: %s", e.Error())
  384. return
  385. }
  386. }
  387. }
  388. hasFindMap[v.FromEdbInfoId] = struct{}{}
  389. }
  390. }
  391. hasFindMap[edbInfoId] = struct{}{}
  392. return
  393. }
  394. // DeleteChart 上传图表接口
  395. func DeleteChart(chartInfoId int) (err error, errMsg string) {
  396. // 设置缓存 防止重复撤回
  397. cacheKey := "eta_forum_task:DeleteChart:" + strconv.Itoa(chartInfoId)
  398. if utils.Rc.Get(cacheKey) != nil {
  399. err = fmt.Errorf("系统处理中,请稍后重试!")
  400. return
  401. }
  402. utils.Rc.SetNX(cacheKey, 1, 30*time.Second)
  403. defer func() {
  404. if err != nil {
  405. go alarm_msg.SendAlarmMsg(fmt.Sprintf("撤回图表失败:%v,ErrMsg:%s", err, errMsg), 3)
  406. }
  407. utils.Rc.Delete(cacheKey)
  408. }()
  409. // 查询图表信息
  410. chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
  411. if err != nil {
  412. if utils.IsErrNoRow(err) {
  413. errMsg = "图表不存在"
  414. err = fmt.Errorf(errMsg)
  415. return
  416. }
  417. errMsg = "获取图表信息失败"
  418. err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
  419. return
  420. }
  421. if chartInfo.ForumChartInfoId <= 0 {
  422. errMsg = "该图表未上传至社区,无需撤回"
  423. err = fmt.Errorf(errMsg)
  424. return
  425. }
  426. req := new(DeleteChartReq)
  427. req.ChartInfoId = chartInfo.ForumChartInfoId
  428. // 添加计算指标
  429. reqJson, err := json.Marshal(req)
  430. if err != nil {
  431. errMsg = "参数解析异常"
  432. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  433. return
  434. }
  435. respItem, err := ChartDeleteLib(string(reqJson))
  436. if err != nil {
  437. errMsg = "撤回失败"
  438. err = fmt.Errorf("撤回失败,Err:" + err.Error())
  439. return
  440. }
  441. if respItem.Ret != 200 {
  442. errMsg = "撤回失败"
  443. err = fmt.Errorf(respItem.ErrMsg)
  444. return
  445. }
  446. // 更新社区返回的图表ID
  447. err = data_manage.SetForumChartInfoId(chartInfoId, 0, utils.ChartClassifyResourceStatusDown)
  448. if err != nil {
  449. errMsg = "撤回失败"
  450. err = fmt.Errorf("更新图表ID失败,Err:" + err.Error())
  451. return
  452. }
  453. return
  454. }
  455. // DeleteChart 上传图表接口
  456. func DeleteChartByForumChartInfoId(forumChartInfoId int) (err error, errMsg string) {
  457. // 查询图表信息
  458. req := new(DeleteChartReq)
  459. req.ChartInfoId = forumChartInfoId
  460. // 添加计算指标
  461. reqJson, err := json.Marshal(req)
  462. if err != nil {
  463. errMsg = "参数解析异常"
  464. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  465. return
  466. }
  467. respItem, err := ChartDeleteLib(string(reqJson))
  468. if err != nil {
  469. errMsg = "撤回失败"
  470. err = fmt.Errorf("撤回失败,Err:" + err.Error())
  471. return
  472. }
  473. if respItem.Ret != 200 {
  474. errMsg = "撤回失败"
  475. err = fmt.Errorf(respItem.ErrMsg)
  476. return
  477. }
  478. return
  479. }
  480. type AdminSaveReq struct {
  481. *system.Admin
  482. BusinessCode string `description:"商家编码"`
  483. }
  484. // 上传管理员信息
  485. func AdminSave(adminId int) (err error) {
  486. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  487. return
  488. }
  489. //查询用户信息
  490. adminInfo, err := system.GetSysAdminById(adminId)
  491. if err != nil {
  492. if utils.IsErrNoRow(err) {
  493. err = fmt.Errorf("用户不存在")
  494. return
  495. }
  496. err = fmt.Errorf("获取用户信息失败,Err:" + err.Error())
  497. return
  498. }
  499. var req AdminSaveReq
  500. req.Admin = adminInfo
  501. req.BusinessCode = utils.BusinessCode
  502. reqJson, err := json.Marshal(req)
  503. if err != nil {
  504. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  505. return
  506. }
  507. respItem, err := AdminSaveLib(string(reqJson))
  508. if err != nil {
  509. err = fmt.Errorf("上传管理员信息失败,Err:" + err.Error())
  510. return
  511. }
  512. if respItem.Ret != 200 {
  513. err = fmt.Errorf("上传管理员信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
  514. return
  515. }
  516. return
  517. }
  518. type AdminDeleteReq struct {
  519. AdminName string
  520. BusinessCode string `description:"商家编码"`
  521. }
  522. // 上传管理员信息
  523. func AdminDelete(adminName string) (err error) {
  524. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  525. return
  526. }
  527. var req AdminDeleteReq
  528. req.AdminName = adminName
  529. req.BusinessCode = utils.BusinessCode
  530. reqJson, err := json.Marshal(req)
  531. if err != nil {
  532. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  533. return
  534. }
  535. respItem, err := AdminDeleteLib(string(reqJson))
  536. if err != nil {
  537. err = fmt.Errorf("删除管理员信息失败,Err:" + err.Error())
  538. return
  539. }
  540. if respItem.Ret != 200 {
  541. err = fmt.Errorf("删除管理员信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
  542. return
  543. }
  544. return
  545. }
  546. type ChartThemeReq struct {
  547. *chart_theme.ChartTheme
  548. BusinessCode string `description:"商家编码"`
  549. }
  550. // 上传主题信息
  551. func ChartThemeSave(theme *chart_theme.ChartTheme) (err error) {
  552. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  553. return
  554. }
  555. var req ChartThemeReq
  556. req.ChartTheme = theme
  557. req.BusinessCode = utils.BusinessCode
  558. reqJson, err := json.Marshal(req)
  559. if err != nil {
  560. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  561. return
  562. }
  563. respItem, err := ChartThemeSaveLib(string(reqJson))
  564. if err != nil {
  565. err = fmt.Errorf("上传图表主题信息失败,Err:" + err.Error())
  566. return
  567. }
  568. if respItem.Ret != 200 {
  569. err = fmt.Errorf("上传图表主题信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
  570. return
  571. }
  572. return
  573. }
  574. // ChartThemeTypeSave 上传主题类型信息
  575. func ChartThemeTypeSave(theme *chart_theme.ChartThemeType) (err error) {
  576. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  577. return
  578. }
  579. //req.BusinessCode = utils.BusinessCode
  580. reqJson, err := json.Marshal(theme)
  581. if err != nil {
  582. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  583. return
  584. }
  585. respItem, err := ChartThemeTypeSaveLib(string(reqJson))
  586. if err != nil {
  587. err = fmt.Errorf("上传图表主题信息失败,Err:" + err.Error())
  588. return
  589. }
  590. if respItem.Ret != 200 {
  591. err = fmt.Errorf("上传图表主题信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
  592. return
  593. }
  594. return
  595. }
  596. // ChartBatchUpdate 批量上传和更新图表信息
  597. func ChartBatchUpdateAndUpload(chartClassifyInfo *data_manage.ChartClassify, sysUser *system.Admin) (err error) {
  598. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  599. return
  600. }
  601. var tmpErr []error
  602. deleteCache := true
  603. cacheKey := "eta_forum_task:EtaForumChartUpdateByClassifyId:" + strconv.Itoa(chartClassifyInfo.ChartClassifyId)
  604. defer func() {
  605. if deleteCache {
  606. _ = utils.Rc.Delete(cacheKey)
  607. }
  608. stack := ""
  609. if err != nil {
  610. stack = fmt.Sprintln(stack + err.Error())
  611. }
  612. if len(tmpErr) > 0 {
  613. for _, v := range tmpErr {
  614. stack = fmt.Sprintln(stack + v.Error())
  615. }
  616. }
  617. if stack != "" {
  618. utils.FileLog.Error("批量更新资源库图表信息失败"+"<br/>"+stack)
  619. go alarm_msg.SendAlarmMsg("批量更新资源库图表信息失败"+"<br/>"+stack, 3)
  620. }
  621. }()
  622. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  623. deleteCache = false
  624. err = fmt.Errorf("系统处理中,请稍后重试!")
  625. return
  626. }
  627. chartClassifyInfoList, err := data_manage.GetChartClassifyByLevelPath(chartClassifyInfo.LevelPath, chartClassifyInfo.Source)
  628. if err != nil {
  629. return
  630. }
  631. chartClassifyIdList := make([]string, 0)
  632. upChartClassifyIdList := make([]string, 0)
  633. for _, v := range chartClassifyInfoList {
  634. chartClassifyIdList = append(chartClassifyIdList, strconv.Itoa(v.ChartClassifyId))
  635. if v.ResourceStatus == utils.ChartClassifyResourceStatusUp {
  636. upChartClassifyIdList = append(upChartClassifyIdList, strconv.Itoa(v.ChartClassifyId))
  637. }
  638. }
  639. condition := " and forum_chart_info_id > 0 and source=1 and chart_classify_id in ?"
  640. // 查询需要更新的图表信息总数
  641. total, err := data_manage.GetChartInfoCountByCondition(condition, []interface{}{chartClassifyIdList})
  642. if err != nil {
  643. return
  644. }
  645. if total > 0 {
  646. // 更新图表数据
  647. offset := 0
  648. pageSize := 100
  649. success := 0
  650. // 循环更新100个图表数据
  651. for i := 0; offset < total; i++ {
  652. // 查询需要更新的图表信息
  653. chartInfos, e := data_manage.GetChartInfoListByCondition(condition, []interface{}{chartClassifyIdList}, offset, pageSize)
  654. if e != nil {
  655. err = fmt.Errorf("查询需要更新的图表信息失败: %v", e)
  656. return
  657. }
  658. // 循环更新图表数据
  659. for _, chartInfo := range chartInfos {
  660. // 更新图表数据
  661. er, msg := UpdateChart(chartInfo.ChartInfoId)
  662. if er != nil {
  663. er = fmt.Errorf("图表ID %d, 更新图表数据失败: %s, %v", chartInfo.ChartInfoId, msg, er)
  664. tmpErr = append(tmpErr, er)
  665. continue
  666. }
  667. success += 1
  668. }
  669. offset = (i + 1) * pageSize
  670. }
  671. utils.FileLog.Info("更新图表数据完成, 更新图表数据总数:", success)
  672. }
  673. // 批量上传已经上架的分类下的图表到资源库中
  674. // 查询需要新增的图表ID
  675. condition = " and source=1 and forum_chart_info_id=0 and resource_status !=2 and chart_classify_id in ?"
  676. total, err = data_manage.GetChartInfoCountByCondition(condition, []interface{}{upChartClassifyIdList})
  677. if err != nil {
  678. return
  679. }
  680. if total == 0 {
  681. return
  682. }
  683. offset := 0
  684. pageSize := 100
  685. success := 0
  686. for i := 0; offset < total; i++ {
  687. chartInfos, e := data_manage.GetChartInfoListByCondition(condition, []interface{}{upChartClassifyIdList}, offset, pageSize)
  688. if e != nil {
  689. err = fmt.Errorf("查询需要新增的图表信息失败: %v", e)
  690. return
  691. }
  692. // 循环更新图表数据
  693. for _, chartInfo := range chartInfos {
  694. // 更新图表数据
  695. er, msg := UploadChart(chartInfo.ChartInfoId, "", sysUser)
  696. if er != nil {
  697. er = fmt.Errorf("图表ID %d, 上传图表数据失败: %s, %v", chartInfo.ChartInfoId, msg, er)
  698. tmpErr = append(tmpErr, er)
  699. continue
  700. }
  701. success += 1
  702. }
  703. offset = (i + 1) * pageSize
  704. }
  705. utils.FileLog.Info("批量上传已经上架的分类下的图表到资源库中完成, 新增图表数据总数:", success)
  706. return
  707. }
  708. // 批量删除资源库图表信息
  709. func ChartInfoDeleteBatch(chartClassifyInfo *data_manage.ChartClassify, sysUser *system.Admin) (err error) {
  710. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  711. return
  712. }
  713. var tmpErr []error
  714. deleteCache := true
  715. cacheKey := "eta_forum_task:ChartInfoDeleteBatch:" + strconv.Itoa(chartClassifyInfo.ChartClassifyId)
  716. defer func() {
  717. if deleteCache {
  718. _ = utils.Rc.Delete(cacheKey)
  719. }
  720. stack := ""
  721. if err != nil {
  722. stack = fmt.Sprintln(stack + err.Error())
  723. }
  724. if len(tmpErr) > 0 {
  725. for _, v := range tmpErr {
  726. stack = fmt.Sprintln(stack + v.Error())
  727. }
  728. }
  729. if stack != "" {
  730. utils.FileLog.Error("批量删除资源库图表信息失败"+"<br/>"+stack)
  731. go alarm_msg.SendAlarmMsg("批量删除资源库图表信息失败"+"<br/>"+stack, 3)
  732. }
  733. }()
  734. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  735. deleteCache = false
  736. err = fmt.Errorf("系统处理中,请稍后重试!")
  737. return
  738. }
  739. // 查询所有子分类
  740. chartClassifyInfoList, err := data_manage.GetChartClassifyByLevelPath(chartClassifyInfo.LevelPath, chartClassifyInfo.Source)
  741. if err != nil {
  742. return
  743. }
  744. if len(chartClassifyInfoList) == 0 {
  745. return
  746. }
  747. chartClassifyIdList := make([]string, 0)
  748. for _, v := range chartClassifyInfoList {
  749. chartClassifyIdList = append(chartClassifyIdList, strconv.Itoa(v.ChartClassifyId))
  750. }
  751. // 批量删除图表信息
  752. condition := " AND source=? AND chart_classify_id in ? AND forum_chart_info_id > 0"
  753. total, err := data_manage.GetChartInfoCountByCondition(condition, []interface{}{chartClassifyInfo.Source, chartClassifyIdList})
  754. if err != nil {
  755. return
  756. }
  757. if total == 0 {
  758. return
  759. }
  760. offset := 0
  761. pageSize := 100
  762. success := 0
  763. // 循环更新100个图表数据
  764. for i := 0; offset < total; i++ {
  765. // 查询需要更新的图表信息
  766. chartInfos, e := data_manage.GetChartInfoListByCondition(condition, []interface{}{chartClassifyInfo.Source, chartClassifyIdList}, offset, pageSize)
  767. if e != nil {
  768. err = fmt.Errorf("查询需要更新的图表信息失败: %v", e)
  769. return
  770. }
  771. // 循环更新图表数据
  772. for _, chartInfo := range chartInfos {
  773. // 删除图表数据
  774. er, msg := DeleteChart(chartInfo.ChartInfoId)
  775. if er != nil {
  776. er = fmt.Errorf("图表ID %d, 删除图表数据失败: %s, %v", chartInfo.ChartInfoId, msg, er)
  777. tmpErr = append(tmpErr, er)
  778. continue
  779. }
  780. success += 1
  781. }
  782. offset = (i + 1) * pageSize
  783. }
  784. fmt.Println("删除图表数据完成, 删除图表数据总数:", success)
  785. return
  786. }
  787. // 修改分类状态,一键上架至资源库
  788. func SetChartClassifyResourceStatusUp(chartClassifyInfo *data_manage.ChartClassify, sysUser *system.Admin) (errMsg string, err error) {
  789. if chartClassifyInfo.ResourceStatus == utils.ChartClassifyResourceStatusUp {
  790. errMsg = "分类状态已为已上架, 无需重复操作"
  791. err = fmt.Errorf("%s", errMsg)
  792. return
  793. }
  794. // 判断是否是精选资源
  795. if chartClassifyInfo.IsSelected != utils.ChartClassifyIsSelected {
  796. errMsg = "分类状态已为已上架, 无需重复操作"
  797. err = fmt.Errorf("%s", errMsg)
  798. return
  799. }
  800. // 查询分类下的所有图表信息
  801. err = data_manage.UpdateChartClassifyResourceStatus(chartClassifyInfo.Source, utils.ChartClassifyResourceStatusUp, chartClassifyInfo.LevelPath)
  802. if err != nil {
  803. errMsg = "更新分类状态失败"
  804. err = fmt.Errorf("更新分类状态失败,Err:%w", err)
  805. return
  806. }
  807. go ChartBatchUpdateAndUpload(chartClassifyInfo, sysUser)
  808. return
  809. }
  810. // 修改分类,一键从资源库下架
  811. func SetChartClassifyResourceStatusDown(chartClassifyInfo *data_manage.ChartClassify, sysUser *system.Admin) (errMsg string, err error) {
  812. if chartClassifyInfo.ResourceStatus == utils.ChartClassifyResourceStatusDown {
  813. errMsg = "分类状态已为已下架, 无需重复操作"
  814. err = fmt.Errorf("%s", errMsg)
  815. return
  816. }
  817. // 查询分类下的所有图表信息
  818. err = data_manage.UpdateChartClassifyResourceStatus(chartClassifyInfo.Source, utils.ChartClassifyResourceStatusDown, chartClassifyInfo.LevelPath)
  819. if err != nil {
  820. errMsg = "更新分类状态失败"
  821. err = fmt.Errorf("更新分类状态失败,Err:%w", err)
  822. return
  823. }
  824. go ChartInfoDeleteBatch(chartClassifyInfo, sysUser)
  825. return
  826. }
  827. func getChartDescriptionWithAdminNameByChartInfoId(chartInfoId int) (list []*data_manage.ChartDescriptionReq, err error, errMsg string) {
  828. descriptionList, err := data_manage.GetChartDescriptionByChartInfoId(chartInfoId)
  829. if err != nil {
  830. errMsg = "获取图表简介失败"
  831. err = fmt.Errorf("获取图表简介失败,Err:" + err.Error())
  832. return
  833. }
  834. // 查询创建者信息
  835. adminIdList := make([]int, 0)
  836. for _, v := range descriptionList {
  837. adminIdList = append(adminIdList, v.SysUserId)
  838. }
  839. adminList, err := system.GetAdminListByIdList(adminIdList)
  840. if err != nil {
  841. errMsg = "获取创建者信息失败"
  842. err = fmt.Errorf("获取创建者信息失败,Err:" + err.Error())
  843. return
  844. }
  845. adminMap := make(map[int]string)
  846. for _, v := range adminList {
  847. adminMap[v.AdminId] = v.AdminName
  848. }
  849. for _, v := range descriptionList {
  850. adminName, ok := adminMap[v.SysUserId]
  851. if !ok {
  852. adminName = ""
  853. }
  854. list = append(list, &data_manage.ChartDescriptionReq{
  855. ChartInfoId: v.ChartInfoId,
  856. Description: v.Description,
  857. AdminName: adminName,
  858. SysUserId: v.SysUserId,
  859. SysUserRealName: v.SysUserRealName,
  860. ModifyTime: v.ModifyTime,
  861. CreateTime: v.CreateTime,
  862. })
  863. }
  864. return
  865. }