chart_info.go 24 KB

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