measure.ts 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { ref } from 'vue'
  2. import { fuseModels, getFuseModel, getFuseModelShowVariable } from './fuse-model'
  3. import { createTemploraryID, autoSetModeCallback } from './sys'
  4. import { custom } from '@/env'
  5. import {
  6. addStoreItem,
  7. deepIsRevise,
  8. deleteStoreItem,
  9. fetchStoreItems,
  10. recoverStoreItems,
  11. saveStoreItems,
  12. updateStoreItem
  13. } from '@/utils'
  14. import {
  15. MeasureType,
  16. fetchMeasures,
  17. postAddMeasure,
  18. postUpdateMeasure,
  19. postDeleteMeasure
  20. } from '@/api'
  21. import type { Measure as SMeasure } from '@/api'
  22. import { Message } from 'bill/index'
  23. export type Measure<T extends MeasureType = MeasureType> = SMeasure<T> & { selected?: boolean }
  24. export type Measures = Measure[]
  25. export const MeasureTypeMeta = {
  26. [MeasureType.area]: { icon: 'h-r', desc: '面积', unitDesc: '面积', unit: 'm²' },
  27. [MeasureType.free]: { icon: 'f-l', desc: '自由', unitDesc: '长度', unit: 'm' },
  28. [MeasureType.vertical]: { icon: 'v-l', desc: '垂直', unitDesc: '长度', unit: 'm' }
  29. }
  30. export const measures = ref<Measures>([])
  31. export const getMeasureIsShow = (measure: Measure) =>
  32. measure.positions.every(({modelId}) => {
  33. const model = getFuseModel(modelId)
  34. return custom.showMeasures && model && model.loaded && getFuseModelShowVariable(model).value
  35. })
  36. export const createMeasure = (measure: Partial<Measure> = {}): Measure => ({
  37. id: createTemploraryID(),
  38. fusionId: fuseModels.value[0].fusionId,
  39. title: MeasureTypeMeta[measure.type || MeasureType.free].unitDesc,
  40. positions: [],
  41. desc: '',
  42. type: MeasureType.free,
  43. ...measure
  44. })
  45. let bcMeasures: Measures = []
  46. export const getBackupMeasures = () => bcMeasures
  47. export const backupMeasures = () => {
  48. bcMeasures = measures.value.map(measure => ({...measure, positions: [...measure.positions]}))
  49. }
  50. export const recoverMeasures = recoverStoreItems(measures, getBackupMeasures)
  51. export const initialMeasures = fetchStoreItems(measures, async () => {
  52. return fuseModels.value.length ? await fetchMeasures(fuseModels.value[0].fusionId) : []
  53. }, backupMeasures)
  54. export const addMeasure = addStoreItem(measures, postAddMeasure)
  55. export const updateMeasure = updateStoreItem(measures, postUpdateMeasure)
  56. export const deleteMeasure = deleteStoreItem(measures, measure => postDeleteMeasure(measure.id))
  57. export const saveMeasures = saveStoreItems(
  58. measures,
  59. getBackupMeasures,
  60. {
  61. add: addMeasure,
  62. delete: deleteMeasure,
  63. update: updateMeasure
  64. }
  65. )
  66. export const autoSaveMeasures = autoSetModeCallback(measures, {
  67. isUpdate: (newMeasure) => {
  68. console.log(newMeasure, getBackupMeasures())
  69. return deepIsRevise(
  70. newMeasure.map(item => ({...item, selected: false})),
  71. getBackupMeasures().map(item => ({...item, selected: false}))
  72. )
  73. },
  74. backup: backupMeasures,
  75. recovery: recoverMeasures,
  76. save: async () => {
  77. if (!measures.value.every(record => record.title)) {
  78. Message.warning('测量名称不可为空')
  79. throw '测量名称不可为空'
  80. }
  81. await saveMeasures()
  82. }
  83. })
  84. export type { MeasurePosition } from '@/api'
  85. export { MeasureType, }