diff --git a/.env.local b/.env.local index a3752946..f0650411 100644 --- a/.env.local +++ b/.env.local @@ -4,7 +4,7 @@ NODE_ENV=development VITE_DEV=true # 请求路径 -VITE_BASE_URL='http://192.168.0.74:48080' +VITE_BASE_URL='http://192.168.0.66:48080' # VITE_BASE_URL='http://192.168.0.189:48080' # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持 S3 服务 diff --git a/package-lock.json b/package-lock.json index e058cf2c..3da5aac5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,6 +36,7 @@ "fast-xml-parser": "^4.3.2", "highlight.js": "^11.9.0", "jsencrypt": "^3.3.2", + "json-bigint": "^1.0.0", "lodash-es": "^4.17.21", "markdown-it": "^14.1.0", "markmap-common": "^0.16.0", @@ -6691,6 +6692,14 @@ "node": "*" } }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -11700,6 +11709,14 @@ "node": ">=6" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", @@ -23149,6 +23166,11 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, + "bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==" + }, "binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -26748,6 +26770,14 @@ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, "json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", diff --git a/package.json b/package.json index 47eef7ed..8ed2ad52 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "fast-xml-parser": "^4.3.2", "highlight.js": "^11.9.0", "jsencrypt": "^3.3.2", + "json-bigint": "^1.0.0", "lodash-es": "^4.17.21", "markdown-it": "^14.1.0", "markmap-common": "^0.16.0", diff --git a/src/config/axios/service.ts b/src/config/axios/service.ts index 618f14a9..c27858a8 100644 --- a/src/config/axios/service.ts +++ b/src/config/axios/service.ts @@ -220,4 +220,5 @@ const handleAuthorized = () => { } return Promise.reject(t('sys.api.timeoutMessage')) } + export { service } diff --git a/src/views/mapPage/realTimeMap/components-tool/editNodeProperties.vue b/src/views/mapPage/realTimeMap/components-tool/editNodeProperties.vue index 5b0de665..79bafc63 100644 --- a/src/views/mapPage/realTimeMap/components-tool/editNodeProperties.vue +++ b/src/views/mapPage/realTimeMap/components-tool/editNodeProperties.vue @@ -2,10 +2,10 @@ - + - + @@ -72,13 +72,13 @@
- + cm
- + cm
@@ -188,7 +188,7 @@ const submit = async (formEl) => { form.value.dataList[index] && form.value.dataList[index].id ) { - item.id = form.value.dataList[index].id + item.id = String(form.value.dataList[index].id) item.locationNo = form.value.dataList[index].locationNo item.mapItemId = form.value.dataList[index].mapItemId item.laneId = form.value.dataList[index].laneId diff --git a/src/views/mapPage/realTimeMap/components-tool/itemAreaSettingDialog.vue b/src/views/mapPage/realTimeMap/components-tool/itemAreaSettingDialog.vue index 5802d91b..049f5b3f 100644 --- a/src/views/mapPage/realTimeMap/components-tool/itemAreaSettingDialog.vue +++ b/src/views/mapPage/realTimeMap/components-tool/itemAreaSettingDialog.vue @@ -6,7 +6,7 @@ width="600" class="equipment-form-dialog" > - + @@ -20,7 +20,7 @@
@@ -39,8 +39,14 @@ const props = defineProps({ } }) +const ruleFormRef = ref() const dialogFormVisible = ref(false) //列表的 +const rules = reactive({ + skuInfo: [{ required: true, message: '请输入物料区域名称', trigger: 'blur' }], + areaName: [{ required: true, message: '请输入物料名称', trigger: 'blur' }] +}) + //新增 const form = ref({ positionMapId: '', @@ -56,11 +62,16 @@ const open = (list) => { form.value.areaNumber = form.value.mapItemIds.length } -const submitForm = async () => { - form.value.positionMapId = props.positionMapId - await MapApi.createOrEditOrDelHouseArea(form.value) - dialogFormVisible.value = false - message.success('设置成功') +const submitForm = async (formEl) => { + if (!formEl) return + await formEl.validate(async (valid, fields) => { + if (valid) { + form.value.positionMapId = props.positionMapId + await MapApi.createOrEditOrDelHouseArea(form.value) + dialogFormVisible.value = false + message.success('设置成功') + } + }) } defineExpose({ open }) // 提供 open 方法,用于打开弹窗 diff --git a/src/views/mapPage/realTimeMap/components-tool/lineLibrarySettingDialog.vue b/src/views/mapPage/realTimeMap/components-tool/lineLibrarySettingDialog.vue index 29a11aa5..abbb2450 100644 --- a/src/views/mapPage/realTimeMap/components-tool/lineLibrarySettingDialog.vue +++ b/src/views/mapPage/realTimeMap/components-tool/lineLibrarySettingDialog.vue @@ -6,7 +6,7 @@ width="600" class="equipment-form-dialog" > - + @@ -17,7 +17,7 @@ @@ -36,8 +36,13 @@ const props = defineProps({ } }) +const lineFormRef = ref() const dialogFormVisible = ref(false) //列表的 +const rules = reactive({ + laneName: [{ required: true, message: '请输入线库名称', trigger: 'blur' }] +}) + //新增 const form = ref({ positionMapId: '', @@ -52,11 +57,15 @@ const open = (list) => { form.value.areaNumber = form.value.mapItemIds.length } -const submitForm = async () => { - form.value.positionMapId = props.positionMapId - await MapApi.createOrEditOrDelHouseLane(form.value) - dialogFormVisible.value = false - message.success('设置成功') +const submitLineLibraryForm = async () => { + await lineFormRef.value.validate(async (valid, fields) => { + if (valid) { + form.value.positionMapId = props.positionMapId + await MapApi.createOrEditOrDelHouseLane(form.value) + dialogFormVisible.value = false + message.success('设置成功') + } + }) } defineExpose({ open }) // 提供 open 方法,用于打开弹窗 diff --git a/src/views/mapPage/realTimeMap/editMap.vue b/src/views/mapPage/realTimeMap/editMap.vue index 5cfd7ed6..d278a31c 100644 --- a/src/views/mapPage/realTimeMap/editMap.vue +++ b/src/views/mapPage/realTimeMap/editMap.vue @@ -240,38 +240,72 @@ {{ item.text }} - -
- -
+ + + + diff --git a/src/views/mapPage/realTimeMap/框选demo.vue b/src/views/mapPage/realTimeMap/框选demo.vue index 91babaf9..2e2cb7ec 100644 --- a/src/views/mapPage/realTimeMap/框选demo.vue +++ b/src/views/mapPage/realTimeMap/框选demo.vue @@ -3,36 +3,37 @@ @mousedown="startSelection" @mousemove="updateSelection" @mouseup="endSelection" - style="position: relative; width: 100%; height: 900px" + style="position: relative; height: 100vh; border: 1px solid #ccc" > - +
- -
+ 设备{{ index }}
+ /> @@ -41,49 +42,70 @@ import { ref } from 'vue' export default { setup() { - const points = ref([ - { x: 210, y: 210 }, - { x: 330, y: 500 }, - { x: 840, y: 440 }, - { x: 230, y: 400 }, - { x: 750, y: 640 } + // 图片数据 + const images = ref([ + { src: 'https://via.placeholder.com/100', x: 100, y: 100 }, + { src: 'https://via.placeholder.com/100', x: 300, y: 200 }, + { src: 'https://via.placeholder.com/100', x: 500, y: 300 } ]) - const isSelecting = ref(false) - const selectionBox = ref({ x: 0, y: 0, width: 0, height: 0 }) - const startPos = ref({ x: 0, y: 0 }) - const selectedPoints = ref([]) + // 框选区域 + const selectionBox = ref({ + x: 0, + y: 0, + width: 0, + height: 0 + }) + // 是否正在框选 + const isSelecting = ref(false) + + // 框选起始位置 + const startPos = ref({ x: 0, y: 0 }) + + // 开始框选 const startSelection = (event) => { isSelecting.value = true - startPos.value = { x: event.offsetX, y: event.offsetY } - selectionBox.value = { x: event.offsetX, y: event.offsetY, width: 0, height: 0 } - } - - const updateSelection = (event) => { - if (isSelecting.value) { - selectionBox.value.width = event.offsetX - startPos.value.x - selectionBox.value.height = event.offsetY - startPos.value.y + startPos.value = { x: event.clientX, y: event.clientY } + selectionBox.value = { + x: event.clientX, + y: event.clientY, + width: 0, + height: 0 } + + // 阻止默认行为(避免选中图片或文本) + event.preventDefault() } + // 更新框选区域 + const updateSelection = (event) => { + if (!isSelecting.value) return + + const currentX = event.clientX + const currentY = event.clientY + + selectionBox.value = { + x: Math.min(startPos.value.x, currentX), + y: Math.min(startPos.value.y, currentY), + width: Math.abs(currentX - startPos.value.x), + height: Math.abs(currentY - startPos.value.y) + } + + // 阻止默认行为(避免选中图片或文本) + event.preventDefault() + } + + // 结束框选 const endSelection = () => { isSelecting.value = false - selectedPoints.value = points.value.filter((point) => { - return ( - point.x >= Math.min(startPos.value.x, startPos.value.x + selectionBox.value.width) && - point.x <= Math.max(startPos.value.x, startPos.value.x + selectionBox.value.width) && - point.y >= Math.min(startPos.value.y, startPos.value.y + selectionBox.value.height) && - point.y <= Math.max(startPos.value.y, startPos.value.y + selectionBox.value.height) - ) - }) + console.log('框选区域:', selectionBox.value) } return { - points, - isSelecting, + images, selectionBox, - selectedPoints, + isSelecting, startSelection, updateSelection, endSelection @@ -91,3 +113,13 @@ export default { } } + +