From 5a96e6a94c982d413af29b9b2ee2a460bac121fd Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期六, 18 七月 2026 11:43:07 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_pro_河南鹤壁' into dev_pro_河南鹤壁

---
 src/views/procurementManagement/procurementLedger/index.vue |  213 +++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 151 insertions(+), 62 deletions(-)

diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 1b6b268..e2d340b 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -45,6 +45,7 @@
         <el-button @click="handleOut">瀵煎嚭</el-button>
         <el-button type="danger" plain @click="handleDelete">鍒犻櫎
         </el-button>
+        <el-button type="warning" plain @click="handlePrint">鎵撳嵃鍗曟嵁</el-button>
       </div>
       <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
         :expand-row-keys="expandedRowKeys" :row-key="(row) => row.id" show-summary :summary-method="summarizeMainTable"
@@ -68,7 +69,7 @@
               <el-table-column label="鍙敤鏁伴噺" prop="availableQuality" />
               <el-table-column label="閫�璐ф暟閲�" prop="returnQuality" />
               <el-table-column label="绋庣巼(%)" prop="taxRate" />
-              <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="unitPriceFormatter" />
+              <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
               <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
               <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
             </el-table>
@@ -100,14 +101,14 @@
         <el-table-column label="褰曞叆浜�" prop="recorderName" width="120" show-overflow-tooltip />
         <el-table-column label="褰曞叆鏃ユ湡" prop="entryDate" width="100" show-overflow-tooltip />
         <el-table-column label="澶囨敞" prop="remarks" width="200" show-overflow-tooltip />
-        <el-table-column fixed="right" label="鎿嶄綔" width="180" align="center">
+        <el-table-column fixed="right" label="鎿嶄綔" width="220" align="center">
           <template #default="scope">
             <el-button link type="primary" @click="openForm('detail', scope.row)">璇︽儏
             </el-button>
             <el-button link type="primary" @click="openForm('edit', scope.row)"
               :disabled="scope.row.stockInStatus === '瀹屽叏鍏ュ簱'">缂栬緫
             </el-button>
-            <el-button link type="primary" @click="openFileDialog(scope.row)">闄勪欢</el-button>
+            <el-button link type="primary" @click="downloadOrder(scope.row.id)">涓嬭浇</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -161,7 +162,7 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="褰曞叆浜猴細" prop="recorderId">
-              <el-select v-model="form.recorderId" placeholder="璇烽�夋嫨" clearable filterable>
+              <el-select v-model="form.recorderId" placeholder="璇烽�夋嫨" clearable filterable disabled>
                 <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
               </el-select>
             </el-form-item>
@@ -208,9 +209,9 @@
           <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="warnNum" width="120" show-overflow-tooltip />-->
           <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
-          <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="unitPriceFormatter" width="150" />
+          <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" width="150" />
           <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" width="150" />
           <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" width="150" />
           <el-table-column label="鏄惁璐ㄦ" prop="isChecked" width="150">
@@ -276,20 +277,22 @@
       @cancel="closeProductDia">
       <el-form :model="productForm" label-width="140px" label-position="top" :rules="productRules" ref="productFormRef">
         <el-row :gutter="30">
-          <el-col :span="24">
-            <el-form-item label="浜у搧澶х被锛�" prop="productId">
-              <el-tree-select v-model="productForm.productId" placeholder="璇烽�夋嫨" clearable filterable check-strictly
-                @change="getModels" :data="productOptions" :render-after-expand="false" style="width: 100%" />
+          <el-col :span="12">
+            <el-form-item label="浜у搧澶х被锛�" prop="productCategory">
+              <el-input v-model="productForm.productCategory"
+                        placeholder="鐐瑰嚮閫夋嫨"
+                        readonly
+                        @click="showProductSelectDialog = true"
+                        style="cursor:pointer" />
             </el-form-item>
           </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="24">
+          <el-col :span="12">
             <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
