excel_info.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. package excel
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/models/data_manage"
  6. "eta/eta_api/models/data_manage/excel"
  7. "eta/eta_api/models/data_manage/excel/request"
  8. "eta/eta_api/models/data_manage/excel/response"
  9. "eta/eta_api/models/system"
  10. "eta/eta_api/services/alarm_msg"
  11. "eta/eta_api/services/data"
  12. "eta/eta_api/services/data/data_manage_permission"
  13. "eta/eta_api/utils"
  14. "fmt"
  15. "sort"
  16. "time"
  17. )
  18. // GetExcelDetailInfoByExcelInfoId 根据表格id获取表格详情
  19. func GetExcelDetailInfoByExcelInfoId(excelInfoId, sysUserId int, lang string) (excelDetail response.ExcelInfoDetail, errMsg string, err error) {
  20. errMsg = `获取失败`
  21. //获取eta表格信息
  22. excelInfo, err := excel.GetExcelInfoById(excelInfoId)
  23. if err != nil {
  24. err = errors.New("获取ETA表格信息失败,Err:" + err.Error())
  25. if err.Error() == utils.ErrNoRow() {
  26. errMsg = "ETA表格被删除,请刷新页面"
  27. err = errors.New("ETA表格被删除,请刷新页面,Err:" + err.Error())
  28. }
  29. return
  30. }
  31. return formatExcelInfo2Detail(excelInfo, sysUserId, lang)
  32. }
  33. // GetExcelDetailInfoByUnicode 根据表格编码获取表格详情
  34. func GetExcelDetailInfoByUnicode(unicode string, sysUserId int, lang string) (excelDetail response.ExcelInfoDetail, errMsg string, err error) {
  35. errMsg = `获取失败`
  36. // 获取eta表格信息
  37. excelInfo, err := excel.GetExcelInfoByUnicode(unicode)
  38. if err != nil {
  39. err = errors.New("获取ETA表格信息失败,Err:" + err.Error())
  40. if err.Error() == utils.ErrNoRow() {
  41. errMsg = "ETA表格被删除,请刷新页面"
  42. err = errors.New("ETA表格被删除,请刷新页面,Err:" + err.Error())
  43. }
  44. return
  45. }
  46. return formatExcelInfo2Detail(excelInfo, sysUserId, lang)
  47. }
  48. func formatExcelInfo2Detail(excelInfo *excel.ExcelInfo, sysUserId int, lang string) (excelDetail response.ExcelInfoDetail, errMsg string, err error) {
  49. // 数据权限
  50. haveOperaAuth, err := data_manage_permission.CheckExcelPermissionByExcelInfoId(excelInfo.ExcelInfoId, excelInfo.ExcelClassifyId, excelInfo.IsJoinPermission, sysUserId)
  51. if err != nil {
  52. err = errors.New("获取表格权限信息失败,Err" + err.Error())
  53. return
  54. }
  55. excelDetail = response.ExcelInfoDetail{
  56. ExcelInfoId: excelInfo.ExcelInfoId,
  57. Source: excelInfo.Source,
  58. ExcelType: excelInfo.ExcelType,
  59. ExcelName: excelInfo.ExcelName,
  60. UniqueCode: excelInfo.UniqueCode,
  61. ExcelClassifyId: excelInfo.ExcelClassifyId,
  62. SysUserId: excelInfo.SysUserId,
  63. SysUserRealName: excelInfo.SysUserRealName,
  64. Content: excelInfo.Content,
  65. ExcelImage: excelInfo.ExcelImage,
  66. FileUrl: excelInfo.FileUrl,
  67. Sort: excelInfo.Sort,
  68. IsDelete: excelInfo.IsDelete,
  69. ModifyTime: excelInfo.ModifyTime,
  70. CreateTime: excelInfo.CreateTime,
  71. TableData: nil,
  72. HaveOperaAuth: haveOperaAuth,
  73. }
  74. // 无权限,不需要返回数据
  75. if !haveOperaAuth {
  76. return
  77. }
  78. switch excelInfo.Source {
  79. case utils.TIME_TABLE: // 时间序列表格
  80. var tableDataConfig TableDataConfig
  81. err = json.Unmarshal([]byte(excelDetail.Content), &tableDataConfig)
  82. if err != nil {
  83. err = errors.New("表格json转结构体失败,Err:" + err.Error())
  84. return
  85. }
  86. result, tmpErr := GetDataByTableDataConfig(tableDataConfig)
  87. if tmpErr != nil {
  88. err = errors.New("获取最新的表格数据失败,Err:" + tmpErr.Error())
  89. return
  90. }
  91. if len(result.EdbInfoIdList) > 0 {
  92. classifyIdList := make([]int, 0)
  93. for _, v := range result.Data {
  94. classifyIdList = append(classifyIdList, v.ClassifyId)
  95. }
  96. classifyMap := make(map[int]*data_manage.EdbClassify)
  97. classifyList, tmpErr := data_manage.GetEdbClassifyByIdList(classifyIdList)
  98. if tmpErr != nil {
  99. err = errors.New("获取分类列表失败,Err:" + tmpErr.Error())
  100. return
  101. }
  102. for _, v := range classifyList {
  103. classifyMap[v.ClassifyId] = v
  104. }
  105. // 获取所有有权限的指标和分类
  106. permissionEdbIdList, permissionClassifyIdList, tmpErr := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUserId, 0, 0)
  107. if err != nil {
  108. err = errors.New("获取所有有权限的指标和分类失败,Err:" + tmpErr.Error())
  109. return
  110. }
  111. for i, v := range result.Data {
  112. if currClassify, ok := classifyMap[v.ClassifyId]; ok {
  113. result.Data[i].HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(v.IsJoinPermission, currClassify.IsJoinPermission, v.EdbInfoId, v.ClassifyId, permissionEdbIdList, permissionClassifyIdList)
  114. }
  115. }
  116. }
  117. excelDetail.TableData = result
  118. case utils.MIXED_TABLE: // 混合表格
  119. var result request.MixedTableReq
  120. err = json.Unmarshal([]byte(excelDetail.Content), &result)
  121. if err != nil {
  122. err = errors.New("表格json转结构体失败,Err:" + err.Error())
  123. return
  124. }
  125. newData, tmpErr, tmpErrMsg := GetMixedTableCellData(result, lang)
  126. if tmpErr != nil {
  127. errMsg = "获取失败"
  128. if tmpErrMsg != `` {
  129. errMsg = tmpErrMsg
  130. }
  131. err = errors.New("获取最新的数据失败,Err:" + tmpErr.Error())
  132. return
  133. }
  134. result.Data = newData
  135. excelDetail.TableData = result
  136. }
  137. return
  138. }
  139. // GetExcelInfoOpButton 获取ETA表格的操作权限
  140. func GetExcelInfoOpButton(sysUser *system.Admin, belongUserId, source int, haveOperaAuth bool) (button response.ExcelInfoDetailButton) {
  141. // 如果没有数据权限,那么直接返回
  142. if !haveOperaAuth {
  143. return
  144. }
  145. //非管理员角色查看其他用户创建的表格,可刷新、另存为、下载表格;
  146. button.RefreshButton = true
  147. button.CopyButton = true
  148. button.DownloadButton = true
  149. // 1、本用户创建的表格,可编辑、刷新、另存为、下载、删除,删除需二次确认;
  150. // 2、管理员角色对所有表格有如上权限;
  151. // 3、在线excel所有人都能编辑
  152. if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || sysUser.AdminId == belongUserId || source == utils.EXCEL_DEFAULT {
  153. button.OpButton = true
  154. button.DeleteButton = true
  155. }
  156. // 自定义分析
  157. if source == utils.CUSTOM_ANALYSIS_TABLE {
  158. if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || sysUser.AdminId == belongUserId {
  159. button.OpEdbButton = true // 生成、查看指标按钮
  160. button.RefreshEdbButton = true // 刷新指标按钮
  161. }
  162. }
  163. return
  164. }
  165. // GetFirstEdbDataList 获取第一列的数据
  166. func GetFirstEdbDataList(edbInfo *data_manage.EdbInfo, num int, manualDateList []string) (resultDataList []request.ManualDataReq, err error) {
  167. var dataList []*data_manage.EdbDataList
  168. switch edbInfo.EdbInfoType {
  169. case 0:
  170. dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, ``, ``)
  171. case 1:
  172. _, dataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, ``, false)
  173. default:
  174. err = errors.New(fmt.Sprint("获取失败,指标类型异常", edbInfo.EdbInfoType))
  175. }
  176. if err != nil {
  177. return
  178. }
  179. // 获取需要的期数
  180. lenData := len(dataList)
  181. if lenData <= 0 {
  182. return
  183. }
  184. tmpManualDateNum := 0 // 手工数据的期数
  185. lenManualDate := len(manualDateList)
  186. if lenManualDate > 0 {
  187. sortDateList := manualDateList
  188. baseDateList := utils.StrArr{}
  189. baseDateList = append(baseDateList, sortDateList...)
  190. sort.Sort(baseDateList)
  191. sortDateList = append([]string{}, baseDateList...)
  192. lastData := dataList[lenData-1]
  193. lastDataDate, tmpErr := time.ParseInLocation(utils.FormatDate, lastData.DataTime, time.Local)
  194. if tmpErr != nil {
  195. err = tmpErr
  196. return
  197. }
  198. // 遍历倒序后的日期,然后匹配在实际数据之后日期的个数
  199. for _, tmpDateStr := range sortDateList {
  200. tmpDate, tmpErr := time.ParseInLocation(utils.FormatDate, tmpDateStr, time.Local)
  201. if tmpErr != nil {
  202. err = tmpErr
  203. return
  204. }
  205. if tmpDate.After(lastDataDate) {
  206. tmpManualDateNum++
  207. continue
  208. }
  209. break
  210. }
  211. }
  212. // 需要的期数减去手工数据的期数,这才是A列指标需要的数据
  213. num = num - tmpManualDateNum
  214. if num > lenData {
  215. num = lenData
  216. }
  217. latestDateTime, _ := time.ParseInLocation(utils.FormatDate, edbInfo.LatestDate, time.Local)
  218. for i := 1; i <= num; i++ {
  219. dataTime, _ := time.ParseInLocation(utils.FormatDate, dataList[lenData-i].DataTime, time.Local)
  220. dataType := 1
  221. // 如果是预测指标,且当前值的日期,晚于实际日期,那么是预测值
  222. if edbInfo.EdbInfoType == 1 && dataTime.After(latestDateTime) {
  223. dataType = 5
  224. }
  225. resultDataList = append(resultDataList, request.ManualDataReq{
  226. DataType: dataType,
  227. DataTime: dataList[lenData-i].DataTime,
  228. ShowValue: fmt.Sprint(dataList[lenData-i].Value),
  229. Value: fmt.Sprint(dataList[lenData-i].Value),
  230. DataTimeType: 1,
  231. })
  232. }
  233. return
  234. }
  235. // GetOtherEdbDataList 获取其他列的数据
  236. func GetOtherEdbDataList(edbInfo *data_manage.EdbInfo, dateList []string) (resultDataList []request.ManualDataReq, err error) {
  237. lenDate := len(dateList)
  238. if lenDate <= 0 {
  239. return
  240. }
  241. sortDateList := dateList
  242. baseDateList := utils.StrArr{}
  243. baseDateList = append(baseDateList, sortDateList...)
  244. sort.Sort(baseDateList)
  245. sortDateList = append([]string{}, baseDateList...)
  246. endDateTime, err := time.ParseInLocation(utils.FormatDate, sortDateList[0], time.Local)
  247. if err != nil {
  248. return
  249. }
  250. firstDateTime, err := time.ParseInLocation(utils.FormatDate, sortDateList[lenDate-1], time.Local)
  251. if err != nil {
  252. return
  253. }
  254. var dataList []*data_manage.EdbDataList
  255. switch edbInfo.EdbInfoType {
  256. case 0:
  257. dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, ``, ``)
  258. case 1:
  259. _, dataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, ``, false)
  260. default:
  261. err = errors.New(fmt.Sprint("获取失败,指标类型异常", edbInfo.EdbInfoType))
  262. }
  263. if err != nil {
  264. return
  265. }
  266. // 获取日期内的数据(包含开始日期前一个日期,以及 结束日期后一个日期,目的为了做空日期时的 插值法兼容)
  267. baseDataList := make([]*data_manage.EdbDataList, 0)
  268. var lastData *data_manage.EdbDataList
  269. var isInsert bool
  270. for _, data := range dataList {
  271. tmpDate := data.DataTime
  272. tmpDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, tmpDate, time.Local)
  273. if tmpErr != nil {
  274. err = tmpErr
  275. return
  276. }
  277. if tmpDateTime.Before(firstDateTime) {
  278. lastData = data
  279. continue
  280. }
  281. // 如果是第一次写入数据
  282. if !isInsert && lastData != nil {
  283. baseDataList = append(baseDataList, lastData)
  284. }
  285. if tmpDateTime.After(endDateTime) {
  286. baseDataList = append(baseDataList, data)
  287. break
  288. }
  289. baseDataList = append(baseDataList, data)
  290. isInsert = true
  291. }
  292. // 实际数据的日期map
  293. realValMap := make(map[string]string)
  294. for _, v := range baseDataList {
  295. realValMap[v.DataTime] = v.DataTime
  296. }
  297. // 插值法处理
  298. handleDataMap := make(map[string]float64)
  299. err = data.HandleDataByLinearRegression(baseDataList, handleDataMap)
  300. if err != nil {
  301. return
  302. }
  303. latestDateTime, _ := time.ParseInLocation(utils.FormatDate, edbInfo.LatestDate, time.Local)
  304. // 对于不存在的数据做补充
  305. for _, date := range sortDateList {
  306. dataType := 1
  307. if _, ok := realValMap[date]; !ok {
  308. dataType = 2
  309. } else {
  310. dataTime, _ := time.ParseInLocation(utils.FormatDate, date, time.Local)
  311. // 如果是预测指标,且当前值的日期,晚于实际日期,那么是预测值
  312. if edbInfo.EdbInfoType == 1 && dataTime.After(latestDateTime) {
  313. dataType = 5
  314. }
  315. }
  316. var value, showValue string
  317. if tmpVal, ok := handleDataMap[date]; ok {
  318. value = fmt.Sprint(tmpVal)
  319. showValue = value
  320. } else {
  321. dataType = 3
  322. }
  323. resultDataList = append(resultDataList, request.ManualDataReq{
  324. DataType: dataType,
  325. DataTime: date,
  326. ShowValue: showValue,
  327. Value: value,
  328. })
  329. }
  330. return
  331. }
  332. // GetFirstHistoryEdbDataList 获取指标的历史的数据
  333. func GetFirstHistoryEdbDataList(edbInfo *data_manage.EdbInfo, num int, endDate string) (resultDataList []request.ManualDataReq, err error) {
  334. endDateTime, err := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
  335. if err != nil {
  336. return
  337. }
  338. var dataList []*data_manage.EdbDataList
  339. switch edbInfo.EdbInfoType {
  340. case 0:
  341. dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbInfoId, ``, endDate)
  342. case 1:
  343. _, dataList, _, _, err, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, endDate, true)
  344. default:
  345. err = errors.New(fmt.Sprint("获取失败,指标类型异常", edbInfo.EdbInfoType))
  346. }
  347. if err != nil {
  348. return
  349. }
  350. // 获取需要的期数
  351. lenData := len(dataList)
  352. if lenData <= 0 {
  353. return
  354. }
  355. lastData := dataList[lenData-1]
  356. lastDataDateTime, err := time.ParseInLocation(utils.FormatDate, lastData.DataTime, time.Local)
  357. if err != nil {
  358. return
  359. }
  360. if endDateTime.Equal(lastDataDateTime) || lastDataDateTime.After(endDateTime) {
  361. dataList = dataList[:lenData-1]
  362. lenData = len(dataList)
  363. }
  364. if num > lenData {
  365. num = lenData
  366. }
  367. latestDateTime, _ := time.ParseInLocation(utils.FormatDate, edbInfo.LatestDate, time.Local)
  368. for i := 1; i <= num; i++ {
  369. dataTime, _ := time.ParseInLocation(utils.FormatDate, dataList[lenData-i].DataTime, time.Local)
  370. dataType := 1
  371. // 如果是预测指标,且当前值的日期,晚于实际日期,那么是预测值
  372. if edbInfo.EdbInfoType == 1 && dataTime.After(latestDateTime) {
  373. dataType = 5
  374. }
  375. resultDataList = append(resultDataList, request.ManualDataReq{
  376. DataType: dataType,
  377. DataTime: dataList[lenData-i].DataTime,
  378. ShowValue: fmt.Sprint(dataList[lenData-i].Value),
  379. Value: fmt.Sprint(dataList[lenData-i].Value),
  380. })
  381. }
  382. return
  383. }
  384. // GetEdbIdsFromExcelCodes 获取表格中的指标IDs
  385. func GetEdbIdsFromExcelCodes(excelCodes []string, sysUserId int, lang string) (edbIds []int, err error) {
  386. edbIds = make([]int, 0)
  387. edbIdExist := make(map[int]bool)
  388. for _, v := range excelCodes {
  389. // 表格详情
  390. detail, msg, e := GetExcelDetailInfoByUnicode(v, sysUserId, lang)
  391. if e != nil {
  392. err = fmt.Errorf("GetExcelDetailInfoByExcelInfoId err: %s, errMsg: %s", e.Error(), msg)
  393. return
  394. }
  395. // 自定义表格
  396. if detail.Source == utils.TIME_TABLE {
  397. jsonByte, e := json.Marshal(detail.TableData)
  398. if e != nil {
  399. err = fmt.Errorf("JSON格式化自定义表格数据失败, Err: %s", e.Error())
  400. return
  401. }
  402. var tableData request.TableDataReq
  403. if e = json.Unmarshal(jsonByte, &tableData); e != nil {
  404. err = fmt.Errorf("解析自定义表格数据失败, Err: %s", e.Error())
  405. return
  406. }
  407. for _, tv := range tableData.EdbInfoIdList {
  408. if edbIdExist[tv] {
  409. continue
  410. }
  411. edbIdExist[tv] = true
  412. edbIds = append(edbIds, tv)
  413. }
  414. }
  415. // 混合表格
  416. if detail.Source == utils.MIXED_TABLE {
  417. jsonByte, e := json.Marshal(detail.TableData)
  418. if e != nil {
  419. err = fmt.Errorf("JSON格式化混合表格数据失败, Err: %s", e.Error())
  420. return
  421. }
  422. var tableData request.MixedTableReq
  423. if e = json.Unmarshal(jsonByte, &tableData); e != nil {
  424. err = fmt.Errorf("解析混合表格数据失败, Err: %s", e.Error())
  425. return
  426. }
  427. if len(tableData.Data) > 0 {
  428. for _, td := range tableData.Data {
  429. for _, tv := range td {
  430. if tv.EdbInfoId > 0 && !edbIdExist[tv.EdbInfoId] {
  431. edbIdExist[tv.EdbInfoId] = true
  432. edbIds = append(edbIds, tv.EdbInfoId)
  433. }
  434. }
  435. }
  436. }
  437. }
  438. }
  439. return
  440. }
  441. // GetExcelEdbBatchRefreshKey 获取批量刷新表格指标缓存key
  442. func GetExcelEdbBatchRefreshKey(source string, reportId, chapterId int) string {
  443. if source == `` {
  444. return ``
  445. }
  446. return fmt.Sprint("batch_refresh_excel_edb:", source, ":", reportId, ":", chapterId)
  447. }
  448. // ReplaceEdbInExcel 替换表格中的指标
  449. func ReplaceEdbInExcel(oldEdbInfo, newEdbInfo *data_manage.EdbInfo) (err error) {
  450. defer func() {
  451. if err != nil {
  452. go alarm_msg.SendAlarmMsg("替换表格中的指标失败提醒,errmsg:"+err.Error(), 3)
  453. }
  454. }()
  455. //查询和指标相关的 表格
  456. mappingList, err := excel.GetExcelEdbMappingByEdbInfoId(oldEdbInfo.EdbInfoId)
  457. if err != nil {
  458. err = fmt.Errorf("查询和指标相关的表格失败,错误:%s", err.Error())
  459. return
  460. }
  461. updateList := make([]*excel.ExcelInfo, 0)
  462. // 循环列表,根据表格类型单独处理
  463. for _, excelMapping := range mappingList {
  464. //查询和指标相关的混合表格
  465. excelInfo, tmpErr := excel.GetExcelInfoById(excelMapping.ExcelInfoId)
  466. if tmpErr != nil {
  467. err = fmt.Errorf("查询和指标相关的混合表格失败,错误:%s", tmpErr.Error())
  468. return
  469. }
  470. // 清除缓存
  471. key := utils.HZ_CHART_LIB_EXCEL_TABLE_DETAIL + ":" + excelInfo.UniqueCode
  472. if utils.Re == nil {
  473. _ = utils.Rc.Delete(key)
  474. }
  475. // 根据表格类型,调用不同的处理函数
  476. switch excelMapping.Source {
  477. case utils.TIME_TABLE: // 时间序列表格
  478. // 替换余额表格中的指标
  479. newExcelInfo, e := replaceEdbInTimeExcel(oldEdbInfo, newEdbInfo, excelInfo)
  480. if e != nil {
  481. err = fmt.Errorf("替换余额表格中的指标失败,错误:%s", e.Error())
  482. return
  483. }
  484. updateList = append(updateList, newExcelInfo)
  485. case utils.MIXED_TABLE:
  486. // 替换余额表格中的指标
  487. newExcelInfo, e := replaceEdbInBalanceExcel(oldEdbInfo, newEdbInfo, excelInfo)
  488. if e != nil {
  489. err = fmt.Errorf("替换余额表格中的指标失败,错误:%s", e.Error())
  490. return
  491. }
  492. updateList = append(updateList, newExcelInfo)
  493. default:
  494. // 其他表格类型的处理逻辑
  495. }
  496. }
  497. err = excel.ReplaceEdbInExcel(oldEdbInfo.EdbInfoId, newEdbInfo.EdbInfoId, updateList)
  498. if err != nil {
  499. err = fmt.Errorf("替换表格中的指标失败,错误:%s", err.Error())
  500. return
  501. }
  502. //todo 是否需要刷新表格中的指标数据
  503. return
  504. }
  505. func replaceEdbInBalanceExcel(oldEdbInfo, newEdbInfo *data_manage.EdbInfo, excelInfo *excel.ExcelInfo) (newExcelInfo *excel.ExcelInfo, err error) {
  506. newExcelInfo = excelInfo
  507. var mixedTableReq request.MixedTableReq
  508. err = json.Unmarshal([]byte(excelInfo.Content), &mixedTableReq)
  509. if err != nil {
  510. err = fmt.Errorf("表格json转结构体失败,Err:" + err.Error())
  511. return
  512. }
  513. // 处理data
  514. configList := mixedTableReq.Data
  515. for ck, rowList := range configList {
  516. for rk, cell := range rowList {
  517. switch cell.DataType {
  518. case request.EdbDT: // 指标信息
  519. if cell.EdbInfoId == oldEdbInfo.EdbInfoId {
  520. //更换成新指标ID
  521. configList[ck][rk].EdbInfoId = newEdbInfo.EdbInfoId
  522. }
  523. case request.InsertDataDT, request.PopInsertDataDT: // 插值、弹框插值
  524. if cell.EdbInfoId == oldEdbInfo.EdbInfoId {
  525. //更换成新指标ID
  526. configList[ck][rk].EdbInfoId = newEdbInfo.EdbInfoId
  527. }
  528. case request.InsertEdbCalculateDataDT: // 插入指标计算公式生成的值
  529. var config request.CalculateConf
  530. err = json.Unmarshal([]byte(cell.Value), &config)
  531. if err != nil {
  532. return
  533. }
  534. if cell.EdbInfoId == oldEdbInfo.EdbInfoId {
  535. //更换成新指标ID
  536. configList[ck][rk].EdbInfoId = newEdbInfo.EdbInfoId
  537. }
  538. if config.EdbInfoId == oldEdbInfo.EdbInfoId {
  539. config.EdbInfoId = newEdbInfo.EdbInfoId
  540. }
  541. var configStr []byte
  542. configStr, err = json.Marshal(config)
  543. if err != nil {
  544. return
  545. }
  546. configList[ck][rk].Value = string(configStr)
  547. case request.DateDT: // 日期类型
  548. // 指标日期类型的单元格需要额外将指标id取出来
  549. if cell.DataTimeType == request.EdbDateDT {
  550. var config request.EdbDateConf
  551. err = json.Unmarshal([]byte(cell.Value), &config)
  552. if err != nil {
  553. return
  554. }
  555. if config.EdbInfoId == oldEdbInfo.EdbInfoId {
  556. config.EdbInfoId = newEdbInfo.EdbInfoId
  557. var configStr []byte
  558. configStr, err = json.Marshal(config)
  559. if err != nil {
  560. return
  561. }
  562. configList[ck][rk].Value = string(configStr)
  563. }
  564. }
  565. }
  566. }
  567. }
  568. mixedTableReq.Data = configList
  569. var newContentByte []byte
  570. newContentByte, err = json.Marshal(mixedTableReq)
  571. if err != nil {
  572. return
  573. }
  574. // 生成的新内容替换原先的旧内容
  575. excelInfo.Content = string(newContentByte)
  576. newExcelInfo = excelInfo
  577. return
  578. }
  579. func replaceEdbInTimeExcel(oldEdbInfo, newEdbInfo *data_manage.EdbInfo, excelInfo *excel.ExcelInfo) (newExcelInfo *excel.ExcelInfo, err error) {
  580. newExcelInfo = excelInfo
  581. var tableDataConfig TableDataConfig
  582. err = json.Unmarshal([]byte(excelInfo.Content), &tableDataConfig)
  583. if err != nil {
  584. err = errors.New("表格json转结构体失败,Err:" + err.Error())
  585. return
  586. }
  587. if len(tableDataConfig.EdbInfoIdList) <= 0 {
  588. return
  589. }
  590. // 实际期数没有的情况下,直接返回吧
  591. if tableDataConfig.Num <= 0 {
  592. return
  593. }
  594. // 先处理edbInfoList
  595. for k, id := range tableDataConfig.EdbInfoIdList {
  596. if id == oldEdbInfo.EdbInfoId {
  597. tableDataConfig.EdbInfoIdList[k] = newEdbInfo.EdbInfoId
  598. }
  599. }
  600. // 先处理tableEdbInfoList
  601. for k, tableEdbInfo := range tableDataConfig.TableEdbInfoList {
  602. if tableEdbInfo.EdbInfoId == oldEdbInfo.EdbInfoId {
  603. tableDataConfig.TableEdbInfoList[k].EdbInfoId = newEdbInfo.EdbInfoId
  604. }
  605. }
  606. var newContentByte []byte
  607. newContentByte, err = json.Marshal(tableDataConfig)
  608. if err != nil {
  609. return
  610. }
  611. // 生成的新内容替换原先的旧内容
  612. excelInfo.Content = string(newContentByte)
  613. newExcelInfo = excelInfo
  614. return
  615. }