This commit is contained in:
Zzc 2025-11-19 17:06:17 +08:00
commit 43f7657a53
9 changed files with 636 additions and 115 deletions

View File

@ -87,7 +87,7 @@ const getYHZinfo = async () => {
method: "GET", method: "GET",
}); });
if (res.code === "00000") { if (res.code === "00000") {
yhzinfo.value = res.data; yhzinfo.value = res.data[0];
} else { } else {
throw new Error(res.message); throw new Error(res.message);
} }

View File

@ -440,7 +440,6 @@ const handleGetLocation = () => {
(position) => { (position) => {
form.material.jd = position.coords.longitude.toFixed(6); form.material.jd = position.coords.longitude.toFixed(6);
form.material.wd = position.coords.latitude.toFixed(6); form.material.wd = position.coords.latitude.toFixed(6);
showToast("定位成功");
}, },
(error) => { (error) => {
const errorMessage = const errorMessage =

View File

@ -2,6 +2,8 @@
<div class="detail-container"> <div class="detail-container">
<el-form <el-form
ref="formRef" ref="formRef"
:model="form"
:rules="rules"
label-position="right" label-position="right"
label-width="150px" label-width="150px"
style="max-height: 60vh; overflow-y: auto; padding-right: 50px" style="max-height: 60vh; overflow-y: auto; padding-right: 50px"
@ -9,23 +11,26 @@
<el-form-item label="所属服务站:"> <el-form-item label="所属服务站:">
<span>{{ yhzData.rawName }}</span> <span>{{ yhzData.rawName }}</span>
</el-form-item> </el-form-item>
<el-form-item label="物资名称:"> <el-form-item label="物资名称:" prop="wzmc">
<el-input <el-input
maxlength="20" maxlength="20"
show-word-limit show-word-limit
v-model="form.material.wzmc" v-model="form.material.wzmc"
></el-input> ></el-input>
</el-form-item> </el-form-item>
<el-form-item label="数量与单位:"> <el-form-item label="数量与单位:" required>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="16"> <el-col :span="16">
<el-form-item prop="sl">
<el-input <el-input
v-model="form.material.sl" v-model.number="form.material.sl"
type="number" type="number"
placeholder="请输入数量" placeholder="请输入数量"
></el-input> ></el-input>
</el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item prop="dw">
<el-select <el-select
v-model="form.material.dw" v-model="form.material.dw"
filterable filterable
@ -40,6 +45,7 @@
<el-option label="箱" value="箱"></el-option> <el-option label="箱" value="箱"></el-option>
<el-option label="袋" value="袋"></el-option> <el-option label="袋" value="袋"></el-option>
</el-select> </el-select>
</el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
@ -54,7 +60,7 @@
</template> </template>
<script setup> <script setup>
import { ref } from "vue"; import { ref, computed } from "vue";
const formRef = ref(null); const formRef = ref(null);
defineExpose({ formRef }); defineExpose({ formRef });
@ -68,6 +74,51 @@ const props = defineProps({
default: () => ({}), default: () => ({}),
}, },
}); });
const rules = computed(() => {
return {
wzmc: [
{
required: true,
validator: (rule, value, callback) => {
if (props.form.material.wzmc) {
callback();
} else {
callback(new Error("请输入物资名称"));
}
},
trigger: "blur",
},
],
sl: [
{
required: true,
type: "number",
validator: (rule, value, callback) => {
if (props.form.material.sl) {
callback();
} else {
callback(new Error("请输入数量"));
}
},
trigger: "blur",
},
],
dw: [
{
required: true,
validator: (rule, value, callback) => {
if (props.form.material.dw) {
callback();
} else {
callback(new Error("请选择或输入单位"));
}
},
trigger: "change",
},
],
};
});
</script> </script>
<style> <style>

View File

