From a19f095ac1404c551719de7e4c08044aa7aa8d2b Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期六, 10 一月 2026 16:15:05 +0800
Subject: [PATCH] 双奇点 1.编辑采购台账时,删除产品时,弹出两个提示需修改下 2.采购台账添加附件操作按钮和页面

---
 src/views/procurementManagement/procurementLedger/index.vue |  572 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 532 insertions(+), 40 deletions(-)

diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 30dacdb..36ff34b 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -39,6 +39,7 @@
     <div class="table_list">
       <div style="display: flex;justify-content: flex-end;margin-bottom: 20px;">
         <el-button type="primary" @click="openForm('add')">鏂板鍙拌处</el-button>
+        <!-- <el-button type="success" @click="openScanAddDialog">鎵爜鏂板</el-button> -->
         <el-button @click="handleOut">瀵煎嚭</el-button>
         <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
       </div>
@@ -52,8 +53,7 @@
         show-summary
         :summary-method="summarizeMainTable"
         @expand-change="expandChange"
-        height="calc(100vh - 18.5em)"
-        stripe
+        height="calc(100vh - 19em)"
       >
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column type="expand">
@@ -63,7 +63,6 @@
               border
               show-summary
               :summary-method="summarizeChildrenTable"
-              stripe
             >
               <el-table-column
                 align="center"
@@ -104,12 +103,10 @@
         <el-table-column
           label="閿�鍞悎鍚屽彿"
           prop="salesContractNo"
-          width="200"
           show-overflow-tooltip
         />
         <el-table-column
           label="渚涘簲鍟嗗悕绉�"
-          width="240"
           prop="supplierName"
           show-overflow-tooltip
         />
@@ -156,9 +153,16 @@
               type="primary"
               size="small"
               @click="openForm('edit', scope.row)"
-							:disabled="scope.row.receiptPaymentAmount>0 || scope.row.recorderName !== userStore.nickName"
               >缂栬緫</el-button
             >
+            <el-button
+              link
+              type="primary"
+              size="small"
+              @click="downLoadFile(scope.row)"
+              >闄勪欢</el-button
+            >
+
           </template>
         </el-table-column>
       </el-table>
@@ -195,12 +199,21 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
-              <el-input
-                v-model="form.salesContractNo"
-                placeholder="璇疯緭鍏�"
+            <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesLedgerId">
+              <el-select
+                v-model="form.salesLedgerId"
+                placeholder="璇烽�夋嫨"
+								filterable
                 clearable
-              />
+                @change="salesLedgerChange"
+              >
+                <el-option
+                  v-for="item in salesContractList"
+                  :key="item.id"
+                  :label="item.salesContractNo"
+                  :value="item.id"
+                />
+              </el-select>
             </el-form-item>
           </el-col>
         </el-row>
@@ -210,6 +223,7 @@
               <el-select
                 v-model="form.supplierId"
                 placeholder="璇烽�夋嫨"
+								filterable
                 clearable
               >
                 <el-option
@@ -231,6 +245,30 @@
             </el-form-item>
           </el-col>
         </el-row>
+				<el-row :gutter="30">
+					<el-col :span="12">
+						<el-form-item label="浠樻鏂瑰紡">
+							<el-input
+								v-model="form.paymentMethod"
+								placeholder="璇疯緭鍏�"
+								clearable
+							/>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="绛捐鏃ユ湡锛�" prop="executionDate">
+							<el-date-picker
+								style="width: 100%"
+								v-model="form.executionDate"
+								value-format="YYYY-MM-DD"
+								format="YYYY-MM-DD"
+								type="date"
+								placeholder="璇烽�夋嫨"
+								clearable
+							/>
+						</el-form-item>
+					</el-col>
+				</el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="褰曞叆浜猴細" prop="recorderId">
@@ -239,6 +277,7 @@
                 placeholder="璇烽�夋嫨"
                 clearable
                 disabled
+								filterable
               >
                 <el-option
                   v-for="item in userList"
@@ -252,24 +291,12 @@
           <el-col :span="12">
             <el-form-item label="褰曞叆鏃ユ湡锛�" prop="entryDate">
               <el-date-picker
-                disabled
                 style="width: 100%"
                 v-model="form.entryDate"
                 value-format="YYYY-MM-DD"
                 format="YYYY-MM-DD"
                 type="date"
                 placeholder="璇烽�夋嫨"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="浠樻鏂瑰紡">
