chart_info.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. package services
  2. import (
  3. "errors"
  4. "eta/eta_forum_admin/models"
  5. "eta/eta_forum_admin/utils"
  6. "fmt"
  7. "sort"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. // AddChartInfo 添加图表
  13. func AddChartInfo(req *models.AddChartReq, sysUserId int, sysUserRealName string) (chartInfo *models.ChartInfo, err error, errMsg string, isSendEmail bool) {
  14. isSendEmail = true // 默认错误的时候要发送邮件
  15. req.ChartInfo.ChartName = strings.Trim(req.ChartInfo.ChartName, " ")
  16. if req.ChartInfo.ChartName == "" {
  17. errMsg = "请填写图表名称!"
  18. err = errors.New(errMsg)
  19. isSendEmail = false
  20. return
  21. }
  22. //判断图表是否存在
  23. var condition string
  24. var pars []interface{}
  25. // todo 判断同一个平台上的图表是否重复
  26. condition += " AND chart_name=? AND source = ? "
  27. pars = append(pars, req.ChartInfo.ChartName, req.ChartInfo.Source)
  28. count, err := models.GetChartInfoCountByCondition(condition, pars)
  29. if err != nil {
  30. errMsg = "判断图表名称是否存在失败"
  31. err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
  32. return
  33. }
  34. if count > 0 {
  35. errMsg = "图表已存在"
  36. err = errors.New("图表已存在")
  37. isSendEmail = false
  38. return
  39. }
  40. // 添加指标数据
  41. err = BatchAddOrUpdateEdbData(req.EdbInfoDataList)
  42. if err != nil {
  43. errMsg = "添加指标数据失败"
  44. err = errors.New("添加指标数据失败,Err:" + err.Error())
  45. return
  46. }
  47. // 查询指标ID和指标编码之间的关系
  48. originEdbInfoIdMap := make(map[int]string)
  49. for _, v := range req.EdbInfoList {
  50. originEdbInfoIdMap[v.EdbInfoId] = v.EdbCode
  51. }
  52. // 添加关联指标
  53. var edbInfoIdArr []int
  54. edbInfoList := make([]*models.EdbInfo, 0)
  55. edbInfoList, err, errMsg, isSendEmail = BatchAddOrUpdateEdbInfo(req.EdbInfoList, req.EdbInfoCalculateMapping, sysUserId, sysUserRealName)
  56. if err != nil {
  57. errMsg = "添加关联指标失败"
  58. err = errors.New("添加关联指标失败,Err:" + err.Error())
  59. return
  60. }
  61. edbCodeMap := make(map[string]*models.EdbInfo, 0)
  62. for _, v := range edbInfoList {
  63. edbCodeMap[v.EdbCode] = v
  64. edbInfoIdArr = append(edbInfoIdArr, v.EdbInfoId)
  65. }
  66. // todo 批量新增指标
  67. sort.Ints(edbInfoIdArr)
  68. var edbInfoIdArrStr []string
  69. for _, v := range edbInfoIdArr {
  70. edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
  71. }
  72. edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
  73. chartInfo = new(models.ChartInfo)
  74. chartInfo.ChartName = req.ChartInfo.ChartName
  75. chartInfo.EdbInfoIds = edbInfoIdStr
  76. chartInfo.SysUserId = req.ChartInfo.SysUserId
  77. chartInfo.SysUserRealName = req.ChartInfo.SysUserRealName
  78. chartInfo.CreateTime = time.Now()
  79. chartInfo.ModifyTime = time.Now()
  80. chartInfo.IsSetName = req.ChartInfo.IsSetName
  81. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  82. // todo 是否需要单独生成一个指标图表序列ID
  83. chartInfo.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
  84. chartInfo.DateType = req.ChartInfo.DateType
  85. chartInfo.ChartType = req.ChartInfo.ChartType
  86. calendar := req.ChartInfo.Calendar
  87. chartInfo.Calendar = calendar
  88. chartInfo.StartDate = req.ChartInfo.StartDate
  89. chartInfo.EndDate = req.ChartInfo.EndDate
  90. chartInfo.SeasonStartDate = req.ChartInfo.StartDate
  91. chartInfo.SeasonEndDate = req.ChartInfo.EndDate
  92. chartInfo.LeftMin = req.ChartInfo.LeftMin
  93. chartInfo.LeftMax = req.ChartInfo.LeftMax
  94. chartInfo.RightMin = req.ChartInfo.RightMin
  95. chartInfo.RightMax = req.ChartInfo.RightMax
  96. chartInfo.Right2Min = req.ChartInfo.Right2Min
  97. chartInfo.Right2Max = req.ChartInfo.Right2Max
  98. chartInfo.MinMaxSave = req.ChartInfo.MinMaxSave
  99. chartInfo.Disabled = req.ChartInfo.Disabled
  100. chartInfo.BarConfig = req.ChartInfo.BarConfig
  101. chartInfo.ExtraConfig = req.ChartInfo.ExtraConfig
  102. chartInfo.SeasonExtraConfig = req.ChartInfo.SeasonExtraConfig
  103. chartInfo.StartYear = req.ChartInfo.StartYear
  104. chartInfo.Source = req.ChartInfo.Source
  105. chartInfo.ChartThemeId = req.ChartInfo.ChartThemeId
  106. chartInfo.SourcesFrom = req.ChartInfo.SourcesFrom
  107. chartInfo.Instructions = req.ChartInfo.Instructions
  108. chartInfo.MarkersLines = req.ChartInfo.MarkersLines
  109. chartInfo.MarkersAreas = req.ChartInfo.MarkersAreas
  110. chartInfo.Unit = req.ChartInfo.Unit
  111. chartInfo.UnitEn = req.ChartInfo.UnitEn
  112. newId, err := models.AddChartInfo(chartInfo)
  113. if err != nil {
  114. errMsg = `保存失败`
  115. err = errors.New("保存失败,Err:" + err.Error())
  116. return
  117. }
  118. chartInfo.ChartInfoId = int(newId)
  119. // todo 先整理好指标信息,生成指标ID,再将图表和指标ID进行绑定
  120. chartEdbInfoList := req.ChartEdbMapping
  121. mapList := make([]*models.ChartEdbMapping, 0)
  122. for _, v := range chartEdbInfoList {
  123. mapItem := new(models.ChartEdbMapping)
  124. mapItem.ChartInfoId = int(newId)
  125. edbCode, ok := originEdbInfoIdMap[v.EdbInfoId]
  126. if !ok {
  127. err = fmt.Errorf("指标代码不存在,EdbCode:%s", v.EdbCode)
  128. errMsg = "指标代码不存在"
  129. return
  130. }
  131. edbBase, ok := edbCodeMap[edbCode]
  132. if !ok {
  133. err = fmt.Errorf("指标代码不存在,EdbCode:%s", v.EdbCode)
  134. errMsg = "指标代码不存在"
  135. return
  136. }
  137. mapItem.EdbInfoId = edbBase.EdbInfoId
  138. mapItem.CreateTime = time.Now()
  139. mapItem.ModifyTime = time.Now()
  140. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  141. mapItem.UniqueCode = utils.MD5(fmt.Sprint(utils.CHART_PREFIX, "_", edbBase.EdbInfoId, "_", timestamp))
  142. mapItem.MaxData = v.MaxData
  143. mapItem.MinData = v.MinData
  144. mapItem.IsOrder = v.IsOrder
  145. mapItem.IsAxis = v.IsAxis
  146. mapItem.EdbInfoType = v.EdbInfoType
  147. mapItem.LeadValue = v.LeadValue
  148. mapItem.LeadUnit = v.LeadUnit
  149. mapItem.ChartStyle = v.ChartStyle
  150. mapItem.ChartColor = v.ChartColor
  151. mapItem.PredictChartColor = v.PredictChartColor
  152. mapItem.ChartWidth = v.ChartWidth
  153. mapItem.Source = v.Source
  154. mapItem.EdbAliasName = v.EdbAliasName
  155. mapItem.IsConvert = v.IsConvert
  156. mapItem.ConvertType = v.ConvertType
  157. mapItem.ConvertValue = v.ConvertValue
  158. mapItem.ConvertUnit = v.ConvertUnit
  159. mapItem.ConvertEnUnit = v.ConvertEnUnit
  160. mapItem.EdbCode = edbCode
  161. mapList = append(mapList, mapItem)
  162. }
  163. if len(mapList) <= 0 {
  164. errMsg = `图表指标映射不能为空`
  165. err = errors.New("图表指标映射不能为空")
  166. return
  167. }
  168. err = models.AddChartEdbMapping(mapList)
  169. if err != nil {
  170. errMsg = `保存失败`
  171. err = errors.New("保存失败,Err:" + err.Error())
  172. return
  173. }
  174. return
  175. }
  176. // UpdateChartInfoAndEdbInfo 刷新图表信息和指标信息
  177. func UpdateChartInfoAndEdbInfo(req *models.AddChartReq, sysUserId int, sysUserRealName string) (chartInfo *models.ChartInfo, err error, errMsg string, isSendEmail bool) {
  178. isSendEmail = true // 默认错误的时候要发送邮件
  179. req.ChartInfo.ChartName = strings.Trim(req.ChartInfo.ChartName, " ")
  180. if req.ChartInfo.ChartName == "" {
  181. errMsg = "请填写图表名称!"
  182. err = errors.New(errMsg)
  183. isSendEmail = false
  184. return
  185. }
  186. chartInfo, err = models.GetChartInfoById(req.ChartInfo.ChartInfoId)
  187. if err != nil {
  188. if err.Error() == utils.ErrNoRow() {
  189. errMsg = "图表已被删除,请刷新页面"
  190. err = errors.New(errMsg)
  191. isSendEmail = false
  192. return
  193. }
  194. errMsg = "获取图表信息失败"
  195. err = errors.New("获取图表信息失败,Err:" + err.Error())
  196. return
  197. }
  198. //判断图表是否存在
  199. var condition string
  200. var pars []interface{}
  201. // todo 判断同一个平台上的图表是否重复
  202. condition += " AND chart_name=? AND source = ? AND chart_info_id<>? "
  203. pars = append(pars, req.ChartInfo.ChartName, req.ChartInfo.Source, req.ChartInfo.ChartInfoId)
  204. count, err := models.GetChartInfoCountByCondition(condition, pars)
  205. if err != nil {
  206. errMsg = "判断图表名称是否存在失败"
  207. err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
  208. return
  209. }
  210. if count > 0 {
  211. errMsg = "图表已存在"
  212. err = errors.New("图表已存在")
  213. isSendEmail = false
  214. return
  215. }
  216. // 添加指标数据
  217. err = BatchAddOrUpdateEdbData(req.EdbInfoDataList)
  218. if err != nil {
  219. errMsg = "添加指标数据失败"
  220. err = errors.New("添加指标数据失败,Err:" + err.Error())
  221. return
  222. }
  223. // 查询指标ID和指标编码之间的关系
  224. originEdbInfoIdMap := make(map[int]string)
  225. for _, v := range req.EdbInfoList {
  226. originEdbInfoIdMap[v.EdbInfoId] = v.EdbCode
  227. }
  228. // 添加关联指标
  229. var edbInfoIdArr []int
  230. edbInfoList := make([]*models.EdbInfo, 0)
  231. edbInfoList, err, errMsg, isSendEmail = BatchAddOrUpdateEdbInfo(req.EdbInfoList, req.EdbInfoCalculateMapping, sysUserId, sysUserRealName)
  232. if err != nil {
  233. errMsg = "添加关联指标失败"
  234. err = errors.New("添加关联指标失败,Err:" + err.Error())
  235. return
  236. }
  237. edbCodeMap := make(map[string]*models.EdbInfo, 0)
  238. for _, v := range edbInfoList {
  239. edbCodeMap[v.EdbCode] = v
  240. edbInfoIdArr = append(edbInfoIdArr, v.EdbInfoId)
  241. }
  242. // todo 批量新增指标
  243. sort.Ints(edbInfoIdArr)
  244. var edbInfoIdArrStr []string
  245. for _, v := range edbInfoIdArr {
  246. edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
  247. }
  248. edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
  249. chartInfo.ChartName = req.ChartInfo.ChartName
  250. chartInfo.EdbInfoIds = edbInfoIdStr
  251. chartInfo.SysUserId = req.ChartInfo.SysUserId
  252. chartInfo.SysUserRealName = req.ChartInfo.SysUserRealName
  253. chartInfo.ModifyTime = time.Now()
  254. chartInfo.IsSetName = req.ChartInfo.IsSetName
  255. chartInfo.DateType = req.ChartInfo.DateType
  256. chartInfo.ChartType = req.ChartInfo.ChartType
  257. calendar := req.ChartInfo.Calendar
  258. chartInfo.Calendar = calendar
  259. chartInfo.StartDate = req.ChartInfo.StartDate
  260. chartInfo.EndDate = req.ChartInfo.EndDate
  261. chartInfo.SeasonStartDate = req.ChartInfo.StartDate
  262. chartInfo.SeasonEndDate = req.ChartInfo.EndDate
  263. chartInfo.LeftMin = req.ChartInfo.LeftMin
  264. chartInfo.LeftMax = req.ChartInfo.LeftMax
  265. chartInfo.RightMin = req.ChartInfo.RightMin
  266. chartInfo.RightMax = req.ChartInfo.RightMax
  267. chartInfo.Right2Min = req.ChartInfo.Right2Min
  268. chartInfo.Right2Max = req.ChartInfo.Right2Max
  269. chartInfo.MinMaxSave = req.ChartInfo.MinMaxSave
  270. chartInfo.Disabled = req.ChartInfo.Disabled
  271. chartInfo.BarConfig = req.ChartInfo.BarConfig
  272. chartInfo.ExtraConfig = req.ChartInfo.ExtraConfig
  273. chartInfo.SeasonExtraConfig = req.ChartInfo.SeasonExtraConfig
  274. chartInfo.StartYear = req.ChartInfo.StartYear
  275. chartInfo.Source = req.ChartInfo.Source
  276. chartInfo.ChartThemeId = req.ChartInfo.ChartThemeId
  277. chartInfo.SourcesFrom = req.ChartInfo.SourcesFrom
  278. chartInfo.Instructions = req.ChartInfo.Instructions
  279. chartInfo.MarkersLines = req.ChartInfo.MarkersLines
  280. chartInfo.MarkersAreas = req.ChartInfo.MarkersAreas
  281. chartInfo.Unit = req.ChartInfo.Unit
  282. chartInfo.UnitEn = req.ChartInfo.UnitEn
  283. err = chartInfo.Update([]string{})
  284. if err != nil {
  285. errMsg = `更新失败`
  286. err = errors.New("更新失败,Err:" + err.Error())
  287. return
  288. }
  289. // 处理映射,已存在的映射直接更新,不存在的映射再新增,同时删除旧的映射关系
  290. oldChartEdbMappingList, err := models.GetChartEdbMappingListV2(chartInfo.ChartInfoId)
  291. oldMappingIdMap := make(map[string]*models.ChartEdbMapping)
  292. removeMapping := make(map[int]struct{})
  293. for _, v := range oldChartEdbMappingList {
  294. name := fmt.Sprintf("%s-%s", v.EdbCode, v.Source)
  295. oldMappingIdMap[name] = v
  296. removeMapping[v.ChartEdbMappingId] = struct{}{}
  297. }
  298. // todo 先整理好指标信息,生成指标ID,再将图表和指标ID进行绑定
  299. chartEdbInfoList := req.ChartEdbMapping
  300. addMappingList := make([]*models.ChartEdbMapping, 0)
  301. for _, v := range chartEdbInfoList {
  302. mapItem := new(models.ChartEdbMapping)
  303. mapItem.ChartInfoId = chartInfo.ChartInfoId
  304. edbCode, ok := originEdbInfoIdMap[v.EdbInfoId]
  305. if !ok {
  306. err = fmt.Errorf("指标代码不存在,EdbCode:%s", v.EdbCode)
  307. errMsg = "指标代码不存在"
  308. return
  309. }
  310. edbBase, ok := edbCodeMap[edbCode]
  311. if !ok {
  312. err = fmt.Errorf("指标代码不存在,EdbCode:%s", v.EdbCode)
  313. errMsg = "指标代码不存在"
  314. return
  315. }
  316. // 判断是否已经存在映射关系
  317. existName := fmt.Sprintf("%s-%s", edbCode, v.Source)
  318. if oldMapping, ok1 := oldMappingIdMap[existName]; ok1 {
  319. //更新映射关系
  320. mapItem = oldMapping
  321. mapItem.ModifyTime = time.Now()
  322. mapItem.MaxData = v.MaxData
  323. mapItem.MinData = v.MinData
  324. mapItem.IsOrder = v.IsOrder
  325. mapItem.IsAxis = v.IsAxis
  326. mapItem.EdbInfoType = v.EdbInfoType
  327. mapItem.LeadValue = v.LeadValue
  328. mapItem.LeadUnit = v.LeadUnit
  329. mapItem.ChartStyle = v.ChartStyle
  330. mapItem.ChartColor = v.ChartColor
  331. mapItem.PredictChartColor = v.PredictChartColor
  332. mapItem.ChartWidth = v.ChartWidth
  333. mapItem.Source = v.Source
  334. mapItem.EdbAliasName = v.EdbAliasName
  335. mapItem.IsConvert = v.IsConvert
  336. mapItem.ConvertType = v.ConvertType
  337. mapItem.ConvertValue = v.ConvertValue
  338. mapItem.ConvertUnit = v.ConvertUnit
  339. mapItem.ConvertEnUnit = v.ConvertEnUnit
  340. mapItem.EdbCode = edbCode
  341. err = mapItem.Update([]string{})
  342. if err != nil {
  343. errMsg = `更新失败`
  344. err = errors.New("更新图表指标映射关系失败,Err:" + err.Error())
  345. return
  346. }
  347. delete(removeMapping, mapItem.ChartEdbMappingId)
  348. } else {
  349. mapItem.EdbInfoId = edbBase.EdbInfoId
  350. mapItem.CreateTime = time.Now()
  351. mapItem.ModifyTime = time.Now()
  352. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  353. mapItem.UniqueCode = utils.MD5(fmt.Sprint(utils.CHART_PREFIX, "_", edbBase.EdbInfoId, "_", timestamp))
  354. mapItem.MaxData = v.MaxData
  355. mapItem.MinData = v.MinData
  356. mapItem.IsOrder = v.IsOrder
  357. mapItem.IsAxis = v.IsAxis
  358. mapItem.EdbInfoType = v.EdbInfoType
  359. mapItem.LeadValue = v.LeadValue
  360. mapItem.LeadUnit = v.LeadUnit
  361. mapItem.ChartStyle = v.ChartStyle
  362. mapItem.ChartColor = v.ChartColor
  363. mapItem.PredictChartColor = v.PredictChartColor
  364. mapItem.ChartWidth = v.ChartWidth
  365. mapItem.Source = v.Source
  366. mapItem.EdbAliasName = v.EdbAliasName
  367. mapItem.IsConvert = v.IsConvert
  368. mapItem.ConvertType = v.ConvertType
  369. mapItem.ConvertValue = v.ConvertValue
  370. mapItem.ConvertUnit = v.ConvertUnit
  371. mapItem.ConvertEnUnit = v.ConvertEnUnit
  372. mapItem.EdbCode = edbCode
  373. addMappingList = append(addMappingList, mapItem)
  374. }
  375. }
  376. if len(addMappingList) > 0 {
  377. err = models.AddChartEdbMapping(addMappingList)
  378. if err != nil {
  379. errMsg = `保存失败`
  380. err = errors.New("保存失败,Err:" + err.Error())
  381. return
  382. }
  383. }
  384. // 删除原先的绑定关系
  385. if len(removeMapping) > 0 {
  386. removeIdList := make([]string, 0) //需要移除的日期
  387. for _, v := range removeMapping {
  388. removeIdList = append(removeIdList, fmt.Sprint(v))
  389. }
  390. removeIdStr := strings.Join(removeIdList, `","`)
  391. removeIdStr = `"` + removeIdStr + `"`
  392. err = models.DeleteChartEdbMappingByChartEdbMappingId(removeIdStr)
  393. if err != nil {
  394. errMsg = `删除失败`
  395. err = errors.New("删除失败,Err:" + err.Error())
  396. return
  397. }
  398. }
  399. return
  400. }
  401. // 删除图表信息
  402. func DeleteChart(chartInfoId int) (err error, errMsg string) {
  403. //删除图表
  404. chartInfo, err := models.GetChartInfoById(chartInfoId)
  405. if err != nil {
  406. if err.Error() == utils.ErrNoRow() {
  407. errMsg = "图表已删除,请刷新页面"
  408. err = fmt.Errorf("图表不存在,Err:" + err.Error())
  409. return
  410. } else {
  411. errMsg = "删除失败"
  412. err = fmt.Errorf("删除失败, 获取图表信息失败Err:" + err.Error())
  413. return
  414. }
  415. }
  416. if chartInfo == nil {
  417. errMsg = "图表已删除,请刷新页面"
  418. err = fmt.Errorf(errMsg)
  419. return
  420. }
  421. // 处理映射,已存在的映射直接更新,不存在的映射再新增,同时删除旧的映射关系
  422. oldChartEdbMappingList, err := models.GetChartEdbMappingListV2(chartInfo.ChartInfoId)
  423. edbInfoIds := make([]int, 0)
  424. for _, v := range oldChartEdbMappingList {
  425. edbInfoIds = append(edbInfoIds, v.EdbInfoId)
  426. }
  427. //删除图表及关联指标
  428. err = models.DeleteChartInfoAndData(chartInfo.ChartInfoId)
  429. if err != nil {
  430. errMsg = "删除失败"
  431. err = fmt.Errorf("删除图表数据失败, Err:" + err.Error())
  432. return
  433. }
  434. err, errMsg = BatchDeleteEdbInfo(edbInfoIds)
  435. if err != nil {
  436. errMsg = "删除失败"
  437. err = fmt.Errorf("删除指标数据失败, Err:" + err.Error())
  438. return
  439. }
  440. return
  441. }