@ -392,6 +392,9 @@ const openAddModel = () => {
modelVisible.value = false; modelVisible.value = false;
}; };
model.onConfirm = async () => { model.onConfirm = async () => {
await dialogRef?.value?.dynamicComponentRef?.formRef
.validate()
.then(async () => {
try { try {
console.log('form', toRaw(form)) console.log('form', toRaw(form))
const res = await request({ const res = await request({
@ -411,6 +414,10 @@ const openAddModel = () => {
ElMessage.error(error.message); ElMessage.error(error.message);
console.log('error', error) console.log('error', error)
} }
})
.catch((err) => {
ElMessage.error('请处理表单中的错误项');
});
}; };
model.width = '40%'; model.width = '40%';
modelVisible.value = true; modelVisible.value = true;

View File

@ -0,0 +1,265 @@
<template>
<div class="detail-container">
<el-form
ref="formRef"
:model="form"
label-position="right"
label-width="140px"
style="max-height: 60vh; overflow-y: auto; padding-right: 50px"
:rules="rules"
>
<el-row>
<el-form-item label="所属区县" prop="qxmc">
<el-select
v-model="qx"
filterable
remote
reserve-keyword
clearable
placeholder="输入区县名称查询"
:remote-method="remoteMethod_qx"
:loading="loading"
@change="handleSelect_qx"
value-key="index"
>
<el-option
v-for="(item, index) in qxList"
:key="index"
:label="item.qxmc"
:value="item.qxmc"
/>
</el-select>
</el-form-item>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="服务站名称" prop="mc">
<el-input maxlength="20" show-word-limit v-model="form.mc" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责人:" prop="fzr">
<el-select
v-model="ryxx"
filterable
remote
reserve-keyword
clearable
placeholder="输入人员名称 / 联系方式 查询"
:remote-method="remoteMethod"
:loading="loading"
@change="handleSelect"
value-key="userId"
>
<el-option
v-for="item in selectOptions"
:key="item.userId"
:label="item.realName"
:value="item"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="负责人添加经纬度:">
<el-select v-model="sfjwd">
<el-option label="是" value="是"></el-option>
<el-option label="否" value="否"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="sfjwd === '否'">
<el-col :span="12">
<el-form-item label="站点经度:" prop="jd">
<el-input v-model="form.jd" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="站点纬度:" prop="wd">
<el-input v-model="form.wd" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup>
import { ref, onMounted, watch, computed } from "vue";
import { request } from "@/utils/request";
const formRef = ref(null);
defineExpose({ formRef });
const props = defineProps({
form: {
type: Object,
default: () => ({}),
},
});
const sfjwd = ref("是");
const qx = ref("");
const ryxx = ref("");
const loading = ref(false);
const selectOptions = ref([]);
const qxList = ref([]);
//
const getUserList = async (key) => {
try {
const keyword = key;
let url = "";
if (keyword) {
url = `/snow-ops-platform/yhzry/getUserByKey?key=${keyword}`;
} else {
url = `/snow-ops-platform/yhzry/getUserByKey?key=`;
}
const res = await request({
url: url,
method: "GET",
});
if (res.code === "00000") {
return res.data;
} else {
throw new Error(res.message);
}
} catch (error) {
ElMessage.error(error.message);
console.log(error);
}
};
//
const remoteMethod = async (query) => {
if (query === "") {
selectOptions.value = [];
return [];
}
loading.value = true;
const res = await getUserList(query);
if (res) {
selectOptions.value = res;
}
loading.value = false;
};
//
const getQxList = async (key) => {
try {
const keyword = key;
let url = "";
if (keyword) {
url = `/snow-ops-platform/district/listDistricts?qxmc=${keyword}`;
} else {
url = `/snow-ops-platform/district/listDistricts?qxmc=`;
}
const res = await request({
url: url,
method: "GET",
});
if (res.code === "00000") {
return res.data;
} else {
throw new Error(res.message);
}
} catch (error) {}
};
//
const remoteMethod_qx = async (query) => {
loading.value = true;
const res = await getQxList(query);
if (res) {
qxList.value = res;
}
loading.value = false;
};
//
const handleSelect_qx = (value) => {
props.form.qxmc = value;
};
//
const handleSelect = (value) => {
console.log("value", value);
props.form.fzrXm = value.realName;
props.form.fzrSjhm = value.phone;
props.form.fzrUserId = value.userId;
};
const rules = computed(() => {
return {
mc: [
{
required: true,
validator: (rule, value, callback) => {
if (props.form.mc) {
callback();
} else {
callback(new Error("请输入服务站名称"));
}
},
trigger: "blur",
},
],
qxmc: [
{
required: true,
validator: (rule, value, callback) => {
if (props.form.qxmc) {
callback();
} else {
callback(new Error("请选择所属区县"));
}
},
trigger: "blur",
},
],
fzr: [
{
required: true,
validator: (rule, value, callback) => {
if (props.form.fzrUserId && props.form.fzrXm && props.form.fzrSjhm) {
callback();
} else {
callback(new Error("请选择负责人"));
}
},
trigger: "blur",
},
],
jd: [
{
required: sfjwd.value === "否",
validator: (rule, value, callback) => {
if (props.form.jd) {
callback();
} else {
callback(new Error("请输入站点经度"));
}
},
trigger: "blur",
},
],
wd: [
{
required: sfjwd.value === "否",
validator: (rule, value, callback) => {
if (props.form.wd) {
callback();
} else {
callback(new Error("请输入站点纬度"));
}
},
trigger: "blur",
},
],
};
});
</script>
<style>
</style>

View File

@ -2,6 +2,8 @@
<div class="detail-container"> <div class="detail-container">
<el-form <el-form
ref="formRef" ref="formRef"
:model="form"
:rules="rules"
label-position="right" label-position="right"
label-width="150px" label-width="150px"
style="max-height: 60vh; overflow-y: auto; padding-right: 50px" style="max-height: 60vh; overflow-y: auto; padding-right: 50px"
@ -9,23 +11,26 @@
<el-form-item label="所属服务站:"> <el-form-item label="所属服务站:">
<span>{{ basicData.mc }}</span> <span>{{ basicData.mc }}</span>
</el-form-item> </el-form-item>
<el-form-item label="物资名称:"> <el-form-item label="物资名称:" prop="wzmc">
<el-input <el-input
maxlength="20" maxlength="20"
show-word-limit show-word-limit
v-model="form.material.wzmc" v-model="form.material.wzmc"
></el-input> ></el-input>
</el-form-item> </el-form-item>
<el-form-item label="数量与单位:"> <el-form-item label="数量与单位:" required>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="16"> <el-col :span="16">
<el-form-item prop="sl">
<el-input <el-input
v-model="form.material.sl" v-model.number="form.material.sl"
type="number" type="number"
placeholder="请输入数量" placeholder="请输入数量"
></el-input> ></el-input>
</el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item prop="dw">
<el-select <el-select
v-model="form.material.dw" v-model="form.material.dw"
filterable filterable
@ -40,6 +45,7 @@
<el-option label="箱" value="箱"></el-option> <el-option label="箱" value="箱"></el-option>
<el-option label="袋" value="袋"></el-option> <el-option label="袋" value="袋"></el-option>
</el-select> </el-select>
</el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
@ -54,7 +60,7 @@
</template> </template>
<script setup> <script setup>
import { ref } from "vue"; import { ref, computed } from "vue";
const formRef = ref(null); const formRef = ref(null);
defineExpose({ formRef }); defineExpose({ formRef });
@ -65,9 +71,54 @@ const props = defineProps({
}, },
basicData: { basicData: {
type: Object, type: Object,
default: () => ({}) default: () => ({}),
} },
});
//
const rules = computed(() => {
return {
wzmc: [
{
required: true,
validator: (rule, value, callback) => {
if (props.form.material.wzmc) {
callback();
} else {
callback(new Error("请输入物资名称"));
}
},
trigger: "blur",
},
],
sl: [
{
required: true,
type: "number",
validator: (rule, value, callback) => {
if (props.form.material.sl) {
callback();
} else {
callback(new Error("请输入数量"));
}
},
trigger: "blur",
},
],
dw: [
{
required: true,
validator: (rule, value, callback) => {
if (props.form.material.dw) {
callback();
} else {
callback(new Error("请选择或输入单位"));
}
},
trigger: "change",
},
],
};
}); });
</script> </script>

View File

@ -2,16 +2,19 @@
<div class="detail-container"> <div class="detail-container">
<el-form <el-form
ref="formRef" ref="formRef"
:model="form"
:rules="rules"
label-position="right" label-position="right"
label-width="150px" label-width="150px"
style="max-height: 60vh; overflow-y: auto; padding-right: 50px" style="max-height: 60vh; overflow-y: auto; padding-right: 50px"
> >
<el-form-item label="负责人:"> <el-form-item label="负责人:" prop="fzr">
<el-select <el-select
v-model="ryxx" v-model="ryxx"
filterable filterable
remote remote
reserve-keyword reserve-keyword
clearable
placeholder="输入人员名称 / 联系方式 查询" placeholder="输入人员名称 / 联系方式 查询"
:remote-method="remoteMethod" :remote-method="remoteMethod"
:loading="loading" :loading="loading"
@ -27,21 +30,24 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="负责人添加经纬度:"> <el-form-item label="负责人添加经纬度:">
<el-select v-model="form.sfjwd"> <el-select v-model="sfjwd">
<el-option label="是" value="是"></el-option> <el-option label="是" value="是"></el-option>
<el-option label="否" value="否"></el-option> <el-option label="否" value="否"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="站点经纬度:"> <el-form-item v-if="sfjwd === '否'" label="站点经度:" prop="jd">
<el-input v-model="form.jwd" /> <el-input v-model="form.jd" />
</el-form-item>
<el-form-item v-if="sfjwd === '否'" label="站点纬度:" prop="wd">
<el-input v-model="form.wd" />
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, onMounted, watch } from "vue"; import { ref, onMounted, watch, computed } from "vue";
import { request } from "@/utils/request"; import { request } from "@/utils/request";
const formRef = ref(null); const formRef = ref(null);
defineExpose({ formRef }); defineExpose({ formRef });
@ -53,6 +59,7 @@ const props = defineProps({
}, },
}); });
const sfjwd = ref("是");
const ryxx = ref(""); const ryxx = ref("");
const loading = ref(false); const loading = ref(false);
const selectOptions = ref([]); const selectOptions = ref([]);
@ -103,8 +110,37 @@ const handleSelect = (value) => {
props.form.userId = value.userId; props.form.userId = value.userId;
}; };
onMounted(async () => { //
props.form.yhzid = props.yhzdata.id; const rules = computed(() => {
return {
fzr: [
{
required: true,
validator: (rule, value, callback) => {
if (props.form.userId && props.form.sjhm && props.form.xm) {
callback();
} else {
callback(new Error("请选择负责人"));
}
},
trigger: "blur",
},
],
jd: [
{
required: sfjwd.value === "否",
message: "请输入站点经度",
trigger: "blur",
},
],
wd: [
{
required: sfjwd.value === "否",
message: "请输入站点纬度",
trigger: "blur",
},
],
};
}); });
</script> </script>