-              <el-input
-                v-model="form.paymentMethod"
-                placeholder="璇疯緭鍏�"
                 clearable
               />
             </el-form-item>
@@ -290,7 +317,6 @@
           border
           @selection-change="productSelected"
           show-summary
-          stripe
           :summary-method="summarizeProTable"
         >
           <el-table-column align="center" type="selection" width="55" />
@@ -304,6 +330,7 @@
           <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
           <el-table-column label="鍗曚綅" prop="unit" width="70" />
           <el-table-column label="鏁伴噺" prop="quantity" width="70" />
+					<el-table-column label="搴撳瓨棰勮鏁伴噺" prop="warnNum" width="120" show-overflow-tooltip />
           <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
           <el-table-column
             label="鍚◣鍗曚环(鍏�)"
@@ -525,6 +552,17 @@
               </el-select>
             </el-form-item>
           </el-col>
+					<el-col :span="12">
+						<el-form-item label="搴撳瓨棰勮鏁伴噺锛�" prop="warnNum">
+							<el-input-number
+								v-model="productForm.warnNum"
+								:precision="2"
+								:step="0.1"
+								clearable
+								style="width: 100%"
+							/>
+						</el-form-item>
+					</el-col>
         </el-row>
       </el-form>
       <template #footer>
@@ -534,6 +572,222 @@
         </div>
       </template>
     </el-dialog>
+    
+    <!-- 浜岀淮鐮佹樉绀哄璇濇 -->
+    <el-dialog
+      v-model="qrCodeDialogVisible"
+      title="閲囪喘鍚堝悓鍙蜂簩缁寸爜"
+      width="400px"
+      center
+    >
+      <div style="text-align: center;">
+        <img :src="qrCodeUrl" alt="浜岀淮鐮�" style="width:200px;height:200px;" />
+        <div style="margin: 20px;">
+          <el-button type="primary" @click="downloadQRCode">涓嬭浇浜岀淮鐮佸浘鐗�</el-button>
+        </div>
+      </div>
+    </el-dialog>
+
+    <!-- 鎵爜鏂板瀵硅瘽妗� -->
+    <el-dialog
+      v-model="scanAddDialogVisible"
+      title="鎵爜鏂板閲囪喘鍙拌处"
+      width="70%"
+      @close="closeScanAddDialog"
+    >
+      <el-form
+        :model="scanAddForm"
+        label-width="140px"
+        label-position="top"
+        :rules="scanAddRules"
+        ref="scanAddFormRef"
+      >
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="鎵爜鍐呭锛�">
+              <el-input
+                v-model="scanAddForm.scanContent"
+                type="textarea"
+                :rows="3"
+                placeholder="璇锋壂鎻忎簩缁寸爜鎴栨墜鍔ㄨ緭鍏ラ噰璐悎鍚屼俊鎭�"
+                @input="parseScanContent"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseContractNumber">
+              <el-input
+                v-model="scanAddForm.purchaseContractNumber"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
+              <el-input
+                v-model="scanAddForm.supplierName"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
+              <el-input
+                v-model="scanAddForm.projectName"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍚堝悓閲戦(鍏�)锛�" prop="contractAmount">
+              <el-input-number
+                v-model="scanAddForm.contractAmount"
+                :precision="2"
+                :step="0.1"
+                clearable
+                style="width: 100%"
+                placeholder="璇疯緭鍏�"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="浠樻鏂瑰紡锛�">
+              <el-input
+                v-model="scanAddForm.paymentMethod"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="褰曞叆浜猴細">
+              <el-input v-model="scanAddForm.recorderName" disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="澶囨敞锛�">
+              <el-input
+                v-model="scanAddForm.remark"
+                type="textarea"
+                :rows="2"
+                placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
+                clearable
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitScanAdd">纭鏂板</el-button>
+          <el-button @click="closeScanAddDialog">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+    <!-- 鎵爜鐧昏瀵硅瘽妗� -->
+    <el-dialog
+      v-model="scanDialogVisible"
+      title="鎵爜鐧昏"
+      width="60%"
+      @close="closeScanDialog"
+    >
+      <el-form
+        :model="scanForm"
+        label-width="120px"
+        label-position="left"
+        :rules="scanRules"
+        ref="scanFormRef"
+      >
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="閲囪喘鍚堝悓鍙凤細">
+              <el-input v-model="scanForm.purchaseContractNumber" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="渚涘簲鍟嗗悕绉帮細">
+              <el-input v-model="scanForm.supplierName" disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="椤圭洰鍚嶇О锛�">
+              <el-input v-model="scanForm.projectName" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎵爜鏃堕棿锛�">
+              <el-input v-model="scanForm.scanTime" disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鎵爜浜猴細">
+              <el-input v-model="scanForm.scannerName" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎵爜鐘舵�侊細">
+              <el-tag :type="scanForm.scanStatus === '宸叉壂鐮�' ? 'success' : 'warning'">
+                {{ scanForm.scanStatus }}
+              </el-tag>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="鎵爜澶囨敞锛�">
+              <el-input
+                v-model="scanForm.scanRemark"
+                type="textarea"
+                :rows="3"
+                placeholder="璇疯緭鍏ユ壂鐮佸娉ㄤ俊鎭�"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="鎵爜璁板綍锛�">
+              <el-table :data="scanRecords" border style="width: 100%">
+                <el-table-column label="搴忓彿" type="index" width="60" align="center" />
+                <el-table-column label="鎵爜鏃堕棿" prop="scanTime" width="180" />
+                <el-table-column label="鎵爜浜�" prop="scannerName" width="120" />
+                <el-table-column label="鎵爜鐘舵��" prop="scanStatus" width="100">
+                  <template #default="scope">
+                    <el-tag :type="scope.row.scanStatus === '宸叉壂鐮�' ? 'success' : 'warning'">
+                      {{ scope.row.scanStatus }}
+                    </el-tag>
+                  </template>
+                </el-table-column>
+                <el-table-column label="澶囨敞" prop="scanRemark" />
+              </el-table>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitScan">纭鎵爜</el-button>
+          <el-button @click="closeScanDialog">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+		<FileList ref="fileListRef" />
   </div>
 </template>
 