-              <el-select v-model="productForm.productModelId" placeholder="璇烽�夋嫨" filterable clearable
-                @change="getProductModel">
-                <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
-              </el-select>
+              <el-input v-model="productForm.specificationModel"
+                        placeholder="鐐瑰嚮閫夋嫨"
+                        readonly
+                        @click="showProductSelectDialog = true"
+                        style="cursor:pointer" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -310,7 +313,7 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍚◣鍗曚环(鍏�)锛�" prop="taxInclusiveUnitPrice">
-              <el-input-number v-model="productForm.taxInclusiveUnitPrice" :precision="6" :step="0.1" :min="0" clearable
+              <el-input-number v-model="productForm.taxInclusiveUnitPrice" :precision="6" :step="0.000001" :min="0" clearable
                 style="width: 100%" @change="mathNum" />
             </el-form-item>
           </el-col>
@@ -324,13 +327,13 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍚◣鎬讳环(鍏�)锛�" prop="taxInclusiveTotalPrice">
-              <el-input-number v-model="productForm.taxInclusiveTotalPrice" :precision="2" :step="0.1" :min="0"
+              <el-input-number v-model="productForm.taxInclusiveTotalPrice" :precision="6" :step="0.000001" :min="0"
                 clearable style="width: 100%" @change="reverseMathNum('taxInclusiveTotalPrice')" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="涓嶅惈绋庢�讳环(鍏�)锛�" prop="taxExclusiveTotalPrice">
-              <el-input-number v-model="productForm.taxExclusiveTotalPrice" :precision="2" :step="0.1" :min="0"
+              <el-input-number v-model="productForm.taxExclusiveTotalPrice" :precision="6" :step="0.000001" :min="0"
                 clearable style="width: 100%" @change="reverseMathNum('taxExclusiveTotalPrice')" />
             </el-form-item>
           </el-col>
@@ -344,14 +347,12 @@
               </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" :min="0" clearable
-                style="width: 100%" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
+<!--          <el-col :span="12">-->
+<!--            <el-form-item label="搴撳瓨棰勮鏁伴噺锛�" prop="warnNum">-->
+<!--              <el-input-number v-model="productForm.warnNum" :precision="2" :step="0.1" :min="0" clearable-->
+<!--                style="width: 100%" />-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
           <el-col :span="12">
             <el-form-item label="鏄惁璐ㄦ锛�" prop="isChecked">
               <el-radio-group v-model="productForm.isChecked">
@@ -361,8 +362,21 @@
             </el-form-item>
           </el-col>
         </el-row>
+<!--        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="鏄惁璐ㄦ锛�" prop="isChecked">
+              <el-radio-group v-model="productForm.isChecked">
+                <el-radio label="鏄�" :value="true" />
+                <el-radio label="鍚�" :value="false" />
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>-->
       </el-form>
     </FormDialog>
+    <ProductSelectDialog v-model="showProductSelectDialog"
+                         @confirm="handleProductSelect"
+                         single />
     <FileList v-if="fileListDialogVisible" v-model:visible="fileListDialogVisible" record-type="purchase_ledger"
       :record-id="recordId" />
     <Detail ref="detailRef" />
@@ -403,6 +417,7 @@
   productList,
   getPurchaseById,
   getOptions,
+  getPrintData,
   getPurchaseTemplateList,
   delPurchaseTemplate,
 } from "@/api/procurementManagement/procurementLedger.js";
@@ -435,8 +450,11 @@
 const fileList = ref([]);
 import useUserStore from "@/store/modules/user";
 import { modelList, productTreeList } from "@/api/basicData/product.js";
+import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
 import dayjs from "dayjs";
 import FileUpload from "@/components/AttachmentUpload/file/index.vue";
+import { tableAmountFormatter, formatDecimal, buildAmountSummaryFormat } from '@/utils/numberFormat';
+import { downloadPurchaseJpg, printPurchaseMulti } from "@/utils/documentPrint.js";
 
 const userStore = useUserStore();
 
@@ -632,17 +650,11 @@
 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 showProductSelectDialog = ref(false);
 const productOperationType = ref("");
 const productOperationIndex = ref("");
 const currentId = ref("");
