useSync.hook.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import { onUnmounted } from 'vue';
  2. import { httpErrorHandle, fetchRouteParamsByhistory } from '@/utils'
  3. import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
  4. import { EditCanvasTypeEnum, ChartEditStoreEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
  5. import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
  6. import { fetchChartComponent, createComponent } from '@/packages/index'
  7. import { CreateComponentType } from '@/packages/index.d'
  8. import { saveInterval } from '@/settings/designSetting'
  9. // 接口状态
  10. import { ResultEnum } from '@/enums/httpEnum'
  11. // 接口
  12. import { saveProjectApi, fetchProjectApi } from '@/api/path/project'
  13. // 画布枚举
  14. import { SyncEnum } from '@/enums/editPageEnum'
  15. // 请求处理
  16. export const useSync = () => {
  17. const chartEditStore = useChartEditStore()
  18. const chartHistoryStore = useChartHistoryStore()
  19. /**
  20. * * 组件动态注册
  21. * @param projectData 项目数据
  22. * @param isSplace 是否替换数据
  23. * @returns
  24. */
  25. const updateComponent = async (projectData: any, isSplace = false) => {
  26. if (isSplace) {
  27. // 清除列表
  28. chartEditStore.componentList = []
  29. // 清除历史记录
  30. chartHistoryStore.clearBackStack()
  31. chartHistoryStore.clearForwardStack()
  32. }
  33. // 列表组件注册
  34. projectData.componentList.forEach(async (e: CreateComponentType) => {
  35. if (!window['$vue'].component(e.chartConfig.chartKey)) {
  36. window['$vue'].component(
  37. e.chartConfig.chartKey,
  38. fetchChartComponent(e.chartConfig)
  39. )
  40. }
  41. })
  42. // 数据赋值
  43. for (const key in projectData) {
  44. // 组件
  45. if (key === ChartEditStoreEnum.COMPONENT_LIST) {
  46. for (const comItem of projectData[key]) {
  47. // 补充 class 上的方法
  48. let newComponent: CreateComponentType = await createComponent(
  49. comItem.chartConfig
  50. )
  51. // 不保存到记录
  52. chartEditStore.addComponentList(
  53. Object.assign(newComponent, comItem),
  54. false,
  55. true
  56. )
  57. }
  58. } else {
  59. // 非组件(顺便排除脏数据)
  60. if (key !== 'editCanvasConfig' && key !== 'requestGlobalConfig') return
  61. Object.assign((chartEditStore as any)[key], projectData[key])
  62. }
  63. }
  64. }
  65. // 数据获取
  66. const dataSyncFetch = async () => {
  67. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.START)
  68. try {
  69. const res: any = await fetchProjectApi({ projectId: fetchRouteParamsByhistory() })
  70. if (res.code === ResultEnum.SUCCESS) {
  71. if (res.data) {
  72. const data = JSON.parse(res.data)
  73. await updateComponent(data)
  74. return
  75. }
  76. setTimeout(() => {
  77. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.SUCCESS)
  78. }, 1000)
  79. return
  80. }
  81. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE)
  82. } catch (error) {
  83. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE)
  84. httpErrorHandle()
  85. }
  86. }
  87. // 数据保存
  88. const dataSyncUpdate = async () => {
  89. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.START)
  90. let params = new FormData()
  91. params.append('projectId', fetchRouteParamsByhistory())
  92. params.append('content', JSON.stringify(chartEditStore.getStorageInfo || {}))
  93. const res: any = await saveProjectApi(params)
  94. if (res.code === ResultEnum.SUCCESS) {
  95. // 成功状态
  96. setTimeout(() => {
  97. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.SUCCESS)
  98. }, 1000)
  99. return
  100. }
  101. // 失败状态
  102. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE)
  103. }
  104. // 定时处理
  105. const intervalDataSyncUpdate = () => {
  106. // 定时获取数据
  107. const syncTiming = setInterval(() => {
  108. dataSyncUpdate()
  109. }, saveInterval * 1000)
  110. // 销毁
  111. onUnmounted(() => {
  112. clearInterval(syncTiming)
  113. })
  114. }
  115. return {
  116. updateComponent,
  117. dataSyncFetch,
  118. dataSyncUpdate,
  119. intervalDataSyncUpdate
  120. }
  121. }