|
@@ -48,6 +48,7 @@
|
|
|
<a-radio-button :value="1">配置面板</a-radio-button>
|
|
|
<a-radio-button :value="2">信息面板</a-radio-button>
|
|
|
</a-radio-group>
|
|
|
+ <a-button type="link" size="small" @click="syncCoordinates">同步坐标</a-button>
|
|
|
</div>
|
|
|
|
|
|
<div v-if="modeRadio === 1" class="config">
|
|
@@ -89,8 +90,8 @@
|
|
|
<div class="panel-ct">
|
|
|
<div class="subregionTool">
|
|
|
<div v-if="localSubRegions.length === 0">
|
|
|
- 暂无区域,立即<a-button type="link" size="small" @click="createSubregion"
|
|
|
- >新建</a-button
|
|
|
+ 暂无区域,<a-button type="link" size="small" @click="createSubregion"
|
|
|
+ >新建区域</a-button
|
|
|
>
|
|
|
</div>
|
|
|
<div v-else>
|
|
@@ -100,7 +101,7 @@
|
|
|
type="link"
|
|
|
size="small"
|
|
|
@click="createSubregion"
|
|
|
- >继续新建</a-button
|
|
|
+ >继续创建</a-button
|
|
|
>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -110,221 +111,256 @@
|
|
|
|
|
|
<div v-if="modeRadio === 2" class="info">
|
|
|
<div class="panel">
|
|
|
- <div class="panel-hd"
|
|
|
- >家具列表 <span v-if="localFurniture.length">({{ localFurniture.length }})</span></div
|
|
|
- >
|
|
|
+ <div class="panel-hd">
|
|
|
+ <div
|
|
|
+ >家具列表 <span v-if="localFurniture.length">({{ localFurniture.length }})</span></div
|
|
|
+ >
|
|
|
+ <a-space>
|
|
|
+ <a-popconfirm
|
|
|
+ v-if="localFurniture.length"
|
|
|
+ title="确定清空家具吗?"
|
|
|
+ @confirm="clearFurniture"
|
|
|
+ >
|
|
|
+ <a-button size="small" type="link">清空</a-button>
|
|
|
+ </a-popconfirm>
|
|
|
+ <a-button size="small" type="link" @click="modeRadio = 1">添加</a-button>
|
|
|
+ </a-space>
|
|
|
+ </div>
|
|
|
<div class="panel-ct">
|
|
|
- <div v-for="(furniture, index) in localFurniture" :key="index" class="list-item">
|
|
|
- <a-collapse v-model:activeKey="furnitureActiveKey" ghost>
|
|
|
- <a-collapse-panel :key="index + 2" :header="`${furniture.name} 属性`">
|
|
|
- <div class="mapConfig">
|
|
|
- <div class="mapConfig-item">
|
|
|
- <label class="mapConfig-item-label">家具尺寸:</label>
|
|
|
- <div class="mapConfig-item-content">
|
|
|
- <a-space>
|
|
|
- <a-input-number
|
|
|
- v-model:value="furniture.width"
|
|
|
- :min="10"
|
|
|
- size="small"
|
|
|
- :style="inputStyle"
|
|
|
- />
|
|
|
- <a-input-number
|
|
|
- v-model:value="furniture.length"
|
|
|
- :min="10"
|
|
|
- size="small"
|
|
|
- :style="inputStyle"
|
|
|
- />
|
|
|
- </a-space>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="mapConfig-item">
|
|
|
- <label class="mapConfig-item-label">家具旋转:</label>
|
|
|
- <div class="mapConfig-item-content">
|
|
|
- <a-select v-model:value="furniture.rotate" size="small" :style="inputStyle">
|
|
|
- <a-select-option :value="0">0°</a-select-option>
|
|
|
- <a-select-option :value="90">90°</a-select-option>
|
|
|
- <a-select-option :value="180">180°</a-select-option>
|
|
|
- <a-select-option :value="270">270°</a-select-option>
|
|
|
- </a-select>
|
|
|
+ <template v-if="localFurniture.length">
|
|
|
+ <div v-for="(furniture, index) in localFurniture" :key="index" class="list-item">
|
|
|
+ <a-collapse v-model:activeKey="furnitureActiveKey" ghost>
|
|
|
+ <a-collapse-panel :key="index + 1" :header="`${furniture.name} 属性`">
|
|
|
+ <div class="mapConfig">
|
|
|
+ <div class="mapConfig-item">
|
|
|
+ <label class="mapConfig-item-label">家具尺寸:</label>
|
|
|
+ <div class="mapConfig-item-content">
|
|
|
+ <a-space>
|
|
|
+ <a-input-number
|
|
|
+ v-model:value="furniture.width"
|
|
|
+ :min="10"
|
|
|
+ size="small"
|
|
|
+ :style="inputStyle"
|
|
|
+ />
|
|
|
+ <a-input-number
|
|
|
+ v-model:value="furniture.length"
|
|
|
+ :min="10"
|
|
|
+ size="small"
|
|
|
+ :style="inputStyle"
|
|
|
+ />
|
|
|
+ </a-space>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="mapConfig-item">
|
|
|
- <label class="mapConfig-item-label">位置微调:</label>
|
|
|
- <div class="mapConfig-item-content"></div>
|
|
|
- <a-space>
|
|
|
- <ArrowLeftOutlined @click="nudge('left')" />
|
|
|
- <ArrowUpOutlined @click="nudge('up')" />
|
|
|
- <ArrowDownOutlined @click="nudge('down')" />
|
|
|
- <ArrowRightOutlined @click="nudge('right')" />
|
|
|
- <a-input-number
|
|
|
- v-model:value="nudgeStep"
|
|
|
- :min="1"
|
|
|
- size="small"
|
|
|
- style="width: 60px"
|
|
|
- />
|
|
|
- </a-space>
|
|
|
- </div>
|
|
|
|
|
|
- <div class="mapConfig-item">
|
|
|
- <label class="mapConfig-item-label">left/top:</label>
|
|
|
- <div class="mapConfig-item-content">
|
|
|
- <a-space>
|
|
|
- <a-input-number
|
|
|
- v-model:value="furniture.left"
|
|
|
- disabled
|
|
|
+ <div class="mapConfig-item">
|
|
|
+ <label class="mapConfig-item-label">家具旋转:</label>
|
|
|
+ <div class="mapConfig-item-content">
|
|
|
+ <a-select
|
|
|
+ v-model:value="furniture.rotate"
|
|
|
size="small"
|
|
|
:style="inputStyle"
|
|
|
- />
|
|
|
- <a-input-number
|
|
|
- v-model:value="furniture.top"
|
|
|
- disabled
|
|
|
- size="small"
|
|
|
- :style="inputStyle"
|
|
|
- />
|
|
|
- </a-space>
|
|
|
+ >
|
|
|
+ <a-select-option :value="0">0°</a-select-option>
|
|
|
+ <a-select-option :value="90">90°</a-select-option>
|
|
|
+ <a-select-option :value="180">180°</a-select-option>
|
|
|
+ <a-select-option :value="270">270°</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
|
|
|
- <div class="mapConfig-item">
|
|
|
- <label class="mapConfig-item-label">x/y:</label>
|
|
|
- <div class="mapConfig-item-content">
|
|
|
+ <div class="mapConfig-item">
|
|
|
+ <label class="mapConfig-item-label">位置微调:</label>
|
|
|
+ <div class="mapConfig-item-content"></div>
|
|
|
<a-space>
|
|
|
+ <ArrowLeftOutlined @click="nudge('left')" />
|
|
|
+ <ArrowUpOutlined @click="nudge('up')" />
|
|
|
+ <ArrowDownOutlined @click="nudge('down')" />
|
|
|
+ <ArrowRightOutlined @click="nudge('right')" />
|
|
|
<a-input-number
|
|
|
- v-model:value="furniture.x"
|
|
|
+ v-model:value="nudgeStep"
|
|
|
+ :min="1"
|
|
|
size="small"
|
|
|
- :style="inputStyle"
|
|
|
- />
|
|
|
- <a-input-number
|
|
|
- v-model:value="furniture.y"
|
|
|
- size="small"
|
|
|
- :style="inputStyle"
|
|
|
+ style="width: 60px"
|
|
|
/>
|
|
|
</a-space>
|
|
|
</div>
|
|
|
- </div>
|
|
|
|
|
|
- <div class="mapConfig-item">
|
|
|
- <label class="mapConfig-item-label">操作:</label>
|
|
|
- <div class="mapConfig-item-content">
|
|
|
- <a-space>
|
|
|
- <a-popconfirm
|
|
|
- title="确定删除家具吗?"
|
|
|
- @confirm="deleteFurniture(furniture.nanoid!)"
|
|
|
- >
|
|
|
- <DeleteOutlined />
|
|
|
- </a-popconfirm>
|
|
|
- </a-space>
|
|
|
+ <div class="mapConfig-item">
|
|
|
+ <label class="mapConfig-item-label">left/top:</label>
|
|
|
+ <div class="mapConfig-item-content">
|
|
|
+ <a-space>
|
|
|
+ <a-input-number
|
|
|
+ v-model:value="furniture.left"
|
|
|
+ disabled
|
|
|
+ size="small"
|
|
|
+ :style="inputStyle"
|
|
|
+ />
|
|
|
+ <a-input-number
|
|
|
+ v-model:value="furniture.top"
|
|
|
+ disabled
|
|
|
+ size="small"
|
|
|
+ :style="inputStyle"
|
|
|
+ />
|
|
|
+ </a-space>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="mapConfig-item">
|
|
|
+ <label class="mapConfig-item-label">x/y:</label>
|
|
|
+ <div class="mapConfig-item-content">
|
|
|
+ <a-space>
|
|
|
+ <a-input-number
|
|
|
+ v-model:value="furniture.x"
|
|
|
+ size="small"
|
|
|
+ :style="inputStyle"
|
|
|
+ />
|
|
|
+ <a-input-number
|
|
|
+ v-model:value="furniture.y"
|
|
|
+ size="small"
|
|
|
+ :style="inputStyle"
|
|
|
+ />
|
|
|
+ </a-space>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="mapConfig-item">
|
|
|
+ <label class="mapConfig-item-label">操作:</label>
|
|
|
+ <div class="mapConfig-item-content">
|
|
|
+ <a-space>
|
|
|
+ <a-popconfirm
|
|
|
+ title="确定删除家具吗?"
|
|
|
+ @confirm="deleteFurniture(furniture.nanoid!)"
|
|
|
+ >
|
|
|
+ <DeleteOutlined />
|
|
|
+ </a-popconfirm>
|
|
|
+ </a-space>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- </a-collapse-panel>
|
|
|
- </a-collapse>
|
|
|
- </div>
|
|
|
+ </a-collapse-panel>
|
|
|
+ </a-collapse>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <div v-else class="list-empty">暂无家具</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<div class="panel">
|
|
|
- <div class="panel-hd"
|
|
|
- >区域列表 <span v-if="localSubRegions.length">({{ localSubRegions.length }})</span></div
|
|
|
- >
|
|
|
+ <div class="panel-hd">
|
|
|
+ <div
|
|
|
+ >区域列表
|
|
|
+ <span v-if="localSubRegions.length">({{ localSubRegions.length }})</span></div
|
|
|
+ >
|
|
|
+ <a-space>
|
|
|
+ <a-popconfirm
|
|
|
+ v-if="localSubRegions.length"
|
|
|
+ title="确定清空子区域吗?"
|
|
|
+ @confirm="clearSubregions"
|
|
|
+ >
|
|
|
+ <a-button size="small" type="link">清空</a-button>
|
|
|
+ </a-popconfirm>
|
|
|
+ <a-button size="small" type="link" @click="createSubregion">新建</a-button>
|
|
|
+ </a-space>
|
|
|
+ </div>
|
|
|
<div class="panel-ct">
|
|
|
- <div v-for="(region, index) in localSubRegions" :key="index" class="list-item">
|
|
|
- <a-collapse v-model:activeKey="regionActiveKey" ghost>
|
|
|
- <a-collapse-panel :key="index + 2" :header="`子区域 ${index + 1} 属性`">
|
|
|
- <div class="mapConfig">
|
|
|
- <div class="mapConfig-item">
|
|
|
- <div class="mapConfig-item-label">X范围:</div>
|
|
|
- <div class="mapConfig-item-content">
|
|
|
- <a-space>
|
|
|
- <a-input
|
|
|
- v-model:value.trim="region.startXx"
|
|
|
- :style="inputStyle"
|
|
|
- size="small"
|
|
|
- />
|
|
|
-
|
|
|
- <a-input
|
|
|
- v-model:value.trim="region.stopXx"
|
|
|
- :style="inputStyle"
|
|
|
- size="small"
|
|
|
- />
|
|
|
- </a-space>
|
|
|
+ <template v-if="localSubRegions.length">
|
|
|
+ <div v-for="(region, index) in localSubRegions" :key="index" class="list-item">
|
|
|
+ <a-collapse v-model:activeKey="regionActiveKey" ghost>
|
|
|
+ <a-collapse-panel :key="index + 1" :header="`子区域 ${index + 1} 属性`">
|
|
|
+ <div class="mapConfig">
|
|
|
+ <div class="mapConfig-item">
|
|
|
+ <div class="mapConfig-item-label">X范围:</div>
|
|
|
+ <div class="mapConfig-item-content">
|
|
|
+ <a-space>
|
|
|
+ <a-input
|
|
|
+ v-model:value.trim="region.startXx"
|
|
|
+ :style="inputStyle"
|
|
|
+ size="small"
|
|
|
+ />
|
|
|
+
|
|
|
+ <a-input
|
|
|
+ v-model:value.trim="region.stopXx"
|
|
|
+ :style="inputStyle"
|
|
|
+ size="small"
|
|
|
+ />
|
|
|
+ </a-space>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
|
|
|
- <div class="mapConfig-item">
|
|
|
- <div class="mapConfig-item-label">Y范围:</div>
|
|
|
- <div class="mapConfig-item-content">
|
|
|
- <a-space>
|
|
|
- <a-input
|
|
|
- v-model:value.trim="region.startYy"
|
|
|
- :style="inputStyle"
|
|
|
- size="small"
|
|
|
- />
|
|
|
-
|
|
|
- <a-input
|
|
|
- v-model:value.trim="region.stopYy"
|
|
|
- :style="inputStyle"
|
|
|
- size="small"
|
|
|
- />
|
|
|
- </a-space>
|
|
|
+ <div class="mapConfig-item">
|
|
|
+ <div class="mapConfig-item-label">Y范围:</div>
|
|
|
+ <div class="mapConfig-item-content">
|
|
|
+ <a-space>
|
|
|
+ <a-input
|
|
|
+ v-model:value.trim="region.startYy"
|
|
|
+ :style="inputStyle"
|
|
|
+ size="small"
|
|
|
+ />
|
|
|
+
|
|
|
+ <a-input
|
|
|
+ v-model:value.trim="region.stopYy"
|
|
|
+ :style="inputStyle"
|
|
|
+ size="small"
|
|
|
+ />
|
|
|
+ </a-space>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="mapConfig-item">
|
|
|
- <div class="mapConfig-item-label">Z范围:</div>
|
|
|
- <div class="mapConfig-item-content">
|
|
|
- <a-space>
|
|
|
- <a-input
|
|
|
- v-model:value.trim="region.startZz"
|
|
|
- :style="inputStyle"
|
|
|
- size="small"
|
|
|
- />
|
|
|
|
|
|
- <a-input
|
|
|
- v-model:value.trim="region.stopZz"
|
|
|
- :style="inputStyle"
|
|
|
- size="small"
|
|
|
- />
|
|
|
- </a-space>
|
|
|
+ <div class="mapConfig-item">
|
|
|
+ <div class="mapConfig-item-label">Z范围:</div>
|
|
|
+ <div class="mapConfig-item-content">
|
|
|
+ <a-space>
|
|
|
+ <a-input
|
|
|
+ v-model:value.trim="region.startZz"
|
|
|
+ :style="inputStyle"
|
|
|
+ size="small"
|
|
|
+ />
|
|
|
+
|
|
|
+ <a-input
|
|
|
+ v-model:value.trim="region.stopZz"
|
|
|
+ :style="inputStyle"
|
|
|
+ size="small"
|
|
|
+ />
|
|
|
+ </a-space>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
|
|
|
- <div class="mapConfig-item">
|
|
|
- <div class="mapConfig-item-label">区域跟踪:</div>
|
|
|
- <div class="mapConfig-item-content">
|
|
|
- <a-switch v-model:checked="region.isTracking" size="small" />
|
|
|
+ <div class="mapConfig-item">
|
|
|
+ <div class="mapConfig-item-label">区域跟踪:</div>
|
|
|
+ <div class="mapConfig-item-content">
|
|
|
+ <a-switch v-model:checked="region.isTracking" size="small" />
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
|
|
|
- <div class="mapConfig-item">
|
|
|
- <div class="mapConfig-item-label">区域跌倒:</div>
|
|
|
- <div class="mapConfig-item-content">
|
|
|
- <a-switch v-model:checked="region.isFalling" size="small" />
|
|
|
+ <div class="mapConfig-item">
|
|
|
+ <div class="mapConfig-item-label">区域跌倒:</div>
|
|
|
+ <div class="mapConfig-item-content">
|
|
|
+ <a-switch v-model:checked="region.isFalling" size="small" />
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
|
|
|
- <div v-if="region.isBed" class="mapConfig-item">
|
|
|
- <div class="mapConfig-item-label">呼吸检测:</div>
|
|
|
- <div class="mapConfig-item-content"> 默认开启 </div>
|
|
|
- </div>
|
|
|
+ <div v-if="region.isBed" class="mapConfig-item">
|
|
|
+ <div class="mapConfig-item-label">呼吸检测:</div>
|
|
|
+ <div class="mapConfig-item-content"> 默认开启 </div>
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="mapConfig-item">
|
|
|
- <div class="mapConfig-item-label">删除区域:</div>
|
|
|
- <div class="mapConfig-item-content">
|
|
|
- <a-popconfirm
|
|
|
- title="确定删除区域吗?"
|
|
|
- @confirm="deleteBlockArea(region.id || '')"
|
|
|
- >
|
|
|
- <DeleteOutlined />
|
|
|
- </a-popconfirm>
|
|
|
+ <div class="mapConfig-item">
|
|
|
+ <div class="mapConfig-item-label">删除区域:</div>
|
|
|
+ <div class="mapConfig-item-content">
|
|
|
+ <a-popconfirm
|
|
|
+ title="确定删除区域吗?"
|
|
|
+ @confirm="deleteBlockArea(region.id || '')"
|
|
|
+ >
|
|
|
+ <DeleteOutlined />
|
|
|
+ </a-popconfirm>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- </a-collapse-panel>
|
|
|
- </a-collapse>
|
|
|
- </div>
|
|
|
+ </a-collapse-panel>
|
|
|
+ </a-collapse>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <div v-else class="list-empty">暂无子区域</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -371,6 +407,8 @@ const emit = defineEmits<{
|
|
|
const localFurniture = ref<FurnitureItem[]>(props.furnitureItems ?? [])
|
|
|
const localSubRegions = ref<SubRegions[]>(props.subRegions ?? [])
|
|
|
|
|
|
+console.log('props', props)
|
|
|
+
|
|
|
const inputStyle = computed(() => ({ width: '70px' }))
|
|
|
const pixelPosition = reactive({ left: 0, top: 0 })
|
|
|
const nudgeStep = ref(5)
|
|
@@ -539,7 +577,7 @@ onUnmounted(() => {
|
|
|
localStorage.removeItem('subRegions')
|
|
|
})
|
|
|
|
|
|
-const regionActiveKey = ref<number[]>([0])
|
|
|
+const regionActiveKey = ref<number[]>([])
|
|
|
const furnitureActiveKey = ref<number[]>([])
|
|
|
|
|
|
const deleteBlockArea = (id: string) => {
|
|
@@ -548,10 +586,21 @@ const deleteBlockArea = (id: string) => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-const modeRadioChange = (e: Event) => {
|
|
|
- const value = (e.target as HTMLInputElement).value as unknown as 1 | 2 | 3
|
|
|
- console.log(11111111, value)
|
|
|
- regionActiveKey.value = [0]
|
|
|
+const modeRadioChange = () => {
|
|
|
+ regionActiveKey.value = []
|
|
|
+ furnitureActiveKey.value = []
|
|
|
+}
|
|
|
+
|
|
|
+const syncCoordinates = () => {
|
|
|
+ console.log('同步坐标', localFurniture.value, localSubRegions.value)
|
|
|
+}
|
|
|
+
|
|
|
+const clearSubregions = () => {
|
|
|
+ localSubRegions.value = []
|
|
|
+}
|
|
|
+
|
|
|
+const clearFurniture = () => {
|
|
|
+ localFurniture.value = []
|
|
|
}
|
|
|
</script>
|
|
|
|
|
@@ -597,7 +646,6 @@ const modeRadioChange = (e: Event) => {
|
|
|
.header {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- justify-content: space-between;
|
|
|
margin-bottom: 12px;
|
|
|
}
|
|
|
}
|
|
@@ -611,11 +659,20 @@ const modeRadioChange = (e: Event) => {
|
|
|
color: #666;
|
|
|
line-height: 1.5;
|
|
|
padding: 5px 8px;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ .ant-btn-link {
|
|
|
+ font-size: 12px;
|
|
|
+ line-height: 1.5;
|
|
|
+ padding: 0;
|
|
|
+ }
|
|
|
}
|
|
|
&-ct {
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
gap: 8px;
|
|
|
+ min-height: 30px;
|
|
|
max-height: 300px;
|
|
|
overflow-y: auto;
|
|
|
|
|
@@ -666,6 +723,14 @@ const modeRadioChange = (e: Event) => {
|
|
|
background-color: #f5f5f5;
|
|
|
cursor: pointer;
|
|
|
}
|
|
|
+
|
|
|
+ .list-empty {
|
|
|
+ padding: 8px 12px;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #999;
|
|
|
+ border-radius: 8px;
|
|
|
+ background-color: #f5f5f5;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
.mapConfig {
|