chart.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789
  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. func AddChartInfo(req request.AddChartReq, source int, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  373. isSendEmail = true
  374. req.ChartName = strings.Trim(req.ChartName, " ")
  375. if req.ChartName == "" {
  376. errMsg = "请填写图表名称!"
  377. err = errors.New(errMsg)
  378. isSendEmail = false
  379. return
  380. }
  381. if req.TagX <= 0 {
  382. errMsg = "请选择X轴坐标的标签!"
  383. err = errors.New(errMsg)
  384. isSendEmail = false
  385. return
  386. }
  387. if req.TagY <= 0 {
  388. errMsg = "请选择Y轴坐标的标签!"
  389. err = errors.New(errMsg)
  390. isSendEmail = false
  391. return
  392. }
  393. if req.CalculateValue <= 0 {
  394. errMsg = "请设置时间长度!"
  395. err = errors.New(errMsg)
  396. isSendEmail = false
  397. return
  398. }
  399. if req.CalculateUnit == `` {
  400. errMsg = "请设置时间频度!"
  401. err = errors.New(errMsg)
  402. isSendEmail = false
  403. return
  404. }
  405. // 品种配置
  406. if len(req.VarietyList) < 0 {
  407. errMsg = "请选择品种!"
  408. err = errors.New(errMsg)
  409. isSendEmail = false
  410. return
  411. }
  412. // 日期配置
  413. dateConfigList := len(req.DateConfigList)
  414. if dateConfigList < 0 {
  415. errMsg = "请选择日期!"
  416. err = errors.New(errMsg)
  417. isSendEmail = false
  418. return
  419. }
  420. if dateConfigList > 5 {
  421. errMsg = "日期数量已达上限!"
  422. err = errors.New(errMsg)
  423. isSendEmail = false
  424. return
  425. }
  426. // 基础配置转string
  427. extraConfigByte, err := json.Marshal(req)
  428. if err != nil {
  429. return
  430. }
  431. chartClassify, err := data_manage.GetCrossVarietyChartClassifyBySysUserId(sysUser.AdminId)
  432. if err != nil {
  433. if err.Error() != utils.ErrNoRow() {
  434. errMsg = "获取分类信息失败"
  435. err = errors.New("获取分类信息失败,Err:" + err.Error())
  436. return
  437. }
  438. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  439. chartClassify = &data_manage.ChartClassify{
  440. ChartClassifyId: 0,
  441. ChartClassifyName: sysUser.RealName,
  442. ParentId: 0,
  443. HasData: 0,
  444. CreateTime: time.Now(),
  445. ModifyTime: time.Now(),
  446. SysUserId: sysUser.AdminId,
  447. SysUserRealName: sysUser.RealName,
  448. Level: 1,
  449. UniqueCode: utils.MD5(utils.DATA_PREFIX + "_" + timestamp),
  450. Sort: 0,
  451. Source: source,
  452. }
  453. }
  454. var chartInfoId int
  455. // 判断图表是否存在
  456. var condition string
  457. var pars []interface{}
  458. condition += " AND chart_name=? AND source = ? "
  459. pars = append(pars, req.ChartName, source)
  460. count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
  461. if err != nil {
  462. errMsg = "判断图表名称是否存在失败"
  463. err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
  464. return
  465. }
  466. if count > 0 {
  467. errMsg = "图表已存在,请重新填写"
  468. err = errors.New(errMsg)
  469. isSendEmail = false
  470. return
  471. }
  472. chartInfo = new(data_manage.ChartInfo)
  473. chartInfo.ChartName = req.ChartName
  474. //chartInfo.EdbInfoIds = edbInfoIdStr
  475. //chartInfo.ChartClassifyId = req.ChartClassifyId
  476. chartInfo.SysUserId = sysUser.AdminId
  477. chartInfo.SysUserRealName = sysUser.RealName
  478. chartInfo.CreateTime = time.Now()
  479. chartInfo.ModifyTime = time.Now()
  480. chartInfo.IsSetName = 0
  481. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  482. chartInfo.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
  483. chartInfo.ChartType = 9 // 相关性图
  484. chartInfo.Calendar = "公历"
  485. chartInfo.DateType = 6
  486. //chartInfo.StartDate = req.StartDate
  487. //chartInfo.EndDate = req.EndDate
  488. //chartInfo.SeasonStartDate = req.StartDate
  489. //chartInfo.SeasonEndDate = req.EndDate
  490. chartInfo.LeftMin = req.LeftMin
  491. chartInfo.LeftMax = req.LeftMax
  492. //chartInfo.RightMin = req.RightMin
  493. //chartInfo.RightMax = req.RightMax
  494. //chartInfo.Disabled = disableVal
  495. chartInfo.Source = source
  496. chartInfo.ExtraConfig = string(extraConfigByte)
  497. // 图表品种
  498. chartVarietyMappingList := make([]*cross_varietyModel.ChartVarietyMapping, 0)
  499. for _, varietyId := range req.VarietyList {
  500. chartVarietyMappingList = append(chartVarietyMappingList, &cross_varietyModel.ChartVarietyMapping{
  501. Id: 0,
  502. ChartInfoId: 0,
  503. ChartVarietyId: varietyId,
  504. ModifyTime: time.Now(),
  505. CreateTime: time.Now(),
  506. })
  507. }
  508. // 图表配置
  509. chartInfoCrossVariety := &cross_varietyModel.ChartInfoCrossVariety{
  510. Id: 0,
  511. ChartInfoId: 0,
  512. ChartXTagId: req.TagX,
  513. ChartYTagId: req.TagY,
  514. CalculateValue: req.CalculateValue,
  515. CalculateUnit: req.CalculateUnit,
  516. ModifyTime: time.Now(),
  517. CreateTime: time.Now(),
  518. }
  519. // 新增图表和指标mapping
  520. chartInfoId, e := cross_varietyModel.CreateChart(chartInfo, chartClassify, chartVarietyMappingList, chartInfoCrossVariety)
  521. if e != nil {
  522. errMsg = "操作失败"
  523. err = errors.New("新增相关性图表失败, Err: " + e.Error())
  524. return
  525. }
  526. //添加es数据
  527. go data.EsAddOrEditChartInfo(chartInfoId)
  528. return
  529. }
  530. // EditChartInfo 编辑图表
  531. func EditChartInfo(req request.EditChartReq, sysUser *system.Admin) (chartItem *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  532. isSendEmail = true
  533. chartItem, err = data_manage.GetChartInfoById(req.ChartInfoId)
  534. if err != nil {
  535. if err.Error() == utils.ErrNoRow() {
  536. errMsg = "图表已被删除,请刷新页面"
  537. err = errors.New(errMsg)
  538. isSendEmail = false
  539. return
  540. }
  541. errMsg = "获取图表信息失败"
  542. err = errors.New("获取图表信息失败,Err:" + err.Error())
  543. return
  544. }
  545. if chartItem.Source != utils.CHART_SOURCE_CROSS_HEDGING {
  546. errMsg = "该图不是跨品种分析图表!"
  547. err = errors.New(errMsg)
  548. isSendEmail = false
  549. return
  550. }
  551. req.ChartName = strings.Trim(req.ChartName, " ")
  552. if req.ChartName == "" {
  553. errMsg = "请填写图表名称!"
  554. err = errors.New(errMsg)
  555. isSendEmail = false
  556. return
  557. }
  558. if req.TagX <= 0 {
  559. errMsg = "请选择X轴坐标的标签!"
  560. err = errors.New(errMsg)
  561. isSendEmail = false
  562. return
  563. }
  564. if req.TagY <= 0 {
  565. errMsg = "请选择Y轴坐标的标签!"
  566. err = errors.New(errMsg)
  567. isSendEmail = false
  568. return
  569. }
  570. if req.CalculateValue <= 0 {
  571. errMsg = "请设置时间长度!"
  572. err = errors.New(errMsg)
  573. isSendEmail = false
  574. return
  575. }
  576. if req.CalculateUnit == `` {
  577. errMsg = "请设置时间频度!"
  578. err = errors.New(errMsg)
  579. isSendEmail = false
  580. return
  581. }
  582. // 品种配置
  583. if len(req.VarietyList) < 0 {
  584. errMsg = "请选择品种!"
  585. err = errors.New(errMsg)
  586. isSendEmail = false
  587. return
  588. }
  589. // 日期配置
  590. dateConfigList := len(req.DateConfigList)
  591. if dateConfigList < 0 {
  592. errMsg = "请选择日期!"
  593. err = errors.New(errMsg)
  594. isSendEmail = false
  595. return
  596. }
  597. if dateConfigList > 5 {
  598. errMsg = "日期数量已达上限!"
  599. err = errors.New(errMsg)
  600. isSendEmail = false
  601. return
  602. }
  603. // 基础配置转string
  604. extraConfigByte, err := json.Marshal(req)
  605. if err != nil {
  606. return
  607. }
  608. // 图表操作权限
  609. ok := data.CheckOpChartPermission(sysUser, chartItem.SysUserId)
  610. if !ok {
  611. errMsg = "没有该图表的操作权限"
  612. err = errors.New(errMsg)
  613. isSendEmail = false
  614. return
  615. }
  616. //判断图表是否存在
  617. var condition string
  618. var pars []interface{}
  619. condition += " AND chart_info_id <> ? "
  620. pars = append(pars, req.ChartInfoId)
  621. condition += " AND chart_name=? AND source = ? "
  622. pars = append(pars, req.ChartName, chartItem.Source)
  623. count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
  624. if err != nil {
  625. errMsg = "判断图表名称是否存在失败"
  626. err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
  627. return
  628. }
  629. if count > 0 {
  630. errMsg = "图表已存在,请重新填写"
  631. err = errors.New(errMsg)
  632. isSendEmail = false
  633. return
  634. }
  635. chartItem.ChartName = req.ChartName
  636. chartItem.ExtraConfig = string(extraConfigByte)
  637. chartItem.ModifyTime = time.Now()
  638. chartUpdateCols := []string{"ChartName", "ExtraConfig", "ModifyTime"}
  639. // 跨品种分析配置
  640. chartInfoCrossVariety, err := cross_varietyModel.GetChartInfoCrossVarietyByChartInfoId(chartItem.ChartInfoId)
  641. if err != nil {
  642. return
  643. }
  644. chartInfoCrossVariety.ChartXTagId = req.TagX
  645. chartInfoCrossVariety.ChartYTagId = req.TagY
  646. chartInfoCrossVariety.CalculateValue = req.CalculateValue
  647. chartInfoCrossVariety.CalculateUnit = req.CalculateUnit
  648. chartInfoCrossVariety.ModifyTime = time.Now()
  649. chartInfoCrossVarietyUpdateCols := []string{"ChartXTagId", "ChartYTagId", "CalculateValue", "CalculateUnit", "ModifyTime"}
  650. // 图表品种
  651. chartVarietyMappingList := make([]*cross_varietyModel.ChartVarietyMapping, 0)
  652. for _, varietyId := range req.VarietyList {
  653. chartVarietyMappingList = append(chartVarietyMappingList, &cross_varietyModel.ChartVarietyMapping{
  654. Id: 0,
  655. ChartInfoId: 0,
  656. ChartVarietyId: varietyId,
  657. ModifyTime: time.Now(),
  658. CreateTime: time.Now(),
  659. })
  660. }
  661. err = cross_varietyModel.EditChart(chartItem, chartVarietyMappingList, chartInfoCrossVariety,
  662. chartUpdateCols, chartInfoCrossVarietyUpdateCols)
  663. if err != nil {
  664. errMsg = "保存失败"
  665. err = errors.New("保存失败,Err:" + err.Error())
  666. return
  667. }
  668. resp := new(data_manage.AddChartInfoResp)
  669. resp.ChartInfoId = chartItem.ChartInfoId
  670. resp.UniqueCode = chartItem.UniqueCode
  671. //resp.ChartType = req.ChartType
  672. //添加es数据
  673. go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
  674. //修改my eta es数据
  675. go data.EsAddOrEditMyChartInfoByChartInfoId(chartItem.ChartInfoId)
  676. return
  677. }
  678. // CopyChartInfo 复制图表
  679. //func CopyChartInfo(configId, classifyId int, chartName string, correlationChartInfoReq data_manage.CorrelationChartInfoReq, sysUser *system.Admin) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  680. // configSource := 2
  681. // isSendEmail = true
  682. // // 获取相关性图的配置
  683. // multipleGraphConfigChartMapping, err := data_manage.GetMultipleGraphConfigChartMappingByIdAndSource(configId, configSource)
  684. // if err != nil {
  685. // return
  686. // }
  687. // multipleGraphConfig, err := data_manage.GetMultipleGraphConfigById(configId)
  688. // if err != nil {
  689. // return
  690. // }
  691. // multipleGraphConfig.MultipleGraphConfigId = 0
  692. // err = data_manage.AddMultipleGraphConfig(multipleGraphConfig)
  693. // if err != nil {
  694. // return
  695. // }
  696. //
  697. // // 添加图
  698. // addChartReq := data_manage.AddChartInfoReq{
  699. // ChartClassifyId: classifyId,
  700. // ChartName: chartName,
  701. // ChartType: utils.CHART_TYPE_CURVE,
  702. // Calendar: "公历",
  703. // CorrelationChartInfo: correlationChartInfoReq,
  704. // }
  705. // chartSource := utils.CHART_SOURCE_CORRELATION // 默认是相关性图
  706. // chartInfo, err, errMsg, isSendEmail = AddChartInfo(addChartReq, chartSource, sysUser)
  707. // if err != nil {
  708. // return
  709. // }
  710. //
  711. // // 添加关系
  712. // multipleGraphConfigChartMapping = &data_manage.MultipleGraphConfigChartMapping{
  713. // //Id: 0,
  714. // MultipleGraphConfigId: multipleGraphConfig.MultipleGraphConfigId,
  715. // ChartInfoId: chartInfo.ChartInfoId,
  716. // Source: configSource,
  717. // ModifyTime: time.Now(),
  718. // CreateTime: time.Now(),
  719. // }
  720. // err = data_manage.AddMultipleGraphConfigChartMapping(multipleGraphConfigChartMapping)
  721. // if err != nil {
  722. // return
  723. // }
  724. //
  725. // //添加es数据
  726. // go data.EsAddOrEditChartInfo(chartInfo.ChartInfoId)
  727. //
  728. // return
  729. //}