From 6a4ca55df9aa84ca256ec118cf1d1601817e5c99 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 22 五月 2026 21:27:13 +0800
Subject: [PATCH] feat: 设备台账新增附件上传和详情查看
---
src/views/equipmentManagement/ledger/index.vue | 61 +++++++++++++++++++++++++++++-
src/views/equipmentManagement/ledger/Form.vue | 27 +++++++++++++
2 files changed, 84 insertions(+), 4 deletions(-)
diff --git a/src/views/equipmentManagement/ledger/Form.vue b/src/views/equipmentManagement/ledger/Form.vue
index 45ca248..f1d21f2 100644
--- a/src/views/equipmentManagement/ledger/Form.vue
+++ b/src/views/equipmentManagement/ledger/Form.vue
@@ -156,6 +156,16 @@
/>
</el-form-item>
</el-col>
+ <el-col :span="24">
+ <el-form-item label="璁惧鍥剧墖" prop="storageBlobDTOs">
+ <AttachmentUploadImage
+ v-model:fileList="fileList"
+ :limit="20"
+ :fileSize="5"
+ :buttonText="'涓婁紶鍥剧墖'"
+ />
+ </el-form-item>
+ </el-col>
</el-row>
</el-form>
</template>
@@ -170,7 +180,8 @@
calculateTaxExclusiveTotalPrice,
} from "@/utils/summarizeTable";
import { ElMessage } from "element-plus";
-import {ref, getCurrentInstance} from "vue";
+import { ref, getCurrentInstance, computed } from "vue";
+import AttachmentUploadImage from '@/components/AttachmentUpload/image/index.vue';
const { proxy } = getCurrentInstance();
const { tax_rate } = proxy.useDict("tax_rate");
@@ -230,6 +241,18 @@
// createUser: useUserStore().nickName, // 褰曞叆浜�
createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), // 褰曞叆鏃ユ湡
planRuntimeTime: dayjs().format("YYYY-MM-DD"), // 褰曞叆鏃ユ湡
+ storageBlobDTOs: undefined, // 璁惧鍥剧墖鎻愪氦
+ storageBlobVOs: undefined, // 璁惧鍥剧墖灞曠ず
+});
+
+const fileList = computed({
+ get() {
+ return form.storageBlobVOs || [];
+ },
+ set(val) {
+ form.storageBlobDTOs = val;
+ form.storageBlobVOs = val;
+ }
});
const loadForm = async (id) => {
@@ -259,6 +282,8 @@
} else {
form.planRuntimeTime = undefined;
}
+ form.storageBlobVOs = data.storageBlobVOs;
+ form.storageBlobDTOs = data.storageBlobVOs;
}
};
diff --git a/src/views/equipmentManagement/ledger/index.vue b/src/views/equipmentManagement/ledger/index.vue
index 93b9e6d..af10532 100644
--- a/src/views/equipmentManagement/ledger/index.vue
+++ b/src/views/equipmentManagement/ledger/index.vue
@@ -109,13 +109,52 @@
</div>
</template>
</el-dialog>
+
+ <!-- 璇︽儏瀵硅瘽妗� -->
+ <el-dialog v-model="detailDialogVisible" title="璁惧鍙拌处璇︽儏" width="60%" draggable>
+ <el-descriptions :column="2" border>
+ <el-descriptions-item label="璁惧鍚嶇О">{{ detailData.deviceName }}</el-descriptions-item>
+ <el-descriptions-item label="瑙勬牸鍨嬪彿">{{ detailData.deviceModel }}</el-descriptions-item>
+ <el-descriptions-item label="璁惧鍝佺墝">{{ detailData.deviceBrand }}</el-descriptions-item>
+ <el-descriptions-item label="璁惧绫诲瀷">{{ detailData.type }}</el-descriptions-item>
+ <el-descriptions-item label="渚涘簲鍟�">{{ detailData.supplierName }}</el-descriptions-item>
+ <el-descriptions-item label="瀛樻斁浣嶇疆">{{ detailData.storageLocation }}</el-descriptions-item>
+ <el-descriptions-item label="鍗曚綅">{{ detailData.unit }}</el-descriptions-item>
+ <el-descriptions-item label="鏁伴噺">{{ detailData.number }}</el-descriptions-item>
+ <el-descriptions-item label="鍚敤鎶樻棫">{{ detailData.isDepr === 1 ? '鏄�' : '鍚�' }}</el-descriptions-item>
+ <el-descriptions-item label="姣忓勾鎶樻棫閲戦">{{ detailData.annualDepreciationAmount }}</el-descriptions-item>
+ <el-descriptions-item label="鍚◣鍗曚环">{{ detailData.taxIncludingPriceUnit }}</el-descriptions-item>
+ <el-descriptions-item label="鍚◣鎬讳环">{{ detailData.taxIncludingPriceTotal }}</el-descriptions-item>
+ <el-descriptions-item label="绋庣巼(%)">{{ detailData.taxRate }}</el-descriptions-item>
+ <el-descriptions-item label="涓嶅惈绋庢�讳环">{{ detailData.unTaxIncludingPriceTotal }}</el-descriptions-item>
+ <el-descriptions-item label="褰曞叆鏃ユ湡">{{ detailData.createTime }}</el-descriptions-item>
+ <el-descriptions-item label="棰勮杩愯鏃堕棿">{{ detailData.planRuntimeTime ? dayjs(detailData.planRuntimeTime).format('YYYY-MM-DD') : '' }}</el-descriptions-item>
+ <el-descriptions-item label="璁惧鍥剧墖" :span="2">
+ <div v-if="detailData.storageBlobVOs && detailData.storageBlobVOs.length > 0" style="display: flex; gap: 10px; flex-wrap: wrap;">
+ <el-image
+ v-for="(file, index) in detailData.storageBlobVOs"
+ :key="index"
+ :src="file.previewURL || file.url"
+ :preview-src-list="detailData.storageBlobVOs.map(u => u.previewURL || u.url)"
+ :initial-index="index"
+ style="width: 100px; height: 100px"
+ fit="cover"
+ />
+ </div>
+ <span v-else>鏃犲浘鐗�</span>
+ </el-descriptions-item>
+ </el-descriptions>
+ <template #footer>
+ <el-button @click="detailDialogVisible = false">鍏抽棴</el-button>
+ </template>
+ </el-dialog>
</div>
</template>
<script setup>
import { usePaginationApi } from "@/hooks/usePaginationApi";
// import { Search } from "@element-plus/icons-vue";
-import { getLedgerPage, delLedger } from "@/api/equipmentManagement/ledger";
+import { getLedgerPage, delLedger, getLedgerById } from "@/api/equipmentManagement/ledger";
import { onMounted, getCurrentInstance, ref, reactive } from "vue";
import Modal from "./Modal.vue";
import { ElMessageBox, ElMessage } from "element-plus";
@@ -135,6 +174,9 @@
const qrDialogVisible = ref(false);
const qrCodeUrl = ref("");
const qrRowData = ref(null);
+
+const detailDialogVisible = ref(false);
+const detailData = ref({});
// 瀵煎叆鐩稿叧
const uploadRef = ref(null)
@@ -218,8 +260,14 @@
label: "鎿嶄綔",
align: "center",
fixed: 'right',
- width: 150,
+ width: 180,
operation: [
+ {
+ name: "璇︽儏",
+ clickFun: (row) => {
+ handleDetail(row);
+ },
+ },
{
name: "缂栬緫",
clickFun: (row) => {
@@ -227,7 +275,7 @@
},
},
{
- name: "鐢熸垚浜岀淮鐮�",
+ name: "浜岀淮鐮�",
clickFun: (row) => {
showQRCode(row)
},
@@ -248,6 +296,13 @@
const edit = (id) => {
modalRef.value.loadForm(id);
};
+const handleDetail = async (row) => {
+ const { code, data } = await getLedgerById(row.id);
+ if (code == 200) {
+ detailData.value = data;
+ detailDialogVisible.value = true;
+ }
+};
const changePage = ({ page, limit }) => {
pagination.currentPage = page;
pagination.pageSize = limit;
--
Gitblit v1.9.3