import { ref } from 'vue' import { fuseModels, getFuseModel, getFuseModelShowVariable } from './fuse-model' import { createTemploraryID, autoSetModeCallback } from './sys' import { custom } from '@/env' import { addStoreItem, deepIsRevise, deleteStoreItem, fetchStoreItems, recoverStoreItems, saveStoreItems, updateStoreItem } from '@/utils' import { MeasureType, fetchMeasures, postAddMeasure, postUpdateMeasure, postDeleteMeasure } from '@/api' import type { Measure as SMeasure } from '@/api' import { Message } from 'bill/index' export type Measure = SMeasure & { selected?: boolean } export type Measures = Measure[] export const MeasureTypeMeta = { [MeasureType.area]: { icon: 'h-r', desc: '面积', unitDesc: '面积', unit: 'm²' }, [MeasureType.free]: { icon: 'f-l', desc: '自由', unitDesc: '长度', unit: 'm' }, [MeasureType.vertical]: { icon: 'v-l', desc: '垂直', unitDesc: '长度', unit: 'm' } } export const measures = ref([]) export const getMeasureIsShow = (measure: Measure) => measure.positions.every(({modelId}) => { const model = getFuseModel(modelId) return custom.showMeasures && model && model.loaded && getFuseModelShowVariable(model).value }) export const createMeasure = (measure: Partial = {}): Measure => ({ id: createTemploraryID(), fusionId: fuseModels.value[0].fusionId, title: MeasureTypeMeta[measure.type || MeasureType.free].unitDesc, positions: [], desc: '', type: MeasureType.free, ...measure }) let bcMeasures: Measures = [] export const getBackupMeasures = () => bcMeasures export const backupMeasures = () => { bcMeasures = measures.value.map(measure => ({...measure, positions: [...measure.positions]})) } export const recoverMeasures = recoverStoreItems(measures, getBackupMeasures) export const initialMeasures = fetchStoreItems(measures, async () => { return fuseModels.value.length ? await fetchMeasures(fuseModels.value[0].fusionId) : [] }, backupMeasures) export const addMeasure = addStoreItem(measures, postAddMeasure) export const updateMeasure = updateStoreItem(measures, postUpdateMeasure) export const deleteMeasure = deleteStoreItem(measures, measure => postDeleteMeasure(measure.id)) export const saveMeasures = saveStoreItems( measures, getBackupMeasures, { add: addMeasure, delete: deleteMeasure, update: updateMeasure } ) export const autoSaveMeasures = autoSetModeCallback(measures, { isUpdate: (newMeasure) => { console.log(newMeasure, getBackupMeasures()) return deepIsRevise( newMeasure.map(item => ({...item, selected: false})), getBackupMeasures().map(item => ({...item, selected: false})) ) }, backup: backupMeasures, recovery: recoverMeasures, save: async () => { if (!measures.value.every(record => record.title)) { Message.warning('测量名称不可为空') throw '测量名称不可为空' } await saveMeasures() } }) export type { MeasurePosition } from '@/api' export { MeasureType, }