balance_table.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. package excel
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/models/data_manage"
  6. excelModel "eta/eta_api/models/data_manage/excel"
  7. "eta/eta_api/models/data_manage/excel/request"
  8. "eta/eta_api/models/system"
  9. "eta/eta_api/utils"
  10. "fmt"
  11. "github.com/xuri/excelize/v2"
  12. "strconv"
  13. "time"
  14. )
  15. // 将表格信息转化成指标数据
  16. func GetBalanceExcelData(excelDetail *excelModel.ExcelInfo, lang string) (newDataMap map[int]map[int]request.MixedTableCellDataReq, allRows, allCols int, err error, errMsg string) {
  17. var result request.MixedTableReq
  18. err = json.Unmarshal([]byte(excelDetail.Content), &result)
  19. if err != nil {
  20. err = errors.New("表格json转结构体失败,Err:" + err.Error())
  21. return
  22. }
  23. //todo 语言兼容
  24. newData, tmpErr, tmpErrMsg := GetMixedTableCellData(result, lang)
  25. if tmpErr != nil {
  26. errMsg = "获取失败"
  27. if tmpErrMsg != `` {
  28. errMsg = tmpErrMsg
  29. }
  30. err = errors.New("获取最新的数据失败,Err:" + tmpErr.Error())
  31. return
  32. }
  33. allRows = len(newData)
  34. allCols = 0
  35. newDataMap = make(map[int]map[int]request.MixedTableCellDataReq)
  36. for r, row := range newData {
  37. tmp := len(row)
  38. if tmp > allCols {
  39. allCols = tmp
  40. }
  41. colMap := make(map[int]request.MixedTableCellDataReq)
  42. for c, col := range row {
  43. colMap[c] = col
  44. }
  45. newDataMap[r] = colMap
  46. }
  47. return
  48. }
  49. func GetBalanceExcelChartList(excelInfo *excelModel.ExcelInfo, lang string) (list []*data_manage.ChartInfoView, mappingListMap map[int][]*excelModel.ExcelChartEdb, dataListMap map[int][]*data_manage.EdbDataList, err error, errMsg string) {
  50. newExcelDataMap, excelAllRows, excelAllCols, err, errMsg := GetBalanceExcelData(excelInfo, lang)
  51. if err != nil {
  52. return
  53. }
  54. dataListMap = make(map[int][]*data_manage.EdbDataList)
  55. // 相关联指标
  56. mappingListTmp, err := excelModel.GetExcelChartEdbMappingByExcelInfoId(excelInfo.ExcelInfoId)
  57. if err != nil {
  58. errMsg = "获取失败"
  59. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
  60. return
  61. }
  62. mappingListMap = make(map[int][]*excelModel.ExcelChartEdb, 0)
  63. charInfoIds := make([]int, 0)
  64. for _, mapping := range mappingListTmp {
  65. mappingListMap[mapping.ChartInfoId] = append(mappingListMap[mapping.ChartInfoId], mapping)
  66. err, errMsg = GetBalanceExcelEdbData(mapping, newExcelDataMap, dataListMap, excelAllRows, excelAllCols)
  67. if err != nil {
  68. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
  69. return
  70. }
  71. }
  72. for k, _ := range mappingListMap {
  73. charInfoIds = append(charInfoIds, k)
  74. }
  75. list = make([]*data_manage.ChartInfoView, 0)
  76. if len(charInfoIds) > 0 {
  77. chartInfoList, e := data_manage.GetChartInfoViewByIdList(charInfoIds)
  78. if e != nil {
  79. errMsg = "获取失败"
  80. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", e.Error())
  81. return
  82. }
  83. list = chartInfoList
  84. /*for _, chartInfo := range chartInfoList {
  85. mappingList, ok := mappingListMap[chartInfo.ChartInfoId]
  86. if !ok {
  87. err = fmt.Errorf("未找到图表关联的指标信息")
  88. return
  89. }
  90. var chartInfoResp *data_manage.ChartInfoDetailResp
  91. chartInfoResp, err, errMsg = GetBalanceExcelChartDetail(chartInfo, mappingList, sysUser, dataListMap)
  92. if err != nil {
  93. return
  94. }
  95. list = append(list, chartInfoResp)
  96. }*/
  97. }
  98. return
  99. }
  100. // 将表格信息转化成指标数据
  101. func GetBalanceExcelEdbData(excelEdbMappingItem *excelModel.ExcelChartEdb, newMixedTableCellDataListMap map[int]map[int]request.MixedTableCellDataReq, dataListMap map[int][]*data_manage.EdbDataList, allRows, allCols int) (err error, errMsg string) {
  102. var dateList, dataList []string
  103. // 日期序列
  104. {
  105. _, startColumnName, endColumnName, startNum, endNum, isAll, isRow, isColumn, tmpErr := GetSheetStr(excelEdbMappingItem.DateSequence)
  106. if tmpErr != nil {
  107. err = tmpErr
  108. return
  109. }
  110. startNum = startNum - 1
  111. endNum = endNum - 1
  112. // 选择行的数据
  113. if isRow {
  114. // 因为是选择一行的数据,所以开始行和结束行时一样的
  115. //endNum = startNum - 1
  116. // 开始列名、结束列
  117. var startColumn, endColumn int
  118. if isAll {
  119. // 结束列(其实也就是整列的个数)
  120. endColumn = allCols - 1
  121. } else {
  122. tmpStartColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
  123. if tmpErr != nil {
  124. errMsg = "列名异常:" + startColumnName
  125. err = errors.New(errMsg)
  126. return
  127. }
  128. tmpEndColumn, tmpErr := excelize.ColumnNameToNumber(endColumnName)
  129. if tmpErr != nil {
  130. errMsg = "列名异常:" + endColumnName
  131. err = errors.New(errMsg)
  132. return
  133. }
  134. startColumn = tmpStartColumn - 1
  135. endColumn = tmpEndColumn - 1
  136. }
  137. // 最大列数,如果设置的超过了最大列数,那么结束列就是最大列数
  138. maxCol := allCols
  139. if endColumn > maxCol {
  140. endColumn = maxCol - 1
  141. }
  142. // 长度固定,避免一直申请内存空间
  143. dateList = make([]string, endColumn-startColumn+1)
  144. i := 0
  145. for currColumn := startColumn; currColumn <= endColumn; currColumn++ {
  146. currCell, ok := newMixedTableCellDataListMap[startNum][currColumn]
  147. if !ok {
  148. errMsg = fmt.Sprintf("第%d列,第%d行数据异常", currColumn, startNum)
  149. err = errors.New(errMsg)
  150. return
  151. }
  152. dateList[i] = currCell.ShowValue
  153. i++
  154. }
  155. } else if isColumn { // 选择列的数据
  156. if isAll {
  157. // 选择一整列的话,结束行得根据实际情况调整(其实也就是整个sheet有多少行)
  158. endNum = allRows - 1
  159. }
  160. startColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
  161. if tmpErr != nil {
  162. errMsg = "列名异常:" + startColumnName
  163. err = errors.New(errMsg)
  164. return
  165. }
  166. startColumn = startColumn - 1
  167. // 最大行数,如果设置的超过了最大行数,那么结束行就是最大行数
  168. maxRow := allRows
  169. if endNum > maxRow {
  170. endNum = maxRow - 1
  171. }
  172. // 长度固定,避免一直申请内存空间
  173. dateList = make([]string, endNum-startNum+1)
  174. i := 0
  175. for currRow := startNum; currRow <= endNum; currRow++ {
  176. currCell, ok := newMixedTableCellDataListMap[currRow][startColumn]
  177. if !ok {
  178. errMsg = fmt.Sprintf("第%d列,第%d行数据异常", currRow, startColumn)
  179. err = errors.New(errMsg)
  180. return
  181. }
  182. //dateList = append(dateList, currCell.Value)
  183. dateList[i] = currCell.ShowValue
  184. i++
  185. }
  186. }
  187. }
  188. // 数据序列
  189. {
  190. _, startColumnName, endColumnName, startNum, endNum, isAll, isRow, isColumn, tmpErr := GetSheetStr(excelEdbMappingItem.DataSequence)
  191. if tmpErr != nil {
  192. err = tmpErr
  193. return
  194. }
  195. startNum = startNum - 1
  196. endNum = endNum - 1
  197. // 选择行的数据
  198. if isRow {
  199. // 开始列名、结束列
  200. var startColumn, endColumn int
  201. if isAll {
  202. // 结束列(其实也就是整列的个数)
  203. endColumn = allCols - 1
  204. } else {
  205. tmpStartColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
  206. if tmpErr != nil {
  207. errMsg = "列名异常:" + startColumnName
  208. err = errors.New(errMsg)
  209. return
  210. }
  211. tmpEndColumn, tmpErr := excelize.ColumnNameToNumber(endColumnName)
  212. if tmpErr != nil {
  213. errMsg = "列名异常:" + endColumnName
  214. err = errors.New(errMsg)
  215. return
  216. }
  217. startColumn = tmpStartColumn - 1
  218. endColumn = tmpEndColumn - 1
  219. }
  220. // 最大列数,如果设置的超过了最大列数,那么结束列就是最大列数
  221. maxCol := allCols
  222. if endColumn > maxCol {
  223. endColumn = maxCol - 1
  224. }
  225. // 长度固定,避免一直申请内存空间
  226. dataList = make([]string, endColumn-startColumn+1)
  227. i := 0
  228. for currColumn := startColumn; currColumn <= endColumn; currColumn++ {
  229. currCell, ok := newMixedTableCellDataListMap[startNum][currColumn]
  230. if !ok {
  231. errMsg = fmt.Sprintf("第%d列,第%d行数据异常", startColumn, currColumn)
  232. err = errors.New(errMsg)
  233. return
  234. }
  235. //dataList = append(dataList, currCell.Value)
  236. dataList[i] = currCell.ShowValue
  237. i++
  238. }
  239. } else if isColumn { // 选择列的数据
  240. if isAll {
  241. // 选择一整列的话,结束行得根据实际情况调整(其实也就是整个sheet有多少行)
  242. endNum = allRows - 1
  243. }
  244. startColumn, tmpErr := excelize.ColumnNameToNumber(startColumnName)
  245. if tmpErr != nil {
  246. errMsg = "列名异常:" + startColumnName
  247. err = errors.New(errMsg)
  248. return
  249. }
  250. startColumn = startColumn - 1
  251. // 最大行数,如果设置的超过了最大行数,那么结束行就是最大行数
  252. maxRow := allRows
  253. if endNum > maxRow {
  254. endNum = maxRow - 1
  255. }
  256. // 长度固定,避免一直申请内存空间
  257. dataList = make([]string, endNum-startNum+1)
  258. i := 0
  259. for currRow := startNum; currRow <= endNum; currRow++ {
  260. currCell, ok := newMixedTableCellDataListMap[currRow][startColumn]
  261. if !ok {
  262. errMsg = fmt.Sprintf("第%d列,第%d行数据异常", currRow, startColumn)
  263. err = errors.New(errMsg)
  264. return
  265. }
  266. //dataList = append(dataList, currCell.Value)
  267. dataList[i] = currCell.ShowValue
  268. i++
  269. }
  270. }
  271. }
  272. //fmt.Println(dateList, dataList)
  273. //fmt.Println("日期序列结束")
  274. // 将excel中的日期、数据系列处理
  275. //newDateList, newDataList, err, errMsg := excel2.HandleEdbSequenceVal(dateList, dataList)
  276. newDateList, newDataList := dateList, dataList
  277. if err != nil {
  278. err = fmt.Errorf(" 处理日期和数据系列失败 %s", err.Error())
  279. return
  280. }
  281. newDataMap := make(map[int]float64, len(newDataList))
  282. for i, v := range newDataList {
  283. val, e := strconv.ParseFloat(v, 64)
  284. if e != nil {
  285. err = fmt.Errorf(" 处理日期和数据系列失败 %s", e.Error())
  286. return
  287. }
  288. newDataMap[i] = val
  289. }
  290. //组装成excelEdbData
  291. list := make([]*data_manage.EdbDataList, 0)
  292. for i, v := range newDateList {
  293. // todo 处理DataTimestamp
  294. dataTime, e := time.ParseInLocation(utils.FormatDate, v, time.Local)
  295. if e != nil {
  296. err = errors.New("time.Parse Err:" + err.Error())
  297. return
  298. }
  299. timestamp := dataTime.UnixNano() / 1e6
  300. tmp := &data_manage.EdbDataList{
  301. EdbDataId: i,
  302. EdbInfoId: excelEdbMappingItem.ExcelChartEdbId,
  303. DataTime: v,
  304. DataTimestamp: timestamp,
  305. Value: newDataMap[i],
  306. }
  307. list = append(list, tmp)
  308. }
  309. dataListMap[excelEdbMappingItem.ExcelChartEdbId] = list
  310. return
  311. }
  312. // 获取平衡表指标绑定详情
  313. func GetBalanceExcelChartSimple(excelInfo *excelModel.ExcelInfo, chartInfoId int, lang string) (list []*data_manage.ChartInfoView, mappingListMap map[int][]*excelModel.ExcelChartEdb, dataListMap map[int][]*data_manage.EdbDataList, err error, errMsg string) {
  314. mappingListTmp, err := excelModel.GetExcelChartEdbMappingByChartInfoId(chartInfoId)
  315. if err != nil {
  316. errMsg = "获取失败"
  317. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
  318. return
  319. }
  320. mappingList := make([]*excelModel.ExcelChartEdbView, 0)
  321. for _, v := range mappingListTmp {
  322. tmp :=
  323. &excelModel.ExcelChartEdbView{
  324. ExcelChartEdbId: v.ExcelChartEdbId,
  325. ExcelInfoId: v.ExcelInfoId,
  326. ChartInfoId: v.ChartInfoId,
  327. EdbCode: v.EdbCode,
  328. EdbName: v.EdbName,
  329. DateSequenceStr: v.DateSequence,
  330. DataSequenceStr: v.DataSequence,
  331. /*MaxData: v.MaxData,
  332. MinData: v.MinData,
  333. IsOrder: v.IsOrder,
  334. IsAxis: v.IsAxis,
  335. EdbInfoType: v.EdbInfoType,
  336. LeadValue: v.LeadValue,
  337. LeadUnit: v.LeadUnit,*/
  338. FromTag: v.FromTag,
  339. }
  340. mappingList = append(mappingList, tmp)
  341. }
  342. return
  343. }
  344. func GetBalanceExcelChart(excelInfo *excelModel.ExcelInfo, lang string) (list []*data_manage.ChartInfoView, mappingListMap map[int][]*excelModel.ExcelChartEdb, dataListMap map[int][]*data_manage.EdbDataList, err error, errMsg string) {
  345. newExcelDataMap, excelAllRows, excelAllCols, err, errMsg := GetBalanceExcelData(excelInfo, lang)
  346. if err != nil {
  347. return
  348. }
  349. dataListMap = make(map[int][]*data_manage.EdbDataList)
  350. // 相关联指标
  351. mappingListTmp, err := excelModel.GetExcelChartEdbMappingByExcelInfoId(excelInfo.ExcelInfoId)
  352. if err != nil {
  353. errMsg = "获取失败"
  354. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
  355. return
  356. }
  357. mappingListMap = make(map[int][]*excelModel.ExcelChartEdb, 0)
  358. charInfoIds := make([]int, 0)
  359. for _, mapping := range mappingListTmp {
  360. mappingListMap[mapping.ChartInfoId] = append(mappingListMap[mapping.ChartInfoId], mapping)
  361. err, errMsg = GetBalanceExcelEdbData(mapping, newExcelDataMap, dataListMap, excelAllRows, excelAllCols)
  362. if err != nil {
  363. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
  364. return
  365. }
  366. }
  367. for k, _ := range mappingListMap {
  368. charInfoIds = append(charInfoIds, k)
  369. }
  370. list = make([]*data_manage.ChartInfoView, 0)
  371. if len(charInfoIds) > 0 {
  372. chartInfoList, e := data_manage.GetChartInfoViewByIdList(charInfoIds)
  373. if e != nil {
  374. errMsg = "获取失败"
  375. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", e.Error())
  376. return
  377. }
  378. list = chartInfoList
  379. /*for _, chartInfo := range chartInfoList {
  380. mappingList, ok := mappingListMap[chartInfo.ChartInfoId]
  381. if !ok {
  382. err = fmt.Errorf("未找到图表关联的指标信息")
  383. return
  384. }
  385. var chartInfoResp *data_manage.ChartInfoDetailResp
  386. chartInfoResp, err, errMsg = GetBalanceExcelChartDetail(chartInfo, mappingList, sysUser, dataListMap)
  387. if err != nil {
  388. return
  389. }
  390. list = append(list, chartInfoResp)
  391. }*/
  392. }
  393. return
  394. }
  395. // 获取单个图表信息
  396. func GetBalanceExcelChartSingle(chartInfo *data_manage.ChartInfoView, lang string) (mappingListTmp []*excelModel.ExcelChartEdb, dataListMap map[int][]*data_manage.EdbDataList, err error, errMsg string) {
  397. // 相关联指标
  398. mappingListTmp, err = excelModel.GetExcelChartEdbMappingByChartInfoId(chartInfo.ChartInfoId)
  399. if err != nil {
  400. errMsg = "获取失败"
  401. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
  402. return
  403. }
  404. if len(mappingListTmp) <= 0 {
  405. errMsg = "获取失败"
  406. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
  407. return
  408. }
  409. excelInfoId := mappingListTmp[0].ExcelInfoId
  410. // 查询所有子表
  411. excelInfo, err := excelModel.GetExcelInfoById(excelInfoId)
  412. if err != nil {
  413. if err.Error() == utils.ErrNoRow() {
  414. errMsg = "表格不存在"
  415. err = fmt.Errorf(errMsg)
  416. return
  417. }
  418. errMsg = "查询子表失败"
  419. err = fmt.Errorf(" 查询子表失败图表,指标信息失败 Err:%s", err.Error())
  420. return
  421. }
  422. // 获取图表详情
  423. newExcelDataMap, excelAllRows, excelAllCols, err, errMsg := GetBalanceExcelData(excelInfo, lang)
  424. if err != nil {
  425. return
  426. }
  427. dataListMap = make(map[int][]*data_manage.EdbDataList)
  428. for _, mapping := range mappingListTmp {
  429. err, errMsg = GetBalanceExcelEdbData(mapping, newExcelDataMap, dataListMap, excelAllRows, excelAllCols)
  430. if err != nil {
  431. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", err.Error())
  432. return
  433. }
  434. }
  435. return
  436. }
  437. // AddBalanceStaticExcel 另存为静态表
  438. func AddBalanceStaticExcel(oldExcelInfoId int, versionName string, sysUser *system.Admin, parentId int) (excelInfo *excelModel.ExcelInfo, err error, errMsg string, isSendEmail bool) {
  439. isSendEmail = true
  440. versionName = utils.TrimLRStr(versionName)
  441. // 获取原ETA表格信息
  442. oldExcelInfo, err := excelModel.GetExcelInfoById(oldExcelInfoId)
  443. if err != nil {
  444. errMsg = "获取ETA表格失败"
  445. return
  446. }
  447. // todo 操作权限校验
  448. {
  449. // 数据权限
  450. /*haveOperaAuth, tmpErr := data_manage_permission.CheckExcelPermissionByExcelInfoId(oldExcelInfo.ExcelInfoId, oldExcelInfo.ExcelClassifyId, oldExcelInfo.IsJoinPermission, sysUser.AdminId)
  451. if err != nil {
  452. errMsg = "获取ETA表格权限失败"
  453. err = errors.New("获取ETA表格权限失败,Err:" + tmpErr.Error())
  454. return
  455. }
  456. button := GetExcelInfoOpButton(sysUser, oldExcelInfo.SysUserId, oldExcelInfo.Source, haveOperaAuth)
  457. if !button.CopyButton {
  458. errMsg = "无操作权限"
  459. err = errors.New(errMsg)
  460. isSendEmail = false
  461. return
  462. }*/
  463. }
  464. // 检验分类下是否存在该表格名称
  465. {
  466. var condition string
  467. var pars []interface{}
  468. condition += " AND rel_excel_info_id=? "
  469. pars = append(pars, oldExcelInfoId)
  470. condition += " AND version_name=? "
  471. pars = append(pars, versionName)
  472. count, tmpErr := excelModel.GetExcelInfoCountByCondition(condition, pars)
  473. if tmpErr != nil {
  474. errMsg = "判断表格名称是否存在失败"
  475. err = tmpErr
  476. return
  477. }
  478. if count > 0 {
  479. errMsg = "表格名称已存在,请重新填写表格名称"
  480. err = errors.New(errMsg)
  481. isSendEmail = false
  482. return
  483. }
  484. }
  485. // 表格信息
  486. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  487. excelInfo = &excelModel.ExcelInfo{
  488. //ExcelInfoId: 0,
  489. ExcelName: oldExcelInfo.ExcelName + "(" + versionName + ")",
  490. Source: oldExcelInfo.Source,
  491. ExcelType: oldExcelInfo.ExcelType,
  492. UniqueCode: utils.MD5(utils.EXCEL_DATA_PREFIX + "_" + timestamp),
  493. ExcelClassifyId: oldExcelInfo.ExcelClassifyId,
  494. SysUserId: sysUser.AdminId,
  495. SysUserRealName: sysUser.RealName,
  496. Content: oldExcelInfo.Content,
  497. ExcelImage: oldExcelInfo.ExcelImage,
  498. FileUrl: oldExcelInfo.FileUrl,
  499. RelExcelInfoId: oldExcelInfoId,
  500. VersionName: versionName,
  501. UpdateUserId: sysUser.AdminId,
  502. UpdateUserRealName: sysUser.AdminName,
  503. BalanceType: 1,
  504. Sort: 0,
  505. IsDelete: 0,
  506. ModifyTime: time.Now(),
  507. CreateTime: time.Now(),
  508. }
  509. // 获取excel与指标的关系表
  510. list, tmpErr := excelModel.GetAllExcelEdbMappingByExcelInfoId(excelInfo.ExcelInfoId)
  511. if tmpErr != nil {
  512. errMsg = "获取失败"
  513. err = tmpErr
  514. return
  515. }
  516. for k, v := range list {
  517. v.ExcelEdbMappingId = 0
  518. v.ExcelInfoId = 0
  519. list[k] = v
  520. }
  521. var childExcel *excelModel.ExcelInfo
  522. err = excelModel.AddExcelInfo(excelInfo, list, childExcel)
  523. if err != nil {
  524. errMsg = "保存失败"
  525. return
  526. }
  527. if parentId == 0 {
  528. //查询动态表所有的子表,并复制为静态表
  529. } else if parentId > 0 {
  530. // 如果复制的是动态表的子表,则同步复制关联的图表
  531. }
  532. return
  533. }