chart_info_excel_balance.go 57 KB

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