chart.go 22 KB

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