chart_info.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786
  1. package line_equation
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/models/data_manage"
  6. "eta/eta_api/models/data_manage/line_equation"
  7. "eta/eta_api/models/data_manage/line_equation/request"
  8. "eta/eta_api/models/system"
  9. "eta/eta_api/services/data"
  10. "eta/eta_api/utils"
  11. "fmt"
  12. "github.com/shopspring/decimal"
  13. "math"
  14. "sort"
  15. "strconv"
  16. "strings"
  17. "time"
  18. )
  19. type LineEquationResp struct {
  20. AData LineEquationDataResp
  21. BData LineEquationDataResp
  22. R2Data LineEquationDataResp
  23. }
  24. type LineEquationDataResp struct {
  25. MaxData float64
  26. MinData float64
  27. LatestDate string `description:"真实数据的最后日期"`
  28. EdbInfoCategoryType int
  29. ChartColor string
  30. ChartStyle string
  31. PredictChartColor string
  32. ChartType int
  33. ChartWidth int
  34. EdbName string
  35. EdbNameEn string
  36. Unit string
  37. UnitEn string
  38. IsAxis int
  39. DataList []data_manage.EdbDataList
  40. }
  41. // GetChartEdbData 获取图表数据
  42. func GetChartEdbData(chartInfoId int, lineChartInfoConfig request.LineChartInfoReq, getAData, getBData, getR2Data bool) (edbList []*data_manage.ChartEdbInfoMapping, dataResp LineEquationResp, err error, errMsg string) {
  43. // 获取基本信息
  44. mappingList, startDate, endDate, err, errMsg := getConfigData(lineChartInfoConfig)
  45. if err != nil {
  46. return
  47. }
  48. xEdbInfoIdList := lineChartInfoConfig.XEdbInfoIdList
  49. yEdbInfoIdList := lineChartInfoConfig.YEdbInfoIdList
  50. aLineEquationDataResp := LineEquationDataResp{
  51. DataList: make([]data_manage.EdbDataList, 0),
  52. MaxData: 0,
  53. MinData: 0,
  54. ChartColor: "#00f",
  55. ChartStyle: `spline`,
  56. PredictChartColor: `#00f`,
  57. ChartType: 0,
  58. ChartWidth: 3,
  59. EdbName: `弹性系数`,
  60. EdbNameEn: `elastic coefficient`,
  61. IsAxis: 1,
  62. }
  63. bLineEquationDataResp := LineEquationDataResp{
  64. DataList: make([]data_manage.EdbDataList, 0),
  65. MaxData: 0,
  66. MinData: 0,
  67. ChartColor: "#00f",
  68. ChartStyle: `spline`,
  69. PredictChartColor: `#00f`,
  70. ChartType: 0,
  71. ChartWidth: 3,
  72. EdbName: `截距`,
  73. EdbNameEn: `intercept`,
  74. IsAxis: 1,
  75. }
  76. r2LineEquationDataResp := LineEquationDataResp{
  77. DataList: make([]data_manage.EdbDataList, 0),
  78. MaxData: 0,
  79. MinData: 0,
  80. ChartColor: "#00f",
  81. ChartStyle: `spline`,
  82. PredictChartColor: `#00f`,
  83. ChartType: 0,
  84. ChartWidth: 3,
  85. EdbName: `相关系数`,
  86. EdbNameEn: `coefficient of association`,
  87. IsAxis: 1,
  88. }
  89. edbList = make([]*data_manage.ChartEdbInfoMapping, 0)
  90. dataResp = LineEquationResp{
  91. AData: aLineEquationDataResp,
  92. BData: bLineEquationDataResp,
  93. R2Data: r2LineEquationDataResp,
  94. }
  95. var baseEdbInfo *data_manage.ChartEdbInfoMapping
  96. // 获取确定以哪个指标的日期作为基准日期
  97. {
  98. var xEdbInfo, yEdbInfo *data_manage.ChartEdbInfoMapping
  99. for _, v := range mappingList {
  100. if v.EdbInfoId == xEdbInfoIdList[0] {
  101. xEdbInfo = v
  102. }
  103. if v.EdbInfoId == yEdbInfoIdList[0] {
  104. yEdbInfo = v
  105. }
  106. }
  107. if xEdbInfo == nil {
  108. errMsg = `X轴第一个指标异常`
  109. err = errors.New(errMsg)
  110. return
  111. }
  112. if yEdbInfo == nil {
  113. errMsg = `Y轴第一个指标异常`
  114. err = errors.New(errMsg)
  115. return
  116. }
  117. // 时间截面规则:按照什么频率来取不同的截面的问题。原则是:按照X轴和Y轴所选择的第一个指标(X和Y分别有一个第一个指标),两个指标中,以低频的那个作为基准。如果X轴和Y轴是同频的,那以Y轴第一个指标的为准。
  118. frequencyIntMap := map[string]int{
  119. "日度": 1,
  120. "周度": 2,
  121. "旬度": 3,
  122. "月度": 4,
  123. "季度": 5,
  124. "年度": 6,
  125. }
  126. // 如果x是高频 或者 x与y是同频的,那么就是Y轴的第一个指标为主
  127. if frequencyIntMap[xEdbInfo.Frequency] <= frequencyIntMap[yEdbInfo.Frequency] {
  128. baseEdbInfo = yEdbInfo
  129. } else {
  130. // 否则是X轴的第一个指标是低频
  131. baseEdbInfo = xEdbInfo
  132. }
  133. }
  134. // 指标对应的所有数据
  135. chartType := 1 //1:普通图,2:季节性图
  136. calendar := "公历"
  137. edbDataListMap, edbList, err := data.GetEdbDataMapList(chartInfoId, chartType, calendar, startDate, endDate, mappingList, "")
  138. if err != nil {
  139. return
  140. }
  141. // 获取所有的日期
  142. dateList := make([]string, 0)
  143. for _, v := range edbDataListMap[baseEdbInfo.EdbInfoId] {
  144. dateList = append(dateList, v.DataTime)
  145. }
  146. // 数据整理
  147. // [日期][A指标id:值,B指标id:值]
  148. dateEdbMap, err := handleData(baseEdbInfo.EdbInfoId, edbDataListMap)
  149. if err != nil {
  150. return
  151. }
  152. lenX := len(xEdbInfoIdList)
  153. var isNotAFirst, isNotBFirst, isNotR2First bool
  154. for i, date := range dateList {
  155. coordinateData := make([]utils.Coordinate, 0)
  156. for k := 0; k < lenX; k++ {
  157. xVal, ok1 := dateEdbMap[date][xEdbInfoIdList[k]]
  158. yVal, ok2 := dateEdbMap[date][yEdbInfoIdList[k]]
  159. if !ok1 || !ok2 {
  160. continue
  161. }
  162. tmpCoordinate1 := utils.Coordinate{
  163. X: xVal,
  164. Y: yVal,
  165. }
  166. coordinateData = append(coordinateData, tmpCoordinate1)
  167. }
  168. dataTime, _ := time.ParseInLocation(utils.FormatDate, date, time.Local)
  169. timestamp := dataTime.UnixNano() / 1e6
  170. // 只有存在两个坐标点的时候,才能去计算线性方程和R平方
  171. if len(coordinateData) >= 2 {
  172. a, b := utils.GetLinearResult(coordinateData)
  173. if !math.IsNaN(a) && !math.IsNaN(b) && !math.IsInf(a, 0) && !math.IsInf(b, 0) {
  174. if getAData {
  175. a, _ = decimal.NewFromFloat(a).Round(4).Float64()
  176. dataResp.AData.DataList = append(dataResp.AData.DataList, data_manage.EdbDataList{
  177. EdbDataId: i,
  178. EdbInfoId: 0,
  179. DataTime: date,
  180. DataTimestamp: timestamp,
  181. Value: a,
  182. })
  183. if !isNotAFirst {
  184. dataResp.AData.MinData = a
  185. dataResp.AData.MaxData = a
  186. isNotAFirst = true
  187. }
  188. if dataResp.AData.MinData > a {
  189. dataResp.AData.MinData = a
  190. }
  191. if dataResp.AData.MaxData < a {
  192. dataResp.AData.MaxData = a
  193. }
  194. }
  195. if getBData {
  196. b, _ = decimal.NewFromFloat(b).Round(4).Float64()
  197. dataResp.BData.DataList = append(dataResp.BData.DataList, data_manage.EdbDataList{
  198. EdbDataId: i,
  199. EdbInfoId: 0,
  200. DataTime: date,
  201. DataTimestamp: timestamp,
  202. Value: b,
  203. })
  204. if !isNotBFirst {
  205. dataResp.BData.MinData = b
  206. dataResp.BData.MaxData = b
  207. isNotBFirst = true
  208. }
  209. if dataResp.BData.MinData > b {
  210. dataResp.BData.MinData = b
  211. }
  212. if dataResp.BData.MaxData < b {
  213. dataResp.BData.MaxData = b
  214. }
  215. }
  216. }
  217. // 计算R平方
  218. if getR2Data {
  219. tmpVal := utils.CalculationDecisive(coordinateData)
  220. if math.IsNaN(tmpVal) || math.IsInf(tmpVal, 0) {
  221. continue
  222. }
  223. tmpVal, _ = decimal.NewFromFloat(tmpVal).Round(4).Float64()
  224. dataResp.R2Data.DataList = append(dataResp.R2Data.DataList, data_manage.EdbDataList{
  225. EdbDataId: i,
  226. EdbInfoId: 0,
  227. DataTime: date,
  228. DataTimestamp: timestamp,
  229. Value: tmpVal,
  230. })
  231. if !isNotR2First {
  232. dataResp.R2Data.MinData = tmpVal
  233. dataResp.R2Data.MaxData = tmpVal
  234. isNotR2First = true
  235. }
  236. if dataResp.R2Data.MinData > tmpVal {
  237. dataResp.R2Data.MinData = tmpVal
  238. }
  239. if dataResp.R2Data.MaxData < tmpVal {
  240. dataResp.R2Data.MaxData = tmpVal
  241. }
  242. }
  243. }
  244. }
  245. dataResp.AData.LatestDate = baseEdbInfo.LatestDate
  246. dataResp.AData.EdbInfoCategoryType = baseEdbInfo.EdbInfoCategoryType
  247. dataResp.BData.LatestDate = baseEdbInfo.LatestDate
  248. dataResp.BData.EdbInfoCategoryType = baseEdbInfo.EdbInfoCategoryType
  249. dataResp.R2Data.LatestDate = baseEdbInfo.LatestDate
  250. dataResp.R2Data.EdbInfoCategoryType = baseEdbInfo.EdbInfoCategoryType
  251. return
  252. }
  253. // GetConfigData 获取配置数据
  254. func GetConfigData(lineChartInfoConfig request.LineChartInfoReq) (mappingList []*data_manage.ChartEdbInfoMapping, startDate, endDate string, err error, errMsg string) {
  255. return getConfigData(lineChartInfoConfig)
  256. }
  257. // getConfigData 获取配置数据
  258. func getConfigData(lineChartInfoConfig request.LineChartInfoReq) (mappingList []*data_manage.ChartEdbInfoMapping, startDate, endDate string, err error, errMsg string) {
  259. dateType := lineChartInfoConfig.DateType
  260. switch dateType {
  261. case 1:
  262. startDate = "2000-01-01"
  263. case 2:
  264. startDate = "2010-01-01"
  265. case 3:
  266. startDate = "2015-01-01"
  267. case 4:
  268. //startDate = strconv.Itoa(time.Now().Year()) + "-01-01"
  269. startDate = "2021-01-01"
  270. case 5:
  271. startDate = lineChartInfoConfig.StartDate + "-01"
  272. endDate = lineChartInfoConfig.EndDate + "-01"
  273. case 6:
  274. startDate = lineChartInfoConfig.StartDate + "-01"
  275. case 7:
  276. startDate = "2018-01-01"
  277. case 8:
  278. startDate = "2019-01-01"
  279. case 9:
  280. startDate = "2020-01-01"
  281. case 11:
  282. startDate = "2022-01-01"
  283. }
  284. //指标数据
  285. edbInfoIdList := make([]int, 0)
  286. {
  287. edbInfoIdMap := make(map[int]int, 0)
  288. for _, edbInfoId := range lineChartInfoConfig.XEdbInfoIdList {
  289. edbInfoIdMap[edbInfoId] = edbInfoId
  290. }
  291. for _, edbInfoId := range lineChartInfoConfig.YEdbInfoIdList {
  292. edbInfoIdMap[edbInfoId] = edbInfoId
  293. }
  294. for _, edbInfoId := range edbInfoIdMap {
  295. edbInfoIdList = append(edbInfoIdList, edbInfoId)
  296. }
  297. }
  298. mappingList, err = data_manage.GetChartEdbMappingListByEdbInfoIdList(edbInfoIdList)
  299. if err != nil {
  300. errMsg = `获取失败`
  301. err = errors.New("获取图表,指标信息失败,Err:" + err.Error())
  302. return
  303. }
  304. return
  305. }
  306. // handleData 数据处理
  307. func handleData(baseEdbInfoId int, edbDataListMap map[int][]*data_manage.EdbDataList) (dateEdbMap map[string]map[int]float64, err error) {
  308. dateEdbMap = make(map[string]map[int]float64) // [日期][A指标id:值,B指标id:值]
  309. for edbInfoId, edbDataList := range edbDataListMap {
  310. if edbInfoId != baseEdbInfoId {
  311. // 用上期的数据补充当期的数据处理
  312. handleDataMap := make(map[string]float64)
  313. err = data_manage.HandleDataByPreviousData(edbDataList, handleDataMap)
  314. if err != nil {
  315. return
  316. }
  317. for date, val := range handleDataMap {
  318. item, ok := dateEdbMap[date]
  319. if ok {
  320. item[edbInfoId] = val
  321. } else {
  322. item = map[int]float64{
  323. edbInfoId: val,
  324. }
  325. }
  326. dateEdbMap[date] = item
  327. }
  328. } else {
  329. for _, edbData := range edbDataList {
  330. item, ok := dateEdbMap[edbData.DataTime]
  331. if ok {
  332. item[edbInfoId] = edbData.Value
  333. } else {
  334. item = map[int]float64{
  335. edbInfoId: edbData.Value,
  336. }
  337. }
  338. dateEdbMap[edbData.DataTime] = item
  339. }
  340. }
  341. }
  342. return
  343. }
  344. // BatchAddChartInfo 批量添加图表
  345. func BatchAddChartInfo(batchAddChartReq []request.AddChart, lineChartInfoConfig request.LineChartInfoReq, sysUser *system.Admin) (batchAddChartList []line_equation.BatchAddChart, err error, errMsg string, isSendEmail bool) {
  346. source := utils.CHART_SOURCE_LINE_EQUATION
  347. // 获取需要
  348. for k, v := range batchAddChartReq {
  349. v.ChartName = strings.Trim(v.ChartName, " ")
  350. batchAddChartReq[k] = v
  351. if v.ChartName == "" {
  352. errMsg = "请填写图表名称!"
  353. err = errors.New(errMsg)
  354. isSendEmail = false
  355. return
  356. }
  357. if v.ChartClassifyId <= 0 {
  358. errMsg = "请填写图表名称!"
  359. err = errors.New(errMsg)
  360. isSendEmail = false
  361. return
  362. }
  363. chartClassify, tmpErr := data_manage.GetChartClassifyById(v.ChartClassifyId)
  364. if tmpErr != nil {
  365. if tmpErr.Error() == utils.ErrNoRow() {
  366. errMsg = "分类不存在"
  367. err = errors.New(errMsg)
  368. isSendEmail = false
  369. return
  370. }
  371. errMsg = "获取分类信息失败"
  372. err = errors.New("获取分类信息失败,Err:" + tmpErr.Error())
  373. return
  374. }
  375. if chartClassify == nil {
  376. errMsg = "分类不存在"
  377. err = errors.New(errMsg)
  378. isSendEmail = false
  379. return
  380. }
  381. // 判断图表是否存在
  382. var condition string
  383. var pars []interface{}
  384. condition += " AND chart_name=? AND source = ? "
  385. pars = append(pars, v.ChartName, source)
  386. count, tmpErr := data_manage.GetChartInfoCountByCondition(condition, pars)
  387. if tmpErr != nil {
  388. errMsg = "判断图表名称是否存在失败"
  389. err = errors.New("判断图表名称是否存在失败,Err:" + tmpErr.Error())
  390. return
  391. }
  392. if count > 0 {
  393. errMsg = "图表已存在,请重新填写"
  394. err = errors.New(errMsg)
  395. isSendEmail = false
  396. return
  397. }
  398. }
  399. edbList, _, _, err, errMsg := getConfigData(lineChartInfoConfig)
  400. var edbInfoIdArr []int
  401. for _, v := range edbList {
  402. edbInfoIdArr = append(edbInfoIdArr, v.EdbInfoId)
  403. }
  404. disableVal := data.CheckIsDisableChart(edbInfoIdArr)
  405. sort.Ints(edbInfoIdArr)
  406. var edbInfoIdArrStr []string
  407. for _, v := range edbInfoIdArr {
  408. edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
  409. }
  410. edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
  411. // 批量配置
  412. lineChartInfoConfigByte, err := json.Marshal(lineChartInfoConfig)
  413. if err != nil {
  414. return
  415. }
  416. multipleGraphConfig := &data_manage.MultipleGraphConfig{
  417. Curve: string(lineChartInfoConfigByte),
  418. SysUserId: sysUser.AdminId,
  419. SysUserRealName: sysUser.RealName,
  420. ModifyTime: time.Now(),
  421. CreateTime: time.Now(),
  422. }
  423. // 多图
  424. batchAddChartList = make([]line_equation.BatchAddChart, 0)
  425. for _, v := range batchAddChartReq {
  426. tmpLineChartInfoConfig := lineChartInfoConfig
  427. tmpLineChartInfoConfig.Source = v.Source
  428. tmpLineChartInfoConfigByte, tmpErr := json.Marshal(tmpLineChartInfoConfig)
  429. if tmpErr != nil {
  430. err = tmpErr
  431. return
  432. }
  433. chartInfo := &data_manage.ChartInfo{
  434. ChartInfoId: 0,
  435. ChartName: v.ChartName,
  436. //ChartNameEn: v.ChartName,
  437. ChartClassifyId: v.ChartClassifyId,
  438. SysUserId: sysUser.AdminId,
  439. SysUserRealName: sysUser.RealName,
  440. UniqueCode: utils.MD5(utils.CHART_PREFIX + "_" + fmt.Sprint(v.Source) + "_" + strconv.FormatInt(time.Now().UnixNano(), 10)),
  441. CreateTime: time.Now(),
  442. ModifyTime: time.Now(),
  443. DateType: lineChartInfoConfig.DateType,
  444. StartDate: lineChartInfoConfig.StartDate,
  445. EndDate: lineChartInfoConfig.EndDate,
  446. IsSetName: 0,
  447. EdbInfoIds: edbInfoIdStr,
  448. ChartType: 1,
  449. Calendar: "公历",
  450. SeasonStartDate: "",
  451. SeasonEndDate: "",
  452. ChartImage: v.ChartImage,
  453. Sort: 0,
  454. LeftMin: v.LeftMin,
  455. LeftMax: v.LeftMax,
  456. RightMin: "",
  457. RightMax: "",
  458. Disabled: disableVal,
  459. BarConfig: "",
  460. Source: source,
  461. ExtraConfig: string(tmpLineChartInfoConfigByte),
  462. ChartThemeId: v.ChartThemeId,
  463. SourcesFrom: v.SourcesFrom,
  464. Instructions: v.Instructions,
  465. MarkersLines: v.MarkersLines,
  466. MarkersAreas: v.MarkersAreas,
  467. }
  468. // 指标信息
  469. mapList := make([]*data_manage.ChartEdbMapping, 0)
  470. for _, edbInfo := range edbList {
  471. mapItem := new(data_manage.ChartEdbMapping)
  472. mapItem.EdbInfoId = edbInfo.EdbInfoId
  473. mapItem.CreateTime = time.Now()
  474. mapItem.ModifyTime = time.Now()
  475. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  476. mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + fmt.Sprint(v.Source) + "_" + timestamp + "_" + strconv.Itoa(edbInfo.EdbInfoId))
  477. mapItem.IsOrder = true
  478. mapItem.IsAxis = 1
  479. mapItem.EdbInfoType = 1
  480. mapItem.Source = source
  481. mapList = append(mapList, mapItem)
  482. }
  483. // 批量的关系图
  484. multipleGraphConfigChartMapping := &data_manage.MultipleGraphConfigChartMapping{
  485. //Id: 0,
  486. //MultipleGraphConfigId: 0,
  487. //ChartInfoId: 0,
  488. Source: v.Source,
  489. ModifyTime: time.Now(),
  490. CreateTime: time.Now(),
  491. }
  492. batchAddChartList = append(batchAddChartList, line_equation.BatchAddChart{
  493. ChartInfo: chartInfo,
  494. EdbMappingList: mapList,
  495. MultipleGraphConfigChartMapping: multipleGraphConfigChartMapping,
  496. })
  497. }
  498. // 批量创建
  499. err = line_equation.CreateLineEquationChartAndEdb(multipleGraphConfig, batchAddChartList)
  500. // 更改es
  501. for _, v := range batchAddChartList {
  502. //添加es数据
  503. go data.EsAddOrEditChartInfo(v.ChartInfo.ChartInfoId)
  504. }
  505. return
  506. }
  507. // BatchSaveChartInfo 批量添加编辑图表
  508. func BatchSaveChartInfo(multipleGraphConfigId int, batchAddChartReq []request.AddChart, lineChartInfoConfig request.LineChartInfoReq, sysUser *system.Admin) (batchAddChartList []line_equation.BatchAddChart, err error, errMsg string, isSendEmail bool) {
  509. // 获取统一配置
  510. multipleGraphConfig, err := data_manage.GetMultipleGraphConfigById(multipleGraphConfigId)
  511. if err != nil {
  512. errMsg = `获取失败`
  513. err = errors.New(`获取配置失败,ERR:` + err.Error())
  514. return
  515. }
  516. // 获取已经关联的图表
  517. chartMappingList, err := data_manage.GetMultipleGraphConfigChartMappingListById(multipleGraphConfig.MultipleGraphConfigId)
  518. if err != nil {
  519. errMsg = `获取失败`
  520. err = errors.New(`获取关联图表配置失败,ERR:` + err.Error())
  521. return
  522. }
  523. // 已经存在关联的图表map
  524. existSourceChartMap := make(map[int]*data_manage.MultipleGraphConfigChartMapping)
  525. // 已经存在的图表map
  526. existChartInfoMap := make(map[int]*data_manage.ChartInfo)
  527. for _, v := range chartMappingList {
  528. existSourceChartMap[v.Source] = v
  529. chartInfo, tmpErr := data_manage.GetChartInfoById(v.ChartInfoId)
  530. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  531. err = tmpErr
  532. return
  533. }
  534. if chartInfo != nil {
  535. existChartInfoMap[v.Source] = chartInfo
  536. }
  537. }
  538. source := utils.CHART_SOURCE_LINE_EQUATION
  539. // 获取需要
  540. for k, v := range batchAddChartReq {
  541. v.ChartName = strings.Trim(v.ChartName, " ")
  542. batchAddChartReq[k] = v
  543. if v.ChartName == "" {
  544. errMsg = "请填写图表名称!"
  545. err = errors.New(errMsg)
  546. isSendEmail = false
  547. return
  548. }
  549. if v.ChartClassifyId <= 0 {
  550. errMsg = "请填写图表名称!"
  551. err = errors.New(errMsg)
  552. isSendEmail = false
  553. return
  554. }
  555. chartClassify, tmpErr := data_manage.GetChartClassifyById(v.ChartClassifyId)
  556. if tmpErr != nil {
  557. if tmpErr.Error() == utils.ErrNoRow() {
  558. errMsg = "分类不存在"
  559. err = errors.New(errMsg)
  560. isSendEmail = false
  561. return
  562. }
  563. errMsg = "获取分类信息失败"
  564. err = errors.New("获取分类信息失败,Err:" + tmpErr.Error())
  565. return
  566. }
  567. if chartClassify == nil {
  568. errMsg = "分类不存在"
  569. err = errors.New(errMsg)
  570. isSendEmail = false
  571. return
  572. }
  573. // 判断图表是否存在
  574. var condition string
  575. var pars []interface{}
  576. condition += " AND chart_name=? AND source = ? "
  577. pars = append(pars, v.ChartName, source)
  578. // 已经创建了图表的类型
  579. if sourceChart, ok := existChartInfoMap[v.Source]; ok {
  580. condition += " AND chart_info_id != ? "
  581. pars = append(pars, sourceChart.ChartInfoId)
  582. }
  583. count, tmpErr := data_manage.GetChartInfoCountByCondition(condition, pars)
  584. if tmpErr != nil {
  585. errMsg = "判断图表名称是否存在失败"
  586. err = errors.New("判断图表名称是否存在失败,Err:" + tmpErr.Error())
  587. return
  588. }
  589. if count > 0 {
  590. errMsg = "图表已存在,请重新填写"
  591. err = errors.New(errMsg)
  592. isSendEmail = false
  593. return
  594. }
  595. }
  596. edbList, _, _, err, errMsg := getConfigData(lineChartInfoConfig)
  597. var edbInfoIdArr []int
  598. for _, v := range edbList {
  599. edbInfoIdArr = append(edbInfoIdArr, v.EdbInfoId)
  600. }
  601. disableVal := data.CheckIsDisableChart(edbInfoIdArr)
  602. sort.Ints(edbInfoIdArr)
  603. var edbInfoIdArrStr []string
  604. for _, v := range edbInfoIdArr {
  605. edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
  606. }
  607. edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
  608. // 批量配置
  609. lineChartInfoConfigByte, err := json.Marshal(lineChartInfoConfig)
  610. if err != nil {
  611. return
  612. }
  613. multipleGraphConfig.Curve = string(lineChartInfoConfigByte)
  614. multipleGraphConfig.ModifyTime = time.Now()
  615. updateMultipleGraphConfigCols := []string{"Curve", "ModifyTime"}
  616. updateChartCols := []string{"ChartName", "DateType", "StartDate", "EndDate", "EdbInfoIds", "LeftMin", "LeftMax", "Disabled", "ExtraConfig"}
  617. // 多图
  618. batchAddChartList = make([]line_equation.BatchAddChart, 0)
  619. for _, v := range batchAddChartReq {
  620. tmpLineChartInfoConfig := lineChartInfoConfig
  621. tmpLineChartInfoConfig.Source = v.Source
  622. tmpLineChartInfoConfigByte, tmpErr := json.Marshal(tmpLineChartInfoConfig)
  623. if tmpErr != nil {
  624. err = tmpErr
  625. return
  626. }
  627. var multipleGraphConfigChartMapping *data_manage.MultipleGraphConfigChartMapping
  628. // 已经创建了图表的类型
  629. chartInfo, ok := existChartInfoMap[v.Source]
  630. if ok {
  631. chartInfo.ChartName = v.ChartName
  632. chartInfo.DateType = lineChartInfoConfig.DateType
  633. chartInfo.StartDate = lineChartInfoConfig.StartDate
  634. chartInfo.EndDate = lineChartInfoConfig.EndDate
  635. chartInfo.EdbInfoIds = edbInfoIdStr
  636. chartInfo.LeftMin = v.LeftMin
  637. chartInfo.LeftMax = v.LeftMax
  638. chartInfo.Disabled = disableVal
  639. chartInfo.ExtraConfig = string(tmpLineChartInfoConfigByte)
  640. //updateChartInfoList
  641. tmpMultipleGraphConfigChartMapping, ok2 := existSourceChartMap[v.Source]
  642. if !ok2 {
  643. err = errors.New("找不到对应的统一配置关系")
  644. return
  645. }
  646. multipleGraphConfigChartMapping = tmpMultipleGraphConfigChartMapping
  647. } else {
  648. chartInfo = &data_manage.ChartInfo{
  649. ChartInfoId: 0,
  650. ChartName: v.ChartName,
  651. //ChartNameEn: v.ChartName,
  652. ChartClassifyId: v.ChartClassifyId,
  653. SysUserId: sysUser.AdminId,
  654. SysUserRealName: sysUser.RealName,
  655. UniqueCode: utils.MD5(utils.CHART_PREFIX + "_" + fmt.Sprint(v.Source) + "_" + strconv.FormatInt(time.Now().UnixNano(), 10)),
  656. CreateTime: time.Now(),
  657. ModifyTime: time.Now(),
  658. DateType: lineChartInfoConfig.DateType,
  659. StartDate: lineChartInfoConfig.StartDate,
  660. EndDate: lineChartInfoConfig.EndDate,
  661. IsSetName: 0,
  662. EdbInfoIds: edbInfoIdStr,
  663. ChartType: 1,
  664. Calendar: "公历",
  665. SeasonStartDate: "",
  666. SeasonEndDate: "",
  667. ChartImage: "",
  668. Sort: 0,
  669. LeftMin: v.LeftMin,
  670. LeftMax: v.LeftMax,
  671. RightMin: "",
  672. RightMax: "",
  673. Disabled: disableVal,
  674. BarConfig: "",
  675. Source: source,
  676. ExtraConfig: string(tmpLineChartInfoConfigByte),
  677. }
  678. // 批量配置的关系图
  679. if tmpMultipleGraphConfigChartMapping, ok2 := existSourceChartMap[v.Source]; ok2 {
  680. multipleGraphConfigChartMapping = tmpMultipleGraphConfigChartMapping
  681. } else {
  682. multipleGraphConfigChartMapping = &data_manage.MultipleGraphConfigChartMapping{
  683. //Id: 0,
  684. //MultipleGraphConfigId: 0,
  685. //ChartInfoId: 0,
  686. Source: v.Source,
  687. ModifyTime: time.Now(),
  688. CreateTime: time.Now(),
  689. }
  690. }
  691. }
  692. // 指标信息
  693. mapList := make([]*data_manage.ChartEdbMapping, 0)
  694. for _, edbInfo := range edbList {
  695. mapItem := new(data_manage.ChartEdbMapping)
  696. mapItem.EdbInfoId = edbInfo.EdbInfoId
  697. mapItem.CreateTime = time.Now()
  698. mapItem.ModifyTime = time.Now()
  699. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  700. mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + fmt.Sprint(v.Source) + "_" + timestamp + "_" + strconv.Itoa(edbInfo.EdbInfoId))
  701. mapItem.IsOrder = true
  702. mapItem.IsAxis = 1
  703. mapItem.EdbInfoType = 1
  704. mapItem.Source = source
  705. mapList = append(mapList, mapItem)
  706. }
  707. batchAddChartList = append(batchAddChartList, line_equation.BatchAddChart{
  708. ChartInfo: chartInfo,
  709. EdbMappingList: mapList,
  710. MultipleGraphConfigChartMapping: multipleGraphConfigChartMapping,
  711. })
  712. }
  713. // 批量创建
  714. err = line_equation.CreateAndEditLineEquationChartAndEdb(multipleGraphConfig, batchAddChartList, updateMultipleGraphConfigCols, updateChartCols)
  715. // 更改es
  716. for _, v := range batchAddChartList {
  717. //添加es数据
  718. go data.EsAddOrEditChartInfo(v.ChartInfo.ChartInfoId)
  719. }
  720. return
  721. }