chart_info.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729
  1. package services
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_forum_hub/models"
  6. "eta/eta_forum_hub/models/chart_collect"
  7. "eta/eta_forum_hub/models/system"
  8. "eta/eta_forum_hub/services/alarm_msg"
  9. "eta/eta_forum_hub/utils"
  10. "fmt"
  11. "sort"
  12. "strconv"
  13. "strings"
  14. "time"
  15. )
  16. // AddChartInfo 添加图表
  17. func AddChartInfo(req *models.AddChartReq, sysUserId int, sysUserRealName string) (chartInfo *models.ChartInfo, err error, errMsg string, isSendEmail bool) {
  18. defer func() {
  19. if err != nil {
  20. utils.FileLog.Info("添加图表失败, AddChartInfo Msg: " + errMsg + ", Err: " + err.Error())
  21. go alarm_msg.SendAlarmMsg("添加图表失败, AddChartInfo Msg: "+errMsg+", Err: "+err.Error(), 3)
  22. }
  23. }()
  24. isSendEmail = true // 默认错误的时候要发送邮件
  25. req.ChartInfo.ChartName = strings.Trim(req.ChartInfo.ChartName, " ")
  26. if req.ChartInfo.ChartName == "" {
  27. errMsg = "请填写图表名称!"
  28. err = errors.New(errMsg)
  29. isSendEmail = false
  30. return
  31. }
  32. //判断图表是否存在
  33. var condition string
  34. var pars []interface{}
  35. // todo 判断同一个平台上的图表是否重复
  36. condition += " AND chart_name=? AND source = ? "
  37. pars = append(pars, req.ChartInfo.ChartName, req.ChartInfo.Source)
  38. count, err := models.GetChartInfoCountByCondition(condition, pars)
  39. if err != nil {
  40. errMsg = "判断图表名称是否存在失败"
  41. err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
  42. return
  43. }
  44. if count > 0 {
  45. errMsg = "图表已存在"
  46. err = errors.New("图表已存在")
  47. isSendEmail = false
  48. return
  49. }
  50. // 添加指标数据
  51. err = BatchAddOrUpdateEdbData(req.EdbInfoDataList)
  52. if err != nil {
  53. errMsg = "添加指标数据失败"
  54. err = errors.New("添加指标数据失败,Err:" + err.Error())
  55. return
  56. }
  57. // 查询指标ID和指标编码之间的关系
  58. originEdbInfoIdMap := make(map[int]string)
  59. for _, v := range req.EdbInfoList {
  60. originEdbInfoIdMap[v.EdbInfoId] = v.EdbCode
  61. }
  62. // 添加关联指标
  63. var edbInfoIdArr []int
  64. edbInfoList := make([]*models.EdbInfo, 0)
  65. edbInfoList, err, errMsg, isSendEmail = BatchAddOrUpdateEdbInfo(req.EdbInfoList, req.EdbInfoCalculateMapping, sysUserId, sysUserRealName)
  66. if err != nil {
  67. errMsg = "添加关联指标失败"
  68. err = errors.New("添加关联指标失败,Err:" + err.Error())
  69. return
  70. }
  71. edbCodeMap := make(map[string]*models.EdbInfo, 0)
  72. for _, v := range edbInfoList {
  73. edbCodeMap[v.EdbCode] = v
  74. edbInfoIdArr = append(edbInfoIdArr, v.EdbInfoId)
  75. }
  76. // todo 批量新增指标
  77. sort.Ints(edbInfoIdArr)
  78. var edbInfoIdArrStr []string
  79. for _, v := range edbInfoIdArr {
  80. edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
  81. }
  82. edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
  83. chartInfo = new(models.ChartInfo)
  84. chartInfo.SysUserId = req.ChartInfo.SysUserId
  85. chartInfo.SysUserRealName = req.ChartInfo.SysUserRealName
  86. // 查询创建者信息
  87. if req.CreatorInfo != nil {
  88. creator, _ := system.GetAdminByAdminName(req.CreatorInfo.AdminName)
  89. if creator != nil {
  90. chartInfo.SysUserId = creator.AdminId
  91. chartInfo.SysUserRealName = creator.RealName
  92. }
  93. }
  94. // 查询上传者信息
  95. if req.UploaderInfo != nil {
  96. uploader, _ := system.GetAdminByAdminName(req.UploaderInfo.AdminName)
  97. if uploader != nil {
  98. chartInfo.UploadUserId = uploader.AdminId
  99. chartInfo.UploadUserRealName = uploader.RealName
  100. }
  101. }
  102. chartInfo.ChartName = req.ChartInfo.ChartName
  103. chartInfo.EdbInfoIds = edbInfoIdStr
  104. chartInfo.CreateTime = time.Now()
  105. chartInfo.ModifyTime = time.Now()
  106. chartInfo.IsSetName = req.ChartInfo.IsSetName
  107. //timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  108. // todo 是否需要单独生成一个指标图表序列ID
  109. //chartInfo.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
  110. chartInfo.UniqueCode = req.ChartInfo.UniqueCode
  111. chartInfo.DateType = req.ChartInfo.DateType
  112. chartInfo.ChartType = req.ChartInfo.ChartType
  113. calendar := req.ChartInfo.Calendar
  114. chartInfo.Calendar = calendar
  115. chartInfo.StartDate = req.ChartInfo.StartDate
  116. chartInfo.EndDate = req.ChartInfo.EndDate
  117. chartInfo.SeasonStartDate = req.ChartInfo.StartDate
  118. chartInfo.SeasonEndDate = req.ChartInfo.EndDate
  119. chartInfo.LeftMin = req.ChartInfo.LeftMin
  120. chartInfo.LeftMax = req.ChartInfo.LeftMax
  121. chartInfo.RightMin = req.ChartInfo.RightMin
  122. chartInfo.RightMax = req.ChartInfo.RightMax
  123. chartInfo.Right2Min = req.ChartInfo.Right2Min
  124. chartInfo.Right2Max = req.ChartInfo.Right2Max
  125. chartInfo.MinMaxSave = req.ChartInfo.MinMaxSave
  126. chartInfo.Disabled = req.ChartInfo.Disabled
  127. chartInfo.BarConfig = req.ChartInfo.BarConfig
  128. chartInfo.ExtraConfig = req.ChartInfo.ExtraConfig
  129. chartInfo.SeasonExtraConfig = req.ChartInfo.SeasonExtraConfig
  130. chartInfo.StartYear = req.ChartInfo.StartYear
  131. chartInfo.Source = req.ChartInfo.Source
  132. chartInfo.ChartThemeId = req.ChartInfo.ChartThemeId
  133. chartInfo.SourcesFrom = req.ChartInfo.SourcesFrom
  134. chartInfo.Instructions = req.ChartInfo.Instructions
  135. chartInfo.MarkersLines = req.ChartInfo.MarkersLines
  136. chartInfo.MarkersAreas = req.ChartInfo.MarkersAreas
  137. chartInfo.Unit = req.ChartInfo.Unit
  138. chartInfo.UnitEn = req.ChartInfo.UnitEn
  139. chartInfo.Description = req.Description
  140. chartInfo.ChartImage = req.ChartInfo.ChartImage
  141. /*newId, err := models.AddChartInfo(chartInfo)
  142. if err != nil {
  143. errMsg = `保存失败`
  144. err = errors.New("保存失败,Err:" + err.Error())
  145. return
  146. }
  147. chartInfo.ChartInfoId = int(newId)*/
  148. // todo 先整理好指标信息,生成指标ID,再将图表和指标ID进行绑定
  149. chartEdbInfoList := req.ChartEdbMapping
  150. mapList := make([]*models.ChartEdbMapping, 0)
  151. newEdbInfoIdMap := make(map[int]int) // ETA系统和ETA社区指标ID的映射关系
  152. for _, v := range chartEdbInfoList {
  153. mapItem := new(models.ChartEdbMapping)
  154. //mapItem.ChartInfoId = int(newId)
  155. edbCode, ok := originEdbInfoIdMap[v.EdbInfoId]
  156. if !ok {
  157. err = fmt.Errorf("指标代码不存在,EdbCode:%s", v.EdbCode)
  158. errMsg = "指标代码不存在"
  159. return
  160. }
  161. edbBase, ok := edbCodeMap[edbCode]
  162. if !ok {
  163. err = fmt.Errorf("指标代码不存在,EdbCode:%s", v.EdbCode)
  164. errMsg = "指标代码不存在"
  165. return
  166. }
  167. mapItem.EdbInfoId = edbBase.EdbInfoId
  168. mapItem.CreateTime = time.Now()
  169. mapItem.ModifyTime = time.Now()
  170. //timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  171. //mapItem.UniqueCode = utils.MD5(fmt.Sprint(utils.CHART_PREFIX, "_", edbBase.EdbInfoId, "_", timestamp))
  172. mapItem.UniqueCode = v.UniqueCode
  173. mapItem.MaxData = v.MaxData
  174. mapItem.MinData = v.MinData
  175. mapItem.IsOrder = v.IsOrder
  176. mapItem.IsAxis = v.IsAxis
  177. mapItem.EdbInfoType = v.EdbInfoType
  178. mapItem.LeadValue = v.LeadValue
  179. mapItem.LeadUnit = v.LeadUnit
  180. mapItem.ChartStyle = v.ChartStyle
  181. mapItem.ChartColor = v.ChartColor
  182. mapItem.PredictChartColor = v.PredictChartColor
  183. mapItem.ChartWidth = v.ChartWidth
  184. mapItem.Source = v.Source
  185. mapItem.EdbAliasName = v.EdbAliasName
  186. mapItem.IsConvert = v.IsConvert
  187. mapItem.ConvertType = v.ConvertType
  188. mapItem.ConvertValue = v.ConvertValue
  189. mapItem.ConvertUnit = v.ConvertUnit
  190. mapItem.ConvertEnUnit = v.ConvertEnUnit
  191. mapItem.EdbCode = edbCode
  192. mapList = append(mapList, mapItem)
  193. newEdbInfoIdMap[v.EdbInfoId] = mapItem.EdbInfoId
  194. }
  195. if len(mapList) <= 0 {
  196. errMsg = `图表指标映射不能为空`
  197. err = errors.New("图表指标映射不能为空")
  198. return
  199. }
  200. /*err = models.AddChartEdbMapping(mapList)
  201. if err != nil {
  202. errMsg = `保存失败`
  203. err = errors.New("保存失败,Err:" + err.Error())
  204. return
  205. }*/
  206. extraConfig := chartInfo.ExtraConfig
  207. barConfig := chartInfo.BarConfig
  208. updateExtraConfigFlag := false
  209. //更新图表配置里的config信息
  210. e, _ := transferChartConfigEdbInfoId(chartInfo, newEdbInfoIdMap)
  211. if e == nil {
  212. //更新图表的特殊字段
  213. if chartInfo.ExtraConfig != extraConfig || chartInfo.BarConfig != barConfig {
  214. updateExtraConfigFlag = true
  215. /*err = chartInfo.Update([]string{"ExtraConfig", "BarConfig"})
  216. if err != nil {
  217. errMsg = `保存失败`
  218. err = errors.New("保存图表配置失败,Err:" + err.Error())
  219. return
  220. }*/
  221. }
  222. }
  223. err = models.AddChartInfoAndMapping(chartInfo, mapList, updateExtraConfigFlag)
  224. if err != nil {
  225. errMsg = `保存失败`
  226. err = errors.New("保存图表失败,Err:" + err.Error())
  227. return
  228. }
  229. if chartInfo.ChartType == utils.CHART_TYPE_SECTION_COMBINE {
  230. err = models.AddChartSeriesAndEdbMapping(req.ChartSeries, req.ChartSeriesEdbMapping, chartInfo.ChartInfoId, newEdbInfoIdMap)
  231. if err != nil {
  232. errMsg = `保存失败`
  233. err = errors.New("保存失败,Err:" + err.Error())
  234. return
  235. }
  236. }
  237. //添加es数据
  238. go EsAddOrEditChartInfo(chartInfo.ChartInfoId)
  239. return
  240. }
  241. // UpdateChartInfoAndEdbInfo 刷新图表信息和指标信息
  242. func UpdateChartInfoAndEdbInfo(req *models.AddChartReq, sysUserId int, sysUserRealName string) (chartInfo *models.ChartInfo, err error, errMsg string, isSendEmail bool) {
  243. defer func() {
  244. if err != nil {
  245. utils.FileLog.Info("刷新图表信息和指标信息失败, AddChartInfo Msg: " + errMsg + ", Err: " + err.Error())
  246. go alarm_msg.SendAlarmMsg("刷新图表信息和指标信息失败, AddChartInfo Msg: "+errMsg+", Err: "+err.Error(), 3)
  247. }
  248. }()
  249. isSendEmail = true // 默认错误的时候要发送邮件
  250. req.ChartInfo.ChartName = strings.Trim(req.ChartInfo.ChartName, " ")
  251. if req.ChartInfo.ChartName == "" {
  252. errMsg = "请填写图表名称!"
  253. err = errors.New(errMsg)
  254. isSendEmail = false
  255. return
  256. }
  257. chartInfo, err = models.GetChartInfoById(req.ChartInfo.ChartInfoId)
  258. if err != nil {
  259. if err.Error() == utils.ErrNoRow() {
  260. errMsg = "图表已被删除,请刷新页面"
  261. err = errors.New(errMsg)
  262. isSendEmail = false
  263. return
  264. }
  265. errMsg = "获取图表信息失败"
  266. err = errors.New("获取图表信息失败,Err:" + err.Error())
  267. return
  268. }
  269. //判断图表是否存在
  270. var condition string
  271. var pars []interface{}
  272. // todo 判断同一个平台上的图表是否重复
  273. condition += " AND chart_name=? AND source = ? AND chart_info_id<>? "
  274. pars = append(pars, req.ChartInfo.ChartName, req.ChartInfo.Source, req.ChartInfo.ChartInfoId)
  275. count, err := models.GetChartInfoCountByCondition(condition, pars)
  276. if err != nil {
  277. errMsg = "判断图表名称是否存在失败"
  278. err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
  279. return
  280. }
  281. if count > 0 {
  282. errMsg = "图表已存在"
  283. err = errors.New("图表已存在")
  284. isSendEmail = false
  285. return
  286. }
  287. // 添加指标数据
  288. err = BatchAddOrUpdateEdbData(req.EdbInfoDataList)
  289. if err != nil {
  290. errMsg = "添加指标数据失败"
  291. err = errors.New("添加指标数据失败,Err:" + err.Error())
  292. return
  293. }
  294. // 查询指标ID和指标编码之间的关系
  295. originEdbInfoIdMap := make(map[int]string)
  296. for _, v := range req.EdbInfoList {
  297. originEdbInfoIdMap[v.EdbInfoId] = v.EdbCode
  298. }
  299. // 添加关联指标
  300. var edbInfoIdArr []int
  301. edbInfoList := make([]*models.EdbInfo, 0)
  302. edbInfoList, err, errMsg, isSendEmail = BatchAddOrUpdateEdbInfo(req.EdbInfoList, req.EdbInfoCalculateMapping, sysUserId, sysUserRealName)
  303. if err != nil {
  304. errMsg = "添加关联指标失败"
  305. err = errors.New("添加关联指标失败,Err:" + err.Error())
  306. return
  307. }
  308. edbCodeMap := make(map[string]*models.EdbInfo, 0)
  309. for _, v := range edbInfoList {
  310. edbCodeMap[v.EdbCode] = v
  311. edbInfoIdArr = append(edbInfoIdArr, v.EdbInfoId)
  312. }
  313. // todo 批量新增指标
  314. sort.Ints(edbInfoIdArr)
  315. var edbInfoIdArrStr []string
  316. for _, v := range edbInfoIdArr {
  317. edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
  318. }
  319. edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
  320. chartInfo.ChartName = req.ChartInfo.ChartName
  321. chartInfo.EdbInfoIds = edbInfoIdStr
  322. chartInfo.ModifyTime = time.Now()
  323. chartInfo.IsSetName = req.ChartInfo.IsSetName
  324. chartInfo.DateType = req.ChartInfo.DateType
  325. chartInfo.ChartType = req.ChartInfo.ChartType
  326. calendar := req.ChartInfo.Calendar
  327. chartInfo.Calendar = calendar
  328. chartInfo.StartDate = req.ChartInfo.StartDate
  329. chartInfo.EndDate = req.ChartInfo.EndDate
  330. chartInfo.SeasonStartDate = req.ChartInfo.StartDate
  331. chartInfo.SeasonEndDate = req.ChartInfo.EndDate
  332. chartInfo.LeftMin = req.ChartInfo.LeftMin
  333. chartInfo.LeftMax = req.ChartInfo.LeftMax
  334. chartInfo.RightMin = req.ChartInfo.RightMin
  335. chartInfo.RightMax = req.ChartInfo.RightMax
  336. chartInfo.Right2Min = req.ChartInfo.Right2Min
  337. chartInfo.Right2Max = req.ChartInfo.Right2Max
  338. chartInfo.MinMaxSave = req.ChartInfo.MinMaxSave
  339. chartInfo.Disabled = req.ChartInfo.Disabled
  340. chartInfo.BarConfig = req.ChartInfo.BarConfig
  341. chartInfo.ExtraConfig = req.ChartInfo.ExtraConfig
  342. chartInfo.SeasonExtraConfig = req.ChartInfo.SeasonExtraConfig
  343. chartInfo.StartYear = req.ChartInfo.StartYear
  344. chartInfo.Source = req.ChartInfo.Source
  345. chartInfo.ChartThemeId = req.ChartInfo.ChartThemeId
  346. chartInfo.SourcesFrom = req.ChartInfo.SourcesFrom
  347. chartInfo.Instructions = req.ChartInfo.Instructions
  348. chartInfo.MarkersLines = req.ChartInfo.MarkersLines
  349. chartInfo.MarkersAreas = req.ChartInfo.MarkersAreas
  350. chartInfo.Unit = req.ChartInfo.Unit
  351. chartInfo.UnitEn = req.ChartInfo.UnitEn
  352. chartInfo.ChartImage = req.ChartInfo.ChartImage
  353. chartInfo.SysUserId = req.ChartInfo.SysUserId
  354. chartInfo.SysUserRealName = req.ChartInfo.SysUserRealName
  355. // 查询创建者信息
  356. if req.CreatorInfo != nil {
  357. creator, _ := system.GetAdminByAdminName(req.CreatorInfo.AdminName)
  358. if creator != nil {
  359. chartInfo.SysUserId = creator.AdminId
  360. chartInfo.SysUserRealName = creator.RealName
  361. }
  362. }
  363. /*err = chartInfo.Update([]string{})
  364. if err != nil {
  365. errMsg = `更新失败`
  366. err = errors.New("更新失败,Err:" + err.Error())
  367. return
  368. }*/
  369. // 处理映射,已存在的映射直接更新,不存在的映射再新增,同时删除旧的映射关系
  370. oldChartEdbMappingList, err := models.GetChartEdbMappingListV2(chartInfo.ChartInfoId)
  371. oldMappingIdMap := make(map[string]*models.ChartEdbMapping)
  372. removeMapping := make(map[int]struct{})
  373. for _, v := range oldChartEdbMappingList {
  374. name := fmt.Sprintf("%s-%d", v.EdbCode, v.Source)
  375. oldMappingIdMap[name] = v
  376. removeMapping[v.ChartEdbMappingId] = struct{}{}
  377. }
  378. // todo 先整理好指标信息,生成指标ID,再将图表和指标ID进行绑定
  379. chartEdbInfoList := req.ChartEdbMapping
  380. addMappingList := make([]*models.ChartEdbMapping, 0)
  381. updateMappingList := make([]*models.ChartEdbMapping, 0)
  382. newEdbInfoIdMap := make(map[int]int) // ETA系统和ETA社区指标ID的映射关系
  383. for _, v := range chartEdbInfoList {
  384. mapItem := new(models.ChartEdbMapping)
  385. mapItem.ChartInfoId = chartInfo.ChartInfoId
  386. edbCode, ok := originEdbInfoIdMap[v.EdbInfoId]
  387. if !ok {
  388. err = fmt.Errorf("指标代码不存在,EdbCode:%s", v.EdbCode)
  389. errMsg = "指标代码不存在"
  390. return
  391. }
  392. edbBase, ok := edbCodeMap[edbCode]
  393. if !ok {
  394. err = fmt.Errorf("指标代码不存在,EdbCode:%s", v.EdbCode)
  395. errMsg = "指标代码不存在"
  396. return
  397. }
  398. // 判断是否已经存在映射关系
  399. existName := fmt.Sprintf("%s-%d", edbCode, v.Source)
  400. if oldMapping, ok1 := oldMappingIdMap[existName]; ok1 {
  401. //更新映射关系
  402. mapItem = oldMapping
  403. mapItem.ModifyTime = time.Now()
  404. mapItem.MaxData = v.MaxData
  405. mapItem.MinData = v.MinData
  406. mapItem.IsOrder = v.IsOrder
  407. mapItem.IsAxis = v.IsAxis
  408. mapItem.EdbInfoType = v.EdbInfoType
  409. mapItem.LeadValue = v.LeadValue
  410. mapItem.LeadUnit = v.LeadUnit
  411. mapItem.ChartStyle = v.ChartStyle
  412. mapItem.ChartColor = v.ChartColor
  413. mapItem.PredictChartColor = v.PredictChartColor
  414. mapItem.ChartWidth = v.ChartWidth
  415. mapItem.Source = v.Source
  416. mapItem.EdbAliasName = v.EdbAliasName
  417. mapItem.IsConvert = v.IsConvert
  418. mapItem.ConvertType = v.ConvertType
  419. mapItem.ConvertValue = v.ConvertValue
  420. mapItem.ConvertUnit = v.ConvertUnit
  421. mapItem.ConvertEnUnit = v.ConvertEnUnit
  422. mapItem.EdbCode = edbCode
  423. /*err = mapItem.Update([]string{})
  424. if err != nil {
  425. errMsg = `更新失败`
  426. err = errors.New("更新图表指标映射关系失败,Err:" + err.Error())
  427. return
  428. }*/
  429. updateMappingList = append(updateMappingList, mapItem)
  430. delete(removeMapping, mapItem.ChartEdbMappingId)
  431. } else {
  432. mapItem.EdbInfoId = edbBase.EdbInfoId
  433. mapItem.CreateTime = time.Now()
  434. mapItem.ModifyTime = time.Now()
  435. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  436. mapItem.UniqueCode = utils.MD5(fmt.Sprint(utils.CHART_PREFIX, "_", edbBase.EdbInfoId, "_", timestamp))
  437. mapItem.MaxData = v.MaxData
  438. mapItem.MinData = v.MinData
  439. mapItem.IsOrder = v.IsOrder
  440. mapItem.IsAxis = v.IsAxis
  441. mapItem.EdbInfoType = v.EdbInfoType
  442. mapItem.LeadValue = v.LeadValue
  443. mapItem.LeadUnit = v.LeadUnit
  444. mapItem.ChartStyle = v.ChartStyle
  445. mapItem.ChartColor = v.ChartColor
  446. mapItem.PredictChartColor = v.PredictChartColor
  447. mapItem.ChartWidth = v.ChartWidth
  448. mapItem.Source = v.Source
  449. mapItem.EdbAliasName = v.EdbAliasName
  450. mapItem.IsConvert = v.IsConvert
  451. mapItem.ConvertType = v.ConvertType
  452. mapItem.ConvertValue = v.ConvertValue
  453. mapItem.ConvertUnit = v.ConvertUnit
  454. mapItem.ConvertEnUnit = v.ConvertEnUnit
  455. mapItem.EdbCode = edbCode
  456. addMappingList = append(addMappingList, mapItem)
  457. }
  458. newEdbInfoIdMap[v.EdbInfoId] = mapItem.EdbInfoId
  459. }
  460. /*if len(addMappingList) > 0 {
  461. err = models.AddChartEdbMapping(addMappingList)
  462. if err != nil {
  463. errMsg = `保存失败`
  464. err = errors.New("保存失败,Err:" + err.Error())
  465. return
  466. }
  467. }*/
  468. // 删除原先的绑定关系
  469. removeIdStr := ""
  470. if len(removeMapping) > 0 {
  471. removeIdList := make([]string, 0) //需要移除的日期
  472. for k, _ := range removeMapping {
  473. removeIdList = append(removeIdList, fmt.Sprint(k))
  474. }
  475. removeIdStr = strings.Join(removeIdList, `","`)
  476. removeIdStr = `"` + removeIdStr + `"`
  477. /*err = models.DeleteChartEdbMappingByChartEdbMappingId(removeIdStr)
  478. if err != nil {
  479. errMsg = `删除失败`
  480. err = errors.New("删除失败,Err:" + err.Error())
  481. return
  482. }*/
  483. }
  484. extraConfig := chartInfo.ExtraConfig
  485. barConfig := chartInfo.BarConfig
  486. updateExtraConfigFlag := false
  487. //更新图表配置里的config信息
  488. e, _ := transferChartConfigEdbInfoId(chartInfo, newEdbInfoIdMap)
  489. if e == nil {
  490. //更新图表的特殊字段
  491. if chartInfo.ExtraConfig != extraConfig || chartInfo.BarConfig != barConfig {
  492. updateExtraConfigFlag = true
  493. /*err = chartInfo.Update([]string{"ExtraConfig", "BarConfig"})
  494. if err != nil {
  495. errMsg = `保存失败`
  496. err = errors.New("保存图表配置失败,Err:" + err.Error())
  497. return
  498. }*/
  499. }
  500. }
  501. err = models.ModifyChartInfoAndMapping(chartInfo, addMappingList, updateMappingList, removeIdStr, updateExtraConfigFlag)
  502. if err != nil {
  503. errMsg = `保存失败`
  504. err = errors.New("保存图表配置失败,Err:" + err.Error())
  505. return
  506. }
  507. if chartInfo.ChartType == utils.CHART_TYPE_SECTION_COMBINE {
  508. err = models.EditChartSeriesAndEdbMapping(req.ChartSeries, req.ChartSeriesEdbMapping, chartInfo.ChartInfoId, newEdbInfoIdMap)
  509. if err != nil {
  510. errMsg = "保存失败"
  511. err = errors.New("保存失败,Err:" + err.Error())
  512. return
  513. }
  514. }
  515. //添加es数据
  516. go EsAddOrEditChartInfo(chartInfo.ChartInfoId)
  517. go EsAddOrEditChartCollectByChartInfoId(chartInfo.ChartInfoId)
  518. return
  519. }
  520. // 删除图表信息
  521. func DeleteChart(chartInfoId int) (err error, errMsg string) {
  522. //删除图表
  523. chartInfo, err := models.GetChartInfoById(chartInfoId)
  524. if err != nil {
  525. if err.Error() == utils.ErrNoRow() {
  526. errMsg = "图表已删除,请刷新页面"
  527. err = fmt.Errorf("图表不存在,Err:" + err.Error())
  528. return
  529. } else {
  530. errMsg = "删除失败"
  531. err = fmt.Errorf("删除失败, 获取图表信息失败Err:" + err.Error())
  532. return
  533. }
  534. }
  535. if chartInfo == nil {
  536. errMsg = "图表已删除,请刷新页面"
  537. err = fmt.Errorf(errMsg)
  538. return
  539. }
  540. // 处理映射,已存在的映射直接更新,不存在的映射再新增,同时删除旧的映射关系
  541. oldChartEdbMappingList, err := models.GetChartEdbMappingListV2(chartInfo.ChartInfoId)
  542. edbInfoIds := make([]int, 0)
  543. for _, v := range oldChartEdbMappingList {
  544. edbInfoIds = append(edbInfoIds, v.EdbInfoId)
  545. }
  546. //删除图表及关联指标
  547. err = models.DeleteChartInfoAndData(chartInfo.ChartInfoId)
  548. if err != nil {
  549. errMsg = "删除失败"
  550. err = fmt.Errorf("删除图表数据失败, Err:" + err.Error())
  551. return
  552. }
  553. if chartInfo.ChartType == utils.CHART_TYPE_SECTION_COMBINE {
  554. err = models.DeleteChartSeriesAndEdbMapping(chartInfo.ChartInfoId)
  555. if err != nil {
  556. errMsg = "删除失败"
  557. err = fmt.Errorf("删除图表系列数据失败, Err:" + err.Error())
  558. return
  559. }
  560. }
  561. err, errMsg = BatchDeleteEdbInfo(edbInfoIds)
  562. if err != nil {
  563. errMsg = "删除失败"
  564. err = fmt.Errorf("删除指标数据失败, Err:" + err.Error())
  565. return
  566. }
  567. go EsDeleteChartInfo(chartInfo.ChartInfoId)
  568. go func() {
  569. var e error
  570. defer func() {
  571. if e != nil {
  572. utils.FileLog.Info("删除图表收藏数据失败, Err:" + e.Error())
  573. }
  574. }()
  575. // 查询所有的收藏图表数据
  576. userChartCollect := make([]string, 0)
  577. chartCollectList, e := chart_collect.GetChartCollectListByChartInfoId(chartInfo.ChartInfoId)
  578. if e != nil {
  579. e = fmt.Errorf("查询图表收藏数据失败, Err:" + e.Error())
  580. return
  581. }
  582. for _, v := range chartCollectList {
  583. userChartCollect = append(userChartCollect, fmt.Sprintf("%d_%d", v.UserId, v.ChartInfoId))
  584. }
  585. if len(userChartCollect) > 0 {
  586. EsDeleteChartCollectByChartInfoIdUserIds(userChartCollect)
  587. }
  588. }()
  589. return
  590. }
  591. func transferChartConfigEdbInfoId(chartInfo *models.ChartInfo, newEdbInfoIdMap map[int]int) (err error, errMsg string) {
  592. chartType := chartInfo.ChartType
  593. switch chartType {
  594. case 7: // 柱形图
  595. var barConfig models.BarChartInfoReq
  596. if chartInfo.BarConfig == `` {
  597. errMsg = "柱方图未配置"
  598. err = errors.New(errMsg)
  599. return
  600. }
  601. err = json.Unmarshal([]byte(chartInfo.BarConfig), &barConfig)
  602. if err != nil {
  603. errMsg = "柱方图配置异常"
  604. err = errors.New(errMsg)
  605. return
  606. }
  607. //替换里面的edbInfoId
  608. for i := 0; i < len(barConfig.EdbInfoIdList); i++ {
  609. if newId, ok := newEdbInfoIdMap[barConfig.EdbInfoIdList[i].EdbInfoId]; ok {
  610. barConfig.EdbInfoIdList[i].EdbInfoId = newId
  611. }
  612. }
  613. for i := 0; i < len(barConfig.XEdbList); i++ {
  614. if newId, ok := newEdbInfoIdMap[barConfig.XEdbList[i].EdbInfoId]; ok {
  615. barConfig.XEdbList[i].EdbInfoId = newId
  616. }
  617. }
  618. for i := 0; i < len(barConfig.YEdbList); i++ {
  619. if newId, ok := newEdbInfoIdMap[barConfig.YEdbList[i].EdbInfoId]; ok {
  620. barConfig.YEdbList[i].EdbInfoId = newId
  621. }
  622. }
  623. configStr, e := json.Marshal(barConfig)
  624. if e != nil {
  625. errMsg = "柱方图配置异常"
  626. err = errors.New(errMsg + "json.Marshal 失败" + e.Error())
  627. return
  628. }
  629. chartInfo.BarConfig = string(configStr)
  630. return
  631. case 10: // 截面散点图
  632. var tmpExtraConfig models.SectionScatterReq
  633. if chartInfo.ExtraConfig == `` {
  634. errMsg = "截面散点图未配置"
  635. err = errors.New(errMsg)
  636. return
  637. }
  638. err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &tmpExtraConfig)
  639. if err != nil {
  640. errMsg = "截面散点配置异常"
  641. err = errors.New(errMsg)
  642. return
  643. }
  644. //替换里面的edbInfoId
  645. for i := 0; i < len(tmpExtraConfig.SeriesList); i++ {
  646. for j := 0; j < len(tmpExtraConfig.SeriesList[i].EdbInfoList); j++ {
  647. if newId, ok := newEdbInfoIdMap[tmpExtraConfig.SeriesList[i].EdbInfoList[j].XEdbInfoId]; ok {
  648. tmpExtraConfig.SeriesList[i].EdbInfoList[j].XEdbInfoId = newId
  649. }
  650. if newId, ok := newEdbInfoIdMap[tmpExtraConfig.SeriesList[i].EdbInfoList[j].YEdbInfoId]; ok {
  651. tmpExtraConfig.SeriesList[i].EdbInfoList[j].YEdbInfoId = newId
  652. }
  653. }
  654. }
  655. configStr, e := json.Marshal(tmpExtraConfig)
  656. if e != nil {
  657. errMsg = "截面散点配置异常"
  658. err = errors.New(errMsg + "json.Marshal 失败" + e.Error())
  659. return
  660. }
  661. chartInfo.ExtraConfig = string(configStr)
  662. return
  663. case utils.CHART_TYPE_SECTION_COMBINE:
  664. // 预览和详情都走这个接口
  665. var sectionExtraConfig models.ChartSectionAllExtraConf
  666. err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &sectionExtraConfig)
  667. if err != nil {
  668. errMsg = "截面组合图配置异常"
  669. err = errors.New(errMsg)
  670. return
  671. }
  672. //替换里面的edbInfoId
  673. for i := 0; i < len(sectionExtraConfig.DateConfList); i++ {
  674. if newId, ok := newEdbInfoIdMap[sectionExtraConfig.DateConfList[i].EdbInfoId]; ok {
  675. sectionExtraConfig.DateConfList[i].EdbInfoId = newId
  676. }
  677. }
  678. configStr, e := json.Marshal(sectionExtraConfig)
  679. if e != nil {
  680. errMsg = "截面组合图配置异常"
  681. err = errors.New(errMsg + "json.Marshal 失败" + e.Error())
  682. return
  683. }
  684. chartInfo.ExtraConfig = string(configStr)
  685. }
  686. return
  687. }