useSync.hook.ts 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import { onUnmounted } from 'vue';
  2. import html2canvas from 'html2canvas'
  3. import { getUUID, httpErrorHandle, fetchRouteParamsLocation, base64toFile } from '@/utils'
  4. import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
  5. import { EditCanvasTypeEnum, ChartEditStoreEnum, ProjectInfoEnum, ChartEditStorage } from '@/store/modules/chartEditStore/chartEditStore.d'
  6. import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
  7. import { useSystemStore } from '@/store/modules/systemStore/systemStore'
  8. import { fetchChartComponent, createComponent } from '@/packages/index'
  9. import { CreateComponentType } from '@/packages/index.d'
  10. import { saveInterval } from '@/settings/designSetting'
  11. // 接口状态
  12. import { ResultEnum } from '@/enums/httpEnum'
  13. // 接口
  14. import { saveProjectApi, fetchProjectApi, uploadFile, updateProjectApi } from '@/api/path'
  15. // 画布枚举
  16. import { SyncEnum } from '@/enums/editPageEnum'
  17. // 请求处理
  18. export const useSync = () => {
  19. const chartEditStore = useChartEditStore()
  20. const chartHistoryStore = useChartHistoryStore()
  21. const systemStore = useSystemStore()
  22. /**
  23. * * 组件动态注册
  24. * @param projectData 项目数据
  25. * @param isSplace 是否替换数据
  26. * @returns
  27. */
  28. const updateComponent = async (projectData: ChartEditStorage, isSplace = false) => {
  29. if (isSplace) {
  30. // 清除列表
  31. chartEditStore.componentList = []
  32. // 清除历史记录
  33. chartHistoryStore.clearBackStack()
  34. chartHistoryStore.clearForwardStack()
  35. }
  36. // 列表组件注册
  37. projectData.componentList.forEach(async (e: CreateComponentType) => {
  38. if (!window['$vue'].component(e.chartConfig.chartKey)) {
  39. window['$vue'].component(
  40. e.chartConfig.chartKey,
  41. fetchChartComponent(e.chartConfig)
  42. )
  43. }
  44. })
  45. // 数据赋值
  46. for (const key in projectData) {
  47. // 组件
  48. if (key === ChartEditStoreEnum.COMPONENT_LIST) {
  49. for (const comItem of projectData[key]) {
  50. // 补充 class 上的方法
  51. let newComponent: CreateComponentType = await createComponent(
  52. comItem.chartConfig
  53. )
  54. chartEditStore.addComponentList(
  55. Object.assign(newComponent, {...comItem, id: getUUID()}),
  56. false,
  57. true
  58. )
  59. }
  60. } else {
  61. // 非组件(顺便排除脏数据)
  62. if (key !== 'editCanvasConfig' && key !== 'requestGlobalConfig') return
  63. Object.assign((chartEditStore as any)[key], projectData[key])
  64. }
  65. }
  66. }
  67. /**
  68. * * 赋值全局数据
  69. * @param projectData 项目数据
  70. * @returns
  71. */
  72. const updateStoreInfo = (projectData: {
  73. id: string,
  74. projectName: string,
  75. indexImage: string,
  76. remarks: string,
  77. }) => {
  78. const { projectName, remarks, indexImage } = projectData
  79. // 名称
  80. chartEditStore.setProjectInfo(ProjectInfoEnum.PROJECT_NAME, projectName)
  81. // 描述
  82. chartEditStore.setProjectInfo(ProjectInfoEnum.REMARKS, remarks)
  83. // 缩略图
  84. chartEditStore.setProjectInfo(ProjectInfoEnum.THUMBNAIL, indexImage)
  85. }
  86. // * 数据获取
  87. const dataSyncFetch = async () => {
  88. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.START)
  89. try {
  90. const res: any = await fetchProjectApi({ projectId: fetchRouteParamsLocation() })
  91. if (res.code === ResultEnum.SUCCESS) {
  92. if (res.data) {
  93. updateStoreInfo(res.data)
  94. // 更新全局数据
  95. await updateComponent(JSON.parse(res.data.content))
  96. return
  97. }
  98. setTimeout(() => {
  99. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.SUCCESS)
  100. }, 1000)
  101. return
  102. }
  103. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE)
  104. } catch (error) {
  105. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE)
  106. httpErrorHandle()
  107. }
  108. }
  109. // * 数据保存
  110. const dataSyncUpdate = async () => {
  111. if(!fetchRouteParamsLocation()) return
  112. if(!systemStore.getFetchInfo.OSSUrl) {
  113. window['$message'].error('数据保存失败,请刷新页面重试!')
  114. return
  115. }
  116. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.START)
  117. // 获取缩略图片
  118. const range = document.querySelector('.go-edit-range') as HTMLElement
  119. const ruler = document.getElementById('mb-ruler')
  120. // 去除标尺Dom
  121. if (ruler) ruler.style.display = 'none'
  122. // 生成图片
  123. const canvasImage: HTMLCanvasElement = await html2canvas(range)
  124. // 还原标尺
  125. if (ruler) ruler.style.display = 'block'
  126. // 上传预览图
  127. let uploadParams = new FormData()
  128. uploadParams.append('object', base64toFile(canvasImage.toDataURL(), `${fetchRouteParamsLocation()}_index_preview.png`))
  129. const uploadRes:any = await uploadFile(systemStore.getFetchInfo.OSSUrl, uploadParams)
  130. // 保存预览图
  131. if(uploadRes.code === ResultEnum.SUCCESS) {
  132. await updateProjectApi({
  133. id: fetchRouteParamsLocation(),
  134. indexImage: uploadRes.data.objectContent.httpRequest.uri
  135. })
  136. }
  137. // 保存数据
  138. let params = new FormData()
  139. params.append('projectId', fetchRouteParamsLocation())
  140. params.append('content', JSON.stringify(chartEditStore.getStorageInfo || {}))
  141. const res: any = await saveProjectApi(params)
  142. if (res.code === ResultEnum.SUCCESS) {
  143. // 成功状态
  144. setTimeout(() => {
  145. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.SUCCESS)
  146. }, 1000)
  147. return
  148. }
  149. // 失败状态
  150. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE)
  151. }
  152. // * 定时处理
  153. const intervalDataSyncUpdate = () => {
  154. // 定时获取数据
  155. const syncTiming = setInterval(() => {
  156. dataSyncUpdate()
  157. }, saveInterval * 1000)
  158. // 销毁
  159. onUnmounted(() => {
  160. clearInterval(syncTiming)
  161. })
  162. }
  163. return {
  164. updateComponent,
  165. updateStoreInfo,
  166. dataSyncFetch,
  167. dataSyncUpdate,
  168. intervalDataSyncUpdate
  169. }
  170. }