@@ -663,15 +675,15 @@
     isChecked: false,
   },
   productRules: {
-    productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+    productCategory: [{ required: true, message: "璇烽�夋嫨浜у搧澶х被", trigger: "change" }],
+    productModelId: [{ required: true, message: "璇烽�夋嫨瑙勬牸鍨嬪彿", trigger: "change" }],
     unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     taxInclusiveUnitPrice: [
       { required: true, message: "璇疯緭鍏�", trigger: "blur" },
     ],
     taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    warnNum: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+    // warnNum: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
     taxInclusiveTotalPrice: [
       { required: true, message: "璇疯緭鍏�", trigger: "blur" },
     ],
@@ -770,12 +782,7 @@
   handleQuery();
 };
 
-const formattedNumber = (row, column, cellValue) => {
-  return parseFloat(cellValue).toFixed(2);
-};
-const unitPriceFormatter = (row, column, cellValue) => {
-  return parseFloat(cellValue).toFixed(6);
-};
+const formattedNumber = tableAmountFormatter;
 // 鏌ヨ鍒楄〃
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 const handleQuery = () => {
@@ -893,10 +900,19 @@
       "futureTickets",
       "futureTicketsAmount",
     ],
-    {
-      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    }
+    buildAmountSummaryFormat(
+      [
+        "taxInclusiveUnitPrice",
+        "taxInclusiveTotalPrice",
+        "taxExclusiveTotalPrice",
+        "ticketsAmount",
+        "futureTicketsAmount",
+      ],
+      {
+        ticketsNum: { noDecimal: true },
+        futureTickets: { noDecimal: true },
+      }
+    )
   );
 };
 const paginationChange = obj => {
@@ -959,15 +975,27 @@
 };
 // 涓昏〃鍚堣鏂规硶
 const summarizeMainTable = param => {
-  return proxy.summarizeTable(param, ["contractAmount"]);
+  return proxy.summarizeTable(
+    param,
+    ["contractAmount"],
+    buildAmountSummaryFormat(["contractAmount"])
+  );
 };
 // 瀛愯〃鍚堣鏂规硶
 const summarizeProTable = param => {
-  return proxy.summarizeTable(param, [
-    "taxInclusiveUnitPrice",
-    "taxInclusiveTotalPrice",
-    "taxExclusiveTotalPrice",
-  ]);
+  return proxy.summarizeTable(
+    param,
+    [
+      "taxInclusiveUnitPrice",
+      "taxInclusiveTotalPrice",
+      "taxExclusiveTotalPrice",
+    ],
+    buildAmountSummaryFormat([
+      "taxInclusiveUnitPrice",
+      "taxInclusiveTotalPrice",
+      "taxExclusiveTotalPrice",
+    ])
+  );
 };
 // 鎵撳紑寮规
 const openForm = async (type, row) => {
@@ -1008,6 +1036,7 @@
     );
 
     form.value.entryDate = getCurrentDate();
+    form.value.recorderId = userStore.id;
 
     if (type === "add") {
       // 鏂板鏃剁敓鎴愰噰璐悎鍚屽彿
@@ -1235,6 +1264,19 @@
     await nextTick();
   }
 };
+
+// ProductSelectDialog 閫変腑鍥炶皟
+const handleProductSelect = (products) => {
+  if (!products || !products.length) return;
+  const p = products[0];
+  productForm.value.productId = p.productId;
+  productForm.value.productCategory = p.productName || '';
+  productForm.value.productModelId = p.id;
+  productForm.value.specificationModel = p.model || '';
+  productForm.value.unit = p.unit || '';
+  showProductSelectDialog.value = false;
+};
+
 const getProductOptions = () => {
   return productTreeList().then(res => {
     productOptions.value = convertIdToValue(res);
@@ -1417,6 +1459,31 @@
     });
 };
 
