From 27ce18fd8a186871be6338c689a8a79c3a00e5fb Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期五, 05 十二月 2025 14:15:54 +0800
Subject: [PATCH] 1.海川开心-营销,采购-客户,供应商可以进行模糊查询

---
 src/views/procurementManagement/procurementLedger/index.vue |  576 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 517 insertions(+), 59 deletions(-)

diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index d498c29..679418d 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -2,26 +2,43 @@
   <div class="app-container">
     <div class="search_form">
       <div>
-        <span class="search_title">閲囪喘鍚堝悓鍙凤細</span>
-        <el-input
-          v-model="searchForm.purchaseContractNumber"
-          style="width: 240px"
-          placeholder="璇疯緭鍏�"
-          @change="handleQuery"
-          clearable
-          :prefix-icon="Search"
-        />
-        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
-          >鎼滅储</el-button
-        >
+        <el-form :model="searchForm" :inline="true">
+          <el-form-item label="渚涘簲鍟嗗悕绉帮細">
+            <el-input v-model="searchForm.supplierName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
+                      @change="handleQuery" />
+          </el-form-item>
+          <el-form-item label="閲囪喘鍚堝悓鍙凤細">
+            <el-input
+                v-model="searchForm.purchaseContractNumber"
+                style="width: 240px"
+                placeholder="璇疯緭鍏�"
+                @change="handleQuery"
+                clearable
+                :prefix-icon="Search"
+            />
+          </el-form-item>
+          <el-form-item label="閿�鍞悎鍚屽彿锛�">
+            <el-input v-model="searchForm.salesContractNo" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
+                      @change="handleQuery" />
+          </el-form-item>
+          <el-form-item label="褰曞叆鏃ユ湡锛�">
+            <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
+                            placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
+          </el-form-item>
+        </el-form>
       </div>
-      <div>
+
+    </div>
+    <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>
-    </div>
-    <div class="table_list">
       <el-table
         :data="tableData"
         border
@@ -32,7 +49,7 @@
         show-summary
         :summary-method="summarizeMainTable"
         @expand-change="expandChange"
-        height="calc(100vh - 18.5em)"
+        height="calc(100vh - 19em)"
       >
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column type="expand">
@@ -92,12 +109,6 @@
           show-overflow-tooltip
         />
         <el-table-column
-          label="椤圭洰鍚嶇О"
-          prop="projectName"
-          width="420"
-          show-overflow-tooltip
-        />
-        <el-table-column
           label="浠樻鏂瑰紡"
           width="100"
           prop="paymentMethod"
@@ -125,7 +136,7 @@
         <el-table-column
           fixed="right"
           label="鎿嶄綔"
-          min-width="60"
+          min-width="150"
           align="center"
         >
           <template #default="scope">
@@ -134,9 +145,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="success"
+              size="small"
+              @click="showQRCode(scope.row)"
+              >鐢熸垚浜岀淮鐮�</el-button
+            >
+
           </template>
         </el-table-column>
       </el-table>
@@ -177,6 +195,7 @@
               <el-select
                 v-model="form.salesLedgerId"
                 placeholder="璇烽�夋嫨"
+								filterable
                 clearable
                 @change="salesLedgerChange"
               >
@@ -196,6 +215,7 @@
               <el-select
                 v-model="form.supplierId"
                 placeholder="璇烽�夋嫨"
+								filterable
                 clearable
               >
                 <el-option
@@ -207,16 +227,31 @@
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="12">
-            <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
-              <el-input
-                v-model="form.projectName"
-                placeholder="璇疯緭鍏�"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
+					<el-col :span="12">
+						<el-form-item label="浠樻鏂瑰紡">
+							<el-input
+								v-model="form.paymentMethod"
+								placeholder="璇疯緭鍏�"
+								clearable
+							/>
+						</el-form-item>
+					</el-col>
         </el-row>
+				<el-row :gutter="30">
+					<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">
@@ -224,7 +259,9 @@
                 v-model="form.recorderId"
                 placeholder="璇烽�夋嫨"
                 clearable
-                disabled
+                filterable
+                default-first-option
+                :reserve-keyword="false"
               >
                 <el-option
                   v-for="item in userList"
@@ -238,24 +275,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>
@@ -289,6 +314,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="鍚◣鍗曚环(鍏�)"
@@ -510,6 +536,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>
@@ -519,13 +556,214 @@
         </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="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.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>
   </div>
 </template>
 
 <script setup>
 import { getToken } from "@/utils/auth";
 import pagination from "@/components/PIMTable/Pagination.vue";