View File

@ -144,6 +144,51 @@ const columns = () => {
); );
}, },
}, },
{
label: "操作",
fixed: "right",
width: 150,
render: (row) => () =>
h("div", { class: "action-btns" }, [
h(
ElButton,
{
type: "danger",
link: true,
style: "margin-left: 10px;",
onClick: async () => {
try {
await ElMessageBox.confirm(
"确定要删除该人员吗?",
"删除确认",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
);
const res = await request({
url: `/snow-ops-platform/yhzry/delete`,
method: "POST",
data: {
id: row.id,
},
});
if (res.code === "00000") {
ElMessage.success("删除成功");
getPeopleList();
}
} catch (error) {
if (error instanceof Error) {
ElMessage.error(error.message || "删除失败");
}
}
},
},
() => "删除"
),
]),
},
]; ];
case "material": case "material":
return [ return [
@ -241,7 +286,7 @@ const getPeopleList = async () => {
const data = { const data = {
pageNum: pagination.current, pageNum: pagination.current,
pageSize: pagination.pageSize, pageSize: pagination.pageSize,
yhzid: Number(props.basicData.id), yhzid: props.basicData.id,
}; };
const res = await request({ const res = await request({
url: "/snow-ops-platform/yhzry/list", url: "/snow-ops-platform/yhzry/list",
@ -333,8 +378,8 @@ const INIT_FORM_people = {
yhzid: props.basicData.id, yhzid: props.basicData.id,
sjhm: "", sjhm: "",
xm: "", xm: "",
sfjwd: "", jd: "",
jwd: "", wd: "",
}; };
const materialForm = reactive({}); const materialForm = reactive({});
const INIT_FORM_material = { const INIT_FORM_material = {
@ -381,6 +426,7 @@ const INIT_FORM_equipment = {
fsfw: "", fsfw: "",
yhzid: props.basicData.id, yhzid: props.basicData.id,
}; };
const dialogRef = ref(null);
const modelVisible = ref(false); const modelVisible = ref(false);
const model = reactive({ const model = reactive({
title: "", title: "",
@ -442,11 +488,14 @@ const handleAdd = () => {
// //
const handleAddPeopleConfirm = async () => { const handleAddPeopleConfirm = async () => {
await dialogRef?.value?.dynamicComponentRef?.formRef
.validate()
.then(async () => {
try { try {
const res = await request({ const res = await request({
url: "/snow-ops-platform/yhzry/add", url: "/snow-ops-platform/yhzry/add",
method: "post", method: "post",
data: toRaw(peopleForm.value), data: toRaw(peopleForm),
}); });
if (res.code === "00000") { if (res.code === "00000") {
ElMessage.success("新增成功"); ElMessage.success("新增成功");
@ -459,10 +508,17 @@ const handleAddPeopleConfirm = async () => {
console.log(error); console.log(error);
ElMessage.error(error.message); ElMessage.error(error.message);
} }
})
.catch((err) => {
ElMessage.error("请处理表单中的错误项");
});
}; };
// //
const handleAddMaterialConfirm = async () => { const handleAddMaterialConfirm = async () => {
await dialogRef?.value?.dynamicComponentRef?.formRef
.validate()
.then(async () => {
try { try {
const res = await request({ const res = await request({
url: "/snow-ops-platform/yjwz/add", url: "/snow-ops-platform/yjwz/add",
@ -480,6 +536,10 @@ const handleAddMaterialConfirm = async () => {
console.log(error); console.log(error);
ElMessage.error(error.message); ElMessage.error(error.message);
} }
})
.catch((err) => {
ElMessage.error("请处理表单中的错误项");
});
}; };
// //

View File

@ -2,6 +2,7 @@ import { h, ref, onMounted, reactive, watch, toRaw, nextTick } from "vue";
import { request } from "@/utils/request"; import { request } from "@/utils/request";
import { useRoute, useRouter } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
import DetailDrawer from "./detailDrawer.vue"; import DetailDrawer from "./detailDrawer.vue";
import AddDialog from "./addDialog.vue";
const tableData = ref([]); // 表格数据 const tableData = ref([]); // 表格数据
const filterData = reactive({ const filterData = reactive({
@ -16,8 +17,19 @@ const model = reactive({
props: {}, props: {},
onCancel: null, onCancel: null,
onConfirm: null, onConfirm: null,
width: '',
}); // 弹窗内容 }); // 弹窗内容
const form = reactive({}); const form = reactive({
});
const INIT_FORM = {
qxmc: "",
mc: "",
fzrXm: "",
fzrSjhm: "",
fzrUserId: "",
jd: "",
wd: "",
};
const drawer = reactive({ const drawer = reactive({
title: '', title: '',
content: null, content: null,
@ -113,9 +125,49 @@ const getYhzDetail = async (row) => {
// 打开新增养护站弹窗 // 打开新增养护站弹窗
const openAddDialog = () => { const openAddDialog = () => {
model.title = '新增养护站';
console.log('新增',) Object.assign(form, INIT_FORM);
model.props = {
form: form,
}; };
model.content = AddDialog;
model.onCancel = () => {
dialogType.value = '';
modelVisible.value = false;
};
model.onConfirm = async () => {
dialogType.value = '';
await dialogRef?.value?.dynamicComponentRef?.formRef.validate().then(() => {
addYHZ();
})
.catch((err) => {
ElMessage.error('请处理表单中的错误项');
});
};
model.width = "50%"
modelVisible.value = true;
};
// 新增养护站
const addYHZ = async () => {
try {
const res = await request({
url: "/snow-ops-platform/yhz/add",
method: "POST",
data: form,
});
if (res.code === "00000") {
ElMessage.success("新增成功");
modelVisible.value = false;
getTableData();
} else {
throw new Error(res.message);
}
} catch (error) {
ElMessage.error(error.message || "新增失败");
}
};
export default () => { export default () => {
const router = useRouter(); const router = useRouter();