view.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import { ref } from "vue";
  2. import { autoSetModeCallback, createTemploraryID, unSetModelUpdate } from './sys'
  3. import { fuseModels } from './fuse-model'
  4. import {
  5. addStoreItem,
  6. deleteStoreItem,
  7. fetchStoreItems,
  8. recoverStoreItems,
  9. saveStoreItems,
  10. updateStoreItem
  11. } from '@/utils'
  12. import {
  13. fetchViews,
  14. postAddView,
  15. postUpdateView,
  16. postDeleteView,
  17. uploadFile
  18. } from '@/api'
  19. import { fuseModel } from '@/model'
  20. import type { View as SView } from '@/api'
  21. import type { ModelType } from '@/model'
  22. import { Message } from "bill/expose-common";
  23. export type View = LocalMode<SView, 'cover'>
  24. export type Views = View[]
  25. export const views = ref<Views>([])
  26. export const createView = (view: Partial<View> = {}): View => {
  27. const base = {
  28. id: createTemploraryID(),
  29. title: '视图' + (views.value.length + 1),
  30. cover: 'https://4dkk.4dage.com/scene_view_data/KK-t-F8e5M46wcQ/images/floor_0.png?t=1659422513133?v=0&rnd=0.9219648338739086&x-oss-process=image/resize,m_fill,w_80,h_60/quality,q_70&rnd=0.25420557086595965',
  31. flyData: '',
  32. num: null,
  33. numType: null,
  34. fusionId: fuseModels.value.length ? fuseModels.value[0].fusionId : -1,
  35. sort: Math.min(...views.value.map(item => item.sort)) - 1,
  36. ...view,
  37. }
  38. if (typeof view.fusionId === 'number') {
  39. return {
  40. ...base,
  41. ...view,
  42. fusionId: view.fusionId,
  43. num: null,
  44. numType: null
  45. }
  46. } else if (view.num && typeof view.numType === 'number') {
  47. return {
  48. ...base,
  49. num: view.num,
  50. numType: view.numType,
  51. fusionId: null,
  52. }
  53. } else {
  54. return base as View
  55. }
  56. }
  57. export const viewToModelType = (view: View): ModelType => {
  58. if (typeof view.fusionId === 'number') {
  59. return fuseModel
  60. } else {
  61. return { num: view.num!, type: view.numType! }
  62. }
  63. }
  64. let bcViews: Views = []
  65. export const getBackupViews = () => bcViews
  66. export const backupViews = () => {
  67. bcViews = views.value.map(view => ({...view}))
  68. }
  69. export const recoverViews = recoverStoreItems(views, getBackupViews)
  70. export const initialViews = async () => {
  71. const serviceViews = await fetchViews()
  72. unSetModelUpdate(() => views.value = serviceViews)
  73. backupViews()
  74. }
  75. export const addView = addStoreItem(views, async (view) => {
  76. const cover = await uploadFile(view.cover)
  77. return await postAddView({ ...view, cover })
  78. })
  79. export const updateView = updateStoreItem(views, async (view) => {
  80. const cover = await uploadFile(view.cover)
  81. return await postUpdateView({ ...view, cover })
  82. })
  83. export const deleteView = deleteStoreItem(views, view => postDeleteView(view.id))
  84. export const saveViews = saveStoreItems(
  85. views,
  86. getBackupViews,
  87. {
  88. add: addView,
  89. delete: deleteView,
  90. update: updateView
  91. }
  92. )
  93. export const autoSaveViews = autoSetModeCallback(views, {
  94. backup: backupViews,
  95. recovery: recoverViews,
  96. save: async () => {
  97. if (!views.value.every(view => view.title)) {
  98. Message.warning('视图名称不可为空')
  99. throw '视图名称不可为空'
  100. }
  101. for (let i = 0; i < views.value.length; i++) {
  102. views.value[i].sort = i
  103. }
  104. await saveViews()
  105. }
  106. })