bxztApp/packages/mobile/src/views/Equipment/EquipmentDetails.vue

1173 lines
33 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="home">
<van-nav-bar title="设备管理" fixed left-arrow @click-left="onClickLeft" />
<van-cell-group>
<van-cell title="当前站点" :value="equipmentInfo.sbwz" />
</van-cell-group>
<div class="content">
<van-cell-group>
<van-cell
title="设备信息"
style="font-size: 18px; font-weight: bold; line-height: inherit"
>
<template #value>
<span
:class="[
'status-tag',
`status-` +
(equipmentDetailInfo.sbzt === '完好'
? 'good'
: equipmentDetailInfo.sbzt === '损坏'
? 'warning'
: 'danger'),
]"
>{{ equipmentDetailInfo.sbzt }}</span
>
</template>
</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>
<van-cell :title="'设备型号: ' + equipmentDetailInfo.sbxh"> </van-cell>
<van-cell :title="'设备位置: ' + equipmentDetailInfo.sbwz"> </van-cell>
<van-cell :title="'设备经纬度: '">
<template #label>
<span
>设备经度: {{ equipmentDetailInfo.jd }}<br />设备纬度:
{{ equipmentDetailInfo.wd }}</span
>
</template>
</van-cell>
<van-cell :title="'设备管理人员: ' + equipmentDetailInfo.glry">
</van-cell>
<van-cell :title="'操作员: ' + equipmentDetailInfo.czy">
</van-cell>
<van-cell :title="'购置日期: ' + equipmentDetailInfo.gzrq">
</van-cell>
<van-cell :title="'购买费用(万元): ' + equipmentDetailInfo.gmfy">
</van-cell>
<van-cell :title="'应急设备: ' + equipmentDetailInfo.sfyjsb">
</van-cell>
<van-cell :title="'纳入市级补助范围: ' + equipmentDetailInfo.sfnrsjbz">
</van-cell>
<van-cell :title="'辐射范围: ' + equipmentDetailInfo.fsfw"> </van-cell>
<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>
<van-tabbar>
<van-tabbar-item>
<van-popover
placement="top-start"
:show="showPopover"
:actions="actions"
@select="onSelect"
>
<template #reference>
<van-button type="primary" style="width: 80px; border-radius: 10px">
更多
</van-button>
</template>
</van-popover>
</van-tabbar-item>
<van-tabbar-item
><template #default>
<van-button
type="warning"
style="width: 80px; border-radius: 10px"
@click="onBrokenPopupOpen"
>
损坏
</van-button>
</template></van-tabbar-item
>
<van-tabbar-item
><template #default>
<van-button
type="primary"
style="width: 80px; border-radius: 10px"
@click="onEditPopupOpen"
>
编辑
</van-button>
</template></van-tabbar-item
>
<van-tabbar-item
><template #default>
<van-button
type="primary"
style="width: 80px; border-radius: 10px"
@click="onRemarkPopupOpen"
>
备注
</van-button>
</template></van-tabbar-item
>
</van-tabbar>
<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="equipmentDetailInfo.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>
<van-popup
:show="showDeletePopup"
position="bottom"
closeable
close-on-click-overlay
:style="{ height: '20%' }"
@close="onDeletePopupClose"
>
<div
style="
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 0 16px;
"
>
<h1
style="
margin: 0 0 20px 0;
font-size: 18px;
color: #333;
text-align: center;
"
>
确认删除
</h1>
<div style="display: flex; gap: 20px; width: 100%">
<van-button
type="default"
style="flex: 1; border-radius: 8px"
@click="onDeletePopupClose"
>
取消
</van-button>
<van-button
type="primary"
style="flex: 1; border-radius: 8px"
@click="onDeleteConfirm"
>
确认
</van-button>
</div>
</div>
</van-popup>
<van-popup
:show="showBrokenPopup"
position="bottom"
closeable
close-on-click-overlay
:style="{ height: '30%' }"
@close="onBrokenPopupClose"
>
<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="brokenReason"
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="onBrokenPopupClose"
>
取消
</van-button>
<van-button
type="primary"
style="flex: 1; border-radius: 8px"
@click="onBrokenConfirm"
>
确认
</van-button>
</div>
</div>
</van-popup>
<van-popup
:show="showScrapPopup"
position="bottom"
closeable
close-on-click-overlay
:style="{ height: '30%' }"
@close="onScrapPopupClose"
>
<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="scrapReason"
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="onScrapPopupClose"
>
取消
</van-button>
<van-button
type="primary"
style="flex: 1; border-radius: 8px"
@click="onScrapConfirm"
>
确认
</van-button>
</div>
</div>
</van-popup>
<van-popup
:show="showEditPopup"
position="bottom"
closeable
close-on-click-overlay
:style="{ height: '80%' }"
@close="onEditPopupClose"
>
<van-form class="device-form" label-align="left" colon>
<h3>编辑设备信息</h3>
<!-- 设备名称 -->
<van-field
v-model="editForm.equipment.sbmc"
label="设备名称"
placeholder="请输入设备名称"
:rules="[{ required: true, message: '请填写设备名称' }]"
maxlength="20"
show-word-limit
>
</van-field>
<!-- 设备大类 -->
<van-field
v-model="editForm.equipment.sbdl"
is-link
arrow-direction="down"
label="设备大类"
placeholder="请选择设备大类"
@click="showCategoryPicker = true"
ref="categoryField"
/>
<!-- 设备类型 -->
<van-field
v-model="editForm.equipment.sblx"
is-link
arrow-direction="down"
label="设备类型"
placeholder="请选择设备类型"
@click="showTypePicker = true"
ref="typeField"
/>
<!-- 设备编号 -->
<van-field
v-model="editForm.equipment.sbbh"
label="设备编号"
placeholder="请输入设备编号"
:rules="[{ required: true, message: '请填写设备编号' }]"
/>
<!-- 设备型号 -->
<van-field
v-model="editForm.equipment.sbxh"
label="设备型号"
placeholder="请输入设备型号"
:rules="[{ required: true, message: '请填写设备型号' }]"
/>
<!-- 经纬度 -->
<van-field
v-model="editForm.equipment.jd"
label="设备经度"
placeholder="请输入经度"
type="number"
/>
<van-field
v-model="editForm.equipment.wd"
label="设备纬度"
placeholder="请输入纬度"
type="number"
/>
<!-- 管理人员 -->
<van-field
v-model="editForm.equipment.glry"
is-link
arrow-direction="down"
readonly
label="管理人员"
placeholder="请选择设备管理人员"
@click="showAdminPicker = true"
/>
<!-- 操作员 -->
<van-field
v-model="editForm.equipment.czy"
is-link
arrow-direction="down"
readonly
label="操作员"
placeholder="请选择操作员"
@click="showOperatorPicker = true"
/>
<!-- 购买费用 -->
<van-field
v-model="editForm.equipment.gmfy"
type="number"
label="购买费用(万元)"
placeholder="请输入购买费用"
/>
<!-- 购置日期 -->
<van-field
v-model="editForm.equipment.gzrq"
is-link
arrow-direction="down"
readonly
label="购置日期"
placeholder="请选择日期"
@click="showTimePicker = true"
/>
<!-- 生产厂家 -->
<van-field
v-model="editForm.equipment.sccj"
label="生产厂家"
placeholder="请输入生产厂家"
/>
<!-- 是否应急设备 -->
<van-field
v-model="editForm.equipment.sfyjsb"
is-link
arrow-direction="down"
readonly
label="是否应急设备"
placeholder="请选择"
@click="showEmergencyPicker = true"
/>
<!-- 是否纳入市级补助范围 -->
<van-field
v-model="editForm.equipment.sfnrsjbz"
is-link
arrow-direction="down"
readonly
label="是否纳入市级补助范围"
placeholder="请选择"
@click="showSubsidyPicker = true"
/>
<!-- 辐射范围 -->
<van-field
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
:show="showCategoryPicker"
round
position="bottom"
close-on-click-overlay
@close="showCategoryPicker = false"
>
<van-picker
title="选择设备大类"
:columns="categoryOptions"
@confirm="onCategoryConfirm"
@cancel="showCategoryPicker = false"
/>
</van-popup>
<!-- 设备类型弹窗 -->
<van-popup
:show="showTypePicker"
round
position="bottom"
close-on-click-overlay
@close="showTypePicker = false"
>
<van-picker
title="选择设备类型"
:columns="typeOptions"
@confirm="onTypeConfirm"
@cancel="showTypePicker = false"
/>
</van-popup>
<!-- 设备管理员弹窗 -->
<van-popup
:show="showAdminPicker"
round
position="bottom"
close-on-click-overlay
@close="showAdminPicker = false"
>
<van-picker
title="选择设备管理员"
:columns="adminOptions"
@confirm="onAdminConfirm"
@cancel="showAdminPicker = false"
/>
</van-popup>
<!-- 操作员弹窗 -->
<van-popup
:show="showOperatorPicker"
round
position="bottom"
close-on-click-overlay
@close="showOperatorPicker = false"
>
<van-picker
title="选择操作员"
:columns="operatorOptions"
@confirm="operatorConfirm"
@cancel="showOperatorPicker = false"
/>
</van-popup>
<!-- 购置日期弹窗 -->
<van-popup
:show="showTimePicker"
round
position="bottom"
close-on-click-overlay
@close="showTimePicker = false"
>
<van-date-picker
v-model="currentDate"
title="选择购置日期"
@confirm="onDateConfirm"
@cancel="showTimePicker = false"
/>
</van-popup>
<!-- 是否应急设备弹窗 -->
<van-popup
:show="showEmergencyPicker"
round
position="bottom"
close-on-click-overlay
@close="showEmergencyPicker = false"
>
<van-picker
title="是否应急设备"
:columns="emergencyOptions"
@confirm="onEmergencyConfirm"
@cancel="showEmergencyPicker = false"
/>
</van-popup>
<!-- 是否纳入市级补助范围弹窗 -->
<van-popup
:show="showSubsidyPicker"
round
position="bottom"
close-on-click-overlay
@close="showSubsidyPicker = false"
>
<van-picker
title="是否纳入市级补助"
:columns="subsidyOptions"
@confirm="onSubsidyConfirm"
@cancel="showSubsidyPicker = false"
/>
</van-popup>
</van-form>
<div
style="
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: 16px;
background: white;
box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
z-index: 100;
"
>
<van-button
round
block
type="primary"
native-type="submit"
@click="onEditSubmit"
>
保存
</van-button>
</div>
</van-popup>
</div>
</template>
<script setup>
import "vant/es/toast/style";
import "vant/es/popup/style";
import { ref, onMounted, toRaw, reactive, computed } from "vue";
import { useRouter, useRoute } from "vue-router";
import { showToast, showLoadingToast, showImagePreview } from "vant";
import { request } from "../../../../shared/utils/request";
const router = useRouter();
const route = useRoute();
const showPopover = ref(false);
const actions = [{ text: "删除" }, { text: "报废" }];
const onSelect = (action) => {
if (action.text === "删除") {
showDeletePopup.value = true;
}
if (action.text === "报废") {
showScrapPopup.value = true;
}
};
const equipmentInfo = ref({});
const yhzInfo = ref({});
const equipmentDetailInfo = ref({});
const photos = ref([]);
const statusList = ref([]);
// 获取设备详情
const getEquipmentDetailInfo = async () => {
try {
const res = await request({
url: `/snow-ops-platform/yjsb/getById?rid=${equipmentInfo.value.rid}`,
method: "GET",
});
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);
}
} catch (error) {
showToast({ type: "error", message: error.message });
}
};
onMounted(() => {
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(yhzInfo.value)) },
});
};
const showScrapPopup = ref(false);
const scrapReason = ref(""); // 报废原因
const onScrapPopupClose = () => {
showScrapPopup.value = false;
scrapReason.value = "";
};
const onScrapConfirm = async () => {
try {
console.log("equipmentDetailInfo", toRaw(equipmentDetailInfo.value));
const res = await request({
url: `/snow-ops-platform/yjsb/updateEquipmentStatus`,
method: "POST",
data: {
equipmentId: equipmentDetailInfo.value.rid,
equipmentStatus: "报废",
statusDesc: scrapReason.value,
},
});
if (res.code && res.code === "00000") {
showToast({ type: "success", message: "操作成功" });
router.push({
name: "EquipManage",
params: {
data: encodeURIComponent(JSON.stringify(yhzInfo.value)),
},
});
} else {
throw new Error(res.data.message);
}
} catch (error) {
showToast({ type: "error", message: "操作失败" });
console.log("error", error);
}
showScrapPopup.value = false;
scrapReason.value = "";
};
const showBrokenPopup = ref(false);
const onBrokenPopupOpen = () => {
showBrokenPopup.value = true;
};
// 损坏相关状态
const brokenReason = ref(""); // 损坏原因
const onBrokenConfirm = async () => {
try {
const res = await request({
url: `/snow-ops-platform/yjsb/updateEquipmentStatus`,
method: "POST",
data: {
equipmentId: equipmentDetailInfo.value.rid,
equipmentStatus: "损坏",
statusDesc: brokenReason.value,
},
});
if (res.code && res.code === "00000") {
showToast({ type: "success", message: "损坏上报成功" });
router.push({
name: "EquipManage",
params: {
data: encodeURIComponent(JSON.stringify(yhzInfo.value)),
},
});
} else {
throw new Error(res.data.message);
}
} catch (error) {
showToast({ type: "error", message: "操作失败" });
console.log("error", error);
}
showBrokenPopup.value = false;
brokenReason.value = "";
};
const onBrokenPopupClose = () => {
showBrokenPopup.value = false;
brokenReason.value = "";
};
const showDeletePopup = ref(false);
const onDeletePopupClose = () => {
showDeletePopup.value = false;
};
const onDeleteConfirm = async () => {
try {
showLoadingToast({
message: "删除中...",
forbidClick: true,
loadingType: "spinner",
});
const res = await request({
url: `/snow-ops-platform/yjsb/delete`,
method: "POST",
data: {
rid: equipmentDetailInfo.value.rid,
},
});
if (res.code && res.code === "00000") {
showToast({ type: "success", message: "删除成功" });
router.push({
name: "EquipManage",
params: {
data: encodeURIComponent(JSON.stringify(yhzInfo.value)),
},
});
} else {
throw new Error(res.data.message);
}
} catch (error) {
showToast({ type: "error", message: "删除失败" });
console.log("error", error);
}
showDeletePopup.value = false;
};
const showRemarkPopup = ref(false);
const onRemarkPopupOpen = () => {
showRemarkPopup.value = true;
};
const onRemarkConfirm = async () => {
try {
showLoadingToast({
message: "提交中...",
forbidClick: true,
loadingType: "spinner",
});
const res = await request({
url: "/snow-ops-platform/yjsb/update",
method: "POST",
data: {
equipment: {
...equipmentDetailInfo.value,
},
photos: photos.value,
},
});
if (res.code && res.code === "00000") {
showToast({ type: "success", message: "备注更新成功" });
getEquipmentDetailInfo();
showRemarkPopup.value = false;
} else {
throw new Error(res.data.message);
}
} catch (error) {
showToast({ type: "error", message: error.message || "备注更新失败" });
} finally {
showRemarkPopup.value = false;
}
};
const onRemarkPopupClose = () => {
getEquipmentDetailInfo();
showRemarkPopup.value = false;
};
const showEditPopup = ref(false);
// 编辑表单
const editForm = reactive({});
// 获取养护站人员列表
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;
};
// 关闭编辑弹窗
const onEditPopupClose = () => {
showEditPopup.value = false;
};
const showCategoryPicker = ref(false);
const showTypePicker = ref(false);
const categoryField = ref(null);
const typeField = ref(null);
const categoryOptions = [
{ text: "自定义", value: "自定义" },
{ text: "大中修工程设备", value: "大中修工程设备" },
{ text: "小修保养设备", value: "小修保养设备" },
{ text: "交通工具", value: "交通工具" },
];
const typeOptions = [
{ text: "自定义", value: "自定义" },
{ text: "装载机", value: "装载机" },
{ text: "路面修补设备", value: "路面修补设备" },
{ text: "清扫车", value: "清扫车" },
{ text: "压路机", value: "压路机" },
{ text: "洒水车", value: "洒水车" },
{ text: "挖掘机", value: "挖掘机" },
{ text: "运输货车", value: "运输货车" },
{ text: "灌缝设备", value: "灌缝设备" },
{ text: "应急抢险车", value: "应急抢险车" },
{ text: "应急巡查车", value: "应急巡查车" },
{ text: "高空作业车", value: "高空作业车" },
{ text: "除雪设备", value: "除雪设备" },
{ text: "照明设备", value: "照明设备" },
{ text: "护栏维修设备", value: "护栏维修设备" },
{ text: "标线设备", value: "标线设备" },
{ text: "绿化修剪设备", value: "绿化修剪设备" },
{ text: "桥梁维护设备", value: "桥梁维护设备" },
{ text: "发电机", value: "发电机" },
{ text: "沥青洒布车", value: "沥青洒布车" },
{ text: "拖车", value: "拖车" },
{ text: "摊铺机", value: "摊铺机" },
{ text: "抽水设备", value: "抽水设备" },
{ text: "沥青拌和站", value: "沥青拌和站" },
{ text: "水泥拌和机", value: "水泥拌和机" },
{ text: "平地机", value: "平地机" },
{ text: "除雾设备", value: "除雾设备" },
{ text: "无人机", value: "无人机" },
{ text: "推土机", value: "推土机" },
{ text: "稀浆封层设备", value: "稀浆封层设备" },
];
const onCategoryConfirm = (value) => {
if (value.selectedValues[0] === "自定义") {
showCategoryPicker.value = false;
categoryField.value.focus();
} else {
editForm.equipment.sbdl = value.selectedValues[0];
showCategoryPicker.value = false;
}
};
const onTypeConfirm = (value) => {
if (value.selectedValues[0] === "自定义") {
showTypePicker.value = false;
typeField.value.focus();
} else {
editForm.equipment.sblx = value.selectedValues[0];
showTypePicker.value = false;
}
};
// 设备管理员
const showAdminPicker = ref(false);
const adminOptions = ref([]);
const onAdminConfirm = (value) => {
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 = ref([]);
const operatorConfirm = (value) => {
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;
};
// 购置日期
const showTimePicker = ref(false);
const currentDate = ref([
new Date().getFullYear(),
new Date().getMonth() + 1,
new Date().getDate(),
]);
const onDateConfirm = ({ selectedValues }) => {
editForm.gzrq = selectedValues.join("-");
showTimePicker.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);
const emergencyOptions = [
{ text: "是", value: "是" },
{ text: "否", value: "否" },
];
const onEmergencyConfirm = (value) => {
editForm.sfyjsb = value.selectedValues[0];
showEmergencyPicker.value = false;
};
// 是否纳入市级补助相关
const showSubsidyPicker = ref(false);
const subsidyOptions = [
{ text: "是", value: "是" },
{ text: "否", value: "否" },
];
const onSubsidyConfirm = (value) => {
editForm.sfnrsjbz = value.selectedValues[0];
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))
const res = await request({
url: "/snow-ops-platform/yjsb/update",
method: "POST",
data: editForm,
});
if (res.code && res.code === "00000") {
showToast({ type: "success", message: "修改成功" });
getEquipmentDetailInfo(); // 刷新详情数据
showEditPopup.value = false;
} else {
throw new Error(res.message);
}
} catch (error) {
showToast({ type: "fail", message: error.message || "修改失败" });
console.log("error", error);
}
};
const showImage = (photos) => {
const photosArr = photos.map((item) => item.photoUrl);
showImagePreview({
images: photosArr,
closeable: true,
});
};
</script>
<style scoped>
.home {
padding-top: var(--van-nav-bar-height); /* 自动匹配导航栏高度 */
}
.content {
padding: 16px 16px 80px 16px;
}
.grid {
margin-top: 16px;
}
.btn {
margin-top: 24px;
}
.status-tag {
display: inline-block;
padding: 3px 8px;
border-radius: 4px;
color: white;
font-size: 12px;
}
.status-good {
background-color: #07c160;
}
.status-warning {
background-color: #ff976a;
}
.status-danger {
background-color: #ee0a24;
}
.device-form {
padding: 16px 16px 80px 16px;
}
</style>