+// 鎵归噺鎵撳嵃閲囪喘鍗� - 澶氶�夊悎骞堕瑙�
+const handlePrint = async () => {
+  if (selectedRows.value.length === 0) {
+    proxy.$modal.msgWarning("璇烽�夋嫨瑕佹墦鍗扮殑鏁版嵁");
+    return;
+  }
+  proxy.$modal.loading("姝e湪鍔犺浇鎵撳嵃鏁版嵁...");
+  try {
+    const orders = [];
+    let companyName = '';
+    for (const row of selectedRows.value) {
+      const res = await getPrintData(row.id);
+      const data = res.data || res;
+      companyName = data.companyName || companyName;
+      orders.push({ ledger: data.ledger, products: data.products });
+    }
+    printPurchaseMulti(companyName, orders);
+  } catch (e) {
+    console.error('鎵撳嵃澶辫触:', e);
+    proxy.$modal.msgError("鎵撳嵃澶辫触");
+  } finally {
+    proxy.$modal.closeLoading();
+  }
+};
+
 // 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
 function getCurrentDate() {
   const today = new Date();
@@ -1476,10 +1543,10 @@
   if (field === "taxInclusiveTotalPrice") {
     // 宸茬煡鍚◣鎬讳环鍜屾暟閲忥紝鍙嶇畻鍚◣鍗曚环
     if (productForm.value.quantity) {
-      productForm.value.taxInclusiveUnitPrice = (
+      productForm.value.taxInclusiveUnitPrice = formatDecimal(
         Number(productForm.value.taxInclusiveTotalPrice) /
         Number(productForm.value.quantity)
-      ).toFixed(6);
+      );
       // 纭繚缁撴灉涓嶄负璐熸暟
       if (Number(productForm.value.taxInclusiveUnitPrice) < 0) {
         productForm.value.taxInclusiveUnitPrice = "0";
@@ -1497,30 +1564,30 @@
       }
     }
     // 鍙嶇畻涓嶅惈绋庢�讳环
-    productForm.value.taxExclusiveTotalPrice = (
+    productForm.value.taxExclusiveTotalPrice = formatDecimal(
       Number(productForm.value.taxInclusiveTotalPrice) /
       (1 + taxRate / 100)
-    ).toFixed(2);
+    );
     // 纭繚缁撴灉涓嶄负璐熸暟
     if (Number(productForm.value.taxExclusiveTotalPrice) < 0) {
       productForm.value.taxExclusiveTotalPrice = "0";
     }
   } else if (field === "taxExclusiveTotalPrice") {
     // 鍙嶇畻鍚◣鎬讳环
-    productForm.value.taxInclusiveTotalPrice = (
+    productForm.value.taxInclusiveTotalPrice = formatDecimal(
       Number(productForm.value.taxExclusiveTotalPrice) *
       (1 + taxRate / 100)
-    ).toFixed(2);
+    );
     // 纭繚缁撴灉涓嶄负璐熸暟
     if (Number(productForm.value.taxInclusiveTotalPrice) < 0) {
       productForm.value.taxInclusiveTotalPrice = "0";
     }
     // 宸茬煡鏁伴噺锛屽弽绠楀惈绋庡崟浠�
     if (productForm.value.quantity) {
-      productForm.value.taxInclusiveUnitPrice = (
+      productForm.value.taxInclusiveUnitPrice = formatDecimal(
         Number(productForm.value.taxInclusiveTotalPrice) /
         Number(productForm.value.quantity)
-      ).toFixed(6);
+      );
       // 纭繚缁撴灉涓嶄负璐熸暟
       if (Number(productForm.value.taxInclusiveUnitPrice) < 0) {
         productForm.value.taxInclusiveUnitPrice = "0";
@@ -1570,6 +1637,28 @@
   fileListDialogVisible.value = true;
 };
 
+// 涓嬭浇閲囪喘鍗�
+const downloadOrder = async (id) => {
+  try {
+    const res = await getPrintData(id);
+    const data = res.data || res;
+    downloadPurchaseJpg(data.companyName, data.ledger, data.products, '閲囪喘鍗昣' + (data.ledger.purchaseContractNumber || id) + '.jpg');
+  } catch (e) {
+    console.error('涓嬭浇澶辫触:', e);
+  }
+};
+
+// 鎵撳嵃閲囪喘鍗�
+const printOrder = async (id) => {
+  try {
+    const res = await getPrintData(id);
+    const data = res.data || res;
+    printPurchase(data.companyName, data.ledger, data.products);
+  } catch (e) {
+    console.error('鎵撳嵃澶辫触:', e);
+  }
+};
+
 // 鍒犻櫎妯℃澘
 const handleDeleteTemplate = async item => {
   if (!item.id) {

--
Gitblit v1.9.3