-import { ref, onMounted } from "vue";
+import { ref, onMounted, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
 import { Search } from "@element-plus/icons-vue";
 import { ElMessageBox } from "element-plus";
 import { userListNoPage } from "@/api/system/user.js";
@@ -546,6 +784,8 @@
   getOptions,
   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([]);
@@ -565,36 +805,55 @@
 const fileList = ref([]);
 import useUserStore from "@/store/modules/user";
 import { modelList, productTreeList } from "@/api/basicData/product.js";
+import dayjs from "dayjs";
 
 const userStore = useUserStore();
+
+// 浜岀淮鐮佺浉鍏冲彉閲�
+const qrCodeDialogVisible = ref(false);
+const qrCodeUrl = ref("");
 
 // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
 const operationType = ref("");
 const dialogFormVisible = ref(false);
 const data = reactive({
   searchForm: {
-    purchaseContractNumber: "",
+    supplierName: "", // 渚涘簲鍟嗗悕绉�
+    purchaseContractNumber: "", // 閲囪喘鍚堝悓缂栧彿
+    salesContractNo: "", // 閿�鍞悎鍚岀紪鍙�
+    entryDate: null, // 褰曞叆鏃ユ湡
+    entryDateStart: undefined,
+    entryDateEnd: undefined,
   },
   form: {
     purchaseContractNumber: "",
     salesLedgerId: "",
-    projectName: "",
     recorderId: "",
     entryDate: "",
     productData: [],
     supplierName: "",
     supplierId: "",
     paymentMethod: "",
+		executionDate: "",
   },
   rules: {
     purchaseContractNumber: [
       { required: true, message: "璇疯緭鍏�", trigger: "blur" },
     ],
-    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 { searchForm, form, rules } = toRefs(data);
+const {  form, rules } = toRefs(data);
+const { form: searchForm } = useFormData({
+  ...data.searchForm,
+  // 璁剧疆褰曞叆鏃ユ湡鑼冨洿涓哄綋澶�
+  entryDate: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')],
+  entryDateStart: dayjs().startOf('day').format('YYYY-MM-DD'),
+  entryDateEnd: dayjs().endOf('day').format('YYYY-MM-DD')
+});
+
 // 浜у搧琛ㄥ崟寮规鏁版嵁
 const productFormVisible = ref(false);
 const productOperationType = ref("");
@@ -613,6 +872,7 @@
     taxInclusiveTotalPrice: "",
     taxExclusiveTotalPrice: "",
     invoiceType: "",
+		warnNum: "",
   },
   productRules: {
     productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
@@ -623,6 +883,7 @@
       { required: true, message: "璇疯緭鍏�", trigger: "blur" },
     ],
     taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+		warnNum: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
     taxInclusiveTotalPrice: [
       { required: true, message: "璇疯緭鍏�", trigger: "blur" },
     ],
@@ -639,6 +900,17 @@
   // 璁剧疆涓婁紶鐨勮姹傚ご閮�
   headers: { Authorization: "Bearer " + getToken() },
 });
+
+const changeDaterange = (value) => {
+  if (value) {
+    searchForm.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
+    searchForm.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
+  } else {
+    searchForm.entryDateStart = undefined;
+    searchForm.entryDateEnd = undefined;
+  }
+  handleQuery();
+};
 
 const formattedNumber = (row, column, cellValue) => {
   return parseFloat(cellValue).toFixed(2);
@@ -675,7 +947,8 @@
 };
 const getList = () => {
   tableLoading.value = true;
-  purchaseListPage({ ...searchForm.value, ...page })
+  const { entryDate, ...rest } = searchForm;
+  purchaseListPage({ ...rest, ...page })
     .then((res) => {
       tableLoading.value = false;
       tableData.value = res.data.records;
@@ -852,10 +1125,15 @@
   });
 };
 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) || "";
+    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);
@@ -870,12 +1148,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瀛楃涓诧級
       }
     }
   }
@@ -1093,7 +1371,6 @@
   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();
   }
 };
@@ -1107,6 +1384,187 @@
   }
 };
 
+// 鏄剧ず浜岀淮鐮�
+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: "",
+  contractAmount: "",
+  paymentMethod: "",
+  recorderName: "",
+  scanRemark: "",
+});
+const scanAddRules = {
+  purchaseContractNumber: [{ required: true, message: "璇疯緭鍏ラ噰璐悎鍚屽彿", trigger: "blur" }],
+  supplierName: [{ required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" }],
+};
+
+// 鎵爜鐧昏瀵硅瘽妗嗙浉鍏冲彉閲�
+const scanDialogVisible = ref(false);
+const scanForm = reactive({
+  purchaseContractNumber: "",
+  supplierName: "",
+  scanTime: "",
+  scannerName: "",
+  scanStatus: "鏈壂鐮�",
+  scanRemark: "",
+});
+const scanRules = {
+  scanRemark: [{ required: true, message: "璇疯緭鍏ユ壂鐮佸娉�", trigger: "blur" }],
+};
+const scanRecords = ref([]);
+
+// 鎵撳紑鎵爜鏂板瀵硅瘽妗�
+const openScanAddDialog = () => {
+  scanAddForm.scanContent = "";
+  scanAddForm.purchaseContractNumber = "";
+  scanAddForm.supplierName = "";
+  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 >= 2) {
+    scanAddForm.purchaseContractNumber = parts[0] || "";
+    scanAddForm.supplierName = parts[1] || "";
+    scanAddForm.contractAmount = parts[2] || "";
+    scanAddForm.paymentMethod = parts[3] || "";
+  }
+};
+
+// 鍏抽棴鎵爜鏂板瀵硅瘽妗�
+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,
+        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.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(() => {
   getList();
 });

--
Gitblit v1.9.3