eta_forum_hub.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  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 {
  249. dataList, err = data_manage.GetEdbDataBaseMongoByEdbInfoId(v.EdbInfoId, v.Source, v.SubSource)
  250. } else {
  251. dataList, err = data_manage.GetEdbDataBaseByEdbInfoId(v.EdbInfoId, v.Source, v.SubSource)
  252. }
  253. if err != nil {
  254. err = fmt.Errorf("查询指标数据失败 Err: %s", err.Error())
  255. return
  256. }
  257. tmp := new(AddEdbDataReq)
  258. tmp.EdbCode = v.EdbCode
  259. tmp.EdbType = v.EdbType
  260. tmp.DataList = dataList
  261. edbInfoDataList = append(edbInfoDataList, tmp)
  262. }
  263. return
  264. }
  265. // traceEdbInfoByEdbInfoId 指标追溯
  266. 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) {
  267. newEdbMappingList = edbMappingList
  268. _, ok := hasFindMap[edbInfoId]
  269. if ok {
  270. return
  271. }
  272. if _, ok1 := edbInfoIdMap[edbInfoId]; !ok1 {
  273. edbInfoIdMap[edbInfoId] = struct{}{}
  274. }
  275. edbInfoMappingList, e := data_manage.GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId)
  276. if e != nil {
  277. err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoId err: %s", e.Error())
  278. return
  279. }
  280. if len(edbInfoMappingList) > 0 {
  281. fromEdbInfoIdList := make([]int, 0)
  282. for _, v := range edbInfoMappingList {
  283. fromEdbInfoIdList = append(fromEdbInfoIdList, v.FromEdbInfoId)
  284. if _, ok1 := edbInfoIdMap[v.FromEdbInfoId]; !ok1 {
  285. edbInfoIdMap[v.FromEdbInfoId] = struct{}{}
  286. }
  287. if _, ok2 := edbMappingMap[v.EdbInfoCalculateMappingId]; !ok2 {
  288. edbMappingMap[v.EdbInfoCalculateMappingId] = struct{}{}
  289. tmp := &data_manage.EdbInfoCalculateMapping{
  290. EdbInfoCalculateMappingId: v.EdbInfoCalculateMappingId,
  291. EdbInfoId: v.EdbInfoId,
  292. Source: v.Source,
  293. SourceName: v.SourceName,
  294. EdbCode: v.EdbCode,
  295. FromEdbInfoId: v.FromEdbInfoId,
  296. FromEdbCode: v.FromEdbCode,
  297. FromEdbName: v.FromEdbName,
  298. FromSource: v.FromSource,
  299. FromSourceName: v.FromSourceName,
  300. FromTag: v.FromTag,
  301. Sort: v.Sort,
  302. CreateTime: v.CreateTime,
  303. ModifyTime: v.ModifyTime,
  304. }
  305. newEdbMappingList = append(newEdbMappingList, tmp)
  306. }
  307. if edbInfoId != v.FromEdbInfoId && (v.FromEdbType == 2 || v.FromEdbInfoType == 1) {
  308. // 查过了就不查了
  309. if _, ok2 := hasFindMap[v.FromEdbInfoId]; !ok2 {
  310. newEdbMappingList, e = traceEdbInfoByEdbInfoId(v.FromEdbInfoId, hasFindMap, edbInfoIdMap, newEdbMappingList, edbMappingMap)
  311. if e != nil {
  312. err = fmt.Errorf("traceEdbInfoByEdbInfoId err: %s", e.Error())
  313. return
  314. }
  315. }
  316. }
  317. hasFindMap[v.FromEdbInfoId] = struct{}{}
  318. }
  319. }
  320. hasFindMap[edbInfoId] = struct{}{}
  321. return
  322. }
  323. // DeleteChart 上传图表接口
  324. func DeleteChart(chartInfoId int) (err error, errMsg string) {
  325. // 查询图表信息
  326. chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
  327. if err != nil {
  328. if err.Error() == utils.ErrNoRow() {
  329. errMsg = "图表不存在"
  330. err = fmt.Errorf(errMsg)
  331. return
  332. }
  333. errMsg = "获取图表信息失败"
  334. err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
  335. return
  336. }
  337. if chartInfo.ForumChartInfoId <= 0 {
  338. errMsg = "该图表未上传至社区,无需撤回"
  339. err = fmt.Errorf(errMsg)
  340. return
  341. }
  342. req := new(DeleteChartReq)
  343. req.ChartInfoId = chartInfo.ForumChartInfoId
  344. // 添加计算指标
  345. reqJson, err := json.Marshal(req)
  346. if err != nil {
  347. errMsg = "参数解析异常"
  348. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  349. return
  350. }
  351. respItem, err := ChartDeleteLib(string(reqJson))
  352. if err != nil {
  353. errMsg = "撤回失败"
  354. err = fmt.Errorf("撤回失败,Err:" + err.Error())
  355. return
  356. }
  357. if respItem.Ret != 200 {
  358. errMsg = "撤回失败"
  359. err = fmt.Errorf(respItem.ErrMsg)
  360. return
  361. }
  362. // 更新社区返回的图表ID
  363. err = data_manage.SetForumChartInfoId(chartInfoId, 0)
  364. if err != nil {
  365. errMsg = "撤回失败"
  366. err = fmt.Errorf("更新图表ID失败,Err:" + err.Error())
  367. return
  368. }
  369. return
  370. }
  371. type AdminSaveReq struct {
  372. *system.Admin
  373. BusinessCode string `description:"商家编码"`
  374. }
  375. // 上传管理员信息
  376. func AdminSave(adminId int) (err error) {
  377. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  378. return
  379. }
  380. //查询用户信息
  381. adminInfo, err := system.GetSysAdminById(adminId)
  382. if err != nil {
  383. if err.Error() == utils.ErrNoRow() {
  384. err = fmt.Errorf("用户不存在")
  385. return
  386. }
  387. err = fmt.Errorf("获取用户信息失败,Err:" + err.Error())
  388. return
  389. }
  390. var req AdminSaveReq
  391. req.Admin = adminInfo
  392. req.BusinessCode = utils.BusinessCode
  393. reqJson, err := json.Marshal(req)
  394. if err != nil {
  395. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  396. return
  397. }
  398. respItem, err := AdminSaveLib(string(reqJson))
  399. if err != nil {
  400. err = fmt.Errorf("上传管理员信息失败,Err:" + err.Error())
  401. return
  402. }
  403. if respItem.Ret != 200 {
  404. err = fmt.Errorf("上传管理员信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
  405. return
  406. }
  407. return
  408. }
  409. type AdminDeleteReq struct {
  410. AdminName string
  411. BusinessCode string `description:"商家编码"`
  412. }
  413. // 上传管理员信息
  414. func AdminDelete(adminName string) (err error) {
  415. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  416. return
  417. }
  418. var req AdminDeleteReq
  419. req.AdminName = adminName
  420. req.BusinessCode = utils.BusinessCode
  421. reqJson, err := json.Marshal(req)
  422. if err != nil {
  423. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  424. return
  425. }
  426. respItem, err := AdminDeleteLib(string(reqJson))
  427. if err != nil {
  428. err = fmt.Errorf("删除管理员信息失败,Err:" + err.Error())
  429. return
  430. }
  431. if respItem.Ret != 200 {
  432. err = fmt.Errorf("删除管理员信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
  433. return
  434. }
  435. return
  436. }
  437. type ChartThemeReq struct {
  438. *chart_theme.ChartTheme
  439. BusinessCode string `description:"商家编码"`
  440. }
  441. // 上传主题信息
  442. func ChartThemeSave(theme *chart_theme.ChartTheme) (err error) {
  443. if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
  444. return
  445. }
  446. var req ChartThemeReq
  447. req.ChartTheme = theme
  448. req.BusinessCode = utils.BusinessCode
  449. reqJson, err := json.Marshal(req)
  450. if err != nil {
  451. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  452. return
  453. }
  454. respItem, err := ChartThemeSaveLib(string(reqJson))
  455. if err != nil {
  456. err = fmt.Errorf("上传图表主题信息失败,Err:" + err.Error())
  457. return
  458. }
  459. if respItem.Ret != 200 {
  460. err = fmt.Errorf("上传图表主题信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
  461. return
  462. }
  463. return
  464. }