Merge branch 'dev' of http://222.212.85.86:8222/bdzl2/bxztApp into dev
This commit is contained in:
commit
283a239fde
@ -27,7 +27,16 @@
|
||||
>
|
||||
</template>
|
||||
</van-cell>
|
||||
<van-cell :title="'设备名称: ' + equipmentDetailInfo.sbmc"> </van-cell>
|
||||
<van-cell :title="'设备名称: ' + equipmentDetailInfo.sbmc">
|
||||
<template #right-icon>
|
||||
<van-image
|
||||
:src="photos[0]?.photoUrl"
|
||||
fit="cover"
|
||||
width="100px"
|
||||
@click="showImage(photos)"
|
||||
></van-image>
|
||||
</template>
|
||||
</van-cell>
|
||||
<van-cell :title="'设备大类: ' + equipmentDetailInfo.sbdl"> </van-cell>
|
||||
<van-cell :title="'设备类型: ' + equipmentDetailInfo.sblx"> </van-cell>
|
||||
<van-cell :title="'设备编号: ' + equipmentDetailInfo.sbbh"> </van-cell>
|
||||
@ -54,8 +63,13 @@
|
||||
<van-cell :title="'纳入市级补助范围: ' + equipmentDetailInfo.sfnrsjbz">
|
||||
</van-cell>
|
||||
<van-cell :title="'辐射范围: ' + equipmentDetailInfo.fsfw"> </van-cell>
|
||||
<van-cell :title="'所属服务站: ' + equipmentDetailInfo.sbwz">
|
||||
<van-cell :title="'所属服务站: ' + equipmentDetailInfo.yhzmc">
|
||||
</van-cell>
|
||||
<van-cell
|
||||
v-if="equipmentDetailInfo.sbzt !== '完好'"
|
||||
:title="equipmentDetailInfo.sbzt + '原因:' + latestStatusDesc"
|
||||
/>
|
||||
<van-cell :title="'备注: ' + equipmentDetailInfo.remark"> </van-cell>
|
||||
</van-cell-group>
|
||||
</div>
|
||||
|
||||
@ -340,14 +354,17 @@
|
||||
<h3>编辑设备信息</h3>
|
||||
<!-- 设备名称 -->
|
||||
<van-field
|
||||
v-model="editForm.sbmc"
|
||||
v-model="editForm.equipment.sbmc"
|
||||
label="设备名称"
|
||||
placeholder="请输入设备名称"
|
||||
:rules="[{ required: true, message: '请填写设备名称' }]"
|
||||
/>
|
||||
maxlength="20"
|
||||
show-word-limit
|
||||
>
|
||||
</van-field>
|
||||
<!-- 设备大类 -->
|
||||
<van-field
|
||||
v-model="editForm.sbdl"
|
||||
v-model="editForm.equipment.sbdl"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
label="设备大类"
|
||||
@ -357,7 +374,7 @@
|
||||
/>
|
||||
<!-- 设备类型 -->
|
||||
<van-field
|
||||
v-model="editForm.sblx"
|
||||
v-model="editForm.equipment.sblx"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
label="设备类型"
|
||||
@ -367,34 +384,34 @@
|
||||
/>
|
||||
<!-- 设备编号 -->
|
||||
<van-field
|
||||
v-model="editForm.sbbh"
|
||||
v-model="editForm.equipment.sbbh"
|
||||
label="设备编号"
|
||||
placeholder="请输入设备编号"
|
||||
:rules="[{ required: true, message: '请填写设备编号' }]"
|
||||
/>
|
||||
<!-- 设备型号 -->
|
||||
<van-field
|
||||
v-model="editForm.sbxh"
|
||||
v-model="editForm.equipment.sbxh"
|
||||
label="设备型号"
|
||||
placeholder="请输入设备型号"
|
||||
:rules="[{ required: true, message: '请填写设备型号' }]"
|
||||
/>
|
||||
<!-- 经纬度 -->
|
||||
<van-field
|
||||
v-model="editForm.jd"
|
||||
v-model="editForm.equipment.jd"
|
||||
label="设备经度"
|
||||
placeholder="请输入经度"
|
||||
type="number"
|
||||
/>
|
||||
<van-field
|
||||
v-model="editForm.wd"
|
||||
v-model="editForm.equipment.wd"
|
||||
label="设备纬度"
|
||||
placeholder="请输入纬度"
|
||||
type="number"
|
||||
/>
|
||||
<!-- 管理人员 -->
|
||||
<van-field
|
||||
v-model="editForm.glry"
|
||||
v-model="editForm.equipment.glry"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
readonly
|
||||
@ -404,7 +421,7 @@
|
||||
/>
|
||||
<!-- 操作员 -->
|
||||
<van-field
|
||||
v-model="editForm.czy"
|
||||
v-model="editForm.equipment.czy"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
readonly
|
||||
@ -414,14 +431,14 @@
|
||||
/>
|
||||
<!-- 购买费用 -->
|
||||
<van-field
|
||||
v-model="editForm.gmfy"
|
||||
v-model="editForm.equipment.gmfy"
|
||||
type="number"
|
||||
label="购买费用(万元)"
|
||||
placeholder="请输入购买费用"
|
||||
/>
|
||||
<!-- 购置日期 -->
|
||||
<van-field
|
||||
v-model="editForm.gzrq"
|
||||
v-model="editForm.equipment.gzrq"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
readonly
|
||||
@ -430,27 +447,16 @@
|
||||
@click="showTimePicker = true"
|
||||
/>
|
||||
|
||||
<!-- 设备状态 -->
|
||||
<van-field
|
||||
v-model="editForm.sbzt"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
readonly
|
||||
label="设备状态"
|
||||
placeholder="请选择设备状态"
|
||||
@click="showStatusPicker = true"
|
||||
/>
|
||||
|
||||
<!-- 生产厂家 -->
|
||||
<van-field
|
||||
v-model="editForm.sccj"
|
||||
v-model="editForm.equipment.sccj"
|
||||
label="生产厂家"
|
||||
placeholder="请输入生产厂家"
|
||||
/>
|
||||
|
||||
<!-- 是否应急设备 -->
|
||||
<van-field
|
||||
v-model="editForm.sfyjsb"
|
||||
v-model="editForm.equipment.sfyjsb"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
readonly
|
||||
@ -461,7 +467,7 @@
|
||||
|
||||
<!-- 是否纳入市级补助范围 -->
|
||||
<van-field
|
||||
v-model="editForm.sfnrsjbz"
|
||||
v-model="editForm.equipment.sfnrsjbz"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
readonly
|
||||
@ -472,11 +478,26 @@
|
||||
|
||||
<!-- 辐射范围 -->
|
||||
<van-field
|
||||
v-model="editForm.fsfw"
|
||||
v-model="editForm.equipment.fsfw"
|
||||
label="辐射范围"
|
||||
placeholder="请输入辐射范围"
|
||||
/>
|
||||
|
||||
<van-field label="设备照片" center>
|
||||
<template #input>
|
||||
<van-uploader
|
||||
v-model="fileList"
|
||||
@delete="handleDelete"
|
||||
name="photos"
|
||||
:file-list="fileList"
|
||||
:file-type="['image/jpeg', 'image/png']"
|
||||
:after-read="afterRead"
|
||||
multiple
|
||||
:max-count="6"
|
||||
/>
|
||||
</template>
|
||||
</van-field>
|
||||
|
||||
<!-- 选择器弹窗 -->
|
||||
<!-- 设备大类弹窗 -->
|
||||
<van-popup
|
||||
@ -558,22 +579,6 @@
|
||||
/>
|
||||
</van-popup>
|
||||
|
||||
<!-- 设备状态弹窗 -->
|
||||
<van-popup
|
||||
:show="showStatusPicker"
|
||||
round
|
||||
position="bottom"
|
||||
close-on-click-overlay
|
||||
@close="showStatusPicker = false"
|
||||
>
|
||||
<van-picker
|
||||
title="选择设备状态"
|
||||
:columns="statusOptions"
|
||||
@confirm="onStatusConfirm"
|
||||
@cancel="showStatusPicker = false"
|
||||
/>
|
||||
</van-popup>
|
||||
|
||||
<!-- 是否应急设备弹窗 -->
|
||||
<van-popup
|
||||
:show="showEmergencyPicker"
|
||||
@ -634,9 +639,9 @@
|
||||
<script setup>
|
||||
import "vant/es/toast/style";
|
||||
import "vant/es/popup/style";
|
||||
import { ref, onMounted, toRaw, reactive } from "vue";
|
||||
import { ref, onMounted, toRaw, reactive, computed } from "vue";
|
||||
import { useRouter, useRoute } from "vue-router";
|
||||
import { showToast, showLoadingToast } from "vant";
|
||||
import { showToast, showLoadingToast, showImagePreview } from "vant";
|
||||
import { request } from "../../../../shared/utils/request";
|
||||
|
||||
const router = useRouter();
|
||||
@ -653,7 +658,10 @@ const onSelect = (action) => {
|
||||
}
|
||||
};
|
||||
const equipmentInfo = ref({});
|
||||
const yhzInfo = ref({});
|
||||
const equipmentDetailInfo = ref({});
|
||||
const photos = ref([]);
|
||||
const statusList = ref([]);
|
||||
|
||||
// 获取设备详情
|
||||
const getEquipmentDetailInfo = async () => {
|
||||
@ -664,6 +672,8 @@ const getEquipmentDetailInfo = async () => {
|
||||
});
|
||||
if (res.code && res.code === "00000") {
|
||||
equipmentDetailInfo.value = res.data.equipment;
|
||||
photos.value = res.data.photos;
|
||||
statusList.value = res.data.statusList;
|
||||
console.log("设备详情", toRaw(equipmentDetailInfo.value));
|
||||
} else {
|
||||
throw new Error(res.data.message);
|
||||
@ -674,15 +684,17 @@ const getEquipmentDetailInfo = async () => {
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
equipmentInfo.value = JSON.parse(decodeURIComponent(route.params.data));
|
||||
console.log("equipmentInfo", toRaw(equipmentInfo.value));
|
||||
const data = JSON.parse(decodeURIComponent(route.params.data));
|
||||
equipmentInfo.value = data.equipmentInfo;
|
||||
|
||||
yhzInfo.value = data.yhzInfo;
|
||||
getEquipmentDetailInfo();
|
||||
});
|
||||
|
||||
const onClickLeft = () => {
|
||||
router.push({
|
||||
name: "EquipManage",
|
||||
params: { data: encodeURIComponent(JSON.stringify(equipmentInfo.value)) },
|
||||
params: { data: encodeURIComponent(JSON.stringify(yhzInfo.value)) },
|
||||
});
|
||||
};
|
||||
|
||||
@ -696,12 +708,12 @@ const onScrapConfirm = async () => {
|
||||
try {
|
||||
console.log("equipmentDetailInfo", toRaw(equipmentDetailInfo.value));
|
||||
const res = await request({
|
||||
url: `/snow-ops-platform/yjsb/update`,
|
||||
url: `/snow-ops-platform/yjsb/updateEquipmentStatus`,
|
||||
method: "POST",
|
||||
data: {
|
||||
...equipmentDetailInfo.value,
|
||||
sbzt: "报废",
|
||||
remark: scrapReason.value,
|
||||
equipmentId: equipmentDetailInfo.value.rid,
|
||||
equipmentStatus: "报废",
|
||||
statusDesc: scrapReason.value,
|
||||
},
|
||||
});
|
||||
if (res.code && res.code === "00000") {
|
||||
@ -709,7 +721,7 @@ const onScrapConfirm = async () => {
|
||||
router.push({
|
||||
name: "EquipManage",
|
||||
params: {
|
||||
data: encodeURIComponent(JSON.stringify(equipmentInfo.value)),
|
||||
data: encodeURIComponent(JSON.stringify(yhzInfo.value)),
|
||||
},
|
||||
});
|
||||
} else {
|
||||
@ -732,12 +744,12 @@ const brokenReason = ref(""); // 损坏原因
|
||||
const onBrokenConfirm = async () => {
|
||||
try {
|
||||
const res = await request({
|
||||
url: `/snow-ops-platform/yjsb/update`,
|
||||
url: `/snow-ops-platform/yjsb/updateEquipmentStatus`,
|
||||
method: "POST",
|
||||
data: {
|
||||
...equipmentDetailInfo.value,
|
||||
sbzt: "损坏", // 修改状态为损坏
|
||||
remark: brokenReason.value,
|
||||
equipmentId: equipmentDetailInfo.value.rid,
|
||||
equipmentStatus: "损坏",
|
||||
statusDesc: brokenReason.value,
|
||||
},
|
||||
});
|
||||
if (res.code && res.code === "00000") {
|
||||
@ -745,7 +757,7 @@ const onBrokenConfirm = async () => {
|
||||
router.push({
|
||||
name: "EquipManage",
|
||||
params: {
|
||||
data: encodeURIComponent(JSON.stringify(equipmentInfo.value)),
|
||||
data: encodeURIComponent(JSON.stringify(yhzInfo.value)),
|
||||
},
|
||||
});
|
||||
} else {
|
||||
@ -786,7 +798,7 @@ const onDeleteConfirm = async () => {
|
||||
router.push({
|
||||
name: "EquipManage",
|
||||
params: {
|
||||
data: encodeURIComponent(JSON.stringify(equipmentInfo.value)),
|
||||
data: encodeURIComponent(JSON.stringify(yhzInfo.value)),
|
||||
},
|
||||
});
|
||||
} else {
|
||||
@ -815,9 +827,10 @@ const onRemarkConfirm = async () => {
|
||||
url: "/snow-ops-platform/yjsb/update",
|
||||
method: "POST",
|
||||
data: {
|
||||
equipment: {
|
||||
...equipmentDetailInfo.value,
|
||||
|
||||
remark: equipmentDetailInfo.value.remark,
|
||||
},
|
||||
photos: photos.value,
|
||||
},
|
||||
});
|
||||
if (res.code && res.code === "00000") {
|
||||
@ -841,10 +854,53 @@ const onRemarkPopupClose = () => {
|
||||
const showEditPopup = ref(false);
|
||||
// 编辑表单
|
||||
const editForm = reactive({});
|
||||
// 打开编辑弹窗
|
||||
const onEditPopupOpen = () => {
|
||||
Object.assign(editForm, equipmentDetailInfo.value);
|
||||
|
||||
// 获取养护站人员列表
|
||||
const getPersonList = async () => {
|
||||
try {
|
||||
const data = {
|
||||
pageNum: 1,
|
||||
pageSize: 9999,
|
||||
yhzid: yhzInfo.value.id,
|
||||
};
|
||||
const res = await request({
|
||||
url: "/snow-ops-platform/yhzry/list",
|
||||
method: "get",
|
||||
params: data,
|
||||
});
|
||||
if (res.code === "00000") {
|
||||
adminOptions.value = res.data.records.map((item) => ({
|
||||
text: item.xm,
|
||||
value: item.userId,
|
||||
}));
|
||||
operatorOptions.value = res.data.records.map((item) => ({
|
||||
text: item.xm,
|
||||
value: item.userId,
|
||||
}));
|
||||
} else {
|
||||
throw new Error("人员信息获取失败");
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
showToast({
|
||||
type: "fail",
|
||||
message: error.message,
|
||||
});
|
||||
}
|
||||
};
|
||||
// 打开编辑弹窗
|
||||
const onEditPopupOpen = async () => {
|
||||
await getPersonList();
|
||||
Object.assign(editForm, {
|
||||
equipment: equipmentDetailInfo.value,
|
||||
photos: photos.value,
|
||||
});
|
||||
fileList.value = photos.value.map((photo) => ({
|
||||
url: photo.photoUrl, // 显示用的URL
|
||||
status: "done", // 上传状态为已完成
|
||||
message: "上传成功", // 提示信息
|
||||
serverUrl: photo.photoUrl, // 保留服务器返回的原始URL
|
||||
}));
|
||||
showEditPopup.value = true;
|
||||
};
|
||||
// 关闭编辑弹窗
|
||||
@ -902,7 +958,7 @@ const onCategoryConfirm = (value) => {
|
||||
showCategoryPicker.value = false;
|
||||
categoryField.value.focus();
|
||||
} else {
|
||||
editForm.sbdl = value.selectedValues[0];
|
||||
editForm.equipment.sbdl = value.selectedValues[0];
|
||||
showCategoryPicker.value = false;
|
||||
}
|
||||
};
|
||||
@ -911,32 +967,36 @@ const onTypeConfirm = (value) => {
|
||||
showTypePicker.value = false;
|
||||
typeField.value.focus();
|
||||
} else {
|
||||
editForm.sblx = value.selectedValues[0];
|
||||
editForm.equipment.sblx = value.selectedValues[0];
|
||||
showTypePicker.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 设备管理员
|
||||
const showAdminPicker = ref(false);
|
||||
const adminOptions = [
|
||||
{ text: "管理员1", value: "管理员1" },
|
||||
{ text: "管理员2", value: "管理员2" },
|
||||
{ text: "管理员3", value: "管理员3" },
|
||||
];
|
||||
const adminOptions = ref([]);
|
||||
const onAdminConfirm = (value) => {
|
||||
editForm.glry = value.selectedValues[0];
|
||||
const selectedOption = adminOptions.value.find(
|
||||
(opt) => opt.value === value.selectedValues[0]
|
||||
);
|
||||
if (selectedOption) {
|
||||
editForm.equipment.glry = selectedOption.text;
|
||||
editForm.equipment.glryid = selectedOption.value;
|
||||
}
|
||||
showAdminPicker.value = false;
|
||||
};
|
||||
|
||||
// 操作员
|
||||
const showOperatorPicker = ref(false);
|
||||
const operatorOptions = [
|
||||
{ text: "操作员1", value: "操作员1" },
|
||||
{ text: "操作员2", value: "操作员2" },
|
||||
{ text: "操作员3", value: "操作员3" },
|
||||
];
|
||||
const operatorOptions = ref([]);
|
||||
const operatorConfirm = (value) => {
|
||||
editForm.czy = value.selectedValues[0];
|
||||
const selectedOption = operatorOptions.value.find(
|
||||
(opt) => opt.value === value.selectedValues[0]
|
||||
);
|
||||
if (selectedOption) {
|
||||
editForm.equipment.czy = selectedOption.text;
|
||||
editForm.equipment.czyid = selectedOption.value;
|
||||
}
|
||||
showOperatorPicker.value = false;
|
||||
};
|
||||
|
||||
@ -953,16 +1013,19 @@ const onDateConfirm = ({ selectedValues }) => {
|
||||
};
|
||||
|
||||
// 设备状态相关
|
||||
const showStatusPicker = ref(false);
|
||||
const statusOptions = [
|
||||
{ text: "完好", value: "完好" },
|
||||
{ text: "损坏", value: "损坏" },
|
||||
{ text: "报废", value: "报废" },
|
||||
];
|
||||
const onStatusConfirm = (value) => {
|
||||
editForm.sbzt = value.selectedValues[0];
|
||||
showStatusPicker.value = false;
|
||||
};
|
||||
const latestStatusDesc = computed(() => {
|
||||
if (
|
||||
!equipmentDetailInfo.value.sbzt ||
|
||||
equipmentDetailInfo.value.sbzt === "完好"
|
||||
)
|
||||
return "";
|
||||
|
||||
const records = statusList.value
|
||||
.filter((item) => item.equipmentStatus === equipmentDetailInfo.value.sbzt)
|
||||
.sort((a, b) => new Date(b.reportTime) - new Date(a.reportTime));
|
||||
|
||||
return records.length > 0 ? `${records[0].statusDesc}` : "暂无相关记录";
|
||||
});
|
||||
|
||||
// 是否应急设备相关
|
||||
const showEmergencyPicker = ref(false);
|
||||
@ -986,11 +1049,62 @@ const onSubsidyConfirm = (value) => {
|
||||
showSubsidyPicker.value = false;
|
||||
};
|
||||
|
||||
// 上传附件相关
|
||||
const fileList = ref([]);
|
||||
// 文件删除
|
||||
const handleDelete = (file) => {
|
||||
if (file.serverUrl) {
|
||||
const index = editForm.photos.findIndex(
|
||||
(p) => p.photoUrl === file.serverUrl
|
||||
);
|
||||
if (index !== -1) {
|
||||
editForm.photos.splice(index, 1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 文件上传
|
||||
const afterRead = async (file) => {
|
||||
try {
|
||||
const toast = showLoadingToast({
|
||||
message: "上传中...",
|
||||
forbidClick: true,
|
||||
duration: 0, // 设置为0表示不会自动关闭
|
||||
});
|
||||
const formData = new FormData();
|
||||
formData.append("file", file.file);
|
||||
const res = await request({
|
||||
url: "/snow-ops-platform/file/upload",
|
||||
method: "post",
|
||||
data: formData,
|
||||
});
|
||||
toast.close();
|
||||
if (res.code === "00000") {
|
||||
editForm.photos.push({ photoUrl: res.data });
|
||||
const index = fileList.value.findIndex((f) => f.file === file.file);
|
||||
if (index !== -1) {
|
||||
fileList.value[index].serverUrl = res.data;
|
||||
}
|
||||
|
||||
console.log("editForm.photos", toRaw(editForm.photos));
|
||||
console.log("fileList.value", fileList.value);
|
||||
} else {
|
||||
throw new Error(res.message);
|
||||
}
|
||||
} catch (error) {
|
||||
toast.close();
|
||||
showToast({
|
||||
type: "fail",
|
||||
message: error.message,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// 提交修改
|
||||
const onEditSubmit = async () => {
|
||||
try {
|
||||
showLoadingToast({ message: "提交中...", forbidClick: true });
|
||||
// console.log('editForm',toRaw(editForm))
|
||||
console.log('editForm',toRaw(editForm))
|
||||
|
||||
const res = await request({
|
||||
url: "/snow-ops-platform/yjsb/update",
|
||||
@ -1009,6 +1123,14 @@ const onEditSubmit = async () => {
|
||||
console.log("error", error);
|
||||
}
|
||||
};
|
||||
|
||||
const showImage = (photos) => {
|
||||
const photosArr = photos.map((item) => item.photoUrl);
|
||||
showImagePreview({
|
||||
images: photosArr,
|
||||
closeable: true,
|
||||
});
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
@ -1017,7 +1139,7 @@ const onEditSubmit = async () => {
|
||||
}
|
||||
|
||||
.content {
|
||||
padding: 16px;
|
||||
padding: 16px 16px 80px 16px;
|
||||
}
|
||||
|
||||
.grid {
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
placeholder="请输入设备名称"
|
||||
/>
|
||||
<van-cell-group>
|
||||
<van-cell title="当前站点" :value="detailData.mc || detailData.sbwz" />
|
||||
<van-cell title="当前站点" :value="detailData.mc" />
|
||||
</van-cell-group>
|
||||
<van-notice-bar mode="link">20台设备待确认</van-notice-bar>
|
||||
|
||||
@ -23,7 +23,14 @@
|
||||
:label="`设备类型: ` + item.sblx"
|
||||
:to="{
|
||||
name: 'EquipDetail',
|
||||
params: { data: encodeURIComponent(JSON.stringify(item)) },
|
||||
params: {
|
||||
data: encodeURIComponent(
|
||||
JSON.stringify({
|
||||
equipmentInfo: item,
|
||||
yhzInfo: detailData,
|
||||
})
|
||||
),
|
||||
},
|
||||
}"
|
||||
>
|
||||
<template #value>
|
||||
@ -63,28 +70,23 @@
|
||||
@close="onPopupClose"
|
||||
>
|
||||
<!-- 表单部分 -->
|
||||
<van-form
|
||||
class="device-form"
|
||||
label-align="left"
|
||||
colon
|
||||
>
|
||||
<van-form class="device-form" label-align="left" colon>
|
||||
<h3>设备信息</h3>
|
||||
|
||||
<!-- 设备名称 -->
|
||||
<van-field
|
||||
v-model="form.sbmc"
|
||||
v-model="form.equipment.sbmc"
|
||||
label="设备名称"
|
||||
placeholder="请输入设备名称"
|
||||
:rules="[{ required: true, message: '请填写设备名称' }]"
|
||||
maxlength="20"
|
||||
show-word-limit
|
||||
>
|
||||
<template #button>
|
||||
<span class="counter">{{ form.sbmc.length }}/20</span>
|
||||
</template>
|
||||
</van-field>
|
||||
|
||||
<!-- 设备大类 -->
|
||||
<van-field
|
||||
v-model="form.sbdl"
|
||||
v-model="form.equipment.sbdl"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
label="设备大类"
|
||||
@ -95,7 +97,7 @@
|
||||
|
||||
<!-- 设备类型 -->
|
||||
<van-field
|
||||
v-model="form.sblx"
|
||||
v-model="form.equipment.sblx"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
label="设备类型"
|
||||
@ -106,7 +108,7 @@
|
||||
|
||||
<!-- 设备编号 -->
|
||||
<van-field
|
||||
v-model="form.sbbh"
|
||||
v-model="form.equipment.sbbh"
|
||||
label="设备编号"
|
||||
placeholder="请输入设备编号"
|
||||
:rules="[{ required: true, message: '请填写设备编号' }]"
|
||||
@ -114,7 +116,7 @@
|
||||
|
||||
<!-- 设备型号 -->
|
||||
<van-field
|
||||
v-model="form.sbxh"
|
||||
v-model="form.equipment.sbxh"
|
||||
label="设备型号"
|
||||
placeholder="请输入设备型号"
|
||||
:rules="[{ required: true, message: '请填写设备型号' }]"
|
||||
@ -122,21 +124,21 @@
|
||||
|
||||
<!-- 设备经度 -->
|
||||
<van-field
|
||||
v-model="form.jd"
|
||||
v-model="form.equipment.jd"
|
||||
label="设备经度"
|
||||
placeholder="请输入设备经度"
|
||||
/>
|
||||
|
||||
<!-- 设备纬度 -->
|
||||
<van-field
|
||||
v-model="form.wd"
|
||||
v-model="form.equipment.wd"
|
||||
label="设备纬度"
|
||||
placeholder="请输入设备纬度"
|
||||
/>
|
||||
|
||||
<!-- 设备管理员 -->
|
||||
<van-field
|
||||
v-model="form.glry"
|
||||
v-model="form.equipment.glry"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
readonly
|
||||
@ -147,7 +149,7 @@
|
||||
|
||||
<!-- 操作员 -->
|
||||
<van-field
|
||||
v-model="form.czy"
|
||||
v-model="form.equipment.czy"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
readonly
|
||||
@ -158,7 +160,7 @@
|
||||
|
||||
<!-- 购买费用 -->
|
||||
<van-field
|
||||
v-model="form.gmfy"
|
||||
v-model="form.equipment.gmfy"
|
||||
type="number"
|
||||
label="购买费用(万元)"
|
||||
placeholder="请输入购买费用"
|
||||
@ -166,7 +168,7 @@
|
||||
|
||||
<!-- 购置日期 -->
|
||||
<van-field
|
||||
v-model="form.gzrq"
|
||||
v-model="form.equipment.gzrq"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
readonly
|
||||
@ -177,7 +179,7 @@
|
||||
|
||||
<!-- 设备状态 -->
|
||||
<van-field
|
||||
v-model="form.sbzt"
|
||||
v-model="form.equipment.sbzt"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
readonly
|
||||
@ -188,14 +190,14 @@
|
||||
|
||||
<!-- 生产厂家 -->
|
||||
<van-field
|
||||
v-model="form.sccj"
|
||||
v-model="form.equipment.sccj"
|
||||
label="生产厂家"
|
||||
placeholder="请输入生产厂家"
|
||||
/>
|
||||
|
||||
<!-- 是否应急设备 -->
|
||||
<van-field
|
||||
v-model="form.sfyjsb"
|
||||
v-model="form.equipment.sfyjsb"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
readonly
|
||||
@ -206,7 +208,7 @@
|
||||
|
||||
<!-- 是否纳入市级补助范围 -->
|
||||
<van-field
|
||||
v-model="form.sfnrsjbz"
|
||||
v-model="form.equipment.sfnrsjbz"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
readonly
|
||||
@ -217,11 +219,34 @@
|
||||
|
||||
<!-- 辐射范围 -->
|
||||
<van-field
|
||||
v-model="form.fsfw"
|
||||
v-model="form.equipment.fsfw"
|
||||
label="辐射范围"
|
||||
placeholder="请输入辐射范围"
|
||||
/>
|
||||
|
||||
<!-- 备注 -->
|
||||
<van-field
|
||||
v-model="form.equipment.remark"
|
||||
label="备注"
|
||||
placeholder="请输入备注"
|
||||
type="textarea"
|
||||
/>
|
||||
|
||||
<van-field label="设备照片" center>
|
||||
<template #input>
|
||||
<van-uploader
|
||||
v-model="fileList"
|
||||
@delete="handleDelete"
|
||||
name="photos"
|
||||
:file-list="fileList"
|
||||
:file-type="['image/jpeg', 'image/png']"
|
||||
:after-read="afterRead"
|
||||
multiple
|
||||
:max-count="6"
|
||||
/>
|
||||
</template>
|
||||
</van-field>
|
||||
|
||||
<!-- 选择器弹窗 -->
|
||||
<!-- 设备大类弹窗 -->
|
||||
<van-popup
|
||||
@ -392,6 +417,7 @@ const searchValue = ref(""); // 搜索框输入值
|
||||
const equipmentList = ref([]);
|
||||
|
||||
const INIT_FORM = {
|
||||
equipment: {
|
||||
qxmc: "",
|
||||
sbbh: "",
|
||||
sbdl: "",
|
||||
@ -413,15 +439,16 @@ const INIT_FORM = {
|
||||
sfnrsjbz: "",
|
||||
fsfw: "",
|
||||
yhzid: "",
|
||||
},
|
||||
photos: [],
|
||||
}; // 表单初始值
|
||||
const form = reactive({ ...INIT_FORM }); // 表单
|
||||
|
||||
// 获取养护站详情数据
|
||||
onMounted(() => {
|
||||
detailData.value = JSON.parse(decodeURIComponent(route.params.data));
|
||||
console.log('detailData',toRaw(detailData.value));
|
||||
getEquipmentList();
|
||||
form.yhzid = detailData.value.id || detailData.value.yhzid;
|
||||
form.qxmc = detailData.value.qxmc;
|
||||
});
|
||||
|
||||
watch(
|
||||
@ -436,12 +463,12 @@ watch(
|
||||
// 获取养护站设备列表
|
||||
const getEquipmentList = async (sbmc) => {
|
||||
try {
|
||||
const yhzid = detailData.value.id || detailData.value.yhzid;
|
||||
const yhzid = detailData.value.id;
|
||||
if (!yhzid) {
|
||||
return;
|
||||
}
|
||||
const data = {
|
||||
yhzid: detailData.value.id || detailData.value.yhzid,
|
||||
yhzid: detailData.value.id,
|
||||
sbmc: sbmc,
|
||||
pageNum: 1,
|
||||
pageSize: 9999,
|
||||
@ -471,7 +498,44 @@ const onClickLeft = () => {
|
||||
router.push("/");
|
||||
};
|
||||
|
||||
const handleAddDevice = () => {
|
||||
// 获取养护站人员列表
|
||||
const getPersonList = async () => {
|
||||
try {
|
||||
const data = {
|
||||
pageNum: 1,
|
||||
pageSize: 9999,
|
||||
yhzid: detailData.value.id,
|
||||
};
|
||||
const res = await request({
|
||||
url: "/snow-ops-platform/yhzry/list",
|
||||
method: "get",
|
||||
params: data,
|
||||
});
|
||||
if (res.code === "00000") {
|
||||
adminOptions.value = res.data.records.map((item) => ({
|
||||
text: item.xm,
|
||||
value: item.userId,
|
||||
}));
|
||||
operatorOptions.value = res.data.records.map((item) => ({
|
||||
text: item.xm,
|
||||
value: item.userId,
|
||||
}));
|
||||
} else {
|
||||
throw new Error("人员信息获取失败");
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
showToast({
|
||||
type: "fail",
|
||||
message: error.message,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const handleAddDevice = async () => {
|
||||
await getPersonList();
|
||||
form.equipment.sfnrsjbz = "否";
|
||||
form.equipment.sfyjsb = "否";
|
||||
showPopup.value = true;
|
||||
};
|
||||
|
||||
@ -529,7 +593,7 @@ const onCategoryConfirm = (value) => {
|
||||
showCategoryPicker.value = false;
|
||||
categoryField.value.focus();
|
||||
} else {
|
||||
form.sbdl = value.selectedValues[0];
|
||||
form.equipment.sbdl = value.selectedValues[0];
|
||||
showCategoryPicker.value = false;
|
||||
}
|
||||
};
|
||||
@ -538,32 +602,36 @@ const onTypeConfirm = (value) => {
|
||||
showTypePicker.value = false;
|
||||
typeField.value.focus();
|
||||
} else {
|
||||
form.sblx = value.selectedValues[0];
|
||||
form.equipment.sblx = value.selectedValues[0];
|
||||
showTypePicker.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 设备管理员
|
||||
const showAdminPicker = ref(false);
|
||||
const adminOptions = [
|
||||
{ text: "管理员1", value: "管理员1" },
|
||||
{ text: "管理员2", value: "管理员2" },
|
||||
{ text: "管理员3", value: "管理员3" },
|
||||
];
|
||||
const adminOptions = ref([]);
|
||||
const onAdminConfirm = (value) => {
|
||||
form.glry = value.selectedValues[0];
|
||||
const selectedOption = adminOptions.value.find(
|
||||
(opt) => opt.value === value.selectedValues[0]
|
||||
);
|
||||
if (selectedOption) {
|
||||
form.equipment.glry = selectedOption.text;
|
||||
form.equipment.glryid = selectedOption.value;
|
||||
}
|
||||
showAdminPicker.value = false;
|
||||
};
|
||||
|
||||
// 操作员
|
||||
const showOperatorPicker = ref(false);
|
||||
const operatorOptions = [
|
||||
{ text: "操作员1", value: "操作员1" },
|
||||
{ text: "操作员2", value: "操作员2" },
|
||||
{ text: "操作员3", value: "操作员3" },
|
||||
];
|
||||
const operatorOptions = ref([]);
|
||||
const operatorConfirm = (value) => {
|
||||
form.czy = value.selectedValues[0];
|
||||
const selectedOption = operatorOptions.value.find(
|
||||
(opt) => opt.value === value.selectedValues[0]
|
||||
);
|
||||
if (selectedOption) {
|
||||
form.equipment.czy = selectedOption.text;
|
||||
form.equipment.czyid = selectedOption.value;
|
||||
}
|
||||
showOperatorPicker.value = false;
|
||||
};
|
||||
|
||||
@ -575,7 +643,7 @@ const currentDate = ref([
|
||||
new Date().getDate(),
|
||||
]);
|
||||
const onDateConfirm = ({ selectedValues }) => {
|
||||
form.gzrq = selectedValues.join("-");
|
||||
form.equipment.gzrq = selectedValues.join("-");
|
||||
showTimePicker.value = false;
|
||||
};
|
||||
|
||||
@ -587,7 +655,7 @@ const statusOptions = [
|
||||
{ text: "报废", value: "报废" },
|
||||
];
|
||||
const onStatusConfirm = (value) => {
|
||||
form.sbzt = value.selectedValues[0];
|
||||
form.equipment.sbzt = value.selectedValues[0];
|
||||
showStatusPicker.value = false;
|
||||
};
|
||||
|
||||
@ -598,7 +666,7 @@ const emergencyOptions = [
|
||||
{ text: "否", value: "否" },
|
||||
];
|
||||
const onEmergencyConfirm = (value) => {
|
||||
form.sfyjsb = value.selectedValues[0];
|
||||
form.equipment.sfyjsb = value.selectedValues[0];
|
||||
showEmergencyPicker.value = false;
|
||||
};
|
||||
|
||||
@ -609,10 +677,59 @@ const subsidyOptions = [
|
||||
{ text: "否", value: "否" },
|
||||
];
|
||||
const onSubsidyConfirm = (value) => {
|
||||
form.sfnrsjbz = value.selectedValues[0];
|
||||
form.equipment.sfnrsjbz = value.selectedValues[0];
|
||||
showSubsidyPicker.value = false;
|
||||
};
|
||||
|
||||
// 上传附件相关
|
||||
const fileList = ref([]);
|
||||
// 文件删除
|
||||
const handleDelete = (file) => {
|
||||
if (file.serverUrl) {
|
||||
const index = form.photos.findIndex((p) => p.photoUrl === file.serverUrl);
|
||||
if (index !== -1) {
|
||||
form.photos.splice(index, 1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 文件上传
|
||||
const afterRead = async (file) => {
|
||||
try {
|
||||
const toast = showLoadingToast({
|
||||
message: "上传中...",
|
||||
forbidClick: true,
|
||||
duration: 0, // 设置为0表示不会自动关闭
|
||||
});
|
||||
const formData = new FormData();
|
||||
formData.append("file", file.file);
|
||||
const res = await request({
|
||||
url: "/snow-ops-platform/file/upload",
|
||||
method: "post",
|
||||
data: formData,
|
||||
});
|
||||
toast.close();
|
||||
if (res.code === "00000") {
|
||||
form.photos.push({ photoUrl: res.data });
|
||||
const index = fileList.value.findIndex((f) => f.file === file.file);
|
||||
if (index !== -1) {
|
||||
fileList.value[index].serverUrl = res.data;
|
||||
}
|
||||
|
||||
console.log("form.photos", toRaw(form.photos));
|
||||
console.log("fileList.value", fileList.value);
|
||||
} else {
|
||||
throw new Error(res.message);
|
||||
}
|
||||
} catch (error) {
|
||||
toast.close();
|
||||
showToast({
|
||||
type: "fail",
|
||||
message: error.message,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const handleSubmit = async () => {
|
||||
try {
|
||||
showLoadingToast({
|
||||
@ -620,6 +737,9 @@ const handleSubmit = async () => {
|
||||
forbidClick: true,
|
||||
loadingType: "spinner",
|
||||
});
|
||||
form.equipment.yhzid = detailData.value.id;
|
||||
form.equipment.qxmc = detailData.value.qxmc;
|
||||
// console.log('detailData', toRaw(detailData.value))
|
||||
console.log("form", toRaw(form));
|
||||
const res = await request({
|
||||
url: "/snow-ops-platform/yjsb/add",
|
||||
@ -648,6 +768,7 @@ const handleSubmit = async () => {
|
||||
onPopupClose();
|
||||
getEquipmentList(searchValue.value);
|
||||
} else {
|
||||
console.log("res", res);
|
||||
throw new Error(res.message);
|
||||
}
|
||||
} catch (error) {
|
||||
|
||||
@ -13,16 +13,87 @@
|
||||
style="font-size: 18px; font-weight: bold; line-height: inherit"
|
||||
>
|
||||
</van-cell>
|
||||
<van-cell :title="'物资名称: ' + wzDetailData.wzmc"> </van-cell>
|
||||
<van-cell :title="'数量: ' + wzDetailData.sl"> </van-cell>
|
||||
<van-cell :title="'余量: ' + wzDetailData.ye"> </van-cell>
|
||||
<van-cell :title="'单位: ' + wzDetailData.dw"> </van-cell>
|
||||
<van-cell :title="'存放地点: ' + wzDetailData.cfdd"> </van-cell>
|
||||
<van-cell :title="'区县名称: ' + wzDetailData.qxmc"> </van-cell>
|
||||
<van-cell :title="'物资名称: ' + wzDetailData.wzmc">
|
||||
<template #right-icon>
|
||||
<van-image
|
||||
:src="photos[0]?.photoUrl"
|
||||
fit="cover"
|
||||
width="100px"
|
||||
@click="showImage(photos)"
|
||||
></van-image>
|
||||
</template>
|
||||
</van-cell>
|
||||
<van-cell :title="'余量: ' + wzDetailData.ye + ' ' + wzDetailData.dw">
|
||||
</van-cell>
|
||||
<van-cell :title="'物资经度: ' + wzDetailData.jd"> </van-cell>
|
||||
<van-cell :title="'物资纬度: ' + wzDetailData.wd"> </van-cell>
|
||||
<van-cell :title="'负责人: ' + wzDetailData.fzr"> </van-cell>
|
||||
<van-cell :title="'联系电话: ' + wzDetailData.lxdh"> </van-cell>
|
||||
<van-cell :title="'入库日期: ' + wzDetailData.rkrq"> </van-cell>
|
||||
<van-cell
|
||||
:title="'入库日期: ' + (wzDetailData.rkrq?.split(' ')[0] || '')"
|
||||
>
|
||||
</van-cell>
|
||||
<van-cell :title="'所属养护站: ' + wzDetailData.yhzMc"> </van-cell>
|
||||
<van-cell :title="'备注: ' + wzDetailData.remark"> </van-cell>
|
||||
</van-cell-group>
|
||||
<van-button type="primary" class="remark-btn" @click="handleRemarkOpen">
|
||||
备注
|
||||
</van-button>
|
||||
<van-popup
|
||||
:show="showRemarkPopup"
|
||||
position="bottom"
|
||||
closeable
|
||||
close-on-click-overlay
|
||||
:style="{ height: '30%' }"
|
||||
@close="onRemarkPopupClose"
|
||||
>
|
||||
<div
|
||||
style="
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding: 0 16px;
|
||||
"
|
||||
>
|
||||
<h1
|
||||
style="
|
||||
margin: 0 0 12px 0;
|
||||
font-size: 18px;
|
||||
color: #333;
|
||||
text-align: center;
|
||||
"
|
||||
>
|
||||
备注信息
|
||||
</h1>
|
||||
<van-field
|
||||
v-model="wzDetailData.remark"
|
||||
placeholder="请输入备注"
|
||||
style="
|
||||
width: 100%;
|
||||
margin-bottom: 16px;
|
||||
border-radius: 8px;
|
||||
background: #f7f8fa;
|
||||
"
|
||||
/>
|
||||
<div style="display: flex; gap: 20px; width: 100%">
|
||||
<van-button
|
||||
type="default"
|
||||
style="flex: 1; border-radius: 8px"
|
||||
@click="onRemarkPopupClose"
|
||||
>
|
||||
取消
|
||||
</van-button>
|
||||
<van-button
|
||||
type="primary"
|
||||
style="flex: 1; border-radius: 8px"
|
||||
@click="onRemarkConfirm"
|
||||
>
|
||||
确认
|
||||
</van-button>
|
||||
</div>
|
||||
</div>
|
||||
</van-popup>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@ -32,7 +103,7 @@ import "vant/es/toast/style";
|
||||
import "vant/es/popup/style";
|
||||
import { ref, onMounted, toRaw, reactive } from "vue";
|
||||
import { useRouter, useRoute } from "vue-router";
|
||||
import { showToast, showLoadingToast } from "vant";
|
||||
import { showToast, showLoadingToast, showImagePreview } from "vant";
|
||||
import { request } from "../../../../shared/utils/request";
|
||||
|
||||
const router = useRouter();
|
||||
@ -41,6 +112,7 @@ const route = useRoute();
|
||||
const yhzDetail = ref({});
|
||||
const wzData = ref([]);
|
||||
const wzDetailData = ref({}); // 物资详情数据
|
||||
const photos = ref([]); // 物资图片数据
|
||||
|
||||
onMounted(() => {
|
||||
const data = JSON.parse(decodeURIComponent(route.params.data));
|
||||
@ -59,6 +131,7 @@ const getwzDetail = async () => {
|
||||
});
|
||||
if (res.code && res.code === "00000") {
|
||||
wzDetailData.value = res.data.material;
|
||||
photos.value = res.data.photos;
|
||||
} else {
|
||||
throw new Error(res.message);
|
||||
}
|
||||
@ -77,6 +150,51 @@ const onClickLeft = () => {
|
||||
params: { data: encodeURIComponent(JSON.stringify(yhzDetail.value)) },
|
||||
});
|
||||
};
|
||||
|
||||
const showImage = (photos) => {
|
||||
const photosArr = photos.map((item) => item.photoUrl);
|
||||
showImagePreview({
|
||||
images: photosArr,
|
||||
closeable: true,
|
||||
});
|
||||
};
|
||||
|
||||
// 编辑备注相关
|
||||
const showRemarkPopup = ref(false);
|
||||
const handleRemarkOpen = () => {
|
||||
showRemarkPopup.value = true;
|
||||
};
|
||||
const onRemarkPopupClose = () => {
|
||||
getwzDetail();
|
||||
showRemarkPopup.value = false;
|
||||
};
|
||||
const onRemarkConfirm = async () => {
|
||||
try {
|
||||
const data = {
|
||||
material: wzDetailData.value,
|
||||
photos: photos.value,
|
||||
},
|
||||
res = await request({
|
||||
url: `/snow-ops-platform/yjwz/update`,
|
||||
method: "POST",
|
||||
data,
|
||||
});
|
||||
if (res.code && res.code === "00000") {
|
||||
showToast({
|
||||
message: "备注信息保存成功",
|
||||
type: "success",
|
||||
});
|
||||
onRemarkPopupClose();
|
||||
} else {
|
||||
throw new Error(res.message);
|
||||
}
|
||||
} catch (error) {
|
||||
showToast({
|
||||
message: error.message,
|
||||
type: "fail",
|
||||
});
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
@ -85,7 +203,7 @@ const onClickLeft = () => {
|
||||
}
|
||||
|
||||
.content {
|
||||
padding: 16px;
|
||||
padding: 16px 16px 80px 16px;
|
||||
}
|
||||
|
||||
.grid {
|
||||
@ -112,5 +230,17 @@ const onClickLeft = () => {
|
||||
.status-danger {
|
||||
background-color: #ee0a24;
|
||||
}
|
||||
.remark-btn {
|
||||
position: fixed;
|
||||
bottom: 20px;
|
||||
left: 16px;
|
||||
right: 16px;
|
||||
width: calc(100% - 32px);
|
||||
margin: 0 auto;
|
||||
border-radius: 24px;
|
||||
font-size: 16px;
|
||||
height: 44px;
|
||||
z-index: 999;
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -19,7 +19,7 @@
|
||||
:key="index"
|
||||
:title="item.wzmc"
|
||||
is-link
|
||||
:label="`余量:${item.sl} (${item.dw})`"
|
||||
:label="`余量:${item.ye} (${item.dw})`"
|
||||
:to="{
|
||||
name: 'MaterialDetail',
|
||||
params: {
|
||||
@ -34,11 +34,10 @@
|
||||
>
|
||||
</van-cell>
|
||||
</van-cell-group>
|
||||
</div>
|
||||
|
||||
<van-button type="primary" class="add-btn" icon="plus" @click="handleAdd">
|
||||
添加物资
|
||||
</van-button>
|
||||
</div>
|
||||
|
||||
<!-- 弹出层 -->
|
||||
<van-popup
|
||||
@ -46,7 +45,6 @@
|
||||
position="bottom"
|
||||
closeable
|
||||
close-on-click-overlay
|
||||
:style="{ height: '60%' }"
|
||||
@close="onPopupClose"
|
||||
>
|
||||
<van-form class="materialAddForm" label-align="left" colon>
|
||||
@ -54,82 +52,133 @@
|
||||
|
||||
<!-- 物资名称 -->
|
||||
<van-field
|
||||
v-model="form.wzmc"
|
||||
v-model="form.material.wzmc"
|
||||
label="物资名称"
|
||||
placeholder="请输入物资名称"
|
||||
:rules="[{ required: true, message: '请填写物资名称' }]"
|
||||
maxlength="20"
|
||||
show-word-limit
|
||||
>
|
||||
<template #button>
|
||||
<span class="counter">{{ form.wzmc.length }}/20</span>
|
||||
</template>
|
||||
</van-field>
|
||||
|
||||
<!-- 数量 -->
|
||||
<van-field
|
||||
v-model="form.sl"
|
||||
v-model="form.material.sl"
|
||||
label="数量"
|
||||
placeholder="请输入数量"
|
||||
type="number"
|
||||
:rules="[{ required: true, message: '请填写物资数量' }]"
|
||||
/>
|
||||
></van-field>
|
||||
|
||||
<!-- 单位 -->
|
||||
<van-field v-model="form.dw" label="单位" placeholder="物资单位" />
|
||||
|
||||
<!-- 负责人 -->
|
||||
<van-field
|
||||
v-model="form.fzr"
|
||||
label="负责人"
|
||||
placeholder="请输入负责人"
|
||||
/>
|
||||
|
||||
<!-- 联系电话 -->
|
||||
<van-field
|
||||
v-model="form.lxdh"
|
||||
label="联系电话"
|
||||
placeholder="请输入联系电话"
|
||||
/>
|
||||
|
||||
<!-- 存放地点 -->
|
||||
<van-field
|
||||
v-model="form.cfdd"
|
||||
label="存放地点"
|
||||
placeholder="请输入存放地点"
|
||||
/>
|
||||
|
||||
<!-- 入库单位 -->
|
||||
<van-field
|
||||
v-model="form.rkdw"
|
||||
label="入库单位"
|
||||
placeholder="请输入入库单位"
|
||||
/>
|
||||
|
||||
<!-- 入库日期 -->
|
||||
<van-field
|
||||
v-model="form.rkrq"
|
||||
v-model="form.material.dw"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
readonly
|
||||
label="入库日期"
|
||||
placeholder="请选择日期"
|
||||
@click="showTimePicker = true"
|
||||
label="单位"
|
||||
placeholder="物资单位"
|
||||
@click="showDwPicker = true"
|
||||
ref="dwField"
|
||||
/>
|
||||
|
||||
<!-- 入库日期弹窗 -->
|
||||
<van-popup
|
||||
:show="showTimePicker"
|
||||
:show="showDwPicker"
|
||||
round
|
||||
position="bottom"
|
||||
close-on-click-overlay
|
||||
@close="showTimePicker = false"
|
||||
@close="showDwPicker = false"
|
||||
>
|
||||
<van-date-picker
|
||||
v-model="currentDate"
|
||||
title="选择入库日期"
|
||||
@confirm="onDateConfirm"
|
||||
@cancel="showTimePicker = false"
|
||||
<van-picker
|
||||
title="选择物资单位"
|
||||
:columns="dwOptions"
|
||||
@confirm="onDwConfirm"
|
||||
@cancel="showDwPicker = false"
|
||||
/>
|
||||
</van-popup>
|
||||
|
||||
<!-- 物资经度 -->
|
||||
<van-field
|
||||
v-model="form.material.jd"
|
||||
label="物资经度"
|
||||
placeholder="请输入物资经度"
|
||||
>
|
||||
<template #button>
|
||||
<van-button
|
||||
size="small"
|
||||
type="primary"
|
||||
@click.stop="handleGetLocation"
|
||||
>获取位置</van-button
|
||||
>
|
||||
</template>
|
||||
</van-field>
|
||||
<!-- 物资纬度 -->
|
||||
<van-field
|
||||
v-model="form.material.wd"
|
||||
label="物资纬度"
|
||||
placeholder="请输入物资纬度"
|
||||
>
|
||||
<template #button>
|
||||
<van-button
|
||||
size="small"
|
||||
type="primary"
|
||||
@click.stop="handleGetLocation"
|
||||
>获取位置</van-button
|
||||
>
|
||||
</template>
|
||||
</van-field>
|
||||
|
||||
<!-- 负责人 -->
|
||||
<van-field
|
||||
v-model="form.material.fzr"
|
||||
is-link
|
||||
arrow-direction="down"
|
||||
readonly
|
||||
label="负责人"
|
||||
placeholder="请选择负责人"
|
||||
@click="showFzrPicker = true"
|
||||
/>
|
||||
|
||||
<!-- 负责人弹窗 -->
|
||||
<van-popup
|
||||
:show="showFzrPicker"
|
||||
round
|
||||
position="bottom"
|
||||
close-on-click-overlay
|
||||
@close="showFzrPicker = false"
|
||||
>
|
||||
<van-picker
|
||||
title="选择设备管理员"
|
||||
:columns="fzrOptions"
|
||||
@confirm="onFzrConfirm"
|
||||
@cancel="showFzrPicker = false"
|
||||
/>
|
||||
</van-popup>
|
||||
|
||||
<!-- 备注 -->
|
||||
<van-field
|
||||
v-model="form.material.remark"
|
||||
label="备注"
|
||||
type="textarea"
|
||||
placeholder=""
|
||||
maxlength="20"
|
||||
show-word-limit
|
||||
>
|
||||
</van-field>
|
||||
|
||||
<!-- -->
|
||||
<van-field label="物资照片" center>
|
||||
<template #input>
|
||||
<van-uploader
|
||||
v-model="fileList"
|
||||
@delete="handleDelete"
|
||||
name="photos"
|
||||
:file-list="fileList"
|
||||
:file-type="['image/jpeg', 'image/png']"
|
||||
:after-read="afterRead"
|
||||
multiple
|
||||
:max-count="6"
|
||||
/>
|
||||
</template>
|
||||
</van-field>
|
||||
</van-form>
|
||||
<div
|
||||
style="
|
||||
@ -172,7 +221,9 @@ const showPopup = ref(false); // 控制弹出层显示隐藏
|
||||
const yhzDetail = ref({}); // 养护站详情数据
|
||||
const materialList = ref([]); // 物资列表数据
|
||||
const INIT_FORM = {
|
||||
rid: "",
|
||||
material: {
|
||||
jd: "", // 物资经度
|
||||
wd: "", // 物资纬度
|
||||
rkrq: "", // 入库日期
|
||||
rkdw: "", // 入库单位
|
||||
sl: 0, // 数量
|
||||
@ -184,7 +235,11 @@ const INIT_FORM = {
|
||||
qxmc: "", // 区县名称
|
||||
wzmc: "", // 物资名称
|
||||
fzrid: "", // 负责人id
|
||||
fzr: "", // 负责人名称
|
||||
yhzid: "", // 养护站id
|
||||
remark: "", // 备注
|
||||
},
|
||||
photos: [],
|
||||
};
|
||||
const form = reactive({ ...INIT_FORM }); // 表单
|
||||
|
||||
@ -226,7 +281,7 @@ onMounted(() => {
|
||||
getMaterialList();
|
||||
});
|
||||
|
||||
// 购置日期
|
||||
// 购置日期相关
|
||||
const showTimePicker = ref(false);
|
||||
const currentDate = ref([
|
||||
new Date().getFullYear(),
|
||||
@ -238,6 +293,32 @@ const onDateConfirm = ({ selectedValues }) => {
|
||||
showTimePicker.value = false;
|
||||
};
|
||||
|
||||
// 选择单位相关
|
||||
const dwField = ref(null);
|
||||
const showDwPicker = ref(false);
|
||||
const dwOptions = [
|
||||
{ text: "辆", value: "辆" },
|
||||
{ text: "米", value: "米" },
|
||||
{ text: "桶", value: "桶" },
|
||||
{ text: "把", value: "把" },
|
||||
{ text: "吨", value: "吨" },
|
||||
{ text: "双", value: "双" },
|
||||
{ text: "件", value: "件" },
|
||||
{ text: "付", value: "付" },
|
||||
{ text: "个", value: "个" },
|
||||
{ text: "件", value: "件" },
|
||||
{ text: "自定义", value: "自定义" },
|
||||
];
|
||||
const onDwConfirm = (value) => {
|
||||
if (value.selectedValues[0] === "自定义") {
|
||||
showDwPicker.value = false;
|
||||
dwField.value.focus();
|
||||
} else {
|
||||
form.material.dw = value.selectedValues[0];
|
||||
showDwPicker.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
const handleSubmit = async () => {
|
||||
try {
|
||||
showLoadingToast({
|
||||
@ -245,8 +326,8 @@ const handleSubmit = async () => {
|
||||
forbidClick: true,
|
||||
loadingType: "spinner",
|
||||
});
|
||||
form.yhzid = yhzDetail.value.id;
|
||||
form.qxmc = yhzDetail.value.qxmc;
|
||||
form.material.yhzid = yhzDetail.value.id;
|
||||
form.material.qxmc = yhzDetail.value.qxmc;
|
||||
console.log("form", toRaw(form));
|
||||
const res = await request({
|
||||
url: "/snow-ops-platform/yjwz/add",
|
||||
@ -273,6 +354,111 @@ const handleSubmit = async () => {
|
||||
}
|
||||
};
|
||||
|
||||
// 负责人相关
|
||||
const showFzrPicker = ref(false);
|
||||
const fzrOptions = ref([]);
|
||||
const onFzrConfirm = (value) => {
|
||||
// 获取选中的负责人ID
|
||||
const selectedId = value.selectedValues[0];
|
||||
|
||||
// 在fzrOptions中查找对应的负责人名称
|
||||
const selectedPerson = fzrOptions.value.find(
|
||||
(item) => item.value === selectedId
|
||||
);
|
||||
// 同时设置id和名称
|
||||
if (selectedPerson) {
|
||||
form.material.fzrid = selectedId;
|
||||
form.material.fzr = selectedPerson.text;
|
||||
} else {
|
||||
form.material.fzrid = "";
|
||||
form.material.fzr = "";
|
||||
}
|
||||
showFzrPicker.value = false;
|
||||
};
|
||||
|
||||
// 图片上传相关
|
||||
const fileList = ref([]);
|
||||
// 文件删除
|
||||
const handleDelete = (file) => {
|
||||
if (file.serverUrl) {
|
||||
const index = form.photos.findIndex((p) => p.photoUrl === file.serverUrl);
|
||||
if (index !== -1) {
|
||||
form.photos.splice(index, 1);
|
||||
}
|
||||
}
|
||||
};
|
||||
// 文件上传
|
||||
const afterRead = async (file) => {
|
||||
try {
|
||||
const toast = showLoadingToast({
|
||||
message: "上传中...",
|
||||
forbidClick: true,
|
||||
duration: 0, // 设置为0表示不会自动关闭
|
||||
});
|
||||
const formData = new FormData();
|
||||
formData.append("file", file.file);
|
||||
const res = await request({
|
||||
url: "/snow-ops-platform/file/upload",
|
||||
method: "post",
|
||||
data: formData,
|
||||
});
|
||||
toast.close();
|
||||
if (res.code === "00000") {
|
||||
form.photos.push({ photoUrl: res.data });
|
||||
const index = fileList.value.findIndex((f) => f.file === file.file);
|
||||
if (index !== -1) {
|
||||
fileList.value[index].serverUrl = res.data;
|
||||
}
|
||||
|
||||
console.log("form.photos", toRaw(form.photos));
|
||||
console.log("fileList.value", fileList.value);
|
||||
} else {
|
||||
throw new Error(res.message);
|
||||
}
|
||||
} catch (error) {
|
||||
toast.close();
|
||||
showToast({
|
||||
type: "fail",
|
||||
message: error.message,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// 获取经纬度
|
||||
const handleGetLocation = () => {
|
||||
if (!navigator.geolocation) {
|
||||
showToast("您的浏览器不支持地理位置获取");
|
||||
return;
|
||||
}
|
||||
|
||||
showLoadingToast({
|
||||
message: "定位中...",
|
||||
forbidClick: true,
|
||||
});
|
||||
|
||||
navigator.geolocation.getCurrentPosition(
|
||||
(position) => {
|
||||
form.material.jd = position.coords.longitude.toFixed(6);
|
||||
form.material.wd = position.coords.latitude.toFixed(6);
|
||||
showToast("定位成功");
|
||||
},
|
||||
(error) => {
|
||||
const errorMessage =
|
||||
{
|
||||
1: "位置服务被拒绝",
|
||||
2: "暂时无法获取位置",
|
||||
3: "定位超时",
|
||||
}[error.code] || "定位失败";
|
||||
showToast(errorMessage);
|
||||
},
|
||||
{
|
||||
enableHighAccuracy: true, // 高精度模式
|
||||
timeout: 5000, // 超时时间
|
||||
maximumAge: 0, // 不缓存位置
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
watch(
|
||||
() => searchValue.value,
|
||||
(newVal, oldVal) => {
|
||||
@ -286,7 +472,38 @@ const onClickLeft = () => {
|
||||
router.push("/");
|
||||
};
|
||||
|
||||
const handleAdd = () => {
|
||||
// 获取养护站人员列表
|
||||
const getPersonList = async () => {
|
||||
try {
|
||||
const data = {
|
||||
pageNum: 1,
|
||||
pageSize: 9999,
|
||||
yhzid: yhzDetail.value.id,
|
||||
};
|
||||
const res = await request({
|
||||
url: "/snow-ops-platform/yhzry/list",
|
||||
method: "get",
|
||||
params: data,
|
||||
});
|
||||
if (res.code === "00000") {
|
||||
fzrOptions.value = res.data.records.map((item) => ({
|
||||
text: item.xm,
|
||||
value: item.userId,
|
||||
}));
|
||||
} else {
|
||||
throw new Error("人员信息获取失败");
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
showToast({
|
||||
type: "fail",
|
||||
message: error.message,
|
||||
});
|
||||
}
|
||||
};
|
||||
const handleAdd = async () => {
|
||||
await getPersonList();
|
||||
handleGetLocation();
|
||||
showPopup.value = true;
|
||||
};
|
||||
|
||||
|
||||
@ -196,11 +196,11 @@ const columns = [
|
||||
label: '预计恢复时间',
|
||||
},
|
||||
{
|
||||
prop: 'actualRecoverTime',
|
||||
prop: 'trafficActualRecoverTime',
|
||||
label: '实际恢复时间',
|
||||
},
|
||||
{
|
||||
prop: 'serviceStationId',
|
||||
prop: 'stationName',
|
||||
label: '所属服务站',
|
||||
},
|
||||
{
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user