From 60501db2df54c0b5b80f19714c39d4b789da4cc6 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期三, 14 一月 2026 15:44:38 +0800
Subject: [PATCH] fix: 合并军泰伟业 生产模块代码

---
 src/views/procurementManagement/procurementLedger/index.vue |  461 +-------------------------------------------------------
 1 files changed, 15 insertions(+), 446 deletions(-)

diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 99a392f..da4266e 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -39,7 +39,6 @@
     <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>
@@ -167,7 +166,7 @@
         <el-table-column
             fixed="right"
             label="鎿嶄綔"
-            min-width="150"
+            width="100"
             align="center"
         >
           <template #default="scope">
@@ -177,13 +176,6 @@
                 size="small"
                 @click="openForm('edit', scope.row)"
             >缂栬緫</el-button
-            >
-            <el-button
-                link
-                type="success"
-                size="small"
-                @click="showQRCode(scope.row)"
-            >鐢熸垚浜岀淮鐮�</el-button
             >
 
           </template>
@@ -198,11 +190,14 @@
           @pagination="paginationChange"
       />
     </div>
-    <el-dialog
+    <FormDialog
         v-model="dialogFormVisible"
         :title="operationType === 'add' ? '鏂板閲囪喘鍙拌处椤甸潰' : '缂栬緫閲囪喘鍙拌处椤甸潰'"
-        width="70%"
+        :width="'70%'"
+        :operation-type="operationType"
         @close="closeDia"
+        @confirm="submitForm"
+        @cancel="closeDia"
     >
       <el-form
           :model="form"
@@ -474,18 +469,15 @@
           </el-col>
         </el-row>
       </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">纭</el-button>
-          <el-button @click="closeDia">鍙栨秷</el-button>
-        </div>
-      </template>
-    </el-dialog>
-    <el-dialog
+    </FormDialog>
+    <FormDialog
         v-model="productFormVisible"
         :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'"
-        width="40%"
+        :width="'40%'"
+        :operation-type="productOperationType"
         @close="closeProductDia"
+        @confirm="submitProduct"
+        @cancel="closeProductDia"
     >
       <el-form
           :model="productForm"
@@ -632,228 +624,7 @@
           </el-col>
         </el-row>
       </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitProduct">纭</el-button>
-          <el-button @click="closeProductDia">鍙栨秷</el-button>
-        </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>
+    </FormDialog>
 
   </div>
 </template>
@@ -861,6 +632,7 @@
 <script setup>
 import {getToken} from "@/utils/auth";
 import pagination from "@/components/PIMTable/Pagination.vue";
+import FormDialog from '@/components/Dialog/FormDialog.vue';
 import {getCurrentInstance, nextTick, onMounted, reactive, ref, toRefs} from "vue";
 import {Search} from "@element-plus/icons-vue";
 import {ElMessage, ElMessageBox} from "element-plus";
@@ -885,10 +657,10 @@
   purchaseListPage
 } from "@/api/procurementManagement/procurementLedger.js";
 import useFormData from "@/hooks/useFormData.js";
-import QRCode from "qrcode";
 import useUserStore from "@/store/modules/user";
 import {modelList, productTreeList} from "@/api/basicData/product.js";
 import dayjs from "dayjs";
+import { getCurrentDate } from "@/utils/index.js";
 
 const { proxy } = getCurrentInstance();
 const tableData = ref([]);
@@ -909,10 +681,6 @@
 const fileList = ref([]);
 
 const userStore = useUserStore();
-
-// 浜岀淮鐮佺浉鍏冲彉閲�
-const qrCodeDialogVisible = ref(false);
-const qrCodeUrl = ref("");
 
 // 璁㈠崟瀹℃壒鐘舵�佹樉绀烘枃鏈�
 const approvalStatusText = {
@@ -1672,10 +1440,6 @@
     }
   }
 };
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
-  return dayjs().format("YYYY-MM-DD");
-}
 const mathNum = () => {
   if (!productForm.value.taxRate) {
     proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
@@ -1756,201 +1520,6 @@
     productData.value = data;
   }
 };
-
-// 鏄剧ず浜岀淮鐮�
-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;
-  }
-
-  try {
-    const a = document.createElement('a');
-    a.href = qrCodeUrl.value;
-    a.download = `閲囪喘鍚堝悓鍙蜂簩缁寸爜_${dayjs().format('YYYYMMDDHHmmss')}.png`;
-    document.body.appendChild(a);
-    a.click();
-    document.body.removeChild(a);
-    proxy.$modal.msgSuccess("涓嬭浇鎴愬姛");
-  } catch (error) {
-    console.error('涓嬭浇浜岀淮鐮佸け璐�:', error);
-    proxy.$modal.msgError("涓嬭浇澶辫触锛岃绋嶅悗閲嶈瘯");
-  }
-};
-
-// 鎵爜鏂板瀵硅瘽妗嗙浉鍏冲彉閲�
-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 = async () => {
-  try {
-    const valid = await proxy.$refs["scanAddFormRef"].validate().catch(() => false);
-    if (!valid) {
-      return;
-    }
-    
-    // 鏋勫缓鏂板鏁版嵁
-    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
-    };
-
-    // await addOrEditPurchase(newData);
-    
-    proxy.$modal.msgSuccess("鎵爜鏂板鎴愬姛锛�");
-    closeScanAddDialog();
-    getList(); // 鍒锋柊鍒楄〃
-  } catch (error) {
-    console.error('鎻愪氦鎵爜鏂板澶辫触:', error);
-    proxy.$modal.msgError("鎻愪氦澶辫触锛岃绋嶅悗閲嶈瘯");
-  }
-};
-
-// 鎵撳紑鎵爜鐧昏瀵硅瘽妗�
-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 = async () => {
-  try {
-    const valid = await proxy.$refs["scanFormRef"].validate().catch(() => false);
-    if (!valid) {
-      return;
-    }
-    
-    // 娣诲姞鎵爜璁板綍
-    scanRecords.value.push({
-      ...scanForm,
-      id: Date.now(), // 妯℃嫙ID
-      scanTime: getCurrentDateTime(),
-    });
-    scanForm.scanStatus = "宸叉壂鐮�";
-    scanForm.scanRemark = scanForm.scanRemark || "鏃�";
-    proxy.$modal.msgSuccess("鎵爜鐧昏鎴愬姛锛�");
-    closeScanDialog();
-  } catch (error) {
-    console.error('鎻愪氦鎵爜鐧昏澶辫触:', error);
-    proxy.$modal.msgError("鎻愪氦澶辫触锛岃绋嶅悗閲嶈瘯");
-  }
-};
-
-// 鑾峰彇褰撳墠鏃ユ湡鏃堕棿
-function getCurrentDateTime() {
-  return dayjs().format("YYYY-MM-DD HH:mm:ss");
-}
 
 // 娣诲姞琛岀被鍚嶆柟娉�
 const tableRowClassName = ({ row }) => {

--
Gitblit v1.9.3