chart_info.go 23 KB

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