@@ -544,15 +798,18 @@
 import { Search } from "@element-plus/icons-vue";
 import { ElMessageBox } from "element-plus";
 import { userListNoPage } from "@/api/system/user.js";
+import FileList from "./fileList.vue";
 import {
   getSalesLedgerWithProducts,
   addOrUpdateSalesLedgerProduct,
   delProduct,
   delLedgerFile,
+  getProductInfoByContractNo,
 } from "@/api/salesManagement/salesLedger.js";
 import {
   addOrEditPurchase,
   delPurchase,
+  getSalesNo,
   purchaseListPage,
   productList,
   getPurchaseById,
@@ -560,6 +817,7 @@
   createPurchaseNo,
 } from "@/api/procurementManagement/procurementLedger.js";
 import useFormData from "@/hooks/useFormData.js";
+import QRCode from "qrcode";
 const { proxy } = getCurrentInstance();
 const tableData = ref([]);
 const productData = ref([]);
@@ -568,6 +826,7 @@
 const modelOptions = ref([]);
 const userList = ref([]);
 const productOptions = ref([]);
+const salesContractList = ref([]);
 const supplierList = ref([]);
 const tableLoading = ref(false);
 const page = reactive({
@@ -582,6 +841,10 @@
 
 const userStore = useUserStore();
 
+// 浜岀淮鐮佺浉鍏冲彉閲�
+const qrCodeDialogVisible = ref(false);
+const qrCodeUrl = ref("");
+
 // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
 const operationType = ref("");
 const dialogFormVisible = ref(false);
@@ -591,16 +854,13 @@
     purchaseContractNumber: "", // 閲囪喘鍚堝悓缂栧彿
     salesContractNo: "", // 閿�鍞悎鍚岀紪鍙�
     projectName: "", // 椤圭洰鍚嶇О
-    entryDate: [
-      dayjs().format("YYYY-MM-DD"),
-      dayjs().add(1, "day").format("YYYY-MM-DD"),
-    ], // 褰曞叆鏃ユ湡
-    entryDateStart: dayjs().format("YYYY-MM-DD"),
-    entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
+    entryDate: null, // 褰曞叆鏃ユ湡
+    entryDateStart: undefined,
+    entryDateEnd: undefined,
   },
   form: {
     purchaseContractNumber: "",
-    salesContractNo: "",
+    salesLedgerId: "",
     projectName: "",
     recorderId: "",
     entryDate: "",
@@ -608,6 +868,7 @@
     supplierName: "",
     supplierId: "",
     paymentMethod: "",
+		executionDate: "",
   },
   rules: {
     purchaseContractNumber: [
@@ -615,6 +876,8 @@
     ],
     projectName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     supplierId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+		entryDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+		executionDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
   },
 });
 const {  form, rules } = toRefs(data);
