|
|
@@ -29,7 +29,10 @@
|
|
|
v-for="item in filterShopCameraList"
|
|
|
:key="item.code"
|
|
|
class="camera-item flex justify-start"
|
|
|
- :class="{ isAdded: isAddedToMap(item.code) }"
|
|
|
+ :class="{
|
|
|
+ isAdded: isAddedToMap(item.code),
|
|
|
+ isActive: item.code === selectedCamera?.cameraId,
|
|
|
+ }"
|
|
|
@click="handleAddCamera(item.code)"
|
|
|
>
|
|
|
<span class="camera-id">{{ item.name }}</span>
|
|
|
@@ -39,18 +42,6 @@
|
|
|
</div>
|
|
|
<div class="draw-container">
|
|
|
<div style="display: flex; margin-bottom: 20px">
|
|
|
- <div>
|
|
|
- 默认摄像头:
|
|
|
- <ElSelect v-model="defaultCameraId">
|
|
|
- <ElOption
|
|
|
- :key="item.value"
|
|
|
- :label="item.value"
|
|
|
- :value="item.value"
|
|
|
- v-for="item in cameraOptions"
|
|
|
- />
|
|
|
- </ElSelect>
|
|
|
- </div>
|
|
|
-
|
|
|
<el-upload
|
|
|
class="avatar-uploader flex justify-center items-center"
|
|
|
action="/temp/api/layout/uploadPicture"
|
|
|
@@ -77,8 +68,7 @@
|
|
|
<SelectedCameraToolbar
|
|
|
@render-map="renderMap"
|
|
|
:selected-camera="selectedCamera!"
|
|
|
- :positionHash="positionHash"
|
|
|
- :key="positionHash"
|
|
|
+ :key="selectedPositionHash"
|
|
|
/>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -110,7 +100,6 @@
|
|
|
import urlJoin from 'url-join';
|
|
|
import { onMounted, ref, toRaw } from 'vue';
|
|
|
import useCameraMap from './MapBase/useCameraMap';
|
|
|
- import { ElSelect, ElOption } from 'element-plus';
|
|
|
import { updateMinMapViewLayoutApi } from '@/api/scene/scene';
|
|
|
import { onUnmounted, watchEffect } from 'vue';
|
|
|
import { useGlobSetting } from '@/hooks/setting';
|
|
|
@@ -119,17 +108,16 @@
|
|
|
import ContextMenu from './MapBase/ContextMenu.vue';
|
|
|
import DefaultCameraIcon from './MapBase/DefaultCameraIcon.vue';
|
|
|
import { CameraImage } from './MapBase/types';
|
|
|
- import { getFavPositionByCamera } from './MapBase/utils';
|
|
|
+ import { createSelectedPositionHash, getFavPositionByCamera } from './MapBase/utils';
|
|
|
import SelectedCameraToolbar from './components/SelectedCameraToolbar.vue';
|
|
|
|
|
|
const miniMap = useMiniMap();
|
|
|
const globSetting = useGlobSetting();
|
|
|
const { scenesTree, shopCameraList, selectedShopCode, selectedShopDetail } = storeToRefs(miniMap);
|
|
|
const { getScenesTree, getShowCameras, getMapLayout } = miniMap;
|
|
|
- const positionHash = ref('');
|
|
|
+ const selectedPositionHash = ref('');
|
|
|
|
|
|
const onSelectCamera = (cameraImg: CameraImage) => {
|
|
|
- console.log('onSelectCamera', cameraImg);
|
|
|
selectedCamera.value = cameraImg;
|
|
|
menuVisible.value = false;
|
|
|
};
|
|
|
@@ -142,45 +130,45 @@
|
|
|
|
|
|
const handleMoving = (e) => {
|
|
|
const target = e.transform.target;
|
|
|
- selectedCamera.value = target;
|
|
|
- // console.log('target', target);
|
|
|
- if (target?.cameraId !== defaultCameraId.value) return;
|
|
|
+ selectedPositionHash.value = createSelectedPositionHash(target);
|
|
|
+ if (target?.cameraId === defaultCamera.value?.cameraId) {
|
|
|
+ favPosition.value = getFavPositionByCamera({
|
|
|
+ left: target.oCoords.tr.x,
|
|
|
+ top: target.oCoords.tr.y,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const handleRoating = (e) => {
|
|
|
+ const target = e.transform.target;
|
|
|
+ selectedPositionHash.value = createSelectedPositionHash(target);
|
|
|
favPosition.value = getFavPositionByCamera({
|
|
|
left: target.oCoords.tr.x,
|
|
|
top: target.oCoords.tr.y,
|
|
|
});
|
|
|
- positionHash.value = String(target.oCoords.tr.x) + '_' + String(target.oCoords.tr.y);
|
|
|
};
|
|
|
|
|
|
const map = useCameraMap({
|
|
|
onSelect: onSelectCamera,
|
|
|
onRightClick: handleRightClick,
|
|
|
onMoving: handleMoving,
|
|
|
+ onRotating: handleRoating,
|
|
|
});
|
|
|
|
|
|
const selectedCamera = ref<CameraImage | null>();
|
|
|
/** 右键选中的摄像机 */
|
|
|
const rightSelectedCamera = ref<CameraImage | null>(null);
|
|
|
- const cameraOptions = ref<{ label: string; value: string }[]>([]);
|
|
|
- const defaultCameraId = ref('');
|
|
|
- const defaultCamera = ref<CameraImage | null>(null);
|
|
|
+ const defaultCamera = ref<CameraImage | null>();
|
|
|
const searchKey = ref('');
|
|
|
|
|
|
const mousePosition = ref<{ left: number; top: number }>({ left: 0, top: 0 });
|
|
|
const menuVisible = ref(false);
|
|
|
const favPosition = ref<{ left: number; top: number } | null>(null);
|
|
|
|
|
|
- watch(
|
|
|
- map.canvas,
|
|
|
- (c) => {
|
|
|
- console.log('map.canvas', c);
|
|
|
- selectedCamera.value = c?.getActiveObject() as CameraImage;
|
|
|
- },
|
|
|
- { deep: true },
|
|
|
- );
|
|
|
-
|
|
|
watchEffect(() => {
|
|
|
- console.log('selectedCamera.value', selectedCamera.value?.left);
|
|
|
+ /** 删除或者新增的时候会执行 */
|
|
|
+ console.log('getActiveObject');
|
|
|
+ selectedCamera.value = map.canvas.value?.getActiveObject() as CameraImage;
|
|
|
});
|
|
|
|
|
|
const handleAvatarSuccess = (e) => {
|
|
|
@@ -191,6 +179,10 @@
|
|
|
|
|
|
const renderMap = () => {
|
|
|
map.renderCamera();
|
|
|
+ favPosition.value = getFavPositionByCamera({
|
|
|
+ left: defaultCamera.value?.oCoords?.tr.x,
|
|
|
+ top: defaultCamera.value?.oCoords?.tr.y,
|
|
|
+ });
|
|
|
};
|
|
|
|
|
|
const changeShop = (code: string) => {
|
|
|
@@ -204,12 +196,11 @@
|
|
|
map.clear();
|
|
|
return;
|
|
|
}
|
|
|
- defaultCameraId.value = res.defaultCameraId;
|
|
|
map.loadFromJSON(res).then(() => {
|
|
|
- mapJSONToOptions();
|
|
|
- if (!defaultCameraId.value) {
|
|
|
- defaultCamera.value = cameraOptions.value[0];
|
|
|
- defaultCameraId.value = cameraOptions.value[0]?.value;
|
|
|
+ if (res.defaultCameraId) {
|
|
|
+ defaultCamera.value = map.getCameraById(res.defaultCameraId);
|
|
|
+ } else {
|
|
|
+ defaultCamera.value = map.getObjects()?.[0] as CameraImage;
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
@@ -226,9 +217,7 @@
|
|
|
const keyupListener = (e) => {
|
|
|
const keyCode = e.code;
|
|
|
if (keyCode === 'Delete') {
|
|
|
- if (selectedCamera.value) {
|
|
|
- handleDeleteCamera();
|
|
|
- }
|
|
|
+ handleDeleteCamera();
|
|
|
}
|
|
|
};
|
|
|
|
|
|
@@ -240,10 +229,6 @@
|
|
|
document.removeEventListener('keyup', keyupListener);
|
|
|
});
|
|
|
|
|
|
- const selectedCameraDetail = computed(() => {
|
|
|
- return shopCameraList.value.find((item) => item.code === selectedCamera.value?.cameraId);
|
|
|
- });
|
|
|
-
|
|
|
const filterShopCameraList = computed(() => {
|
|
|
const k = searchKey.value.trim();
|
|
|
if (!k) return shopCameraList.value;
|
|
|
@@ -252,7 +237,7 @@
|
|
|
|
|
|
/** 摄像机是否已添加到底图 */
|
|
|
const isAddedToMap = (cameraId: string): boolean => {
|
|
|
- return cameraOptions.value.some((x) => x.value === cameraId);
|
|
|
+ return map.hasCamera(cameraId);
|
|
|
};
|
|
|
|
|
|
const handleAddCamera = (cameraId: string) => {
|
|
|
@@ -261,23 +246,12 @@
|
|
|
return;
|
|
|
}
|
|
|
map.addCamera(cameraId).then((cameraImg) => {
|
|
|
- onSelectCamera(cameraImg);
|
|
|
- mapJSONToOptions();
|
|
|
- if (!defaultCameraId.value) {
|
|
|
- defaultCameraId.value = cameraId;
|
|
|
+ if (!defaultCamera.value?.cameraId) {
|
|
|
+ defaultCamera.value = cameraImg;
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
|
|
|
- const mapJSONToOptions = () => {
|
|
|
- const objects = map.toJSON()?.objects || [];
|
|
|
- console.log('objects', objects);
|
|
|
- cameraOptions.value = objects?.map((x) => ({
|
|
|
- label: x.cameraId,
|
|
|
- value: x.cameraId,
|
|
|
- }));
|
|
|
- };
|
|
|
-
|
|
|
const handleSave = () => {
|
|
|
const json = map.toJSON();
|
|
|
console.log('save json', json);
|
|
|
@@ -285,7 +259,7 @@
|
|
|
ElMessage.error('背景图片未添加');
|
|
|
return;
|
|
|
}
|
|
|
- const layout = JSON.stringify({ ...json, defaultCameraId: defaultCameraId.value });
|
|
|
+ const layout = JSON.stringify({ ...json, defaultCameraId: defaultCamera.value?.cameraId });
|
|
|
updateMinMapViewLayoutApi({ layout, targetId: selectedShopCode.value + '' }).then((res) => {
|
|
|
console.log('updateMinMapViewLayoutApi', res);
|
|
|
ElMessage.success('保存成功');
|
|
|
@@ -294,20 +268,17 @@
|
|
|
|
|
|
const handleDeleteCamera = () => {
|
|
|
if (!selectedCamera.value) return;
|
|
|
- map.removeCamera(toRaw(selectedCamera.value!));
|
|
|
+ map.removeActiveCamera();
|
|
|
/** 如果删除的是默认选中的摄像头,那么先清空默认的摄像头再 */
|
|
|
- mapJSONToOptions();
|
|
|
- if (selectedCamera.value.cameraId === defaultCameraId.value) {
|
|
|
- defaultCameraId.value = cameraOptions.value[0]?.value;
|
|
|
+ if (selectedCamera.value.cameraId === defaultCamera.value?.cameraId) {
|
|
|
+ defaultCamera.value = map.getObjects()?.[0];
|
|
|
}
|
|
|
- selectedCamera.value = null;
|
|
|
};
|
|
|
|
|
|
const handleSetDefault = () => {
|
|
|
const cameraId = rightSelectedCamera.value?.cameraId;
|
|
|
if (!cameraId) return;
|
|
|
defaultCamera.value = rightSelectedCamera.value;
|
|
|
- defaultCameraId.value = cameraId;
|
|
|
/** 选择完成后隐藏 */
|
|
|
menuVisible.value = false;
|
|
|
};
|
|
|
@@ -377,5 +348,8 @@
|
|
|
.isAdded {
|
|
|
color: #409eff;
|
|
|
}
|
|
|
+ .isActive {
|
|
|
+ background-color: #f00;
|
|
|
+ }
|
|
|
</style>
|
|
|
./MapBase/useCameraMap ./MapBase/CameraMapBak
|