chart_info.go 23 KB

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