@@ -638,6 +901,7 @@
     taxInclusiveTotalPrice: "",
     taxExclusiveTotalPrice: "",
     invoiceType: "",
+		warnNum: "",
   },
   productRules: {
     productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
@@ -648,6 +912,7 @@
       { required: true, message: "璇疯緭鍏�", trigger: "blur" },
     ],
     taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+		warnNum: [{ required: false, message: "璇烽�夋嫨", trigger: "change" }],
     taxInclusiveTotalPrice: [
       { required: true, message: "璇疯緭鍏�", trigger: "blur" },
     ],
@@ -779,6 +1044,9 @@
   userListNoPage().then((res) => {
     userList.value = res.data;
   });
+  getSalesNo().then((res) => {
+    salesContractList.value = res;
+  });
   getOptions().then((res) => {
     supplierList.value = res.data;
   });
@@ -801,8 +1069,8 @@
 // 涓婁紶鍓嶆牎妫�
 function handleBeforeUpload(file) {
   // 鏍℃鏂囦欢澶у皬
-  if (file.size > 1024 * 1024 * 50) {
-    proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃50MB!");
+  if (file.size > 1024 * 1024 * 10) {
+    proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!");
     return false;
   }
   proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
@@ -886,10 +1154,16 @@
   });
 };
 const getModels = (value) => {
-  productForm.value.productCategory = findNodeById(productOptions.value, value);
-  modelList({ id: value }).then((res) => {
-    modelOptions.value = res;
-  });
+  if (value) {
+    productForm.value.productCategory = findNodeById(productOptions.value, value) || "";
+    productForm.value.productId = value;
+    modelList({ id: value }).then((res) => {
+      modelOptions.value = res;
+    });
+  } else {
+    productForm.value.productCategory = "";
+    modelOptions.value = [];
+  }
 };
 const getProductModel = (value) => {
   const index = modelOptions.value.findIndex((item) => item.id === value);
@@ -904,12 +1178,12 @@
 const findNodeById = (nodes, productId) => {
   for (let i = 0; i < nodes.length; i++) {
     if (nodes[i].value === productId) {
-      return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
+      return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣鐨刲abel
     }
     if (nodes[i].children && nodes[i].children.length > 0) {
       const foundNode = findNodeById(nodes[i].children, productId);
       if (foundNode) {
-        return foundNode.label; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
+        return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝鐩存帴杩斿洖锛堝凡缁忔槸label瀛楃涓诧級
       }
     }
   }
@@ -966,6 +1240,13 @@
     proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
     return;
   }
+  // 淇濊瘉鑷冲皯淇濈暀涓�鏉′骇鍝佷俊鎭�
+  const remainingCount =
+    productData.value.length - productSelectedRows.value.length;
+  if (remainingCount < 1) {
+    proxy.$modal.msgWarning("鑷冲皯淇濈暀涓�鏉′骇鍝佷俊鎭紝鏃犳硶鍏ㄩ儴鍒犻櫎");
+    return;
+  }
   if (operationType.value === "add") {
     productSelectedRows.value.forEach((selectedRow) => {
       const index = productData.value.findIndex(
@@ -989,7 +1270,7 @@
         delProduct(ids).then((res) => {
           proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
           closeProductDia();
-          getSalesLedgerWithProducts({ id: currentId.value, type: 2 }).then(
+					getPurchaseById({ id: currentId.value, type: 2 }).then(
             (res) => {
               productData.value = res.productData;
             }
@@ -1121,6 +1402,217 @@
     }
   }
 };
+// 閿�鍞悎鍚岄�夋嫨鏀瑰彉鏂规硶
+const salesLedgerChange = async (row) => {
+  console.log("row", row);
+  var index = salesContractList.value.findIndex((item) => item.id == row);
+  console.log("index", index);
+  if (index > -1) {
+    form.value.projectName = salesContractList.value[index].projectName;
+    await querygProductInfoByContractNo();
+  }
+};
+
+const querygProductInfoByContractNo = async () => {
+  const { code, data } = await getProductInfoByContractNo({
+    contractNo: form.value.salesLedgerId,
+  });
+  if (code == 200) {
+    productData.value = data;
+  }
+};
+
+const fileListRef = ref(null)
+const downLoadFile = (row) => {
+	fileListRef.value.open(row.salesLedgerFiles)
+}
+
+// 鏄剧ず浜岀淮鐮�
+const showQRCode = async (row) => {
+  try {
+    // 鏋勫缓浜岀淮鐮佸唴瀹癸紝鍙寘鍚噰璐悎鍚屽彿锛堢函鏂囨湰锛�
+    const qrContent = row.purchaseContractNumber || '';
+    // 妫�鏌ュ唴瀹规槸鍚︿负绌�
+    if (!qrContent || qrContent.trim() === '') {
+      proxy.$modal.msgWarning("璇ヨ娌℃湁閲囪喘鍚堝悓鍙凤紝鏃犳硶鐢熸垚浜岀淮鐮�");
+      return;
+    }
+    qrCodeUrl.value = await QRCode.toDataURL(qrContent, {
+      width: 200,
+      margin: 2,
+      color: {
+        dark: '#000000',
+        light: '#FFFFFF'
+      }
+    });
+    qrCodeDialogVisible.value = true;
+  } catch (error) {
+    console.error('鐢熸垚浜岀淮鐮佸け璐�:', error);
+    proxy.$modal.msgError("鐢熸垚浜岀淮鐮佸け璐ワ細" + error.message);
+  }
+};
+
+// 涓嬭浇浜岀淮鐮�
+const downloadQRCode = () => {
+  if (!qrCodeUrl.value) {
+    proxy.$modal.msgWarning("浜岀淮鐮佹湭鐢熸垚");
+    return;
+  }
+  
+  const a = document.createElement('a');
+  a.href = qrCodeUrl.value;
+  a.download = `閲囪喘鍚堝悓鍙蜂簩缁寸爜_${new Date().getTime()}.png`;
+  document.body.appendChild(a);
+  a.click();
+  document.body.removeChild(a);
+  proxy.$modal.msgSuccess("涓嬭浇鎴愬姛");
+};
+
+// 鎵爜鏂板瀵硅瘽妗嗙浉鍏冲彉閲�
+const scanAddDialogVisible = ref(false);
+const scanAddForm = reactive({
+  scanContent: "",
+  purchaseContractNumber: "",
+  supplierName: "",
+  projectName: "",
+  contractAmount: "",
+  paymentMethod: "",
+  recorderName: "",
+  scanRemark: "",
+});
+const scanAddRules = {
+  purchaseContractNumber: [{ required: true, message: "璇疯緭鍏ラ噰璐悎鍚屽彿", trigger: "blur" }],
+  supplierName: [{ required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" }],
+  projectName: [{ required: true, message: "璇疯緭鍏ラ」鐩悕绉�", trigger: "blur" }],
+};
+
+// 鎵爜鐧昏瀵硅瘽妗嗙浉鍏冲彉閲�
+const scanDialogVisible = ref(false);
+const scanForm = reactive({
+  purchaseContractNumber: "",
+  supplierName: "",
+  projectName: "",
+  scanTime: "",
+  scannerName: "",
+  scanStatus: "鏈壂鐮�",
+  scanRemark: "",
+});
+const scanRules = {
+  scanRemark: [{ required: true, message: "璇疯緭鍏ユ壂鐮佸娉�", trigger: "blur" }],
+};
+const scanRecords = ref([]);
+
+// 鎵撳紑鎵爜鏂板瀵硅瘽妗�
+const openScanAddDialog = () => {
+  scanAddForm.scanContent = "";
+  scanAddForm.purchaseContractNumber = "";
+  scanAddForm.supplierName = "";
+  scanAddForm.projectName = "";
+  scanAddForm.contractAmount = "";
+  scanAddForm.paymentMethod = "";
+  scanAddForm.recorderName = userStore.nickName;
+  scanAddForm.scanRemark = "";
+  scanAddDialogVisible.value = true;
+};
+
+// 瑙f瀽鎵爜鍐呭锛堟ā鎷熻В鏋愪簩缁寸爜鏁版嵁锛�
+const parseScanContent = (content) => {
+  if (!content) return;
+  
+  // 妯℃嫙瑙f瀽浜岀淮鐮佸唴瀹癸紝杩欓噷鍙互鏍规嵁瀹為檯闇�姹傝皟鏁磋В鏋愰�昏緫
+  // 鍋囪鎵爜鍐呭鏍煎紡涓猴細鍚堝悓鍙穦渚涘簲鍟唡椤圭洰|閲戦|浠樻鏂瑰紡
+  const parts = content.split('|');
+  if (parts.length >= 3) {
+    scanAddForm.purchaseContractNumber = parts[0] || "";
+    scanAddForm.supplierName = parts[1] || "";
+    scanAddForm.projectName = parts[2] || "";
+    scanAddForm.contractAmount = parts[3] || "";
+    scanAddForm.paymentMethod = parts[4] || "";
+  }
+};
+
+// 鍏抽棴鎵爜鏂板瀵硅瘽妗�
+const closeScanAddDialog = () => {
+  scanAddDialogVisible.value = false;
+  proxy.resetForm("scanAddFormRef");
+};
+
+// 鎻愪氦鎵爜鏂板
+const submitScanAdd = () => {
+  proxy.$refs["scanAddFormRef"].validate((valid) => {
+    if (valid) {
+      // 鏋勫缓鏂板鏁版嵁
+      const newData = {
+        purchaseContractNumber: scanAddForm.purchaseContractNumber,
+        supplierName: scanAddForm.supplierName,
+        projectName: scanAddForm.projectName,
+        contractAmount: scanAddForm.contractAmount,
+        paymentMethod: scanAddForm.paymentMethod,
+        recorderName: scanAddForm.recorderName,
+        entryDate: getCurrentDate(),
+        remark: scanAddForm.scanRemark,
+        type: 2
+      };
+      
+      // 妯℃嫙鏂板鎴愬姛
+      proxy.$modal.msgSuccess("鎵爜鏂板鎴愬姛锛�");
+      closeScanAddDialog();
+      
+      // 鍙互閫夋嫨鏄惁鍒锋柊鍒楄〃
+      // getList();
+    }
+  });
+};
+
+// 鎵撳紑鎵爜鐧昏瀵硅瘽妗�
+const openScanDialog = (row) => {
+  scanForm.purchaseContractNumber = row.purchaseContractNumber;
+  scanForm.supplierName = row.supplierName;
+  scanForm.projectName = row.projectName;
+  scanForm.scanTime = getCurrentDateTime();
+  scanForm.scannerName = userStore.nickName;
+  scanForm.scanStatus = "鏈壂鐮�";
+  scanForm.scanRemark = "";
+  scanRecords.value = [];
+  scanDialogVisible.value = true;
+};
+
+// 鍏抽棴鎵爜鐧昏瀵硅瘽妗�
+const closeScanDialog = () => {
+  scanDialogVisible.value = false;
+  proxy.resetForm("scanFormRef");
+};
+
+// 鎻愪氦鎵爜鐧昏
+const submitScan = () => {
+  proxy.$refs["scanFormRef"].validate((valid) => {
+    if (valid) {
+      // 娣诲姞鎵爜璁板綍
+      scanRecords.value.push({
+        ...scanForm,
+        id: Date.now(), // 妯℃嫙ID
+        scanTime: getCurrentDateTime(),
+      });
+      scanForm.scanStatus = "宸叉壂鐮�";
+      scanForm.scanRemark = scanForm.scanRemark || "鏃�";
+      proxy.$modal.msgSuccess("鎵爜鐧昏鎴愬姛锛�");
+      closeScanDialog();
+    }
+  });
+};
+
+// 鑾峰彇褰撳墠鏃ユ湡鏃堕棿
+function getCurrentDateTime() {
+  const now = new Date();
+  const year = now.getFullYear();
+  const month = String(now.getMonth() + 1).padStart(2, "0");
+  const day = String(now.getDate()).padStart(2, "0");
+  const hours = String(now.getHours()).padStart(2, "0");
+  const minutes = String(now.getMinutes()).padStart(2, "0");
+  const seconds = String(now.getSeconds()).padStart(2, "0");
+  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+}
+
 
 
 onMounted(() => {

--
Gitblit v1.9.3