From 28fc65c34d1642b007dc45b83782e23be58d718c Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期三, 08 七月 2026 16:43:58 +0800
Subject: [PATCH] 已进行排班并且人员已打卡的前提下,对应的班次配置不能编辑删除。

---
 src/views/equipmentManagement/ledger/index.vue |   96 ++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 89 insertions(+), 7 deletions(-)

diff --git a/src/views/equipmentManagement/ledger/index.vue b/src/views/equipmentManagement/ledger/index.vue
index 5555182..af10532 100644
--- a/src/views/equipmentManagement/ledger/index.vue
+++ b/src/views/equipmentManagement/ledger/index.vue
@@ -4,7 +4,7 @@
       <el-form-item label="璁惧鍚嶇О">
         <el-input
           v-model="filters.deviceName"
-          style="width: 240px"
+          style="width: 200px"
           placeholder="璇疯緭鍏ヨ澶囧悕绉�"
           clearable
           @change="getTableData"
@@ -13,7 +13,7 @@
       <el-form-item label="瑙勬牸鍨嬪彿">
         <el-input
             v-model="filters.deviceModel"
-            style="width: 240px"
+            style="width: 200px"
             placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
             clearable
             @change="getTableData"
@@ -22,7 +22,7 @@
       <el-form-item label="渚涘簲鍟�">
         <el-input
             v-model="filters.supplierName"
-            style="width: 240px"
+            style="width: 200px"
             placeholder="璇疯緭鍏ヤ緵搴斿晢"
             clearable
             @change="getTableData"
@@ -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)
 					},
@@ -247,6 +295,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;
@@ -298,7 +353,34 @@
 const showQRCode = async (row) => {
   // 鐩存帴浣跨敤URL锛屼笉瑕佺敤JSON.stringify鍖呰
   const qrContent = proxy.javaApi + '/device-info?deviceId=' + row.id;
-  qrCodeUrl.value = await QRCode.toDataURL(qrContent);
+  const qrDataUrl = await QRCode.toDataURL(qrContent, { width: 200, margin: 2 });
+  
+  // 鍒涘缓canvas鍚堟垚甯﹀悕绉扮殑浜岀淮鐮佸浘鐗�
+  const canvas = document.createElement('canvas');
+  const ctx = canvas.getContext('2d');
+  const qrSize = 200;
+  const textHeight = 30;
+  const padding = 10;
+  canvas.width = qrSize + padding * 2;
+  canvas.height = qrSize + textHeight + padding * 2;
+  
+  // 濉厖鐧借壊鑳屾櫙
+  ctx.fillStyle = '#ffffff';
+  ctx.fillRect(0, 0, canvas.width, canvas.height);
+  
+  // 缁樺埗浜岀淮鐮�
+  const qrImg = new Image();
+  qrImg.src = qrDataUrl;
+  await new Promise((resolve) => { qrImg.onload = resolve; });
+  ctx.drawImage(qrImg, padding, padding, qrSize, qrSize);
+  
+  // 缁樺埗璁惧鍚嶇О
+  ctx.fillStyle = '#333333';
+  ctx.font = 'bold 14px Arial';
+  ctx.textAlign = 'center';
+  ctx.fillText(row.deviceName || '', canvas.width / 2, qrSize + padding + 20);
+  
+  qrCodeUrl.value = canvas.toDataURL('image/png');
   qrRowData.value = row;
   qrDialogVisible.value = true;
 };

--
Gitblit v1.9.3