eta_forum_hub.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  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/utils"
  7. "fmt"
  8. )
  9. type UploadChartToForumReq struct {
  10. ChartInfoId int `description:"图表ID"`
  11. Description string `description:"逻辑简述"`
  12. }
  13. type UpdateChartToForumReq struct {
  14. ChartInfoId int `description:"图表ID"`
  15. }
  16. type ChartSaveLibReq struct {
  17. ChartInfo *data_manage.ChartInfo
  18. Description string `description:"逻辑简述"`
  19. EdbInfoList []*data_manage.EdbInfo
  20. ChartThemeList []*chart_theme.ChartTheme
  21. EdbInfoDataList []*AddEdbDataReq
  22. ChartEdbMapping []*data_manage.ChartEdbMapping
  23. EdbInfoCalculateMapping []*data_manage.EdbInfoCalculateMapping
  24. }
  25. type ChartSaveLibResp struct {
  26. Ret int
  27. Msg string
  28. ErrMsg string
  29. ErrCode string
  30. Data *data_manage.AddChartInfoResp
  31. Success bool `description:"true 执行成功,false 执行失败"`
  32. IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
  33. IsAddLog bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
  34. }
  35. type AddEdbDataReq struct {
  36. EdbCode string
  37. DataList []*data_manage.EdbDataBase
  38. }
  39. type DeleteChartReq struct {
  40. ChartInfoId int `description:"图表id"`
  41. }
  42. // UploadChart 上传图表接口
  43. func UploadChart(chartInfoId int, description string) (err error, errMsg string) {
  44. // 查询图表信息
  45. chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
  46. if err != nil {
  47. if err.Error() == utils.ErrNoRow() {
  48. errMsg = "图表不存在"
  49. err = fmt.Errorf(errMsg)
  50. return
  51. }
  52. errMsg = "获取图表信息失败"
  53. err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
  54. return
  55. }
  56. if chartInfo.ForumChartInfoId > 0 {
  57. errMsg = "该图表已上传至社区,无法再次上传"
  58. err = fmt.Errorf(errMsg)
  59. return
  60. }
  61. //查询图表主题
  62. //查询图表指标
  63. //获取原图表关联的指标信息列表
  64. chartMappingList, err := data_manage.GetChartMappingList(chartInfoId)
  65. if err != nil {
  66. errMsg = "获取图表关联的指标信息失败"
  67. err = fmt.Errorf("获取图表关联的指标信息失败,Err:" + err.Error())
  68. return
  69. }
  70. edbIds := make([]int, 0)
  71. for _, v := range chartMappingList {
  72. edbIds = append(edbIds, v.EdbInfoId)
  73. }
  74. var (
  75. edbInfoList []*data_manage.EdbInfo
  76. edbMappingList []*data_manage.EdbInfoCalculateMapping
  77. edbInfoDataList []*AddEdbDataReq
  78. )
  79. //查询指标详情
  80. edbInfoList, edbMappingList, edbInfoDataList, err = GetEdbListByEdbInfoId(edbIds)
  81. if err != nil {
  82. errMsg = "获取指标详情失败"
  83. err = fmt.Errorf("获取指标详情失败,Err:" + err.Error())
  84. return
  85. }
  86. req := new(ChartSaveLibReq)
  87. req.ChartInfo = chartInfo
  88. req.ChartEdbMapping = chartMappingList
  89. req.EdbInfoList = edbInfoList
  90. req.EdbInfoDataList = edbInfoDataList
  91. req.EdbInfoCalculateMapping = edbMappingList
  92. req.Description = description
  93. // 添加计算指标
  94. reqJson, err := json.Marshal(req)
  95. if err != nil {
  96. errMsg = "参数解析异常"
  97. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  98. return
  99. }
  100. respItem, err := ChartSaveLib(string(reqJson))
  101. if err != nil {
  102. errMsg = "上传失败"
  103. err = fmt.Errorf("上传失败,Err:" + err.Error())
  104. return
  105. }
  106. if respItem.Ret != 200 {
  107. errMsg = "上传失败"
  108. err = fmt.Errorf(respItem.ErrMsg)
  109. return
  110. }
  111. if respItem.Data != nil && respItem.Data.ChartInfoId != 0 {
  112. // 更新社区返回的图表ID
  113. err = data_manage.SetForumChartInfoId(chartInfoId, respItem.Data.ChartInfoId)
  114. if err != nil {
  115. errMsg = "更新图表ID失败"
  116. err = fmt.Errorf("更新图表ID失败,Err:" + err.Error())
  117. return
  118. }
  119. }
  120. return
  121. }
  122. // UpdateChart 更新社区里的图表接口
  123. func UpdateChart(chartInfoId int) (err error, errMsg string) {
  124. // 查询图表信息
  125. chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
  126. if err != nil {
  127. if err.Error() == utils.ErrNoRow() {
  128. errMsg = "图表不存在"
  129. err = fmt.Errorf(errMsg)
  130. return
  131. }
  132. errMsg = "获取图表信息失败"
  133. err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
  134. return
  135. }
  136. if chartInfo.ForumChartInfoId <= 0 {
  137. errMsg = "该图表未上传至社区"
  138. err = fmt.Errorf(errMsg)
  139. return
  140. }
  141. //查询图表主题
  142. //查询图表指标
  143. //获取原图表关联的指标信息列表
  144. chartMappingList, err := data_manage.GetChartMappingList(chartInfoId)
  145. if err != nil {
  146. errMsg = "获取图表关联的指标信息失败"
  147. err = fmt.Errorf("获取图表关联的指标信息失败,Err:" + err.Error())
  148. return
  149. }
  150. edbIds := make([]int, 0)
  151. for _, v := range chartMappingList {
  152. edbIds = append(edbIds, v.EdbInfoId)
  153. }
  154. var (
  155. edbInfoList []*data_manage.EdbInfo
  156. edbMappingList []*data_manage.EdbInfoCalculateMapping
  157. edbInfoDataList []*AddEdbDataReq
  158. )
  159. //查询指标详情
  160. edbInfoList, edbMappingList, edbInfoDataList, err = GetEdbListByEdbInfoId(edbIds)
  161. if err != nil {
  162. errMsg = "获取指标详情失败"
  163. err = fmt.Errorf("获取指标详情失败,Err:" + err.Error())
  164. return
  165. }
  166. req := new(ChartSaveLibReq)
  167. req.ChartInfo = chartInfo
  168. req.ChartInfo.ChartInfoId = chartInfo.ForumChartInfoId
  169. req.ChartEdbMapping = chartMappingList
  170. req.EdbInfoList = edbInfoList
  171. req.EdbInfoDataList = edbInfoDataList
  172. req.EdbInfoCalculateMapping = edbMappingList
  173. // 添加计算指标
  174. reqJson, err := json.Marshal(req)
  175. if err != nil {
  176. errMsg = "参数解析异常"
  177. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  178. return
  179. }
  180. respItem, err := ChartUpdateLib(string(reqJson))
  181. if err != nil {
  182. errMsg = "更新失败"
  183. err = fmt.Errorf("上传失败,Err:" + err.Error())
  184. return
  185. }
  186. if respItem.Ret != 200 {
  187. errMsg = "更新失败"
  188. err = fmt.Errorf(respItem.ErrMsg)
  189. return
  190. }
  191. return
  192. }
  193. func GetEdbListByEdbInfoId(edbInfoIds []int) (edbInfoList []*data_manage.EdbInfo, edbMappingList []*data_manage.EdbInfoCalculateMapping, edbInfoDataList []*AddEdbDataReq, err error) {
  194. //查询指标信息
  195. //查询指标映射
  196. //查询所有指标数据
  197. //查询这个指标相关的mapping信息放到数组里,
  198. //将得到的指标ID信息放到数组里
  199. hasFindMap := make(map[int]struct{})
  200. edbInfoIdMap := make(map[int]struct{})
  201. edbMappingList = make([]*data_manage.EdbInfoCalculateMapping, 0)
  202. edbMappingMap := make(map[int]struct{})
  203. for _, edbInfoId := range edbInfoIds {
  204. edbMappingList, err = traceEdbInfoByEdbInfoId(edbInfoId, hasFindMap, edbInfoIdMap, edbMappingList, edbMappingMap)
  205. if err != nil {
  206. return
  207. }
  208. }
  209. // 指标信息map
  210. edbInfoIdList := make([]int, 0)
  211. for k, _ := range edbInfoIdMap {
  212. edbInfoIdList = append(edbInfoIdList, k)
  213. }
  214. edbInfoList, err = data_manage.GetEdbInfoByIdList(edbInfoIdList)
  215. if err != nil {
  216. err = fmt.Errorf("traceEdbInfoByEdbInfoId GetEdbInfoByIdList err: %s", err.Error())
  217. return
  218. }
  219. for _, v := range edbInfoList {
  220. dataList, e := data_manage.GetEdbDataBaseByEdbCode(v.EdbInfoId, v.Source, v.SubSource)
  221. if e != nil {
  222. err = fmt.Errorf("查询指标数据失败 Err: %s", e.Error())
  223. return
  224. }
  225. tmp := new(AddEdbDataReq)
  226. tmp.EdbCode = v.EdbCode
  227. tmp.DataList = dataList
  228. edbInfoDataList = append(edbInfoDataList, tmp)
  229. }
  230. return
  231. }
  232. // traceEdbInfoByEdbInfoId 指标追溯
  233. 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) {
  234. newEdbMappingList = edbMappingList
  235. _, ok := hasFindMap[edbInfoId]
  236. if ok {
  237. return
  238. }
  239. if _, ok1 := edbInfoIdMap[edbInfoId]; !ok1 {
  240. edbInfoIdMap[edbInfoId] = struct{}{}
  241. }
  242. edbInfoMappingList, e := data_manage.GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId)
  243. if e != nil {
  244. err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoId err: %s", e.Error())
  245. return
  246. }
  247. if len(edbInfoMappingList) > 0 {
  248. fromEdbInfoIdList := make([]int, 0)
  249. for _, v := range edbInfoMappingList {
  250. fromEdbInfoIdList = append(fromEdbInfoIdList, v.FromEdbInfoId)
  251. if _, ok1 := edbInfoIdMap[v.FromEdbInfoId]; !ok1 {
  252. edbInfoIdMap[v.FromEdbInfoId] = struct{}{}
  253. }
  254. if _, ok2 := edbMappingMap[v.EdbInfoCalculateMappingId]; !ok2 {
  255. edbMappingMap[v.EdbInfoCalculateMappingId] = struct{}{}
  256. tmp := &data_manage.EdbInfoCalculateMapping{
  257. EdbInfoCalculateMappingId: v.EdbInfoCalculateMappingId,
  258. EdbInfoId: v.EdbInfoId,
  259. Source: v.Source,
  260. SourceName: v.SourceName,
  261. EdbCode: v.EdbCode,
  262. FromEdbInfoId: v.FromEdbInfoId,
  263. FromEdbCode: v.FromEdbCode,
  264. FromEdbName: v.FromEdbName,
  265. FromSource: v.FromSource,
  266. FromSourceName: v.FromSourceName,
  267. FromTag: v.FromTag,
  268. Sort: v.Sort,
  269. CreateTime: v.CreateTime,
  270. ModifyTime: v.ModifyTime,
  271. }
  272. newEdbMappingList = append(newEdbMappingList, tmp)
  273. }
  274. if edbInfoId != v.FromEdbInfoId && (v.FromEdbType == 2 || v.FromEdbInfoType == 1) {
  275. // 查过了就不查了
  276. if _, ok2 := hasFindMap[v.FromEdbInfoId]; !ok2 {
  277. newEdbMappingList, e = traceEdbInfoByEdbInfoId(v.FromEdbInfoId, hasFindMap, edbInfoIdMap, newEdbMappingList, edbMappingMap)
  278. if e != nil {
  279. err = fmt.Errorf("traceEdbInfoByEdbInfoId err: %s", e.Error())
  280. return
  281. }
  282. }
  283. }
  284. hasFindMap[v.FromEdbInfoId] = struct{}{}
  285. }
  286. }
  287. hasFindMap[edbInfoId] = struct{}{}
  288. return
  289. }
  290. // DeleteChart 上传图表接口
  291. func DeleteChart(chartInfoId int) (err error, errMsg string) {
  292. // 查询图表信息
  293. chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
  294. if err != nil {
  295. if err.Error() == utils.ErrNoRow() {
  296. errMsg = "图表不存在"
  297. err = fmt.Errorf(errMsg)
  298. return
  299. }
  300. errMsg = "获取图表信息失败"
  301. err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
  302. return
  303. }
  304. if chartInfo.ForumChartInfoId <= 0 {
  305. errMsg = "该图表未上传至社区,无需撤回"
  306. err = fmt.Errorf(errMsg)
  307. return
  308. }
  309. req := new(DeleteChartReq)
  310. req.ChartInfoId = chartInfo.ForumChartInfoId
  311. // 添加计算指标
  312. reqJson, err := json.Marshal(req)
  313. if err != nil {
  314. errMsg = "参数解析异常"
  315. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  316. return
  317. }
  318. respItem, err := ChartDeleteLib(string(reqJson))
  319. if err != nil {
  320. errMsg = "撤回失败"
  321. err = fmt.Errorf("撤回失败,Err:" + err.Error())
  322. return
  323. }
  324. if respItem.Ret != 200 {
  325. errMsg = "撤回失败"
  326. err = fmt.Errorf(respItem.ErrMsg)
  327. return
  328. }
  329. // 更新社区返回的图表ID
  330. err = data_manage.SetForumChartInfoId(chartInfoId, 0)
  331. if err != nil {
  332. errMsg = "撤回失败"
  333. err = fmt.Errorf("更新图表ID失败,Err:" + err.Error())
  334. return
  335. }
  336. return
  337. }