From d48e876ec1f09e23a0325b514630150771376921 Mon Sep 17 00:00:00 2001 From: maojiacai Date: Fri, 12 Sep 2025 11:45:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BF=85=E5=88=B0=E7=82=B9=E9=87=87=E9=9B=86?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=B9=B6=E4=B8=94=E5=B1=95=E7=A4=BA=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E6=96=B9=E6=A0=BC=20=E6=96=B0=E5=A2=9E=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E8=BF=9B=E5=BA=A6=E5=B1=95=E7=A4=BA=E6=89=80=E6=9C=89?= =?UTF-8?q?=E6=96=B9=E6=A0=BC=E5=92=8C=E4=BB=BB=E5=8A=A1=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/service/taskProgress.js | 57 ++++ src/assets/lz/dw.png | Bin 0 -> 20533 bytes src/components/Map/GdMap/index.vue | 6 + src/components/Map/GdMap/mapUtil.js | 25 ++ src/components/aboutTable/MyTable.vue | 2 +- src/router/index.js | 26 +- .../taskPage/collectPage/AddFgFormDialog.vue | 306 ++++++++++++++++++ .../service/taskPage/collectPage/index.vue | 223 +++++++++++++ .../components/DistributePatrolTeamDialog.vue | 65 +++- .../dailyTaskPackage/editAddFormDialog.vue | 151 ++++++++- .../service/taskPage/taskProgress/index.vue | 169 ++++++++++ .../taskProgress/taskDetailsDialog.vue | 186 +++++++++++ 12 files changed, 1187 insertions(+), 29 deletions(-) create mode 100644 src/api/service/taskProgress.js create mode 100644 src/assets/lz/dw.png create mode 100644 src/views/backOfficeSystem/service/taskPage/collectPage/AddFgFormDialog.vue create mode 100644 src/views/backOfficeSystem/service/taskPage/collectPage/index.vue create mode 100644 src/views/backOfficeSystem/service/taskPage/taskProgress/index.vue create mode 100644 src/views/backOfficeSystem/service/taskPage/taskProgress/taskDetailsDialog.vue diff --git a/src/api/service/taskProgress.js b/src/api/service/taskProgress.js new file mode 100644 index 0000000..11c2cfe --- /dev/null +++ b/src/api/service/taskProgress.js @@ -0,0 +1,57 @@ +import request from "@/utils/request"; +const api = "/mosty-api/mosty-yjzl"; + +// 获取方格数据 +export function fetchTbZdxlFgdwSelectList() { + return request({ + url: `${api}/tbZdxlFgdw/selectList` + }) +} + +// 查询任务列表 +export function fetchTbZdxlFgxlrwSelectList(params) { + return request({ + url: `${api}/tbZdxlFgxlrw/selectList`, + params + }) +} + +export function fetchSelectListByBddxlrwId(params) { + return request({ + url: `${api}/tbZdxlFgdwBddxlrwJl/selectListByBddxlrwId`, + params + }) +} + +// 必到点采集列表 +export function fetchTbZdxlFgdwBddSelectPage(params) { + return request({ + url: `${api}/tbZdxlFgdwBdd/selectPage`, + params + }) +} + +// 新增必到点采集数据 +export function fetchTbZdxlFgdwBddSave(data) { + return request({ + url: `${api}/tbZdxlFgdwBdd/save`, + method: 'POST', + data + }) +} + +// 修改新增必到点采集数据 +export function fetchTbZdxlFgdwBddUpdate(data) { + return request({ + url: `${api}/tbZdxlFgdwBdd/update`, + method: "POST", + data + }) +} + +// 获取方格详情 +export function fetchTbZdxlFgdwId(id) { + return request({ + url: `${api}/tbZdxlFgdw/${id}` + }) +} diff --git a/src/assets/lz/dw.png b/src/assets/lz/dw.png new file mode 100644 index 0000000000000000000000000000000000000000..5e151e3dfa08f5102cf25c6dc86f47f773cb210f GIT binary patch literal 20533 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 Op{;pZ { let coords = [centerPoint.lng, centerPoint.lat]; emitter.emit("getcentercoord", coords); }); + + // 获取点击经纬度 + emitter.on("getMapClickCoordinates", (res) => { + mapUtil.value.enableClickEvents() + }) }); //切换地图底图 const onMapImageChange = (val) => { @@ -329,6 +334,7 @@ onUnmounted(() => { emitter.off("diffusionCircle"); emitter.off("SsCircle"); emitter.off("ClearssCircle"); + emitter.off("getMapClickCoordinates") }); diff --git a/src/components/Map/GdMap/mapUtil.js b/src/components/Map/GdMap/mapUtil.js index f3ff05a..b9b3c81 100644 --- a/src/components/Map/GdMap/mapUtil.js +++ b/src/components/Map/GdMap/mapUtil.js @@ -697,6 +697,31 @@ export function MapUtil(map) { break; } } + + /** 获取经纬度*/ + MapUtil.prototype.enableClickEvents = function() { + const _that = this; + + if (_that.clickEventHandler) { + console.log('点击事件已经启用'); + return; + } + + // 添加点击事件处理函数 + _that.clickEventHandler = (e) => { + const lng = e.lngLat.lng; + const lat = e.lngLat.lat; + + emitter.emit("mapClickCoordinates", { + lng, + lat, + coordinates: [lng, lat], + timestamp: new Date().getTime() + }); + }; + + _that.mMap.mapboxGLMap.on('click', _that.clickEventHandler); + }; } // 获取uuid 作为边界图层ID function getUUid() { diff --git a/src/components/aboutTable/MyTable.vue b/src/components/aboutTable/MyTable.vue index 8b60032..6ba3067 100644 --- a/src/components/aboutTable/MyTable.vue +++ b/src/components/aboutTable/MyTable.vue @@ -120,7 +120,7 @@ const props = defineProps({ }, selectable: { type: Function, - default: () => {} + default: () => [] } }); // 可选的时候选择的数据 diff --git a/src/router/index.js b/src/router/index.js index 9e19e45..755947d 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -559,23 +559,41 @@ export const privateRoutes = [{ } }, { - path: "/service/taskPage", - component: () => import("@/views/backOfficeSystem/service/taskPage/dailyTaskPackage/index"), + path: "/taskPage", name: "taskPage", + redirect: "/taskPageIndex", meta: { title: '任务清单', icon: "article-ranking" }, children: [ { - path: "/taskPageIndex", + path: "/taskPage/taskPageIndex", component: () => import("@/views/backOfficeSystem/service/taskPage/dailyTaskPackage/index"), name: "taskPageIndex", meta: { title: '日常任务包', icon: "article-ranking" }, - } + }, + { + path: "/taskPage/taskProgress", + component: () => import("@/views/backOfficeSystem/service/taskPage/taskProgress/index"), + name: "taskProgress", + meta: { + title: '任务进度', + icon: "article-ranking" + }, + }, + { + path: "/taskPage/collectPage", + component: () => import("@/views/backOfficeSystem/service/taskPage/collectPage/index"), + name: "collectPage", + meta: { + title: '必到点采集', + icon: "article-ranking" + }, + }, ] }, { diff --git a/src/views/backOfficeSystem/service/taskPage/collectPage/AddFgFormDialog.vue b/src/views/backOfficeSystem/service/taskPage/collectPage/AddFgFormDialog.vue new file mode 100644 index 0000000..794564c --- /dev/null +++ b/src/views/backOfficeSystem/service/taskPage/collectPage/AddFgFormDialog.vue @@ -0,0 +1,306 @@ + + + + + diff --git a/src/views/backOfficeSystem/service/taskPage/collectPage/index.vue b/src/views/backOfficeSystem/service/taskPage/collectPage/index.vue new file mode 100644 index 0000000..1105862 --- /dev/null +++ b/src/views/backOfficeSystem/service/taskPage/collectPage/index.vue @@ -0,0 +1,223 @@ + + + + + diff --git a/src/views/backOfficeSystem/service/taskPage/dailyTaskPackage/components/DistributePatrolTeamDialog.vue b/src/views/backOfficeSystem/service/taskPage/dailyTaskPackage/components/DistributePatrolTeamDialog.vue index 59ade05..978c2c7 100644 --- a/src/views/backOfficeSystem/service/taskPage/dailyTaskPackage/components/DistributePatrolTeamDialog.vue +++ b/src/views/backOfficeSystem/service/taskPage/dailyTaskPackage/components/DistributePatrolTeamDialog.vue @@ -49,21 +49,31 @@ - + + @@ -72,7 +82,7 @@ }} - + @@ -331,10 +341,13 @@ const dialogFormVisible = ref(false); //弹窗 const isShowMap = ref(false) //展示地图 +const formData = ref({}) + //搜索数据 const listQuery = ref({ pageCurrent: 1, - pageSize: 20 + pageSize: 20, + // bbzt: 0 }); //表单数据 const form = ref({}); @@ -1007,7 +1020,7 @@ function delDictItem(row) { //批量数据 const multipleUserRef = ref(null); const multipleSelectionUser = ref([]) -const handleSelectionChange = (val) => { +const handleSelectionChange = async (val) => { // ids.value = []; // if (val) { // val.forEach((item) => { @@ -1015,17 +1028,40 @@ const handleSelectionChange = (val) => { // }); // } + await nextTick() + if (val?.length > 1) { let del_row = val?.shift(); multipleUserRef.value.toggleRowSelection(del_row, false); } multipleSelectionUser.value = val; + + if (multipleSelectionUser.value?.[0]?.id !== formData.value?.id) { + + formData.value.xfbbQwJlId = [] + formData.value.id = '' + } }; const handleClickClose = () => { // emits("selectionChange", []) visible.value = false } + +const handleChange = async (val, obj) => { + if (val?.length > 1) { + let del_row = val?.shift(); + } + console.log(val); + + formData.xfbbQwJlId = val + formData.value.id = obj?.id + await nextTick() + multipleUserRef.value.toggleRowSelection(obj, true) + + multipleSelectionUser.value = [obj] +} + // 确定 const onSubmit = () => { if (multipleSelectionUser.value.length === 0) { @@ -1035,7 +1071,14 @@ const onSubmit = () => { }); return } - emits("selectionChange", multipleSelectionUser.value) + + const obj = multipleSelectionUser.value?.[0]?.jlList?.find(i => i?.id == formData.value?.xfbbQwJlId[0]) + + emits("selectionChange", { + list: multipleSelectionUser.value, + xfbbName: `${multipleSelectionUser.value?.[0]?.fzrXm}-${obj?.jlxm}`, + ...formData?.value + }) visible.value = false } diff --git a/src/views/backOfficeSystem/service/taskPage/dailyTaskPackage/editAddFormDialog.vue b/src/views/backOfficeSystem/service/taskPage/dailyTaskPackage/editAddFormDialog.vue index 8a5a866..c624a0a 100644 --- a/src/views/backOfficeSystem/service/taskPage/dailyTaskPackage/editAddFormDialog.vue +++ b/src/views/backOfficeSystem/service/taskPage/dailyTaskPackage/editAddFormDialog.vue @@ -99,16 +99,49 @@ > - + + + + + +
+ +
+
+
@@ -121,6 +154,7 @@ import { ref, reactive, getCurrentInstance, computed } from "vue"; import { updateData } from "@/api/service/dailyTaskPackage"; import DictTag from "@/components/DictTag/index.vue"; +import MyTable from "@/components/aboutTable/MyTable.vue"; import DistributePatrolTeamDialog from "@/views/backOfficeSystem/service/taskPage/dailyTaskPackage/components/DistributePatrolTeamDialog.vue"; const { proxy } = getCurrentInstance(); @@ -131,6 +165,27 @@ const formRef = ref(null); const infoActive = ref(true); const visible = ref(false); +const pageData = reactive({ + tableConfiger: { + rowHieght: 61, + haveControls: false, + showSelectType: 'checkBox', + loading: false + }, + total: 0, + tableColumn: [ + { + label: "必到点", + prop: "bddMc" + }, + { + label: "打卡次数", + prop: "xlghDkcs", + showSolt:true + }, + ] +}) + //级联选择器配置 const props = defineProps({ modelValue: { @@ -152,7 +207,7 @@ const dialogFormVisible = computed({ //表单数据 const form = ref({ - bddList: [] + bddList: [{ xlghDkcs: 1 }, { xlghDkcs: "" }] }); // 打卡点验证规则 @@ -213,6 +268,10 @@ const rules = reactive({ function open(row = {}, type) { infoActive.value = type === 'view'; form.value = { ...row, xfbbName: row?.xfxz }; + form.value?.bddList?.forEach((item, index) => { + item.index = index // 直接添加index属性 + }) + title.value = "编辑信息"; dialogFormVisible.value = true; } @@ -224,12 +283,50 @@ function close() { } const handleChange = (val) => { - form.value.xfbbId = val?.[0]?.id; - form.value.xfbbName = `${val?.[0]?.fzrXm}警组`; + form.value.xfbbId = val?.id; + form.value.xfbbQwJlId = val?.xfbbQwJlId?.[0] + form.value.xfbbName = val?.xfbbName; +} + +const fieldErrors = ref({}) + +// 检查指定索引是否有错误 +const hasError = (index) => { + const propPath = `bddList[${index}].xlghDkcs` + return !!fieldErrors.value[propPath] +} + +// 获取指定索引的错误信息 +const getError = (index) => { + const propPath = `bddList[${index}].xlghDkcs` + return fieldErrors.value[propPath] || '' +} + +// 验证单个字段 +const validateField = async (propPath) => { + return new Promise((resolve) => { + formRef.value.validateField(propPath, (errorMessage) => { + fieldErrors.value[propPath] = errorMessage + resolve(!errorMessage) + }) + }) +} + +const validateAllCheckpoints = async () => { + // if (!form.value.bddList) return true + + const validations = form.value.bddList.map((_, index) => + validateField(`bddList[${index}].xlghDkcs`) + ) + + const results = await Promise.all(validations) + return results.every(result => result) } //提交 const submit = async () => { + console.log(await validateAllCheckpoints()) + console.log(fieldErrors.value) try { await formRef.value.validate() @@ -267,4 +364,32 @@ defineExpose({ open }) .label { margin-bottom: 1rem; } + +.validation-container { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 4px; + min-height: 60px; /* 预留错误信息空间 */ +} + +.error-message { + color: #f56c6c; + font-size: 12px; + line-height: 1; + padding: 2px 0; + display: block; +} + +.is-error .el-input-number__inner { + border-color: #f56c6c; +} + +/* 确保表格行高度适应错误信息 */ +.el-table .cell { + min-height: 40px; + display: flex; + flex-direction: column; + justify-content: center; +} diff --git a/src/views/backOfficeSystem/service/taskPage/taskProgress/index.vue b/src/views/backOfficeSystem/service/taskPage/taskProgress/index.vue new file mode 100644 index 0000000..1c98402 --- /dev/null +++ b/src/views/backOfficeSystem/service/taskPage/taskProgress/index.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/src/views/backOfficeSystem/service/taskPage/taskProgress/taskDetailsDialog.vue b/src/views/backOfficeSystem/service/taskPage/taskProgress/taskDetailsDialog.vue new file mode 100644 index 0000000..5658376 --- /dev/null +++ b/src/views/backOfficeSystem/service/taskPage/taskProgress/taskDetailsDialog.vue @@ -0,0 +1,186 @@ + + + + +