chart.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756
  1. package cross_variety
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/models/data_manage"
  6. cross_varietyModel "eta/eta_api/models/data_manage/cross_variety"
  7. "eta/eta_api/models/data_manage/cross_variety/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. "strconv"
  14. "strings"
  15. "time"
  16. )
  17. type LineEquationDataResp struct {
  18. MaxData float64
  19. MinData float64
  20. LatestDate string `description:"真实数据的最后日期"`
  21. EdbInfoCategoryType int
  22. ChartColor string
  23. ChartStyle string
  24. PredictChartColor string
  25. ChartType int
  26. ChartWidth int
  27. EdbName string
  28. EdbNameEn string
  29. Unit string
  30. UnitEn string
  31. IsAxis int
  32. DataList []data_manage.EdbDataList
  33. }
  34. // ChartInfoResp 截面散点图数据
  35. type ChartInfoResp struct {
  36. XName string `description:"x轴名称"`
  37. XNameEn string `description:"x轴名称(英文)"`
  38. XUnitName string `description:"x轴单位名称"`
  39. XUnitNameEn string `description:"x轴单位名称(英文)"`
  40. YName string `description:"y轴名称"`
  41. YNameEn string `description:"y轴名称(英文)"`
  42. YUnitName string `description:"y轴单位名称"`
  43. YUnitNameEn string `description:"y轴单位名称(英文)"`
  44. XMinValue string `description:"X轴的最小值"`
  45. XMaxValue string `description:"X轴的最大值"`
  46. YMinValue string `description:"Y轴的最小值"`
  47. YMaxValue string `description:"Y轴的最大值"`
  48. DataList []SectionScatterSeriesItemResp `description:"数据列"`
  49. }
  50. // SectionScatterSeriesItemResp 系列的返回
  51. type SectionScatterSeriesItemResp struct {
  52. Name string `description:"系列名"`
  53. NameEn string `description:"系列名(英文)"`
  54. Color string `description:"颜色"`
  55. CoordinatePointData []CoordinatePoint `description:"趋势线的前后坐标点"`
  56. }
  57. // SectionScatterEdbItemResp 截面散点的返回参数
  58. type SectionScatterEdbItemResp struct {
  59. XEdbInfoId int `description:"X轴指标id"`
  60. XDate string `description:"X轴指标实际日期"`
  61. XName string `description:"X轴指标名称"`
  62. XNameEn string `description:"X轴指标英文名称"`
  63. XValue float64 `description:"X轴实际值"`
  64. YEdbInfoId int `description:"Y轴指标id"`
  65. YDate string `description:"Y轴指标实际日期"`
  66. YName string `description:"Y轴指标名称"`
  67. YNameEn string `description:"Y轴指标英文名称"`
  68. YValue float64 `description:"Y轴实际值"`
  69. IsShow bool `description:"是否展示"`
  70. Name string `description:"标签名称"`
  71. NameEn string `description:"英文标签名称"`
  72. }
  73. // CoordinatePoint 坐标点
  74. type CoordinatePoint struct {
  75. X float64
  76. Y float64
  77. XDate string
  78. YDate string
  79. }
  80. // GetChartData
  81. // @Description: 获取跨品种分析图表数据
  82. // @author: Roc
  83. // @datetime 2023-11-24 09:42:59
  84. // @param chartInfoId int
  85. // @param config request.ChartConfigReq
  86. // @return edbList []*data_manage.ChartEdbInfoMapping
  87. // @return dataResp ChartInfoResp
  88. // @return err error
  89. // @return errMsg string
  90. // @return isSendEmail bool
  91. func GetChartData(chartInfoId int, config request.ChartConfigReq) (edbList []*data_manage.ChartEdbInfoMapping, dataResp ChartInfoResp, err error, errMsg string, isSendEmail bool) {
  92. moveUnitDays, ok := utils.FrequencyDaysMap[config.CalculateUnit]
  93. if !ok {
  94. errMsg = "错误的分析周期"
  95. err = errors.New(errMsg)
  96. isSendEmail = false
  97. return
  98. }
  99. isSendEmail = true
  100. // 品种map
  101. varietyMap := make(map[int]*cross_varietyModel.ChartVariety)
  102. {
  103. varietyList, tmpErr := cross_varietyModel.GetVarietyListByIdList(config.VarietyList)
  104. if tmpErr != nil {
  105. err = tmpErr
  106. return
  107. }
  108. for _, v := range varietyList {
  109. varietyMap[v.ChartVarietyId] = v
  110. }
  111. }
  112. // 标签m
  113. var xTagInfo, yTagInfo *cross_varietyModel.ChartTag
  114. {
  115. tagList, tmpErr := cross_varietyModel.GetTagListByIdList([]int{config.TagX, config.TagY})
  116. if tmpErr != nil {
  117. err = tmpErr
  118. return
  119. }
  120. for _, v := range tagList {
  121. if v.ChartTagId == config.TagX {
  122. xTagInfo = v
  123. } else if v.ChartTagId == config.TagY {
  124. yTagInfo = v
  125. }
  126. }
  127. }
  128. if xTagInfo == nil {
  129. errMsg = "找不到对应的X轴标签"
  130. err = errors.New(errMsg)
  131. return
  132. }
  133. if yTagInfo == nil {
  134. errMsg = "找不到对应的Y轴标签"
  135. err = errors.New(errMsg)
  136. return
  137. }
  138. xVarietyEdbMap := make(map[int]int)
  139. yVarietyEdbMap := make(map[int]int)
  140. xList, err := cross_varietyModel.GetChartTagVarietyListByTagAndVariety(config.TagX, config.VarietyList)
  141. if err != nil {
  142. errMsg = "获取失败"
  143. err = errors.New("获取X轴的品种指标配置信息失败,Err:" + err.Error())
  144. return
  145. }
  146. yList, err := cross_varietyModel.GetChartTagVarietyListByTagAndVariety(config.TagY, config.VarietyList)
  147. if err != nil {
  148. errMsg = "获取失败"
  149. err = errors.New("获取Y轴的品种指标配置信息失败,Err:" + err.Error())
  150. return
  151. }
  152. edbInfoIdList := make([]int, 0)
  153. for _, v := range xList {
  154. edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
  155. xVarietyEdbMap[v.ChartVarietyId] = v.EdbInfoId
  156. }
  157. for _, v := range yList {
  158. edbInfoIdList = append(edbInfoIdList, v.EdbInfoId)
  159. yVarietyEdbMap[v.ChartVarietyId] = v.EdbInfoId
  160. }
  161. // todo 需要取交集
  162. if len(edbInfoIdList) <= 0 {
  163. errMsg = "品种未配置指标"
  164. err = errors.New(errMsg)
  165. isSendEmail = false
  166. return
  167. }
  168. mappingList, err := data_manage.GetChartEdbMappingListByEdbInfoIdList(edbInfoIdList)
  169. if err != nil {
  170. errMsg = "获取指标信息失败"
  171. err = errors.New("获取指标信息失败,ERR:" + err.Error())
  172. return
  173. }
  174. // 指标对应的所有数据
  175. chartType := 1 //1:普通图,2:季节性图
  176. calendar := "公历"
  177. edbDataListMap, edbList, err := data.GetEdbDataMapList(chartInfoId, chartType, calendar, "", "", mappingList, "")
  178. if err != nil {
  179. return
  180. }
  181. currDay := time.Now()
  182. currDay = time.Date(currDay.Year(), currDay.Month(), currDay.Day(), 0, 0, 0, 0, time.Local)
  183. dataMap := make(map[string]float64)
  184. dateMap := make(map[string]string)
  185. for dateIndex, dateConfig := range config.DateConfigList {
  186. for _, edbInfoMapping := range mappingList {
  187. // 数据会是正序的
  188. dataList, ok := edbDataListMap[edbInfoMapping.EdbInfoId]
  189. if !ok {
  190. continue
  191. }
  192. lenData := len(dataList)
  193. if lenData <= 0 {
  194. continue
  195. }
  196. // 数据开始日期
  197. endDateStr := ``
  198. var endDate time.Time
  199. // 数据的开始索引
  200. k := lenData - 1
  201. var currVal float64
  202. switch dateConfig.DateType {
  203. case 1: // 1:最新日期;
  204. endDateStr = dataList[k].DataTime
  205. tmpDate, tmpErr := time.ParseInLocation(utils.FormatDate, endDateStr, time.Local)
  206. if tmpErr != nil {
  207. err = tmpErr
  208. return
  209. }
  210. endDate = tmpDate
  211. currVal = dataList[k].Value
  212. case 2: // 2:N天前
  213. tmpEndDate := currDay.AddDate(0, 0, -dateConfig.Num)
  214. tmpEndDateStr := tmpEndDate.Format(utils.FormatDate)
  215. for i := k; i >= 0; i-- {
  216. tmpDateStr := dataList[i].DataTime
  217. // 如果正好是这一天,那么就直接break了
  218. if tmpEndDateStr == tmpDateStr {
  219. k = i
  220. endDateStr = tmpDateStr
  221. currVal = dataList[i].Value
  222. break
  223. }
  224. tmpDate, tmpErr := time.ParseInLocation(utils.FormatDate, tmpDateStr, time.Local)
  225. if tmpErr != nil {
  226. err = tmpErr
  227. return
  228. }
  229. // 如果这期的日期晚于选择的日期,那么继续遍历
  230. if tmpDate.After(tmpEndDate) {
  231. continue
  232. }
  233. k = i
  234. endDateStr = tmpDateStr
  235. endDate = tmpDate
  236. currVal = dataList[i].Value
  237. break
  238. }
  239. }
  240. // 没有找到日期,那么就不处理
  241. if endDateStr == `` || endDate.IsZero() {
  242. continue
  243. }
  244. // 最早的日期
  245. earliestDate := endDate.AddDate(0, 0, -config.CalculateValue*moveUnitDays)
  246. earliestDateStr := earliestDate.Format(utils.FormatDate)
  247. var minVal, maxVal float64
  248. var isNotFirst bool // 是否是第一条数据
  249. for i := k; i >= 0; i-- {
  250. tmpData := dataList[i]
  251. if !isNotFirst {
  252. maxVal = tmpData.Value
  253. minVal = tmpData.Value
  254. isNotFirst = true
  255. continue
  256. }
  257. tmpDateStr := dataList[i].DataTime
  258. // 如果正好是这一天,那么就直接break了
  259. if earliestDateStr == tmpDateStr {
  260. break
  261. }
  262. tmpDate, tmpErr := time.ParseInLocation(utils.FormatDate, tmpDateStr, time.Local)
  263. if tmpErr != nil {
  264. err = tmpErr
  265. return
  266. }
  267. // 如果这期的日期早于选择的日期,那么继续停止遍历
  268. if tmpDate.Before(earliestDate) {
  269. continue
  270. }
  271. if tmpData.Value > maxVal {
  272. maxVal = tmpData.Value
  273. }
  274. if tmpData.Value < minVal {
  275. minVal = tmpData.Value
  276. }
  277. }
  278. // 最大值等于最小值,说明计算结果无效
  279. if maxVal == minVal {
  280. continue
  281. }
  282. //百分位=(现值-Min)/(Max-Min)
  283. tmpV := (currVal - minVal) / (maxVal - minVal) * 100
  284. tmpV, _ = decimal.NewFromFloat(tmpV).Round(4).Float64()
  285. // key的生成(日期配置下标+指标id)
  286. key := fmt.Sprint(dateIndex, "_", edbInfoMapping.EdbInfoId)
  287. dataMap[key] = tmpV
  288. dateMap[key] = endDateStr
  289. }
  290. }
  291. // 返回数据处理
  292. dataList := make([]SectionScatterSeriesItemResp, 0)
  293. var xMinVal, xMaxVal, yMinVal, yMaxVal float64
  294. var isNotFirst bool
  295. for _, varietyId := range config.VarietyList {
  296. xEdbInfoId, ok1 := xVarietyEdbMap[varietyId]
  297. if !ok1 {
  298. continue
  299. }
  300. yEdbInfoId, ok2 := yVarietyEdbMap[varietyId]
  301. if !ok2 {
  302. continue
  303. }
  304. variety, ok := varietyMap[varietyId]
  305. if !ok {
  306. continue
  307. }
  308. coordinatePointList := make([]CoordinatePoint, 0)
  309. for dateIndex, _ := range config.DateConfigList {
  310. key1 := fmt.Sprint(dateIndex, "_", xEdbInfoId)
  311. xVal, ok1 := dataMap[key1]
  312. if !ok1 {
  313. continue
  314. }
  315. key2 := fmt.Sprint(dateIndex, "_", yEdbInfoId)
  316. yVal, ok2 := dataMap[key2]
  317. if !ok2 {
  318. continue
  319. }
  320. if !isNotFirst {
  321. xMinVal = xVal
  322. xMaxVal = xVal
  323. yMinVal = yVal
  324. yMaxVal = yVal
  325. isNotFirst = true
  326. } else {
  327. if xVal < xMinVal {
  328. xMinVal = xVal
  329. }
  330. if xVal > xMaxVal {
  331. xMaxVal = xVal
  332. }
  333. if yVal < yMinVal {
  334. yMinVal = yVal
  335. }
  336. if yVal > yMaxVal {
  337. yMaxVal = yVal
  338. }
  339. }
  340. coordinatePointList = append(coordinatePointList, CoordinatePoint{
  341. X: xVal,
  342. Y: yVal,
  343. XDate: dateMap[key1],
  344. YDate: dateMap[key2],
  345. })
  346. }
  347. dataList = append(dataList, SectionScatterSeriesItemResp{
  348. Name: variety.ChartVarietyName,
  349. NameEn: "",
  350. Color: "",
  351. CoordinatePointData: coordinatePointList,
  352. })
  353. }
  354. dataResp = ChartInfoResp{
  355. XName: xTagInfo.ChartTagName,
  356. XNameEn: "",
  357. XUnitName: "%",
  358. XUnitNameEn: "%",
  359. YName: yTagInfo.ChartTagName,
  360. YNameEn: "",
  361. YUnitName: "%",
  362. YUnitNameEn: "%",
  363. XMinValue: fmt.Sprint(xMinVal),
  364. XMaxValue: fmt.Sprint(xMaxVal),
  365. YMinValue: fmt.Sprint(yMinVal),
  366. YMaxValue: fmt.Sprint(yMaxVal),
  367. DataList: dataList,
  368. }
  369. return
  370. }
  371. // AddChartInfo
  372. // @Description: AddChartInfo
  373. // @author: Roc
  374. // @datetime 2023-11-24 15:58:14
  375. // @param req request.AddChartReq
  376. // @param sysUser *system.Admin
  377. // @return chartInfo *data_manage.ChartInfo
  378. // @return err error
  379. // @return errMsg string
  380. // @return isSendEmail bool
  381. func AddChartInfo(req request.AddChartReq, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  382. isSendEmail = true
  383. source := utils.CHART_SOURCE_CROSS_HEDGING
  384. req.ChartName = strings.Trim(req.ChartName, " ")
  385. if req.ChartName == "" {
  386. errMsg = "请填写图表名称!"
  387. err = errors.New(errMsg)
  388. isSendEmail = false
  389. return
  390. }
  391. if req.TagX <= 0 {
  392. errMsg = "请选择X轴坐标的标签!"
  393. err = errors.New(errMsg)
  394. isSendEmail = false
  395. return
  396. }
  397. if req.TagY <= 0 {
  398. errMsg = "请选择Y轴坐标的标签!"
  399. err = errors.New(errMsg)
  400. isSendEmail = false
  401. return
  402. }
  403. if req.CalculateValue <= 0 {
  404. errMsg = "请设置时间长度!"
  405. err = errors.New(errMsg)
  406. isSendEmail = false
  407. return
  408. }
  409. if req.CalculateUnit == `` {
  410. errMsg = "请设置时间频度!"
  411. err = errors.New(errMsg)
  412. isSendEmail = false
  413. return
  414. }
  415. // 品种配置
  416. if len(req.VarietyList) < 0 {
  417. errMsg = "请选择品种!"
  418. err = errors.New(errMsg)
  419. isSendEmail = false
  420. return
  421. }
  422. // 日期配置
  423. dateConfigList := len(req.DateConfigList)
  424. if dateConfigList < 0 {
  425. errMsg = "请选择日期!"
  426. err = errors.New(errMsg)
  427. isSendEmail = false
  428. return
  429. }
  430. if dateConfigList > 5 {
  431. errMsg = "日期数量已达上限!"
  432. err = errors.New(errMsg)
  433. isSendEmail = false
  434. return
  435. }
  436. // 基础配置转string
  437. extraConfigByte, err := json.Marshal(req)
  438. if err != nil {
  439. return
  440. }
  441. chartClassify, err := data_manage.GetCrossVarietyChartClassifyBySysUserId(sysUser.AdminId)
  442. if err != nil {
  443. if err.Error() != utils.ErrNoRow() {
  444. errMsg = "获取分类信息失败"
  445. err = errors.New("获取分类信息失败,Err:" + err.Error())
  446. return
  447. }
  448. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  449. chartClassify = &data_manage.ChartClassify{
  450. ChartClassifyId: 0,
  451. ChartClassifyName: sysUser.RealName,
  452. ParentId: 0,
  453. HasData: 0,
  454. CreateTime: time.Now(),
  455. ModifyTime: time.Now(),
  456. SysUserId: sysUser.AdminId,
  457. SysUserRealName: sysUser.RealName,
  458. Level: 1,
  459. UniqueCode: utils.MD5(utils.DATA_PREFIX + "_" + timestamp),
  460. Sort: 0,
  461. Source: source,
  462. }
  463. }
  464. var chartInfoId int
  465. // 判断图表是否存在
  466. var condition string
  467. var pars []interface{}
  468. condition += " AND chart_name=? AND source = ? "
  469. pars = append(pars, req.ChartName, source)
  470. count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
  471. if err != nil {
  472. errMsg = "判断图表名称是否存在失败"
  473. err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
  474. return
  475. }
  476. if count > 0 {
  477. errMsg = "图表已存在,请重新填写"
  478. err = errors.New(errMsg)
  479. isSendEmail = false
  480. return
  481. }
  482. chartInfo = new(data_manage.ChartInfo)
  483. chartInfo.ChartName = req.ChartName
  484. //chartInfo.EdbInfoIds = edbInfoIdStr
  485. //chartInfo.ChartClassifyId = req.ChartClassifyId
  486. chartInfo.SysUserId = sysUser.AdminId
  487. chartInfo.SysUserRealName = sysUser.RealName
  488. chartInfo.CreateTime = time.Now()
  489. chartInfo.ModifyTime = time.Now()
  490. chartInfo.IsSetName = 0
  491. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  492. chartInfo.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
  493. chartInfo.ChartType = 9 // 相关性图
  494. chartInfo.Calendar = "公历"
  495. chartInfo.DateType = 6
  496. //chartInfo.StartDate = req.StartDate
  497. //chartInfo.EndDate = req.EndDate
  498. //chartInfo.SeasonStartDate = req.StartDate
  499. //chartInfo.SeasonEndDate = req.EndDate
  500. chartInfo.LeftMin = req.LeftMin
  501. chartInfo.LeftMax = req.LeftMax
  502. //chartInfo.RightMin = req.RightMin
  503. //chartInfo.RightMax = req.RightMax
  504. //chartInfo.Disabled = disableVal
  505. chartInfo.Source = source
  506. chartInfo.ExtraConfig = string(extraConfigByte)
  507. // 图表品种
  508. chartVarietyMappingList := make([]*cross_varietyModel.ChartVarietyMapping, 0)
  509. for _, varietyId := range req.VarietyList {
  510. chartVarietyMappingList = append(chartVarietyMappingList, &cross_varietyModel.ChartVarietyMapping{
  511. Id: 0,
  512. ChartInfoId: 0,
  513. ChartVarietyId: varietyId,
  514. ModifyTime: time.Now(),
  515. CreateTime: time.Now(),
  516. })
  517. }
  518. // 图表配置
  519. chartInfoCrossVariety := &cross_varietyModel.ChartInfoCrossVariety{
  520. Id: 0,
  521. ChartInfoId: 0,
  522. ChartXTagId: req.TagX,
  523. ChartYTagId: req.TagY,
  524. CalculateValue: req.CalculateValue,
  525. CalculateUnit: req.CalculateUnit,
  526. ModifyTime: time.Now(),
  527. CreateTime: time.Now(),
  528. }
  529. // 新增图表和指标mapping
  530. chartInfoId, e := cross_varietyModel.CreateChart(chartInfo, chartClassify, chartVarietyMappingList, chartInfoCrossVariety)
  531. if e != nil {
  532. errMsg = "操作失败"
  533. err = errors.New("新增相关性图表失败, Err: " + e.Error())
  534. return
  535. }
  536. //添加es数据
  537. go data.EsAddOrEditChartInfo(chartInfoId)
  538. return
  539. }
  540. // EditChartInfo
  541. // @Description: 编辑图表
  542. // @author: Roc
  543. // @datetime 2023-11-24 15:58:31
  544. // @param req request.EditChartReq
  545. // @param sysUser *system.Admin
  546. // @return chartItem *data_manage.ChartInfo
  547. // @return err error
  548. // @return errMsg string
  549. // @return isSendEmail bool
  550. func EditChartInfo(req request.EditChartReq, sysUser *system.Admin) (chartItem *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  551. isSendEmail = true
  552. chartItem, err = data_manage.GetChartInfoById(req.ChartInfoId)
  553. if err != nil {
  554. if err.Error() == utils.ErrNoRow() {
  555. errMsg = "图表已被删除,请刷新页面"
  556. err = errors.New(errMsg)
  557. isSendEmail = false
  558. return
  559. }
  560. errMsg = "获取图表信息失败"
  561. err = errors.New("获取图表信息失败,Err:" + err.Error())
  562. return
  563. }
  564. if chartItem.Source != utils.CHART_SOURCE_CROSS_HEDGING {
  565. errMsg = "该图不是跨品种分析图表!"
  566. err = errors.New(errMsg)
  567. isSendEmail = false
  568. return
  569. }
  570. req.ChartName = strings.Trim(req.ChartName, " ")
  571. if req.ChartName == "" {
  572. errMsg = "请填写图表名称!"
  573. err = errors.New(errMsg)
  574. isSendEmail = false
  575. return
  576. }
  577. if req.TagX <= 0 {
  578. errMsg = "请选择X轴坐标的标签!"
  579. err = errors.New(errMsg)
  580. isSendEmail = false
  581. return
  582. }
  583. if req.TagY <= 0 {
  584. errMsg = "请选择Y轴坐标的标签!"
  585. err = errors.New(errMsg)
  586. isSendEmail = false
  587. return
  588. }
  589. if req.CalculateValue <= 0 {
  590. errMsg = "请设置时间长度!"
  591. err = errors.New(errMsg)
  592. isSendEmail = false
  593. return
  594. }
  595. if req.CalculateUnit == `` {
  596. errMsg = "请设置时间频度!"
  597. err = errors.New(errMsg)
  598. isSendEmail = false
  599. return
  600. }
  601. // 品种配置
  602. if len(req.VarietyList) < 0 {
  603. errMsg = "请选择品种!"
  604. err = errors.New(errMsg)
  605. isSendEmail = false
  606. return
  607. }
  608. // 日期配置
  609. dateConfigList := len(req.DateConfigList)
  610. if dateConfigList < 0 {
  611. errMsg = "请选择日期!"
  612. err = errors.New(errMsg)
  613. isSendEmail = false
  614. return
  615. }
  616. if dateConfigList > 5 {
  617. errMsg = "日期数量已达上限!"
  618. err = errors.New(errMsg)
  619. isSendEmail = false
  620. return
  621. }
  622. // 基础配置转string
  623. extraConfigByte, err := json.Marshal(req)
  624. if err != nil {
  625. return
  626. }
  627. // 图表操作权限
  628. ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId)
  629. if !ok {
  630. errMsg = "没有该图表的操作权限"
  631. err = errors.New(errMsg)
  632. isSendEmail = false
  633. return
  634. }
  635. //判断图表是否存在
  636. var condition string
  637. var pars []interface{}
  638. condition += " AND chart_info_id <> ? "
  639. pars = append(pars, req.ChartInfoId)
  640. condition += " AND chart_name=? AND source = ? "
  641. pars = append(pars, req.ChartName, chartItem.Source)
  642. count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
  643. if err != nil {
  644. errMsg = "判断图表名称是否存在失败"
  645. err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
  646. return
  647. }
  648. if count > 0 {
  649. errMsg = "图表已存在,请重新填写"
  650. err = errors.New(errMsg)
  651. isSendEmail = false
  652. return
  653. }
  654. chartItem.ChartName = req.ChartName
  655. chartItem.ExtraConfig = string(extraConfigByte)
  656. chartItem.ModifyTime = time.Now()
  657. chartUpdateCols := []string{"ChartName", "ExtraConfig", "ModifyTime"}
  658. // 跨品种分析配置
  659. chartInfoCrossVariety, err := cross_varietyModel.GetChartInfoCrossVarietyByChartInfoId(chartItem.ChartInfoId)
  660. if err != nil {
  661. return
  662. }
  663. chartInfoCrossVariety.ChartXTagId = req.TagX
  664. chartInfoCrossVariety.ChartYTagId = req.TagY
  665. chartInfoCrossVariety.CalculateValue = req.CalculateValue
  666. chartInfoCrossVariety.CalculateUnit = req.CalculateUnit
  667. chartInfoCrossVariety.ModifyTime = time.Now()
  668. chartInfoCrossVarietyUpdateCols := []string{"ChartXTagId", "ChartYTagId", "CalculateValue", "CalculateUnit", "ModifyTime"}
  669. // 图表品种
  670. chartVarietyMappingList := make([]*cross_varietyModel.ChartVarietyMapping, 0)
  671. for _, varietyId := range req.VarietyList {
  672. chartVarietyMappingList = append(chartVarietyMappingList, &cross_varietyModel.ChartVarietyMapping{
  673. Id: 0,
  674. ChartInfoId: 0,
  675. ChartVarietyId: varietyId,
  676. ModifyTime: time.Now(),
  677. CreateTime: time.Now(),
  678. })
  679. }
  680. err = cross_varietyModel.EditChart(chartItem, chartVarietyMappingList, chartInfoCrossVariety,
  681. chartUpdateCols, chartInfoCrossVarietyUpdateCols)
  682. if err != nil {
  683. errMsg = "保存失败"
  684. err = errors.New("保存失败,Err:" + err.Error())
  685. return
  686. }
  687. resp := new(data_manage.AddChartInfoResp)
  688. resp.ChartInfoId = chartItem.ChartInfoId
  689. resp.UniqueCode = chartItem.UniqueCode
  690. //resp.ChartType = req.ChartType
  691. //添加es数据
  692. go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
  693. //修改my eta es数据
  694. go data.EsAddOrEditMyChartInfoByChartInfoId(chartItem.ChartInfoId)
  695. return
  696. }