chart_info_excel_balance.go 57 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728
  1. package data
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/models/data_manage"
  6. "eta/eta_api/models/data_manage/chart_theme"
  7. excelModel "eta/eta_api/models/data_manage/excel"
  8. "eta/eta_api/models/data_manage/excel/request"
  9. "eta/eta_api/models/system"
  10. "eta/eta_api/services/data/data_manage_permission"
  11. "eta/eta_api/utils"
  12. "fmt"
  13. "math"
  14. "strconv"
  15. "strings"
  16. "time"
  17. )
  18. // AddBalanceExcelChart 添加平衡表图表
  19. func AddBalanceExcelChart(excelInfo *excelModel.ExcelInfo, req request.AddBalanceTableChartReq, sysUser *system.Admin, dataListMap map[int][]*data_manage.EdbDataList) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  20. /*// 操作权限校验, 增加协作人判断
  21. {
  22. checkExcelInfo := excelInfo
  23. checkExcelInfoId := excelInfo.ExcelInfoId
  24. if excelInfo.BalanceType == 1 {
  25. checkExcelInfoId = excelInfo.RelExcelInfoId
  26. } else {
  27. if excelInfo.ParentId > 0 {
  28. checkExcelInfoId = excelInfo.ParentId
  29. }
  30. }
  31. if checkExcelInfoId != excelInfo.ExcelInfoId {
  32. checkExcelInfo, err = excelModel.GetExcelInfoById(checkExcelInfoId)
  33. if err != nil {
  34. errMsg = "获取平衡表格信息失败"
  35. err = fmt.Errorf("获取平衡表格信息失败,Err:" + err.Error())
  36. return
  37. }
  38. }
  39. // 数据权限
  40. haveOperaAuth, e := data_manage_permission.CheckExcelPermissionByExcelInfoId(checkExcelInfo.ExcelInfoId, checkExcelInfo.ExcelClassifyId, checkExcelInfo.IsJoinPermission, sysUser.AdminId)
  41. if e != nil {
  42. errMsg = "获取ETA表格权限失败"
  43. err = fmt.Errorf("获取表格权限信息失败,Err" + e.Error())
  44. return
  45. }
  46. button := excelService.GetBalanceExcelInfoOpButton(sysUser.AdminId, checkExcelInfo.SysUserId, haveOperaAuth, checkExcelInfo.ExcelInfoId)
  47. if !button.OpButton {
  48. errMsg = "无操作权限"
  49. isSendEmail = false
  50. return
  51. }
  52. }*/
  53. if len(req.ChartEdbInfoList) == 0 {
  54. errMsg = "图表数据不能为空!"
  55. err = fmt.Errorf("图表数据不能为空!%s", err.Error())
  56. return
  57. }
  58. chartEdbList := make([]*excelModel.AddChartEdbAndDataItem, 0)
  59. for k, chartEdb := range req.ChartEdbInfoList {
  60. excelEdb := new(excelModel.ExcelChartEdb)
  61. excelEdb.EdbName = chartEdb.EdbName
  62. randStr := utils.GetRandDigit(4)
  63. excelEdb.EdbCode = `T` + time.Now().Format("060102150405") + "_" + randStr
  64. excelEdb.ExcelInfoId = excelInfo.ExcelInfoId
  65. excelEdb.DateSequence = chartEdb.DateSequenceStr
  66. excelEdb.DataSequence = chartEdb.DataSequenceStr
  67. excelEdb.SysUserId = sysUser.AdminId
  68. excelEdb.SysUserRealName = sysUser.RealName
  69. excelEdb.MaxData = chartEdb.MaxData
  70. excelEdb.MinData = chartEdb.MinData
  71. excelEdb.IsOrder = chartEdb.IsOrder
  72. excelEdb.IsAxis = chartEdb.IsAxis
  73. excelEdb.FromTag = chartEdb.FromTag
  74. excelEdb.EdbInfoType = chartEdb.EdbInfoType
  75. excelEdb.LeadValue = chartEdb.LeadValue
  76. excelEdb.LeadUnit = chartEdb.LeadUnit
  77. excelEdb.CreateTime = time.Now()
  78. excelEdb.ModifyTime = time.Now()
  79. excelEdb.ChartWidth = 1
  80. var dataList []*excelModel.ExcelChartData
  81. if excelInfo.BalanceType == 1 {
  82. tmpList, ok := dataListMap[k]
  83. if !ok {
  84. errMsg = "查询图表数据失败!"
  85. err = fmt.Errorf("查询图表数据失败!%s", err.Error())
  86. return
  87. }
  88. for _, l := range tmpList {
  89. tmp := &excelModel.ExcelChartData{
  90. DataTime: l.DataTime,
  91. Value: l.Value,
  92. DataTimestamp: l.DataTimestamp,
  93. }
  94. dataList = append(dataList, tmp)
  95. }
  96. }
  97. // 处理日期列表和值列表
  98. addItem := &excelModel.AddChartEdbAndDataItem{
  99. ChartEdb: excelEdb,
  100. DataList: dataList,
  101. }
  102. chartEdbList = append(chartEdbList, addItem)
  103. }
  104. chartInfo, err, errMsg, isSendEmail = addBalanceExcelChart(req, sysUser.AdminId, sysUser.RealName)
  105. if err != nil {
  106. errMsg = "新增图表失败!"
  107. err = fmt.Errorf("新增图表失败!%s, %s", errMsg, err.Error())
  108. return
  109. }
  110. obj := new(excelModel.ExcelChartEdb)
  111. err = obj.AddChartEdbAndData(chartEdbList, chartInfo, []int{})
  112. if err != nil {
  113. errMsg = "新增图表失败!"
  114. err = fmt.Errorf("新增图表数据失败!%s", err.Error())
  115. return
  116. }
  117. return
  118. }
  119. func addBalanceExcelChart(req request.AddBalanceTableChartReq, sysUserId int, sysUserRealName string) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  120. isSendEmail = true // 默认错误的时候要发送邮件
  121. req.ChartName = strings.Trim(req.ChartName, " ")
  122. if req.ChartName == "" {
  123. errMsg = "请填写图表名称!"
  124. err = fmt.Errorf(errMsg)
  125. isSendEmail = false
  126. return
  127. }
  128. chartType := req.ChartType
  129. extraConfig := req.ExtraConfig
  130. // 查找默认主题设置
  131. // 查找主题类型id
  132. chartThemeType, err := chart_theme.GetChartThemeTypeByChartType(chartType)
  133. if err != nil {
  134. errMsg = "查找主题类型失败!"
  135. err = fmt.Errorf("%s, %s", errMsg, err.Error())
  136. return
  137. }
  138. chartThemeId := chartThemeType.DefaultChartThemeId
  139. // 季节性图表额外配置信息
  140. var seasonExtraConfig string
  141. if len(req.ChartEdbInfoList) <= 0 {
  142. errMsg = "请选择指标!"
  143. err = fmt.Errorf(errMsg)
  144. return
  145. }
  146. if chartType == 2 {
  147. // 处理季节性图表横轴配置
  148. {
  149. if req.SeasonExtraConfig.XEndDate != "" {
  150. if req.SeasonExtraConfig.XStartDate > req.SeasonExtraConfig.XEndDate && req.SeasonExtraConfig.JumpYear != 1 {
  151. errMsg = "季节性图表配置信息异常:横坐标日期配置错误"
  152. err = fmt.Errorf("季节性图表配置信息异常: 横坐标日期配置错误")
  153. return
  154. }
  155. seasonExtra, tErr := json.Marshal(req.SeasonExtraConfig)
  156. if tErr != nil {
  157. errMsg = "季节性图表配置信息异常"
  158. err = fmt.Errorf("季节性图表配置信息异常,Err:" + tErr.Error())
  159. return
  160. }
  161. seasonExtraConfig = string(seasonExtra)
  162. }
  163. }
  164. }
  165. // 图表额外配置
  166. extraConfig, err, errMsg = HandleExtraConfig(chartType, extraConfig)
  167. if err != nil {
  168. if errMsg == `` {
  169. errMsg = "指标异常!"
  170. }
  171. err = fmt.Errorf("指标异常!Err:" + err.Error())
  172. return
  173. }
  174. //判断图表是否存在
  175. var condition string
  176. var pars []interface{}
  177. // 图表名称在不同图分类下不允许重复 需求调整时间:2022年11月07日09:47:07
  178. condition += " AND chart_classify_id=0 "
  179. condition += " AND chart_name=? AND source = ? "
  180. pars = append(pars, req.ChartName, utils.CHART_SOURCE_BALANCE_EXCEL)
  181. count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
  182. if err != nil {
  183. errMsg = "判断图表名称是否存在失败"
  184. err = fmt.Errorf("判断图表名称是否存在失败,Err:" + err.Error())
  185. return
  186. }
  187. if count > 0 {
  188. errMsg = "图表已存在,请重新填写"
  189. err = fmt.Errorf("判断图表名称是否存在失败")
  190. isSendEmail = false
  191. return
  192. }
  193. chartInfo = new(data_manage.ChartInfo)
  194. chartInfo.ChartName = req.ChartName
  195. //chartInfo.EdbInfoIds = edbInfoIdStr
  196. //chartInfo.ChartClassifyId = req.ChartClassifyId
  197. chartInfo.SysUserId = sysUserId
  198. chartInfo.SysUserRealName = sysUserRealName
  199. chartInfo.CreateTime = time.Now()
  200. chartInfo.ModifyTime = time.Now()
  201. chartInfo.IsSetName = 0
  202. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  203. chartInfo.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
  204. // todo 判断是否需要重新计算用户的start_date
  205. chartInfo.DateType = 3
  206. if chartType == 0 {
  207. chartType = 1
  208. }
  209. chartInfo.ChartType = chartType
  210. calendar := req.Calendar
  211. if calendar == "" {
  212. calendar = "公历"
  213. }
  214. chartInfo.Calendar = calendar
  215. /* chartInfo.StartDate = req.StartDate
  216. chartInfo.EndDate = req.EndDate
  217. chartInfo.SeasonStartDate = req.StartDate
  218. chartInfo.SeasonEndDate = req.EndDate*/
  219. chartInfo.LeftMin = req.LeftMin
  220. chartInfo.LeftMax = req.LeftMax
  221. chartInfo.RightMin = req.RightMin
  222. chartInfo.RightMax = req.RightMax
  223. chartInfo.Right2Min = req.Right2Min
  224. chartInfo.Right2Max = req.Right2Max
  225. chartInfo.MinMaxSave = req.MinMaxSave
  226. //chartInfo.Disabled = disableVal
  227. //chartInfo.BarConfig = barChartConf
  228. chartInfo.ExtraConfig = extraConfig
  229. chartInfo.SeasonExtraConfig = seasonExtraConfig
  230. //chartInfo.StartYear = req.StartYear
  231. chartInfo.Source = utils.CHART_SOURCE_BALANCE_EXCEL
  232. chartInfo.ChartThemeId = chartThemeId
  233. chartInfo.SourcesFrom = req.SourcesFrom
  234. /* chartInfo.Instructions = req.Instructions
  235. chartInfo.MarkersLines = req.MarkersLines
  236. chartInfo.MarkersAreas = req.MarkersAreas
  237. chartInfo.Unit = req.Unit
  238. chartInfo.UnitEn = req.UnitEn*/
  239. /*newId, err := data_manage.AddChartInfo(chartInfo)
  240. if err != nil {
  241. errMsg = `保存失败`
  242. err = fmt.Errorf("保存失败,Err:" + err.Error())
  243. return
  244. }
  245. chartInfo.ChartInfoId = int(newId)*/
  246. //添加es数据
  247. //go EsAddOrEditChartInfo(chartInfo.ChartInfoId)
  248. return
  249. }
  250. // EditBalanceExcelChart 添加平衡表图表
  251. func EditBalanceExcelChart(excelInfo *excelModel.ExcelInfo, req request.AddBalanceTableChartReq, sysUser *system.Admin, dataListMap map[int][]*data_manage.EdbDataList) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  252. if len(req.ChartEdbInfoList) == 0 {
  253. errMsg = "图表数据不能为空!"
  254. err = fmt.Errorf("图表数据不能为空!%s", err.Error())
  255. return
  256. }
  257. /*// 操作权限校验, 增加协作人判断
  258. {
  259. checkExcelInfo := excelInfo
  260. checkExcelInfoId := excelInfo.ExcelInfoId
  261. if excelInfo.BalanceType == 1 {
  262. checkExcelInfoId = excelInfo.RelExcelInfoId
  263. } else {
  264. if excelInfo.ParentId > 0 {
  265. checkExcelInfoId = excelInfo.ParentId
  266. }
  267. }
  268. if checkExcelInfoId != excelInfo.ExcelInfoId {
  269. checkExcelInfo, err = excelModel.GetExcelInfoById(checkExcelInfoId)
  270. if err != nil {
  271. errMsg = "获取平衡表格信息失败"
  272. err = fmt.Errorf("获取平衡表格信息失败,Err:" + err.Error())
  273. return
  274. }
  275. }
  276. // 数据权限
  277. haveOperaAuth, e := data_manage_permission.CheckExcelPermissionByExcelInfoId(checkExcelInfo.ExcelInfoId, checkExcelInfo.ExcelClassifyId, checkExcelInfo.IsJoinPermission, sysUser.AdminId)
  278. if e != nil {
  279. errMsg = "获取ETA表格权限失败"
  280. err = fmt.Errorf("获取表格权限信息失败,Err" + e.Error())
  281. return
  282. }
  283. button := excelService.GetBalanceExcelInfoOpButton(sysUser.AdminId, checkExcelInfo.SysUserId, haveOperaAuth, checkExcelInfo.ExcelInfoId)
  284. if !button.OpButton {
  285. errMsg = "无操作权限"
  286. isSendEmail = false
  287. return
  288. }
  289. }
  290. */
  291. //查询已有的mapping
  292. mapping, err := excelModel.GetExcelChartEdbMappingByChartInfoId(req.ChartInfoId)
  293. if err != nil {
  294. errMsg = "查询图表mapping失败!"
  295. err = fmt.Errorf("查询图表mapping失败!%s", err.Error())
  296. return
  297. }
  298. deleteMap := make(map[int]int)
  299. for _, v := range mapping {
  300. deleteMap[v.ExcelChartEdbId] = v.ExcelChartEdbId
  301. }
  302. // 查询edbIds
  303. chartEdbList := make([]*excelModel.AddChartEdbAndDataItem, 0)
  304. for k, chartEdb := range req.ChartEdbInfoList {
  305. if _, ok := deleteMap[chartEdb.ExcelChartEdbId]; ok {
  306. delete(deleteMap, chartEdb.ExcelChartEdbId)
  307. }
  308. excelChartEdbId := chartEdb.ExcelChartEdbId
  309. excelEdb := new(excelModel.ExcelChartEdb)
  310. if excelChartEdbId > 0 {
  311. excelEdb, err = excelModel.GetExcelChartEdbById(excelChartEdbId)
  312. if err != nil {
  313. if err.Error() == utils.ErrNoRow() {
  314. errMsg = "指标不存在!"
  315. err = errors.New("指标不存在,edbInfoId:" + strconv.Itoa(excelChartEdbId))
  316. return
  317. } else {
  318. errMsg = "获取指标信息失败!"
  319. err = errors.New("获取图表的指标信息失败,Err:" + err.Error())
  320. return
  321. }
  322. }
  323. }
  324. excelEdb.EdbName = chartEdb.EdbName
  325. excelEdb.DateSequence = chartEdb.DateSequenceStr
  326. excelEdb.DataSequence = chartEdb.DataSequenceStr
  327. excelEdb.MaxData = chartEdb.MaxData
  328. excelEdb.MinData = chartEdb.MinData
  329. excelEdb.IsOrder = chartEdb.IsOrder
  330. excelEdb.IsAxis = chartEdb.IsAxis
  331. excelEdb.FromTag = chartEdb.FromTag
  332. excelEdb.EdbInfoType = chartEdb.EdbInfoType
  333. excelEdb.LeadValue = chartEdb.LeadValue
  334. excelEdb.LeadUnit = chartEdb.LeadUnit
  335. excelEdb.ModifyTime = time.Now()
  336. var dataList []*excelModel.ExcelChartData
  337. if excelInfo.BalanceType == 1 {
  338. // 如果是静态表,则直接使用前端传输的数据落到数据库里
  339. tmpList, ok := dataListMap[k]
  340. if !ok {
  341. errMsg = "查询图表数据失败!"
  342. err = fmt.Errorf("查询图表数据失败!%s", err.Error())
  343. return
  344. }
  345. for _, l := range tmpList {
  346. tmp := &excelModel.ExcelChartData{
  347. DataTime: l.DataTime,
  348. Value: l.Value,
  349. DataTimestamp: l.DataTimestamp,
  350. }
  351. dataList = append(dataList, tmp)
  352. }
  353. }
  354. // 处理日期列表和值列表
  355. addItem := &excelModel.AddChartEdbAndDataItem{
  356. ChartEdb: excelEdb,
  357. DataList: dataList,
  358. }
  359. chartEdbList = append(chartEdbList, addItem)
  360. }
  361. chartInfo, err, errMsg, isSendEmail = editBalanceExcelChart(req)
  362. if err != nil {
  363. errMsg = "新增图表失败!"
  364. err = fmt.Errorf("新增图表失败!%s, %s", errMsg, err.Error())
  365. return
  366. }
  367. obj := new(excelModel.ExcelChartEdb)
  368. //删除原先多余的指标
  369. deleteEdbIds := make([]int, 0)
  370. for k, _ := range deleteMap {
  371. deleteEdbIds = append(deleteEdbIds, k)
  372. }
  373. err = obj.AddChartEdbAndData(chartEdbList, chartInfo, deleteEdbIds)
  374. if err != nil {
  375. errMsg = "新增图表失败!"
  376. err = fmt.Errorf("新增图表数据失败!%s", err.Error())
  377. return
  378. }
  379. return
  380. }
  381. func editBalanceExcelChart(req request.AddBalanceTableChartReq) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  382. isSendEmail = true // 默认错误的时候要发送邮件
  383. chartType := req.ChartType
  384. extraConfig := req.ExtraConfig
  385. chartInfo, err = data_manage.GetChartInfoById(req.ChartInfoId)
  386. if err != nil {
  387. if err.Error() == utils.ErrNoRow() {
  388. errMsg = "图表已被删除,请刷新页面"
  389. err = errors.New(errMsg)
  390. isSendEmail = false
  391. return
  392. }
  393. errMsg = "获取图表信息失败"
  394. err = errors.New("获取图表信息失败,Err:" + err.Error())
  395. return
  396. }
  397. // 查找主题类型id
  398. chartThemeType, err := chart_theme.GetChartThemeTypeByChartType(chartType)
  399. if err != nil {
  400. errMsg = "查找主题类型失败!"
  401. err = fmt.Errorf("%s, %s", errMsg, err.Error())
  402. return
  403. }
  404. chartThemeId := chartThemeType.DefaultChartThemeId
  405. // 季节性图表额外配置信息
  406. var seasonExtraConfig string
  407. if chartType == 2 {
  408. // 处理季节性图表横轴配置
  409. {
  410. if req.SeasonExtraConfig.XEndDate != "" {
  411. if req.SeasonExtraConfig.XStartDate > req.SeasonExtraConfig.XEndDate && req.SeasonExtraConfig.JumpYear != 1 {
  412. errMsg = "季节性图表配置信息异常:横坐标日期配置错误"
  413. err = fmt.Errorf("季节性图表配置信息异常: 横坐标日期配置错误")
  414. return
  415. }
  416. seasonExtra, tErr := json.Marshal(req.SeasonExtraConfig)
  417. if tErr != nil {
  418. errMsg = "季节性图表配置信息异常"
  419. err = fmt.Errorf("季节性图表配置信息异常,Err:" + tErr.Error())
  420. return
  421. }
  422. seasonExtraConfig = string(seasonExtra)
  423. }
  424. }
  425. }
  426. /*var extraConfigEdbInfoIdArr []int
  427. extraConfigEdbInfoIdArr, err, errMsg = CheckChartExtraConfig(req.ChartType, req.ExtraConfig)
  428. if err != nil {
  429. err = errors.New("添加失败:" + err.Error())
  430. return
  431. }*/
  432. // 图表额外配置
  433. extraConfig, err, errMsg = HandleExtraConfig(chartType, extraConfig)
  434. if err != nil {
  435. if errMsg == `` {
  436. errMsg = "指标异常!"
  437. }
  438. err = fmt.Errorf("指标异常!Err:" + err.Error())
  439. return
  440. }
  441. //判断图表是否存在
  442. var condition string
  443. var pars []interface{}
  444. condition += " AND chart_info_id<>? "
  445. pars = append(pars, req.ChartInfoId)
  446. // 图表名称在不同图分类下不允许重复 需求调整时间:2022年11月07日09:47:07
  447. condition += " AND chart_classify_id=0 "
  448. condition += " AND chart_name=? AND source = ? "
  449. pars = append(pars, req.ChartName, utils.CHART_SOURCE_BALANCE_EXCEL)
  450. count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
  451. if err != nil {
  452. errMsg = "判断图表名称是否存在失败"
  453. err = fmt.Errorf("判断图表名称是否存在失败,Err:" + err.Error())
  454. return
  455. }
  456. if count > 0 {
  457. errMsg = "图表已存在,请重新填写"
  458. err = fmt.Errorf("判断图表名称是否存在失败")
  459. isSendEmail = false
  460. return
  461. }
  462. // todo 判断是否是禁用的图表
  463. // disableVal := data.CheckIsDisableChart(edbInfoIdArr)
  464. chartInfo.ChartName = req.ChartName
  465. //chartInfo.EdbInfoIds = edbInfoIdStr
  466. //chartInfo.ChartClassifyId = req.ChartClassifyId
  467. chartInfo.ModifyTime = time.Now()
  468. chartInfo.IsSetName = 0
  469. // todo 判断是否需要重新计算用户的start_date
  470. chartInfo.DateType = 3
  471. if chartType == 0 {
  472. chartType = 1
  473. }
  474. chartInfo.ChartType = chartType
  475. calendar := req.Calendar
  476. if calendar == "" {
  477. calendar = "公历"
  478. }
  479. chartInfo.Calendar = calendar
  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.Right2Min = req.Right2Min
  489. chartInfo.Right2Max = req.Right2Max
  490. chartInfo.MinMaxSave = req.MinMaxSave
  491. //chartInfo.Disabled = disableVal
  492. //chartInfo.BarConfig = barChartConf
  493. chartInfo.ExtraConfig = extraConfig
  494. chartInfo.SeasonExtraConfig = seasonExtraConfig
  495. //chartInfo.StartYear = req.StartYear
  496. chartInfo.Source = utils.CHART_SOURCE_BALANCE_EXCEL
  497. chartInfo.ChartThemeId = chartThemeId
  498. chartInfo.SourcesFrom = req.SourcesFrom
  499. /* chartInfo.Instructions = req.Instructions
  500. chartInfo.MarkersLines = req.MarkersLines
  501. chartInfo.MarkersAreas = req.MarkersAreas
  502. chartInfo.Unit = req.Unit
  503. chartInfo.UnitEn = req.UnitEn*/
  504. /*newId, err := data_manage.AddChartInfo(chartInfo)
  505. if err != nil {
  506. errMsg = `保存失败`
  507. err = fmt.Errorf("保存失败,Err:" + err.Error())
  508. return
  509. }
  510. chartInfo.ChartInfoId = int(newId)*/
  511. //添加es数据
  512. //go EsAddOrEditChartInfo(chartInfo.ChartInfoId)
  513. return
  514. }
  515. func GetBalanceExcelChartDetail(chartInfo *data_manage.ChartInfoView, mappingListTmp []*excelModel.ExcelChartEdb, sysUser *system.Admin, dataListMap map[int][]*data_manage.EdbDataList) (resp *data_manage.ChartInfoDetailResp, err error, errMsg string) {
  516. // 图表数据权限
  517. {
  518. // 已授权分类id
  519. permissionChartIdList, permissionClassifyIdList, e := data_manage_permission.GetUserChartAndClassifyPermissionList(sysUser.AdminId, chartInfo.ChartInfoId, chartInfo.ChartClassifyId)
  520. if e != nil {
  521. errMsg = "获取失败"
  522. err = fmt.Errorf("获取已授权分类id数据失败,Err:" + err.Error())
  523. return
  524. }
  525. chartInfo.HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(chartInfo.IsJoinPermission, 0, chartInfo.ChartInfoId, chartInfo.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
  526. }
  527. chartInfoId := chartInfo.ChartInfoId
  528. resp = new(data_manage.ChartInfoDetailResp)
  529. // 获取主题样式
  530. chartTheme, err := GetChartThemeConfig(chartInfo.ChartThemeId, 1, chartInfo.ChartType)
  531. if err != nil {
  532. errMsg = "获取失败"
  533. err = fmt.Errorf(" 获取主题信息失败 Err:%s", err.Error())
  534. return
  535. }
  536. chartInfo.ChartThemeStyle = chartTheme.Config
  537. chartInfo.ChartThemeId = chartTheme.ChartThemeId
  538. dateType := chartInfo.DateType
  539. fmt.Println("dateType:", dateType)
  540. chartType := chartInfo.ChartType
  541. startDate := chartInfo.StartDate
  542. endDate := chartInfo.EndDate
  543. seasonStartDate := chartInfo.SeasonStartDate
  544. seasonEndDate := chartInfo.SeasonEndDate
  545. startYear := chartInfo.StartYear
  546. calendar := chartInfo.Calendar
  547. if calendar == "" {
  548. calendar = "公历"
  549. }
  550. mappingList, err := TransferChartEdbToEdbMappingFormat(chartInfoId, chartType, mappingListTmp, dataListMap)
  551. if err != nil {
  552. return
  553. }
  554. //循环组装映射关系
  555. /*for _, v := range mappingListTmp {
  556. dataList := make([]*data_manage.EdbDataList, 0)
  557. dataListTmp, ok := dataListMap[v.ExcelChartEdbId]
  558. if ok {
  559. dataList = dataListTmp
  560. } else {
  561. err = errors.New(fmt.Sprint("获取失败,指标类型异常", v.ExcelChartEdbId))
  562. return
  563. }
  564. startDateStr, endDateStr, _, endVal, maxValue, minValue := getBalanceDataListStartDateAndValue(dataList)
  565. mapping := &data_manage.ChartEdbInfoMapping{
  566. EdbInfoId: v.ExcelChartEdbId,
  567. SourceName: "",
  568. Source: 0,
  569. SubSource: 0,
  570. EdbCode: v.EdbCode,
  571. EdbName: v.EdbName,
  572. EdbAliasName: v.EdbName,
  573. EdbNameEn: "",
  574. EdbAliasNameEn: "",
  575. EdbType: 0,
  576. Frequency: "",
  577. FrequencyEn: "",
  578. Unit: "",
  579. UnitEn: "",
  580. StartDate: startDateStr,
  581. EndDate: endDateStr,
  582. ModifyTime: v.ModifyTime.Format(utils.FormatDateTime),
  583. ChartEdbMappingId: v.ExcelChartEdbId,
  584. ChartInfoId: chartInfoId,
  585. MaxData: v.MaxData,
  586. MinData: v.MinData,
  587. IsOrder: v.IsOrder,
  588. IsAxis: v.IsAxis,
  589. //EdbInfoType: 0,
  590. //EdbInfoCategoryType: 0,
  591. LeadValue: v.LeadValue,
  592. LeadUnit: v.LeadUnit,
  593. LeadUnitEn: "",
  594. ChartStyle: "",
  595. ChartColor: "",
  596. PredictChartColor: "",
  597. ChartWidth: v.ChartWidth,
  598. ChartType: chartType,
  599. LatestDate: endDateStr,
  600. LatestValue: endVal,
  601. MoveLatestDate: "",
  602. UniqueCode: "",
  603. MinValue: minValue,
  604. MaxValue: maxValue,
  605. DataList: nil,
  606. IsNullData: false,
  607. MappingSource: 0,
  608. RegionType: "",
  609. ClassifyId: 0,
  610. IsConvert: 0,
  611. ConvertType: 0,
  612. ConvertValue: 0,
  613. ConvertUnit: "",
  614. ConvertEnUnit: "",
  615. IsJoinPermission: 0,
  616. HaveOperaAuth: true,
  617. }
  618. mappingList = append(mappingList, mapping)
  619. }*/
  620. if chartType == 2 {
  621. startDate = seasonStartDate
  622. endDate = seasonEndDate
  623. if dateType <= 0 {
  624. if startDate != "" {
  625. dateType = 5
  626. } else {
  627. dateType = utils.DateTypeNYears
  628. }
  629. }
  630. } else {
  631. if dateType <= 0 {
  632. dateType = 3
  633. }
  634. }
  635. yearMax := 0
  636. if dateType == utils.DateTypeNYears {
  637. for _, v := range mappingList {
  638. if v.LatestDate != "" {
  639. lastDateT, tErr := time.Parse(utils.FormatDate, v.LatestDate)
  640. if tErr != nil {
  641. errMsg = "获取失败"
  642. err = fmt.Errorf("获取图表日期信息失败,Err:" + tErr.Error())
  643. return
  644. }
  645. if lastDateT.Year() > yearMax {
  646. yearMax = lastDateT.Year()
  647. }
  648. }
  649. }
  650. }
  651. startDate, endDate = utils.GetDateByDateTypeV2(dateType, startDate, endDate, startYear, yearMax)
  652. if chartInfo.ChartType == 2 {
  653. chartInfo.StartDate = startDate
  654. chartInfo.EndDate = endDate
  655. }
  656. // 图表额外数据参数
  657. extraConfigStr := chartInfo.ExtraConfig
  658. // 柱方图的一些配置
  659. var barConfig data_manage.BarChartInfoReq
  660. if chartInfo != nil && chartInfo.ChartType == 7 {
  661. if chartInfo.BarConfig == `` {
  662. err = fmt.Errorf("柱方图未配置")
  663. errMsg = "柱方图未配置"
  664. return
  665. }
  666. err = json.Unmarshal([]byte(chartInfo.BarConfig), &barConfig)
  667. if err != nil {
  668. err = fmt.Errorf("柱方图配置异常 json.Unmarshal Err:%s", err.Error())
  669. errMsg = "柱方图配置异常"
  670. return
  671. }
  672. extraConfigStr = chartInfo.BarConfig
  673. }
  674. // 获取表格数据
  675. excelChartInfoDataShow := new(ExcelChartInfoDataShow)
  676. excelChartInfoDataShow.DataListMap = dataListMap
  677. if chartInfo.HaveOperaAuth {
  678. // 获取图表中的指标数据
  679. edbList, xEdbIdValue, yDataList, dataResp, e, msg := GetChartEdbDataV2(chartInfoId, chartType, calendar, startDate, endDate, mappingList, extraConfigStr, chartInfo.SeasonExtraConfig, excelChartInfoDataShow)
  680. if e != nil {
  681. err = fmt.Errorf("获取图表,指标数据失败,Err:%s", e.Error())
  682. errMsg = msg
  683. return
  684. }
  685. // 单位
  686. if chartType == utils.CHART_TYPE_BAR && len(yDataList) > 0 {
  687. chartInfo.Unit = yDataList[0].Unit
  688. chartInfo.UnitEn = yDataList[0].UnitEn
  689. }
  690. warnEdbList := make([]string, 0)
  691. for _, v := range edbList {
  692. if v.IsNullData {
  693. warnEdbList = append(warnEdbList, v.EdbName+"("+v.EdbCode+")")
  694. }
  695. }
  696. if len(warnEdbList) > 0 {
  697. chartInfo.WarnMsg = `图表引用指标异常,异常指标:` + strings.Join(warnEdbList, ",")
  698. }
  699. if chartInfoId > 0 && chartInfo != nil {
  700. //判断是否加入我的图库
  701. {
  702. var myChartCondition string
  703. var myChartPars []interface{}
  704. myChartCondition += ` AND a.admin_id=? `
  705. myChartPars = append(myChartPars, sysUser.AdminId)
  706. myChartCondition += ` AND a.chart_info_id=? `
  707. myChartPars = append(myChartPars, chartInfo.ChartInfoId)
  708. myChartList, e := data_manage.GetMyChartByCondition(myChartCondition, myChartPars)
  709. if e != nil && e.Error() != utils.ErrNoRow() {
  710. errMsg = "获取失败"
  711. err = fmt.Errorf("获取我的图表信息失败,GetMyChartByCondition,Err:" + e.Error())
  712. return
  713. }
  714. if myChartList != nil && len(myChartList) > 0 {
  715. chartInfo.IsAdd = true
  716. chartInfo.MyChartId = myChartList[0].MyChartId
  717. chartInfo.MyChartClassifyId = myChartList[0].MyChartClassifyId
  718. }
  719. }
  720. }
  721. //判断是否需要展示英文标识
  722. chartInfo.IsEnChart = CheckIsEnChart(chartInfo.ChartNameEn, edbList, chartInfo.Source, chartInfo.ChartType)
  723. // 图表的指标来源
  724. sourceNameList, sourceNameEnList := GetEdbSourceByEdbInfoIdList(edbList)
  725. chartInfo.ChartSource = strings.Join(sourceNameList, ",")
  726. chartInfo.ChartSourceEn = strings.Join(sourceNameEnList, ",")
  727. // todo 指标权限
  728. {
  729. for _, item := range edbList {
  730. // 数据权限
  731. item.HaveOperaAuth = true
  732. }
  733. }
  734. resp.EdbInfoList = edbList
  735. resp.XEdbIdValue = xEdbIdValue
  736. resp.YDataList = yDataList
  737. resp.DataResp = dataResp
  738. } else {
  739. resp.EdbInfoList = mappingList
  740. }
  741. //图表操作权限
  742. chartInfo.IsEdit = CheckOpChartPermission(sysUser, chartInfo.SysUserId, chartInfo.HaveOperaAuth)
  743. chartInfo.Button = data_manage.ChartViewButton{
  744. IsEdit: chartInfo.IsEdit,
  745. IsEnChart: chartInfo.IsEnChart,
  746. IsAdd: chartInfo.IsAdd,
  747. IsCopy: true,
  748. IsSetName: chartInfo.IsSetName,
  749. }
  750. resp.ChartInfo = chartInfo
  751. resp.BarChartInfo = barConfig
  752. return
  753. }
  754. // GetBalanceExcelEdbDataMapList 获取指标最后的基础数据
  755. func GetBalanceExcelEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate string, mappingList []*data_manage.ChartEdbInfoMapping, seasonExtraConfig string, dataListMap map[int][]*data_manage.EdbDataList) (edbDataListMap map[int][]*data_manage.EdbDataList, edbList []*data_manage.ChartEdbInfoMapping, err error) {
  756. // 指标对应的所有数据
  757. edbDataListMap = make(map[int][]*data_manage.EdbDataList)
  758. for _, v := range mappingList {
  759. //fmt.Println("v:", v.EdbInfoId)
  760. item := new(data_manage.ChartEdbInfoMapping)
  761. item.EdbInfoId = v.EdbInfoId
  762. item.SourceName = v.SourceName
  763. item.Source = v.Source
  764. item.EdbCode = v.EdbCode
  765. item.EdbName = v.EdbName
  766. item.EdbNameEn = v.EdbNameEn
  767. item.Frequency = v.Frequency
  768. item.EdbType = v.EdbType
  769. item.FrequencyEn = GetFrequencyEn(v.Frequency)
  770. if v.Unit != `无` {
  771. item.Unit = v.Unit
  772. }
  773. item.UnitEn = v.UnitEn
  774. item.StartDate = v.StartDate
  775. item.EndDate = v.EndDate
  776. item.ModifyTime = v.ModifyTime
  777. item.EdbInfoCategoryType = v.EdbInfoCategoryType
  778. item.PredictChartColor = v.PredictChartColor
  779. item.ClassifyId = v.ClassifyId
  780. if chartInfoId <= 0 {
  781. item.IsAxis = 1
  782. item.LeadValue = 0
  783. item.LeadUnit = ""
  784. item.ChartEdbMappingId = 0
  785. item.ChartInfoId = 0
  786. item.IsOrder = false
  787. item.EdbInfoType = 1
  788. item.ChartStyle = ""
  789. item.ChartColor = ""
  790. item.ChartWidth = 1
  791. item.MaxData = v.MaxValue
  792. item.MinData = v.MinValue
  793. } else {
  794. item.IsAxis = v.IsAxis
  795. item.EdbInfoType = v.EdbInfoType
  796. item.LeadValue = v.LeadValue
  797. item.LeadUnit = v.LeadUnit
  798. item.LeadUnitEn = GetLeadUnitEn(v.LeadUnit)
  799. item.ChartEdbMappingId = v.ChartEdbMappingId
  800. item.ChartInfoId = v.ChartInfoId
  801. item.ChartStyle = v.ChartStyle
  802. item.ChartColor = v.ChartColor
  803. item.ChartWidth = v.ChartWidth
  804. item.IsOrder = v.IsOrder
  805. item.MaxData = v.MaxData
  806. item.MinData = v.MinData
  807. }
  808. item.LatestValue = v.LatestValue
  809. item.LatestDate = v.LatestDate
  810. item.UniqueCode = v.UniqueCode
  811. item.MoveLatestDate = v.LatestDate
  812. item.EdbAliasName = v.EdbAliasName
  813. item.IsConvert = v.IsConvert
  814. item.ConvertType = v.ConvertType
  815. item.ConvertValue = v.ConvertValue
  816. item.ConvertUnit = v.ConvertUnit
  817. item.ConvertEnUnit = v.ConvertEnUnit
  818. item.IsJoinPermission = v.IsJoinPermission
  819. var startDateReal string
  820. var diffSeconds int64
  821. if chartType == 2 { //季节性图
  822. startDateReal = startDate
  823. } else {
  824. if v.EdbInfoType == 0 && v.LeadUnit != "" && v.LeadValue > 0 { //领先指标
  825. var startTimeRealTemp time.Time
  826. startDateParse, _ := time.Parse(utils.FormatDate, startDate)
  827. switch v.LeadUnit {
  828. case "天":
  829. startTimeRealTemp = startDateParse.AddDate(0, 0, -v.LeadValue)
  830. case "月":
  831. startTimeRealTemp = startDateParse.AddDate(0, -v.LeadValue, 0)
  832. case "季":
  833. startTimeRealTemp = startDateParse.AddDate(0, -3*v.LeadValue, 0)
  834. case "周":
  835. startTimeRealTemp = startDateParse.AddDate(0, 0, -7*v.LeadValue)
  836. case "年":
  837. startTimeRealTemp = startDateParse.AddDate(-v.LeadValue, 0, 0)
  838. }
  839. if startTimeRealTemp.Before(startDateParse) {
  840. startDateReal = startTimeRealTemp.Format(utils.FormatDate)
  841. diffSeconds = (int64(startTimeRealTemp.UnixNano()) - int64(startDateParse.UnixNano())) / 1e6
  842. } else {
  843. startDateReal = startDate
  844. diffSeconds = 0
  845. }
  846. // 预测指标的开始日期也要偏移
  847. {
  848. day, tmpErr := utils.GetDaysBetween2Date(utils.FormatDate, startDate, startDateReal)
  849. if tmpErr != nil {
  850. err = tmpErr
  851. return
  852. }
  853. moveLatestDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, item.MoveLatestDate, time.Local)
  854. if tmpErr != nil {
  855. err = tmpErr
  856. return
  857. }
  858. item.MoveLatestDate = moveLatestDateTime.AddDate(0, 0, day).Format(utils.FormatDate)
  859. }
  860. } else {
  861. startDateReal = startDate
  862. }
  863. }
  864. //fmt.Println("line 1011 chart:", v.Source, v.EdbInfoId, startDateReal, endDate)
  865. calendarPreYear := 0
  866. if calendar == "农历" {
  867. newStartDateReal, e := time.Parse(utils.FormatDate, startDateReal)
  868. if e != nil {
  869. err = fmt.Errorf("时间解析 time.Parse(%s, %s) error: %v", utils.FormatDate, startDateReal, e)
  870. return
  871. }
  872. calendarPreYear = newStartDateReal.Year() - 1
  873. newStartDateReal = newStartDateReal.AddDate(-1, 0, 0)
  874. startDateReal = newStartDateReal.Format(utils.FormatDate)
  875. }
  876. dataList := make([]*data_manage.EdbDataList, 0)
  877. dataListTmp, ok := dataListMap[v.EdbInfoId]
  878. if ok {
  879. dataList = dataListTmp
  880. } else {
  881. err = errors.New(fmt.Sprint("获取失败,指标类型异常", v.EdbInfoId))
  882. return
  883. }
  884. if v.IsConvert == 1 {
  885. switch v.ConvertType {
  886. case 1:
  887. for i, data := range dataList {
  888. dataList[i].Value = data.Value * v.ConvertValue
  889. }
  890. //item.MaxData = item.MaxData * v.ConvertValue
  891. //item.MinData = item.MinData * v.ConvertValue
  892. case 2:
  893. for i, data := range dataList {
  894. dataList[i].Value = data.Value / v.ConvertValue
  895. }
  896. //item.MaxData = item.MaxData / v.ConvertValue
  897. //item.MinData = item.MinData / v.ConvertValue
  898. case 3:
  899. for i, data := range dataList {
  900. if data.Value <= 0 {
  901. err = errors.New("数据中含有负数或0,无法对数运算")
  902. return
  903. }
  904. dataList[i].Value = math.Log(data.Value) / math.Log(v.ConvertValue)
  905. }
  906. //item.MaxData = math.Log(item.MaxData) / math.Log(v.ConvertValue)
  907. //item.MinData = math.Log(item.MinData) / math.Log(v.ConvertValue)
  908. }
  909. }
  910. edbDataListMap[v.EdbInfoId] = dataList
  911. if diffSeconds != 0 && v.EdbInfoType == 0 {
  912. dataListLen := len(dataList)
  913. for i := 0; i < dataListLen; i++ {
  914. dataList[i].DataTimestamp = dataList[i].DataTimestamp - diffSeconds
  915. }
  916. }
  917. if chartType == 2 {
  918. latestDate, tmpErr := time.Parse(utils.FormatDate, v.LatestDate)
  919. if tmpErr != nil {
  920. //item.DataList = dataList
  921. item.IsNullData = true
  922. edbList = append(edbList, item)
  923. continue
  924. }
  925. if calendar == "农历" {
  926. if len(dataList) <= 0 {
  927. result := new(data_manage.EdbDataResult)
  928. item.DataList = result
  929. } else {
  930. result, tmpErr := data_manage.AddCalculateQuarterV6(dataList)
  931. if tmpErr != nil {
  932. err = errors.New("获取农历数据失败,Err:" + tmpErr.Error())
  933. return
  934. }
  935. quarterDataList, tErr := GetSeasonEdbInfoDataListByXDateNong(result, latestDate, seasonExtraConfig, calendarPreYear)
  936. if tErr != nil {
  937. err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
  938. return
  939. }
  940. item.DataList = quarterDataList
  941. }
  942. } else {
  943. quarterDataList, tErr := GetSeasonEdbInfoDataListByXDate(dataList, latestDate, seasonExtraConfig)
  944. if tErr != nil {
  945. err = errors.New("获取季节性图表数据失败,Err:" + tErr.Error())
  946. return
  947. }
  948. item.DataList = quarterDataList
  949. }
  950. } else if chartType == 7 || chartType == utils.CHART_TYPE_RADAR { //柱方图
  951. //item.DataList = dataList
  952. } else {
  953. item.DataList = dataList
  954. }
  955. edbList = append(edbList, item)
  956. }
  957. return
  958. }
  959. func CheckBalanceChartCacheAndPermission(chartInfo *data_manage.ChartInfoView, isCache bool, sysUser *system.Admin) (resp *data_manage.ChartInfoDetailFromUniqueCodeResp, isOk bool, msg, errMsg string) {
  960. //判断是否存在缓存,如果存在缓存,那么直接从缓存中获取
  961. adminId := sysUser.AdminId
  962. // todo 图表数据权限
  963. // 已授权分类id
  964. permissionChartIdList, permissionClassifyIdList, err := data_manage_permission.GetUserChartAndClassifyPermissionList(adminId, chartInfo.ChartInfoId, chartInfo.ChartClassifyId)
  965. if err != nil {
  966. errMsg = "获取已授权分类id数据失败,Err:" + err.Error()
  967. return
  968. }
  969. defer func() {
  970. if isOk {
  971. // 图表权限校验
  972. {
  973. resp.ChartInfo.HaveOperaAuth = data_manage_permission.CheckChartPermissionByPermissionIdList(chartInfo.IsJoinPermission, 0, chartInfo.ChartInfoId, chartInfo.ChartClassifyId, permissionChartIdList, permissionClassifyIdList)
  974. //图表操作权限
  975. chartInfo.IsEdit = CheckOpChartPermission(sysUser, chartInfo.SysUserId, resp.ChartInfo.HaveOperaAuth)
  976. chartInfo.Button = data_manage.ChartViewButton{
  977. IsEdit: chartInfo.IsEdit,
  978. IsEnChart: chartInfo.IsEnChart,
  979. IsAdd: chartInfo.IsAdd,
  980. IsCopy: true,
  981. IsSetName: chartInfo.IsSetName,
  982. }
  983. //if !resp.ChartInfo.HaveOperaAuth {
  984. // for _, v := range resp.EdbInfoList {
  985. // v.DataList = nil
  986. // }
  987. // resp.DataResp = nil
  988. // resp.XEdbIdValue = []int{}
  989. // resp.YDataList = []data_manage.YData{}
  990. //}
  991. }
  992. // todo 是否需要返回平衡表指标权限即判断平衡表的表格数据权限
  993. {
  994. // 查询图表关联的表格ID
  995. excelInfo, e := excelModel.GetExcelInfoByChartInfoId(chartInfo.ChartInfoId)
  996. if e != nil {
  997. errMsg = "获取图表关联的表格ID失败,Err:" + e.Error()
  998. err = e
  999. return
  1000. }
  1001. checkExcelInfo := excelInfo
  1002. if excelInfo.Source == utils.BALANCE_TABLE {
  1003. checkExcelInfoId := excelInfo.ExcelInfoId
  1004. if excelInfo.BalanceType == 1 {
  1005. checkExcelInfoId = excelInfo.RelExcelInfoId
  1006. } else {
  1007. if excelInfo.ParentId > 0 {
  1008. checkExcelInfoId = excelInfo.ParentId
  1009. }
  1010. }
  1011. if checkExcelInfoId != excelInfo.ExcelInfoId {
  1012. checkExcelInfo, err = excelModel.GetExcelInfoById(checkExcelInfoId)
  1013. if err != nil {
  1014. errMsg = "获取平衡表格信息失败"
  1015. err = errors.New("获取平衡表格信息失败,Err:" + err.Error())
  1016. return
  1017. }
  1018. }
  1019. }
  1020. haveOperaAuth, e := data_manage_permission.CheckExcelPermissionByExcelInfoId(checkExcelInfo.ExcelInfoId, checkExcelInfo.ExcelClassifyId, checkExcelInfo.IsJoinPermission, adminId)
  1021. if e != nil {
  1022. errMsg = "获取平衡表格数据权限失败"
  1023. err = errors.New("获取表格权限信息失败,Err" + e.Error())
  1024. return
  1025. }
  1026. // 数据权限
  1027. for _, v := range resp.EdbInfoList {
  1028. v.HaveOperaAuth = haveOperaAuth
  1029. }
  1030. }
  1031. }
  1032. }()
  1033. key := GetChartInfoDataKey(chartInfo.ChartInfoId)
  1034. if utils.Re == nil && isCache {
  1035. if utils.Re == nil && utils.Rc.IsExist(key) {
  1036. if redisData, err1 := utils.Rc.RedisBytes(key); err1 == nil {
  1037. err := json.Unmarshal(redisData, &resp)
  1038. if err != nil || resp == nil {
  1039. return
  1040. }
  1041. // 这里跟当前用户相关的信息重新查询写入resp, 不使用缓存中的
  1042. var myCond string
  1043. var myPars []interface{}
  1044. myCond += ` AND a.admin_id=? `
  1045. myPars = append(myPars, adminId)
  1046. myCond += ` AND a.chart_info_id=? `
  1047. myPars = append(myPars, chartInfo.ChartInfoId)
  1048. myList, err := data_manage.GetMyChartByCondition(myCond, myPars)
  1049. if err != nil && err.Error() != utils.ErrNoRow() {
  1050. msg = "获取失败"
  1051. errMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error()
  1052. return
  1053. }
  1054. resp.ChartInfo.IsAdd = false
  1055. resp.ChartInfo.MyChartId = 0
  1056. resp.ChartInfo.MyChartClassifyId = ""
  1057. if myList != nil && len(myList) > 0 {
  1058. resp.ChartInfo.IsAdd = true
  1059. resp.ChartInfo.MyChartId = myList[0].MyChartId
  1060. resp.ChartInfo.MyChartClassifyId = myList[0].MyChartClassifyId
  1061. }
  1062. //判断是否加入我的图库
  1063. {
  1064. var myChartCondition string
  1065. var myChartPars []interface{}
  1066. myChartCondition += ` AND a.admin_id=? `
  1067. myChartPars = append(myChartPars, adminId)
  1068. myChartCondition += ` AND a.chart_info_id=? `
  1069. myChartPars = append(myChartPars, chartInfo.ChartInfoId)
  1070. myChartList, err := data_manage.GetMyChartByCondition(myChartCondition, myChartPars)
  1071. if err != nil && err.Error() != utils.ErrNoRow() {
  1072. msg = "获取失败"
  1073. errMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error()
  1074. return
  1075. }
  1076. if myChartList != nil && len(myChartList) > 0 {
  1077. chartInfo.IsAdd = true
  1078. chartInfo.MyChartId = myChartList[0].MyChartId
  1079. chartInfo.MyChartClassifyId = myChartList[0].MyChartClassifyId
  1080. }
  1081. }
  1082. isOk = true
  1083. fmt.Println("source redis")
  1084. return
  1085. }
  1086. }
  1087. }
  1088. return
  1089. }
  1090. // GetBalanceExcelSeasonChartLegendPreview 获取预览的季节性图例
  1091. func GetBalanceExcelSeasonChartLegendPreview(dataList []*data_manage.EdbDataList, calendar string, seasonExtraConfigReq data_manage.SeasonExtraItem) (quarterDataList data_manage.QuarterDataList, err error, errMsg string) {
  1092. seasonExtraConfig := ""
  1093. if seasonExtraConfigReq.XEndDate != "" {
  1094. if seasonExtraConfigReq.XStartDate > seasonExtraConfigReq.XEndDate && seasonExtraConfigReq.JumpYear != 1 {
  1095. errMsg = "季节性图表配置信息异常:横坐标日期配置错误"
  1096. err = fmt.Errorf("季节性图表配置信息异常: 横坐标日期配置错误")
  1097. return
  1098. }
  1099. seasonExtra, tErr := json.Marshal(seasonExtraConfigReq)
  1100. if tErr != nil {
  1101. errMsg = "季节性图表配置信息异常"
  1102. err = fmt.Errorf("季节性图表配置信息异常,Err:" + tErr.Error())
  1103. return
  1104. }
  1105. seasonExtraConfig = string(seasonExtra)
  1106. }
  1107. var latestDate time.Time //最新日期
  1108. startDate, endDate, _, _, _, _ := getBalanceDataListStartDateAndValue(dataList)
  1109. calendarPreYear := 0
  1110. startDateReal := startDate
  1111. latestDate, _ = time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  1112. if calendar == "农历" {
  1113. newStartDateReal, e := time.Parse(utils.FormatDate, startDateReal)
  1114. if e != nil {
  1115. err = fmt.Errorf("开始时间解析失败 time.Parse:" + e.Error())
  1116. return
  1117. }
  1118. calendarPreYear = newStartDateReal.Year() - 1
  1119. newStartDateReal = newStartDateReal.AddDate(-1, 0, 0)
  1120. startDateReal = newStartDateReal.Format(utils.FormatDate)
  1121. }
  1122. if calendar == "农历" {
  1123. if len(dataList) <= 0 {
  1124. return
  1125. } else {
  1126. result, tmpErr := data_manage.AddCalculateQuarterV6(dataList)
  1127. if tmpErr != nil {
  1128. err = errors.New("获取农历数据失败,Err:" + tmpErr.Error())
  1129. return
  1130. }
  1131. quarterDataList, err = GetSeasonEdbInfoDataListByXDateNong(result, latestDate, seasonExtraConfig, calendarPreYear)
  1132. if err != nil {
  1133. err = errors.New("获取季节性图表数据失败,Err:" + err.Error())
  1134. return
  1135. }
  1136. }
  1137. } else {
  1138. quarterDataList, err = GetSeasonEdbInfoDataListByXDate(dataList, latestDate, seasonExtraConfig)
  1139. if err != nil {
  1140. err = errors.New("获取季节性图表数据失败,Err:" + err.Error())
  1141. return
  1142. }
  1143. }
  1144. return
  1145. }
  1146. func getBalanceDataListStartDateAndValue(dataList []*data_manage.EdbDataList) (startDate, endDate string, startVal, endVal, maxVal, minVal float64) {
  1147. if len(dataList) == 0 {
  1148. return
  1149. }
  1150. startDate = dataList[0].DataTime
  1151. startVal = dataList[0].Value
  1152. maxVal = dataList[0].Value
  1153. minVal = dataList[0].Value
  1154. endDate = dataList[len(dataList)-1].DataTime
  1155. endVal = dataList[len(dataList)-1].Value
  1156. for _, v := range dataList {
  1157. if v.DataTime < startDate {
  1158. startDate = v.DataTime
  1159. startVal = v.Value
  1160. }
  1161. if v.DataTime > endDate {
  1162. endDate = v.DataTime
  1163. endVal = v.Value
  1164. }
  1165. if v.Value > maxVal {
  1166. maxVal = v.Value
  1167. }
  1168. if v.Value < minVal {
  1169. minVal = v.Value
  1170. }
  1171. }
  1172. return
  1173. }
  1174. // AddBalanceStaticExcel 另存为和存为静态表以及子表的复制都调用该接口
  1175. func AddBalanceStaticExcel(oldExcelInfo *excelModel.ExcelInfo, excelClassifyId int, versionName string, sysUser *system.Admin, parentId, relExcelInfoId, balanceType int, childExcelList []*excelModel.ExcelInfo, pingNameFlag bool, excelDataMap map[int]map[int][]*data_manage.EdbDataList) (excelInfo *excelModel.ExcelInfo, err error, errMsg string, isSendEmail bool) {
  1176. isSendEmail = true
  1177. versionName = utils.TrimLRStr(versionName)
  1178. // 检验分类下是否存在该表格名称
  1179. // todo 检验动态表分类下表格名称是否存在
  1180. if balanceType == 1 && versionName != "" {
  1181. var condition string
  1182. var pars []interface{}
  1183. condition += " AND rel_excel_info_id=? AND balance_type=1 AND parent_id=0"
  1184. pars = append(pars, oldExcelInfo.ExcelInfoId)
  1185. condition += " AND version_name=? "
  1186. pars = append(pars, versionName)
  1187. count, tmpErr := excelModel.GetExcelInfoCountByCondition(condition, pars)
  1188. if tmpErr != nil {
  1189. errMsg = "查询版本名称失败"
  1190. err = tmpErr
  1191. return
  1192. }
  1193. if count > 0 {
  1194. errMsg = "表格版本名称已存在,请重新填写版本名称"
  1195. err = errors.New(errMsg)
  1196. isSendEmail = false
  1197. return
  1198. }
  1199. }
  1200. // 表格信息
  1201. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  1202. excelName := oldExcelInfo.ExcelName
  1203. if pingNameFlag && versionName != "" {
  1204. excelName += "(" + versionName + ")"
  1205. }
  1206. // 处理表格内容, 静态表去除动态指标关联
  1207. content := oldExcelInfo.Content
  1208. excelInfo = &excelModel.ExcelInfo{
  1209. //ExcelInfoId: 0,
  1210. ExcelName: excelName,
  1211. Source: oldExcelInfo.Source,
  1212. ExcelType: oldExcelInfo.ExcelType,
  1213. UniqueCode: utils.MD5(utils.EXCEL_DATA_PREFIX + "_" + timestamp),
  1214. ExcelClassifyId: excelClassifyId,
  1215. SysUserId: sysUser.AdminId,
  1216. SysUserRealName: sysUser.RealName,
  1217. Content: content,
  1218. ExcelImage: oldExcelInfo.ExcelImage,
  1219. FileUrl: oldExcelInfo.FileUrl,
  1220. ParentId: parentId,
  1221. RelExcelInfoId: relExcelInfoId,
  1222. VersionName: versionName,
  1223. UpdateUserId: sysUser.AdminId,
  1224. UpdateUserRealName: sysUser.RealName,
  1225. BalanceType: balanceType,
  1226. Sort: oldExcelInfo.Sort,
  1227. IsDelete: 0,
  1228. ModifyTime: time.Now(),
  1229. CreateTime: time.Now(),
  1230. }
  1231. excelEdbMappingList := make([]*excelModel.ExcelEdbMapping, 0)
  1232. if balanceType == 1 {
  1233. // 获取excel与指标的关系表
  1234. excelEdbMappingList, err = excelModel.GetAllExcelEdbMappingByExcelInfoId(excelInfo.ExcelInfoId)
  1235. if err != nil {
  1236. errMsg = "获取失败"
  1237. return
  1238. }
  1239. for k, v := range excelEdbMappingList {
  1240. v.ExcelEdbMappingId = 0
  1241. v.ExcelInfoId = 0
  1242. excelEdbMappingList[k] = v
  1243. }
  1244. }
  1245. var childExcel *excelModel.ExcelInfo
  1246. err = excelModel.AddExcelInfo(excelInfo, excelEdbMappingList, childExcel)
  1247. if err != nil {
  1248. errMsg = "保存失败"
  1249. return
  1250. }
  1251. if parentId == 0 && len(childExcelList) > 0 {
  1252. for _, childExcelInfo := range childExcelList {
  1253. _, err, errMsg, isSendEmail = AddBalanceStaticExcel(childExcelInfo, excelClassifyId, versionName, sysUser, excelInfo.ExcelInfoId, relExcelInfoId, balanceType, []*excelModel.ExcelInfo{}, false, excelDataMap)
  1254. if err != nil {
  1255. return
  1256. }
  1257. }
  1258. } else if parentId > 0 {
  1259. // 如果复制的是动态表的子表,则同步复制关联的图表
  1260. // 查出所有的chart_list, 同步复制图表和图表指标
  1261. // 相关联指标
  1262. mappingListTmp, e := excelModel.GetExcelChartEdbMappingByExcelInfoId(oldExcelInfo.ExcelInfoId)
  1263. if e != nil {
  1264. errMsg = "获取图表指标失败"
  1265. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", e.Error())
  1266. return
  1267. }
  1268. mappingListMap := make(map[int][]*excelModel.ExcelChartEdb, 0)
  1269. charInfoIds := make([]int, 0)
  1270. for k, _ := range mappingListTmp {
  1271. mappingListTmp[k].ExcelInfoId = excelInfo.ExcelInfoId
  1272. mappingListMap[mappingListTmp[k].ChartInfoId] = append(mappingListMap[mappingListTmp[k].ChartInfoId], mappingListTmp[k])
  1273. }
  1274. for k, _ := range mappingListMap {
  1275. charInfoIds = append(charInfoIds, k)
  1276. }
  1277. if len(charInfoIds) > 0 {
  1278. chartInfoList, e := data_manage.GetChartInfoViewByIdList(charInfoIds)
  1279. if e != nil {
  1280. errMsg = "获取失败"
  1281. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", e.Error())
  1282. return
  1283. }
  1284. for _, chartInfo := range chartInfoList {
  1285. mappingList, ok := mappingListMap[chartInfo.ChartInfoId]
  1286. if !ok {
  1287. err = fmt.Errorf("未找到图表关联的指标信息")
  1288. return
  1289. }
  1290. chartEdbDataMap, ok := excelDataMap[chartInfo.ChartInfoId]
  1291. if !ok && oldExcelInfo.BalanceType == 1 { //
  1292. err = fmt.Errorf("未找到图表关联的指标信息")
  1293. return
  1294. }
  1295. err, errMsg, isSendEmail = CopyBalanceExcelChart(chartInfo, mappingList, versionName, sysUser, pingNameFlag, chartEdbDataMap)
  1296. if err != nil {
  1297. err = fmt.Errorf("复制图表失败 Err:%s", err.Error())
  1298. return
  1299. }
  1300. }
  1301. }
  1302. }
  1303. return
  1304. }
  1305. // CopyBalanceExcelChart 复制平衡表图表
  1306. func CopyBalanceExcelChart(oldChartInfo *data_manage.ChartInfoView, oldChartEdbList []*excelModel.ExcelChartEdb, versionName string, sysUser *system.Admin, pingNameFlag bool, dataListMap map[int][]*data_manage.EdbDataList) (err error, errMsg string, isSendEmail bool) {
  1307. chartEdbList := make([]*excelModel.AddChartEdbAndDataItem, 0)
  1308. if pingNameFlag && versionName != "" {
  1309. oldChartInfo.ChartName += "(" + versionName + ")"
  1310. }
  1311. for _, chartEdb := range oldChartEdbList {
  1312. excelEdb := new(excelModel.ExcelChartEdb)
  1313. excelEdb.EdbName = chartEdb.EdbName
  1314. if pingNameFlag && versionName != "" {
  1315. excelEdb.EdbName += "(" + versionName + ")"
  1316. }
  1317. randStr := utils.GetRandDigit(4)
  1318. excelEdb.EdbCode = `T` + time.Now().Format("060102150405") + "_" + randStr
  1319. excelEdb.ExcelInfoId = chartEdb.ExcelInfoId
  1320. excelEdb.DateSequence = chartEdb.DateSequence
  1321. excelEdb.DataSequence = chartEdb.DataSequence
  1322. excelEdb.SysUserId = sysUser.AdminId
  1323. excelEdb.SysUserRealName = sysUser.RealName
  1324. excelEdb.MaxData = chartEdb.MaxData
  1325. excelEdb.MinData = chartEdb.MinData
  1326. excelEdb.IsOrder = chartEdb.IsOrder
  1327. excelEdb.IsAxis = chartEdb.IsAxis
  1328. excelEdb.FromTag = chartEdb.FromTag
  1329. excelEdb.EdbInfoType = chartEdb.EdbInfoType
  1330. excelEdb.LeadValue = chartEdb.LeadValue
  1331. excelEdb.LeadUnit = chartEdb.LeadUnit
  1332. excelEdb.CreateTime = time.Now()
  1333. excelEdb.ModifyTime = time.Now()
  1334. var dataList []*excelModel.ExcelChartData
  1335. tmpList, ok := dataListMap[chartEdb.ExcelChartEdbId]
  1336. if ok {
  1337. for _, l := range tmpList {
  1338. tmp := &excelModel.ExcelChartData{
  1339. DataTime: l.DataTime,
  1340. Value: l.Value,
  1341. DataTimestamp: l.DataTimestamp,
  1342. }
  1343. dataList = append(dataList, tmp)
  1344. }
  1345. }
  1346. // 处理日期列表和值列表
  1347. addItem := &excelModel.AddChartEdbAndDataItem{
  1348. ChartEdb: excelEdb,
  1349. DataList: dataList,
  1350. }
  1351. chartEdbList = append(chartEdbList, addItem)
  1352. }
  1353. chartInfo, err, errMsg, isSendEmail := copyBalanceExcelChart(oldChartInfo, sysUser.AdminId, sysUser.RealName)
  1354. if err != nil {
  1355. errMsg = "新增图表失败!"
  1356. err = fmt.Errorf("新增图表失败!%s, %s", errMsg, err.Error())
  1357. return
  1358. }
  1359. obj := new(excelModel.ExcelChartEdb)
  1360. err = obj.AddChartEdbAndData(chartEdbList, chartInfo, []int{})
  1361. if err != nil {
  1362. errMsg = "新增图表失败!"
  1363. err = fmt.Errorf("新增图表数据失败!%s", err.Error())
  1364. return
  1365. }
  1366. return
  1367. }
  1368. func copyBalanceExcelChart(oldChartInfo *data_manage.ChartInfoView, sysUserId int, sysUserRealName string) (chartInfo *data_manage.ChartInfo, err error, errMsg string, isSendEmail bool) {
  1369. isSendEmail = true // 默认错误的时候要发送邮件
  1370. oldChartInfo.ChartName = strings.Trim(oldChartInfo.ChartName, " ")
  1371. if oldChartInfo.ChartName == "" {
  1372. errMsg = "请填写图表名称!"
  1373. err = fmt.Errorf(errMsg)
  1374. isSendEmail = false
  1375. return
  1376. }
  1377. //判断图表是否存在
  1378. var condition string
  1379. var pars []interface{}
  1380. // 图表名称在不同图分类下不允许重复 需求调整时间:2022年11月07日09:47:07
  1381. condition += " AND chart_classify_id=0 "
  1382. condition += " AND chart_name=? AND source = ? "
  1383. pars = append(pars, oldChartInfo.ChartName, utils.CHART_SOURCE_BALANCE_EXCEL)
  1384. count, err := data_manage.GetChartInfoCountByCondition(condition, pars)
  1385. if err != nil {
  1386. errMsg = "判断图表名称是否存在失败"
  1387. err = fmt.Errorf("判断图表名称是否存在失败,Err:" + err.Error())
  1388. return
  1389. }
  1390. if count > 0 {
  1391. /*errMsg = "图表已存在,请重新填写"
  1392. err = fmt.Errorf("判断图表名称是否存在失败")
  1393. isSendEmail = false
  1394. return*/
  1395. oldChartInfo.ChartName += " " + strconv.Itoa(count)
  1396. }
  1397. chartInfo = new(data_manage.ChartInfo)
  1398. chartInfo.ChartName = oldChartInfo.ChartName
  1399. //chartInfo.EdbInfoIds = edbInfoIdStr
  1400. //chartInfo.ChartClassifyId = req.ChartClassifyId
  1401. chartInfo.SysUserId = sysUserId
  1402. chartInfo.SysUserRealName = sysUserRealName
  1403. chartInfo.CreateTime = time.Now()
  1404. chartInfo.ModifyTime = time.Now()
  1405. chartInfo.IsSetName = 0
  1406. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  1407. chartInfo.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
  1408. // todo 判断是否需要重新计算用户的start_date
  1409. chartInfo.DateType = oldChartInfo.DateType
  1410. chartInfo.ChartType = oldChartInfo.ChartType
  1411. chartInfo.Calendar = oldChartInfo.Calendar
  1412. /* chartInfo.StartDate = req.StartDate
  1413. chartInfo.EndDate = req.EndDate
  1414. chartInfo.SeasonStartDate = req.StartDate
  1415. chartInfo.SeasonEndDate = req.EndDate*/
  1416. chartInfo.LeftMin = oldChartInfo.LeftMin
  1417. chartInfo.LeftMax = oldChartInfo.LeftMax
  1418. chartInfo.RightMin = oldChartInfo.RightMin
  1419. chartInfo.RightMax = oldChartInfo.RightMax
  1420. chartInfo.Right2Min = oldChartInfo.Right2Min
  1421. chartInfo.Right2Max = oldChartInfo.Right2Max
  1422. chartInfo.MinMaxSave = oldChartInfo.MinMaxSave
  1423. //chartInfo.Disabled = disableVal
  1424. //chartInfo.BarConfig = barChartConf
  1425. chartInfo.ExtraConfig = oldChartInfo.ExtraConfig
  1426. chartInfo.SeasonExtraConfig = oldChartInfo.SeasonExtraConfig
  1427. //chartInfo.StartYear = req.StartYear
  1428. chartInfo.Source = utils.CHART_SOURCE_BALANCE_EXCEL
  1429. chartInfo.ChartThemeId = oldChartInfo.ChartThemeId
  1430. chartInfo.SourcesFrom = oldChartInfo.SourcesFrom
  1431. /* chartInfo.Instructions = req.Instructions
  1432. chartInfo.MarkersLines = req.MarkersLines
  1433. chartInfo.MarkersAreas = req.MarkersAreas
  1434. chartInfo.Unit = req.Unit
  1435. chartInfo.UnitEn = req.UnitEn*/
  1436. /*newId, err := data_manage.AddChartInfo(chartInfo)
  1437. if err != nil {
  1438. errMsg = `保存失败`
  1439. err = fmt.Errorf("保存失败,Err:" + err.Error())
  1440. return
  1441. }
  1442. chartInfo.ChartInfoId = int(newId)*/
  1443. //添加es数据
  1444. //go EsAddOrEditChartInfo(chartInfo.ChartInfoId)
  1445. return
  1446. }
  1447. // CopyBalanceExcel 动态平衡表另存为
  1448. func CopyBalanceExcel(oldExcelInfo *excelModel.ExcelInfo, excelClassifyId int, excelName string, sysUser *system.Admin) (excelInfo *excelModel.ExcelInfo, err error, errMsg string, isSendEmail bool) {
  1449. if oldExcelInfo.ParentId != 0 && oldExcelInfo.BalanceType != 0 {
  1450. errMsg = "平衡表类型错误"
  1451. err = fmt.Errorf("平衡表类型错误 ")
  1452. return
  1453. }
  1454. // 查询excel表格名称是否已经存在
  1455. // 检验分类下是否存在该表格名称
  1456. {
  1457. var nameCondition string
  1458. var namePars []interface{}
  1459. nameCondition += " AND excel_classify_id=? AND parent_id=?"
  1460. namePars = append(namePars, excelClassifyId, 0)
  1461. nameCondition += " AND excel_name=? "
  1462. namePars = append(namePars, excelName)
  1463. count, tmpErr := excelModel.GetExcelInfoCountByCondition(nameCondition, namePars)
  1464. if tmpErr != nil {
  1465. errMsg = "判断表格名称是否存在失败"
  1466. err = tmpErr
  1467. return
  1468. }
  1469. if count > 0 {
  1470. errMsg = "表格名称已存在,请重新填写表格名称"
  1471. err = errors.New(errMsg)
  1472. isSendEmail = false
  1473. return
  1474. }
  1475. }
  1476. oldExcelInfo.ExcelName = excelName
  1477. // 先复制动态表,再复制动态子表,复制静态表,再复制静态子表
  1478. condition := " AND parent_id = ? AND balance_type = 0 "
  1479. var pars []interface{}
  1480. pars = append(pars, oldExcelInfo.ExcelInfoId)
  1481. childExcelList, err := excelModel.GetExcelInfoListByCondition(condition, pars)
  1482. if err != nil {
  1483. errMsg = "获取子表失败"
  1484. err = fmt.Errorf("获取子表失败 %s", err.Error())
  1485. return
  1486. }
  1487. // 查询出每个子表的内容,并将内容转为静态版本
  1488. excelDataMap := make(map[int]map[int][]*data_manage.EdbDataList)
  1489. excelInfo, err, errMsg, isSendEmail = AddBalanceStaticExcel(oldExcelInfo, excelClassifyId, "", sysUser, 0, 0, 0, childExcelList, false, excelDataMap)
  1490. if err != nil {
  1491. errMsg = "复制动态表失败"
  1492. err = fmt.Errorf("复制动态表失败 %s", err.Error())
  1493. return
  1494. }
  1495. //复制静态表
  1496. staticCondition := " AND parent_id = 0 AND balance_type = 1 AND rel_excel_info_id=? "
  1497. var staticPars []interface{}
  1498. staticPars = append(staticPars, oldExcelInfo.ExcelInfoId)
  1499. staticExcelList, err := excelModel.GetExcelInfoListByCondition(staticCondition, staticPars)
  1500. if err != nil {
  1501. errMsg = "获取子表失败"
  1502. err = fmt.Errorf("获取子表失败 %s", err.Error())
  1503. return
  1504. }
  1505. for _, staticExcelInfo := range staticExcelList {
  1506. cCondition := " AND parent_id = ? AND balance_type = 1"
  1507. var cPars []interface{}
  1508. cPars = append(cPars, staticExcelInfo.ExcelInfoId)
  1509. childList, e := excelModel.GetExcelInfoListByCondition(cCondition, cPars)
  1510. if e != nil {
  1511. errMsg = "获取子表失败"
  1512. err = fmt.Errorf("获取子表失败 %s", err.Error())
  1513. return
  1514. }
  1515. excelDataMap = make(map[int]map[int][]*data_manage.EdbDataList)
  1516. for _, childExcelInfo := range childList {
  1517. //得到表格数据并落库
  1518. tmpDataList, e := excelModel.GetExcelChartDataByExcelInfoId(childExcelInfo.ExcelInfoId)
  1519. if e != nil {
  1520. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
  1521. return
  1522. }
  1523. if len(tmpDataList) > 0 {
  1524. for _, v := range tmpDataList {
  1525. child, ok := excelDataMap[v.ChartInfoId]
  1526. if !ok {
  1527. child = make(map[int][]*data_manage.EdbDataList)
  1528. }
  1529. tmp := &data_manage.EdbDataList{
  1530. DataTime: v.DataTime,
  1531. DataTimestamp: v.DataTimestamp,
  1532. Value: v.Value,
  1533. }
  1534. child[v.ExcelChartEdbId] = append(child[v.ExcelChartEdbId], tmp)
  1535. excelDataMap[v.ChartInfoId] = child
  1536. }
  1537. }
  1538. }
  1539. _, err, errMsg, isSendEmail = AddBalanceStaticExcel(staticExcelInfo, excelClassifyId, staticExcelInfo.VersionName, sysUser, 0, excelInfo.ExcelInfoId, 1, childList, false, excelDataMap)
  1540. if err != nil {
  1541. errMsg = "复制动态表失败"
  1542. err = fmt.Errorf("复制动态表失败 %s", err.Error())
  1543. return
  1544. }
  1545. }
  1546. return
  1547. }
  1548. func TransferChartEdbToEdbMappingFormat(chartInfoId, chartType int, mappingListTmp []*excelModel.ExcelChartEdb, dataListMap map[int][]*data_manage.EdbDataList) (mappingList []*data_manage.ChartEdbInfoMapping, err error) {
  1549. mappingList = make([]*data_manage.ChartEdbInfoMapping, 0)
  1550. //循环组装映射关系
  1551. for _, v := range mappingListTmp {
  1552. dataList := make([]*data_manage.EdbDataList, 0)
  1553. dataListTmp, ok := dataListMap[v.ExcelChartEdbId]
  1554. if ok {
  1555. dataList = dataListTmp
  1556. } else {
  1557. err = errors.New(fmt.Sprint("获取失败,指标类型异常", v.ExcelChartEdbId))
  1558. return
  1559. }
  1560. startDateStr, endDateStr, _, endVal, maxValue, minValue := getBalanceDataListStartDateAndValue(dataList)
  1561. mapping := &data_manage.ChartEdbInfoMapping{
  1562. EdbInfoId: v.ExcelChartEdbId,
  1563. SourceName: "平衡表",
  1564. Source: 0,
  1565. SubSource: 0,
  1566. EdbCode: v.EdbCode,
  1567. EdbName: v.EdbName,
  1568. EdbAliasName: v.EdbName,
  1569. EdbNameEn: "",
  1570. EdbAliasNameEn: "",
  1571. EdbType: 0,
  1572. Frequency: "",
  1573. FrequencyEn: "",
  1574. Unit: "",
  1575. UnitEn: "",
  1576. StartDate: startDateStr,
  1577. EndDate: endDateStr,
  1578. ModifyTime: v.ModifyTime.Format(utils.FormatDateTime),
  1579. ChartEdbMappingId: v.ExcelChartEdbId,
  1580. ChartInfoId: chartInfoId,
  1581. MaxData: v.MaxData,
  1582. MinData: v.MinData,
  1583. IsOrder: v.IsOrder,
  1584. IsAxis: v.IsAxis,
  1585. EdbInfoType: v.EdbInfoType,
  1586. //EdbInfoCategoryType: 0,
  1587. LeadValue: v.LeadValue,
  1588. LeadUnit: v.LeadUnit,
  1589. LeadUnitEn: "",
  1590. ChartStyle: "",
  1591. ChartColor: "",
  1592. PredictChartColor: "",
  1593. ChartWidth: v.ChartWidth,
  1594. ChartType: chartType,
  1595. LatestDate: endDateStr,
  1596. LatestValue: endVal,
  1597. MoveLatestDate: "",
  1598. UniqueCode: "",
  1599. MinValue: minValue,
  1600. MaxValue: maxValue,
  1601. DataList: nil,
  1602. IsNullData: false,
  1603. MappingSource: 0,
  1604. RegionType: "",
  1605. ClassifyId: 0,
  1606. IsConvert: 0,
  1607. ConvertType: 0,
  1608. ConvertValue: 0,
  1609. ConvertUnit: "",
  1610. ConvertEnUnit: "",
  1611. IsJoinPermission: 0,
  1612. HaveOperaAuth: true,
  1613. }
  1614. mappingList = append(mappingList, mapping)
  1615. }
  1616. return
  1617. }