From 9030f4f4913935611e613a4064d8e26a01cbf070 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期一, 16 三月 2026 10:43:06 +0800
Subject: [PATCH] fix: 耗材物流-前端
---
src/views/equipmentManagement/repair/Modal/RepairModal.vue | 145 +++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 135 insertions(+), 10 deletions(-)
diff --git a/src/views/equipmentManagement/repair/Modal/RepairModal.vue b/src/views/equipmentManagement/repair/Modal/RepairModal.vue
index 1aa82ec..62ea81d 100644
--- a/src/views/equipmentManagement/repair/Modal/RepairModal.vue
+++ b/src/views/equipmentManagement/repair/Modal/RepairModal.vue
@@ -72,6 +72,28 @@
</el-form-item>
</el-col>
</el-row>
+ <el-row>
+ <el-col :span="24">
+ <el-form-item label="鐜板満鐓х墖">
+ <div class="repair-upload-area">
+ <el-upload
+ v-model:file-list="uploadFileList"
+ :action="uploadUrl"
+ :headers="uploadHeaders"
+ accept="image/*"
+ list-type="picture-card"
+ :limit="uploadLimit"
+ :on-success="handleUploadSuccess"
+ :on-remove="handleRemoveFile"
+ :before-upload="beforeUpload"
+ >
+ <el-icon><Plus /></el-icon>
+ </el-upload>
+ <div v-if="repairFileList.length === 0" class="upload-tip">璇蜂笂浼犵幇鍦虹収鐗囷紝鏈�澶� {{ uploadLimit }} 寮�</div>
+ </div>
+ </el-form-item>
+ </el-col>
+ </el-row>
</el-form>
</FormDialog>
</template>
@@ -84,10 +106,12 @@
getRepairById,
} from "@/api/equipmentManagement/repair";
import { ElMessage } from "element-plus";
+import { Plus } from "@element-plus/icons-vue";
import dayjs from "dayjs";
import useFormData from "@/hooks/useFormData";
import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
import useUserStore from "@/store/modules/user";
+import { getToken } from "@/utils/auth";
defineOptions({
name: "璁惧鎶ヤ慨寮圭獥",
@@ -102,24 +126,83 @@
const userStore = useUserStore();
const deviceOptions = ref([]);
+// 鐜板満鐓х墖涓婁紶锛堜笌 APP 瀛楁涓�鑷达細fileList / commonFileList锛�
+const uploadUrl = import.meta.env.VITE_APP_BASE_API + "/file/upload";
+const uploadLimit = 10;
+const uploadFileList = ref([]);
+const repairFileList = ref([]);
+const uploadHeaders = { Authorization: "Bearer " + getToken() };
+const baseApi = import.meta.env.VITE_APP_BASE_API || "";
+
+const formatFileUrl = (url) => {
+ if (!url) return "";
+ if (url.startsWith("http://") || url.startsWith("https://")) return url;
+ const path = url.replace(/^\/+/, "");
+ return path ? baseApi + "/" + path : baseApi;
+};
+
const loadDeviceName = async () => {
const { data } = await getDeviceLedger();
deviceOptions.value = data;
};
const { form, resetForm } = useFormData({
- deviceLedgerId: undefined, // 璁惧Id
- deviceName: undefined, // 璁惧鍚嶇О
- deviceModel: undefined, // 瑙勬牸鍨嬪彿
- repairTime: dayjs().format("YYYY-MM-DD"), // 鎶ヤ慨鏃ユ湡锛岄粯璁ゅ綋澶�
- repairName: userStore.nickName, // 鎶ヤ慨浜�
- remark: undefined, // 鏁呴殰鐜拌薄
- status: 0, // 鎶ヤ慨鐘舵��
+ deviceLedgerId: undefined,
+ deviceName: undefined,
+ deviceModel: undefined,
+ repairTime: dayjs().format("YYYY-MM-DD"),
+ repairName: userStore.nickName,
+ remark: undefined,
+ status: 0,
});
const setDeviceModel = (deviceId) => {
const option = deviceOptions.value.find((item) => item.id === deviceId);
form.deviceModel = option.deviceModel;
+};
+
+const beforeUpload = (file) => {
+ const isImage = file.type.startsWith("image/");
+ if (!isImage) {
+ ElMessage.warning("鍙兘涓婁紶鍥剧墖");
+ return false;
+ }
+ if (repairFileList.value.length >= uploadLimit) {
+ ElMessage.warning(`鏈�澶氫笂浼� ${uploadLimit} 寮犲浘鐗嘸);
+ return false;
+ }
+ return true;
+};
+
+const handleUploadSuccess = (res, file) => {
+ if (res?.code !== 200 && res?.code !== 0) {
+ ElMessage.error(res?.msg || "涓婁紶澶辫触");
+ const idx = uploadFileList.value.findIndex((f) => f.uid === file.uid);
+ if (idx > -1) uploadFileList.value.splice(idx, 1);
+ return;
+ }
+ const d = res?.data !== undefined ? res.data : res;
+ if (!d) return;
+ const item = {
+ uid: file.uid,
+ id: d.id,
+ url: d.url || d.downloadUrl || d.tempPath,
+ downloadUrl: d.downloadUrl || d.url,
+ bucketFilename: d.bucketFilename || d.originalFilename || file.name,
+ originalFilename: d.originalFilename || d.bucketFilename || file.name,
+ name: d.bucketFilename || d.originalFilename || file.name,
+ size: d.size ?? d.byteSize ?? file.size,
+ byteSize: d.byteSize ?? d.size ?? file.size,
+ uploadResponse: res,
+ };
+ repairFileList.value.push(item);
+};
+
+const handleRemoveFile = (file) => {
+ const targetUrl = file.url || file.response?.data?.url || file.response?.data?.downloadUrl;
+ repairFileList.value = repairFileList.value.filter(
+ (f) => f.uid !== file.uid && (f.url || f.downloadUrl) !== targetUrl
+ );
};
const setForm = (data) => {
@@ -130,14 +213,39 @@
form.repairName = data.repairName;
form.remark = data.remark;
form.status = data.status;
+ const list = data.fileList || data.commonFileList || [];
+ repairFileList.value = (Array.isArray(list) ? list : []).map((f, i) => ({
+ uid: f.id || "existing-" + i,
+ id: f.id,
+ url: f.url || f.downloadUrl,
+ downloadUrl: f.downloadUrl || f.url,
+ bucketFilename: f.bucketFilename || f.originalFilename || f.name,
+ originalFilename: f.originalFilename || f.bucketFilename || f.name,
+ name: f.bucketFilename || f.originalFilename || f.name || "鍥剧墖",
+ size: f.size ?? f.byteSize,
+ byteSize: f.byteSize ?? f.size,
+ ...f,
+ }));
+ uploadFileList.value = repairFileList.value.map((f, i) => ({
+ uid: f.uid || "existing-" + i,
+ name: f.name || f.bucketFilename || "鍥剧墖",
+ url: formatFileUrl(f.url || f.downloadUrl),
+ status: "success",
+ }));
};
const sendForm = async () => {
loading.value = true;
try {
+ const fileList = repairFileList.value.map((f) => {
+ const d = f.uploadResponse?.data !== undefined ? f.uploadResponse.data : f.uploadResponse;
+ return d ? { ...d } : (f.id || f.url ? { ...f } : null);
+ }).filter(Boolean);
+ const submitData = { ...form };
+ if (fileList.length) submitData.fileList = fileList;
const { code } = id.value
- ? await editRepair({ id: unref(id), ...form })
- : await addRepair(form);
+ ? await editRepair({ id: unref(id), ...submitData })
+ : await addRepair(submitData);
if (code == 200) {
ElMessage.success(`${id.value ? "缂栬緫" : "鏂板"}鎶ヤ慨鎴愬姛`);
visible.value = false;
@@ -150,16 +258,22 @@
const handleCancel = () => {
resetForm();
+ repairFileList.value = [];
+ uploadFileList.value = [];
visible.value = false;
};
const handleClose = () => {
resetForm();
+ repairFileList.value = [];
+ uploadFileList.value = [];
visible.value = false;
};
const openAdd = async () => {
id.value = undefined;
+ repairFileList.value = [];
+ uploadFileList.value = [];
visible.value = true;
await nextTick();
await loadDeviceName();
@@ -180,4 +294,15 @@
});
</script>
-<style lang="scss" scoped></style>
+<style lang="scss" scoped>
+.repair-upload-area {
+ :deep(.el-upload-list--picture-card) {
+ --el-upload-list-picture-card-size: 100px;
+ }
+}
+.upload-tip {
+ font-size: 12px;
+ color: var(--el-text-color-secondary);
+ margin-top: 8px;
+}
+</style>
--
Gitblit v1.9.3