eta_forum_hub.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  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. )
  11. type UploadChartToForumReq struct {
  12. ChartInfoId int `description:"图表ID"`
  13. Description string `description:"逻辑简述"`
  14. }
  15. type UpdateChartToForumReq struct {
  16. ChartInfoId int `description:"图表ID"`
  17. }
  18. type ChartSaveLibReq struct {
  19. ChartInfo *data_manage.ChartInfo
  20. Description string `description:"逻辑简述"`
  21. EdbInfoList []*data_manage.EdbInfo
  22. ChartThemeList []*chart_theme.ChartTheme
  23. EdbInfoDataList []*AddEdbDataReq
  24. ChartEdbMapping []*data_manage.ChartEdbMapping
  25. EdbInfoCalculateMapping []*data_manage.EdbInfoCalculateMapping
  26. CreatorInfo *system.Admin //创建者的账号信息
  27. UploaderInfo *system.Admin //上传者的账号信息
  28. }
  29. type ChartSaveLibResp struct {
  30. Ret int
  31. Msg string
  32. ErrMsg string
  33. ErrCode string
  34. Data *data_manage.AddChartInfoResp
  35. Success bool `description:"true 执行成功,false 执行失败"`
  36. IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
  37. IsAddLog bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
  38. }
  39. type AddEdbDataReq struct {
  40. EdbCode string
  41. EdbType int
  42. DataList []*data_manage.EdbDataBase
  43. }
  44. type DeleteChartReq struct {
  45. ChartInfoId int `description:"图表id"`
  46. }
  47. // UploadChart 上传图表接口
  48. func UploadChart(chartInfoId int, description string, uploaderInfo *system.Admin) (err error, errMsg string) {
  49. defer func() {
  50. if err != nil {
  51. go alarm_msg.SendAlarmMsg(fmt.Sprintf("上传图表至社区失败:Err:%v,ErrMsg:%s", err, errMsg), 3)
  52. }
  53. }()
  54. // 查询图表信息
  55. chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
  56. if err != nil {
  57. if err.Error() == utils.ErrNoRow() {
  58. errMsg = "图表不存在"
  59. err = fmt.Errorf(errMsg)
  60. return
  61. }
  62. errMsg = "获取图表信息失败"
  63. err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
  64. return
  65. }
  66. if chartInfo.ForumChartInfoId > 0 {
  67. errMsg = "该图表已上传至社区,无法再次上传"
  68. err = fmt.Errorf(errMsg)
  69. return
  70. }
  71. //查询图表主题
  72. //查询图表指标
  73. //获取原图表关联的指标信息列表
  74. chartMappingList, err := data_manage.GetChartMappingList(chartInfoId)
  75. if err != nil {
  76. errMsg = "获取图表关联的指标信息失败"
  77. err = fmt.Errorf("获取图表关联的指标信息失败,Err:" + err.Error())
  78. return
  79. }
  80. edbIds := make([]int, 0)
  81. for _, v := range chartMappingList {
  82. edbIds = append(edbIds, v.EdbInfoId)
  83. }
  84. var (
  85. edbInfoList []*data_manage.EdbInfo
  86. edbMappingList []*data_manage.EdbInfoCalculateMapping
  87. edbInfoDataList []*AddEdbDataReq
  88. )
  89. //查询指标详情
  90. edbInfoList, edbMappingList, edbInfoDataList, err = GetEdbListByEdbInfoId(edbIds)
  91. if err != nil {
  92. errMsg = "获取指标详情失败"
  93. err = fmt.Errorf("获取指标详情失败,Err:" + err.Error())
  94. return
  95. }
  96. req := new(ChartSaveLibReq)
  97. req.ChartInfo = chartInfo
  98. req.ChartEdbMapping = chartMappingList
  99. req.EdbInfoList = edbInfoList
  100. req.EdbInfoDataList = edbInfoDataList
  101. req.EdbInfoCalculateMapping = edbMappingList
  102. req.Description = description
  103. // 查询创建者信息
  104. creatorInfo, _ := system.GetSysAdminById(chartInfo.SysUserId)
  105. if creatorInfo != nil {
  106. req.CreatorInfo = creatorInfo
  107. }
  108. req.UploaderInfo = uploaderInfo
  109. // 添加计算指标
  110. reqJson, err := json.Marshal(req)
  111. if err != nil {
  112. errMsg = "参数解析异常"
  113. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  114. return
  115. }
  116. respItem, err := ChartSaveLib(string(reqJson))
  117. if err != nil {
  118. errMsg = "上传失败"
  119. err = fmt.Errorf("上传失败,Err:" + err.Error())
  120. return
  121. }
  122. if respItem.Ret != 200 {
  123. errMsg = "上传失败"
  124. err = fmt.Errorf(respItem.ErrMsg)
  125. return
  126. }
  127. if respItem.Data != nil && respItem.Data.ChartInfoId != 0 {
  128. // 更新社区返回的图表ID
  129. err = data_manage.SetForumChartInfoId(chartInfoId, respItem.Data.ChartInfoId)
  130. if err != nil {
  131. errMsg = "更新图表ID失败"
  132. err = fmt.Errorf("更新图表ID失败,Err:" + err.Error())
  133. return
  134. }
  135. }
  136. return
  137. }
  138. // UpdateChart 更新社区里的图表接口
  139. func UpdateChart(chartInfoId int) (err error, errMsg string) {
  140. defer func() {
  141. if err != nil {
  142. go alarm_msg.SendAlarmMsg(fmt.Sprintf("同步图表信息至社区失败:Err:%v,ErrMsg:%s", err, errMsg), 3)
  143. }
  144. }()
  145. // 查询图表信息
  146. chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
  147. if err != nil {
  148. if err.Error() == utils.ErrNoRow() {
  149. errMsg = "图表不存在"
  150. err = fmt.Errorf(errMsg)
  151. return
  152. }
  153. errMsg = "获取图表信息失败"
  154. err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
  155. return
  156. }
  157. if chartInfo.ForumChartInfoId <= 0 {
  158. errMsg = "该图表未上传至社区"
  159. err = fmt.Errorf(errMsg)
  160. return
  161. }
  162. //查询图表主题
  163. //查询图表指标
  164. //获取原图表关联的指标信息列表
  165. chartMappingList, err := data_manage.GetChartMappingList(chartInfoId)
  166. if err != nil {
  167. errMsg = "获取图表关联的指标信息失败"
  168. err = fmt.Errorf("获取图表关联的指标信息失败,Err:" + err.Error())
  169. return
  170. }
  171. edbIds := make([]int, 0)
  172. for _, v := range chartMappingList {
  173. edbIds = append(edbIds, v.EdbInfoId)
  174. }
  175. var (
  176. edbInfoList []*data_manage.EdbInfo
  177. edbMappingList []*data_manage.EdbInfoCalculateMapping
  178. edbInfoDataList []*AddEdbDataReq
  179. )
  180. //查询指标详情
  181. edbInfoList, edbMappingList, edbInfoDataList, err = GetEdbListByEdbInfoId(edbIds)
  182. if err != nil {
  183. errMsg = "获取指标详情失败"
  184. err = fmt.Errorf("获取指标详情失败,Err:" + err.Error())
  185. return
  186. }
  187. req := new(ChartSaveLibReq)
  188. req.ChartInfo = chartInfo
  189. req.ChartInfo.ChartInfoId = chartInfo.ForumChartInfoId
  190. req.ChartEdbMapping = chartMappingList
  191. req.EdbInfoList = edbInfoList
  192. req.EdbInfoDataList = edbInfoDataList
  193. req.EdbInfoCalculateMapping = edbMappingList
  194. // 查询创建者信息
  195. creatorInfo, _ := system.GetSysAdminById(chartInfo.SysUserId)
  196. if creatorInfo != nil {
  197. req.CreatorInfo = creatorInfo
  198. }
  199. // 添加计算指标
  200. reqJson, err := json.Marshal(req)
  201. if err != nil {
  202. errMsg = "参数解析异常"
  203. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  204. return
  205. }
  206. respItem, err := ChartUpdateLib(string(reqJson))
  207. if err != nil {
  208. errMsg = "更新失败"
  209. err = fmt.Errorf("上传失败,Err:" + err.Error())
  210. return
  211. }
  212. if respItem.Ret != 200 {
  213. errMsg = "更新失败"
  214. err = fmt.Errorf(respItem.ErrMsg)
  215. return
  216. }
  217. return
  218. }
  219. func GetEdbListByEdbInfoId(edbInfoIds []int) (edbInfoList []*data_manage.EdbInfo, edbMappingList []*data_manage.EdbInfoCalculateMapping, edbInfoDataList []*AddEdbDataReq, err error) {
  220. //查询指标信息
  221. //查询指标映射
  222. //查询所有指标数据
  223. //查询这个指标相关的mapping信息放到数组里,
  224. //将得到的指标ID信息放到数组里
  225. hasFindMap := make(map[int]struct{})
  226. edbInfoIdMap := make(map[int]struct{})
  227. edbMappingList = make([]*data_manage.EdbInfoCalculateMapping, 0)
  228. edbMappingMap := make(map[int]struct{})
  229. for _, edbInfoId := range edbInfoIds {
  230. edbMappingList, err = traceEdbInfoByEdbInfoId(edbInfoId, hasFindMap, edbInfoIdMap, edbMappingList, edbMappingMap)
  231. if err != nil {
  232. err = fmt.Errorf(" traceEdbInfoByEdbInfoId err: %s", err.Error())
  233. return
  234. }
  235. }
  236. // 指标信息map
  237. edbInfoIdList := make([]int, 0)
  238. for k, _ := range edbInfoIdMap {
  239. edbInfoIdList = append(edbInfoIdList, k)
  240. }
  241. edbInfoList, err = data_manage.GetEdbInfoByIdList(edbInfoIdList)
  242. if err != nil {
  243. err = fmt.Errorf(" GetEdbInfoByIdList err: %s", err.Error())
  244. return
  245. }
  246. for _, v := range edbInfoList {
  247. var dataList []*data_manage.EdbDataBase
  248. if v.Source == utils.DATA_SOURCE_BUSINESS && utils.UseMongo {
  249. dataList, err = data_manage.GetEdbDataBaseMongoByEdbInfoId(v.EdbInfoId, v.Source, v.SubSource)
  250. } else if v.Source == utils.DATA_SOURCE_THS && v.SubSource == utils.DATA_SUB_SOURCE_HIGH_FREQUENCY && utils.UseMongo {
  251. dataList, err = data_manage.GetThsHfEdbDataBaseMongoByEdbInfoId(v.EdbInfoId, v.Source, v.SubSource)
  252. } else {
  253. dataList, err = data_manage.GetEdbDataBaseByEdbInfoId(v.EdbInfoId, v.Source, v.SubSource)
  254. }
  255. if err != nil {
  256. err = fmt.Errorf("查询指标数据失败 Err: %s", err.Error())
  257. return
  258. }
  259. tmp := new(AddEdbDataReq)
  260. tmp.EdbCode = v.EdbCode
  261. tmp.EdbType = v.EdbType
  262. tmp.DataList = dataList
  263. edbInfoDataList = append(edbInfoDataList, tmp)
  264. }
  265. return
  266. }
  267. // traceEdbInfoByEdbInfoId 指标追溯
  268. 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) {
  269. newEdbMappingList = edbMappingList
  270. _, ok := hasFindMap[edbInfoId]
  271. if ok {
  272. return
  273. }
  274. if _, ok1 := edbInfoIdMap[edbInfoId]; !ok1 {
  275. edbInfoIdMap[edbInfoId] = struct{}{}
  276. }
  277. edbInfoMappingList, e := data_manage.GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId)
  278. if e != nil {
  279. err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoId err: %s", e.Error())
  280. return
  281. }
  282. if len(edbInfoMappingList) > 0 {
  283. fromEdbInfoIdList := make([]int, 0)
  284. for _, v := range edbInfoMappingList {
  285. fromEdbInfoIdList = append(fromEdbInfoIdList, v.FromEdbInfoId)
  286. if _, ok1 := edbInfoIdMap[v.FromEdbInfoId]; !ok1 {
  287. edbInfoIdMap[v.FromEdbInfoId] = struct{}{}
  288. }
  289. if _, ok2 := edbMappingMap[v.EdbInfoCalculateMappingId]; !ok2 {
  290. edbMappingMap[v.EdbInfoCalculateMappingId] = struct{}{}
  291. tmp := &data_manage.EdbInfoCalculateMapping{
  292. EdbInfoCalculateMappingId: v.EdbInfoCalculateMappingId,
  293. EdbInfoId: v.EdbInfoId,
  294. Source: v.Source,
  295. SourceName: v.SourceName,
  296. EdbCode: v.EdbCode,
  297. FromEdbInfoId: v.FromEdbInfoId,
  298. FromEdbCode: v.FromEdbCode,
  299. FromEdbName: v.FromEdbName,
  300. FromSource: v.FromSource,
  301. FromSourceName: v.FromSourceName,
  302. FromTag: v.FromTag,
  303. Sort: v.Sort,
  304. CreateTime: v.CreateTime,
  305. ModifyTime: v.ModifyTime,
  306. }
  307. newEdbMappingList = append(newEdbMappingList, tmp)
  308. }
  309. if edbInfoId != v.FromEdbInfoId && (v.FromEdbType == 2 || v.FromEdbInfoType == 1) {
  310. // 查过了就不查了
  311. if _, ok2 := hasFindMap[v.FromEdbInfoId]; !ok2 {
  312. newEdbMappingList, e = traceEdbInfoByEdbInfoId(v.FromEdbInfoId, hasFindMap, edbInfoIdMap, newEdbMappingList, edbMappingMap)
  313. if e != nil {
  314. err = fmt.Errorf("traceEdbInfoByEdbInfoId err: %s", e.Error())
  315. return
  316. }
  317. }
  318. }
  319. hasFindMap[v.FromEdbInfoId] = struct{}{}
  320. }
  321. }
  322. hasFindMap[edbInfoId] = struct{}{}
  323. return
  324. }
  325. // DeleteChart 上传图表接口
  326. func DeleteChart(chartInfoId int) (err error, errMsg string) {
  327. // 查询图表信息
  328. chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
  329. if err != nil {
  330. if err.Error() == utils.ErrNoRow() {
  331. errMsg = "图表不存在"
  332. err = fmt.Errorf(errMsg)
  333. return
  334. }
  335. errMsg = "获取图表信息失败"
  336. err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
  337. return
  338. }
  339. if chartInfo.ForumChartInfoId <= 0 {
  340. errMsg = "该图表未上传至社区,无需撤回"
  341. err = fmt.Errorf(errMsg)
  342. return
  343. }
  344. req := new(DeleteChartReq)
  345. req.ChartInfoId = chartInfo.ForumChartInfoId
  346. // 添加计算指标
  347. reqJson, err := json.Marshal(req)
  348. if err != nil {
  349. errMsg = "参数解析异常"
  350. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  351. return
  352. }
  353. respItem, err := ChartDeleteLib(string(reqJson))
  354. if err != nil {
  355. errMsg = "撤回失败"
  356. err = fmt.Errorf("撤回失败,Err:" + err.Error())
  357. return
  358. }
  359. if respItem.Ret != 200 {
  360. errMsg = "撤回失败"
  361. err = fmt.Errorf(respItem.ErrMsg)
  362. return
  363. }
  364. // 更新社区返回的图表ID
  365. err = data_manage.SetForumChartInfoId(chartInfoId, 0)
  366. if err != nil {
  367. errMsg = "撤回失败"
  368. err = fmt.Errorf("更新图表ID失败,Err:" + err.Error())
  369. return
  370. }
  371. return
  372. }
  373. type AdminSaveReq struct {
  374. *system.Admin
  375. BusinessCode string `description:"商家编码"`
  376. }
  377. // 上传管理员信息
  378. func AdminSave(adminId int) (err error) {
  379. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  380. return
  381. }
  382. //查询用户信息
  383. adminInfo, err := system.GetSysAdminById(adminId)
  384. if err != nil {
  385. if err.Error() == utils.ErrNoRow() {
  386. err = fmt.Errorf("用户不存在")
  387. return
  388. }
  389. err = fmt.Errorf("获取用户信息失败,Err:" + err.Error())
  390. return
  391. }
  392. var req AdminSaveReq
  393. req.Admin = adminInfo
  394. req.BusinessCode = utils.BusinessCode
  395. reqJson, err := json.Marshal(req)
  396. if err != nil {
  397. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  398. return
  399. }
  400. respItem, err := AdminSaveLib(string(reqJson))
  401. if err != nil {
  402. err = fmt.Errorf("上传管理员信息失败,Err:" + err.Error())
  403. return
  404. }
  405. if respItem.Ret != 200 {
  406. err = fmt.Errorf("上传管理员信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
  407. return
  408. }
  409. return
  410. }
  411. type AdminDeleteReq struct {
  412. AdminName string
  413. BusinessCode string `description:"商家编码"`
  414. }
  415. // 上传管理员信息
  416. func AdminDelete(adminName string) (err error) {
  417. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  418. return
  419. }
  420. var req AdminDeleteReq
  421. req.AdminName = adminName
  422. req.BusinessCode = utils.BusinessCode
  423. reqJson, err := json.Marshal(req)
  424. if err != nil {
  425. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  426. return
  427. }
  428. respItem, err := AdminDeleteLib(string(reqJson))
  429. if err != nil {
  430. err = fmt.Errorf("删除管理员信息失败,Err:" + err.Error())
  431. return
  432. }
  433. if respItem.Ret != 200 {
  434. err = fmt.Errorf("删除管理员信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
  435. return
  436. }
  437. return
  438. }
  439. type ChartThemeReq struct {
  440. *chart_theme.ChartTheme
  441. BusinessCode string `description:"商家编码"`
  442. }
  443. // 上传主题信息
  444. func ChartThemeSave(theme *chart_theme.ChartTheme) (err error) {
  445. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  446. return
  447. }
  448. var req ChartThemeReq
  449. req.ChartTheme = theme
  450. req.BusinessCode = utils.BusinessCode
  451. reqJson, err := json.Marshal(req)
  452. if err != nil {
  453. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  454. return
  455. }
  456. respItem, err := ChartThemeSaveLib(string(reqJson))
  457. if err != nil {
  458. err = fmt.Errorf("上传图表主题信息失败,Err:" + err.Error())
  459. return
  460. }
  461. if respItem.Ret != 200 {
  462. err = fmt.Errorf("上传图表主题信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
  463. return
  464. }
  465. return
  466. }
  467. // ChartThemeTypeSave 上传主题类型信息
  468. func ChartThemeTypeSave(theme *chart_theme.ChartThemeType) (err error) {
  469. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  470. return
  471. }
  472. //req.BusinessCode = utils.BusinessCode
  473. reqJson, err := json.Marshal(theme)
  474. if err != nil {
  475. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  476. return
  477. }
  478. respItem, err := ChartThemeTypeSaveLib(string(reqJson))
  479. if err != nil {
  480. err = fmt.Errorf("上传图表主题信息失败,Err:" + err.Error())
  481. return
  482. }
  483. if respItem.Ret != 200 {
  484. err = fmt.Errorf("上传图表主题信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
  485. return
  486. }
  487. return
  488. }