From ed94f308b3fb345eb7238b8836a61d0b8bbaa98c Mon Sep 17 00:00:00 2001
From: chenhj <1263187585@qq.com>
Date: 星期五, 27 三月 2026 17:52:23 +0800
Subject: [PATCH] feat(salesLedger): 添加批号字段和销售出库单打印功能

---
 src/utils/request.js                            |   19 +++++++++
 src/api/salesManagement/salesLedger.js          |   10 +++++
 src/api/productionManagement/productionOrder.js |    7 +++
 src/views/salesManagement/salesLedger/index.vue |   73 ++++++++++++++++++++++++++++++++----
 README.md                                       |    3 +
 5 files changed, 102 insertions(+), 10 deletions(-)

diff --git a/README.md b/README.md
index 073e101..1ed9861 100644
--- a/README.md
+++ b/README.md
@@ -31,6 +31,9 @@
 # 鍚姩鏈嶅姟
 yarn dev
 
+#鎵撳寘鍛戒护
+yarn build:prod -- --company="JCCK"
+
 # 鏋勫缓娴嬭瘯鐜 yarn build:stage
 # 鏋勫缓鐢熶骇鐜 yarn build:prod
 # 鏋勫缓鐢熶骇鐜 yarn build:prod -- --company="AAA"
diff --git a/src/api/productionManagement/productionOrder.js b/src/api/productionManagement/productionOrder.js
index 72cdb10..8adc47f 100644
--- a/src/api/productionManagement/productionOrder.js
+++ b/src/api/productionManagement/productionOrder.js
@@ -145,4 +145,11 @@
     method: "patch",
     data: data,
   });
+}
+
+export function getProductOrderBatchNoOptions() {
+  return request({
+    url: "/productOrder/getProductOrderBatchNo",
+    method: "get",
+  });
 }
\ No newline at end of file
diff --git a/src/api/salesManagement/salesLedger.js b/src/api/salesManagement/salesLedger.js
index 6548927..f403e58 100644
--- a/src/api/salesManagement/salesLedger.js
+++ b/src/api/salesManagement/salesLedger.js
@@ -116,4 +116,14 @@
         method: "get",
         params: query,
     });
+}
+
+// 瀵煎嚭
+export function saleOutboundExport(query) {
+  return request({
+    url: '/sales/ledger/exportSaleOutbound',
+    method: 'post',
+    data: query,
+    responseType: 'blob'
+  })
 }
\ No newline at end of file
diff --git a/src/utils/request.js b/src/utils/request.js
index 9cfcf5b..301a90b 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -72,7 +72,24 @@
 })
 
 // 鍝嶅簲鎷︽埅鍣�
-service.interceptors.response.use(res => {
+service.interceptors.response.use(async res => {
+      const isBlob = res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer'
+
+      if (isBlob) {
+        const contentType = res.headers['content-type']
+
+        if (contentType && contentType.includes('application/json')) {
+          const text = await new Response(res.data).text()
+          const data = JSON.parse(text)
+
+          const msg = data.msg || '瀵煎嚭澶辫触'
+          ElMessage.error(msg)
+
+          return Promise.reject(new Error(msg))
+        }
+
+        return res.data
+      }
     // 鏈缃姸鎬佺爜鍒欓粯璁ゆ垚鍔熺姸鎬�
     const code = res.data.code || 200
     // 鑾峰彇閿欒淇℃伅
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index ce9586b..884582d 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -46,6 +46,7 @@
               <el-table-column align="center" label="搴忓彿" type="index"/>
               <el-table-column label="浜у搧澶х被" prop="productCategory" />
               <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
+              <el-table-column label="鎵瑰彿" prop="batchNo" />
               <el-table-column label="鍗曚綅" prop="unit" />
 							<el-table-column label="浜у搧鐘舵��"
 															 width="100px"
@@ -124,6 +125,7 @@
             <el-button link type="primary" size="small" @click="openForm('edit', scope.row)" :disabled="!scope.row.isEdit">缂栬緫</el-button>
 <!--            <el-button link type="primary" size="small" @click="openForm('view', scope.row)">璇︽儏</el-button>-->
             <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">闄勪欢</el-button>
+            <el-button link type="primary" size="small" @click="exportSaleOutbound(scope.row)">鎵撳嵃閿�鍞嚭搴撳崟</el-button>
 <!--            <el-button link type="primary" size="small" @click="openDeliveryForm(scope.row)">鍙戣揣</el-button>-->
           </template>
         </el-table-column>
@@ -228,6 +230,7 @@
 					<el-table-column label="浜у搧澶х被" prop="productCategory" />
 					<el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
 					<el-table-column label="UID鐮�" prop="uidNo" />
+					<el-table-column label="鎵瑰彿" prop="batchNo" />
 					<el-table-column label="鍗曚綅" prop="unit" />
 					<el-table-column label="鏁伴噺" prop="quantity" />
 					<el-table-column label="绋庣巼(%)" prop="taxRate" />
@@ -362,6 +365,15 @@
 						</el-form-item>
 					</el-col>
 				</el-row>
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="鎵瑰彿锛�" prop="batchNo">
+              <el-select v-model="productForm.batchNo" placeholder="璇烽�夋嫨" clearable filterable>
+                <el-option v-for="item in batchNoOptions" :key="item.value" :label="item.label" :value="item.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
 				<el-row :gutter="30">
 					<el-col :span="12">
 						<el-form-item label="鍗曚綅锛�" prop="unit">
@@ -667,20 +679,22 @@
 import FormDialog from '@/components/Dialog/FormDialog.vue';
 import { getQuotationList } from "@/api/salesManagement/salesQuotation.js";
 import {
-	ledgerListPage,
-	productList,
-	customerList,
-	addOrUpdateSalesLedger,
-	getSalesLedgerWithProducts,
-	delLedger,
-	addOrUpdateSalesLedgerProduct,
-	delProduct,
-	delLedgerFile, getProductInventory,
+  ledgerListPage,
+  productList,
+  customerList,
+  addOrUpdateSalesLedger,
+  getSalesLedgerWithProducts,
+  delLedger,
+  addOrUpdateSalesLedgerProduct,
+  delProduct,
+  delLedgerFile, getProductInventory, saleOutboundExport,
 } from "@/api/salesManagement/salesLedger.js";
 import { modelList, productTreeList } from "@/api/basicData/product.js";
 import useFormData from "@/hooks/useFormData.js";
 import dayjs from "dayjs";
 import { getCurrentDate } from "@/utils/index.js";
+import {getProductOrderBatchNoOptions} from "@/api/productionManagement/productionOrder.js";
+import {safeTrainingExport} from "@/api/safeProduction/safetyTrainingAssessment.js";
 
 const userStore = useUserStore();
 const { proxy } = getCurrentInstance();
@@ -748,10 +762,12 @@
 		taxInclusiveTotalPrice: "",
 		taxExclusiveTotalPrice: "",
 		invoiceType: "",
+    batchNo: "",
 	},
 	productRules: {
 		productCategory: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
 		productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+    batchNo: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
 		specificationModel: [
 			{ required: true, message: "璇烽�夋嫨", trigger: "change" },
 		],
@@ -1245,6 +1261,12 @@
 			});
 		}
 	});
+};
+
+const batchNoOptions = ref([]);
+const fetchBatchNoOptions = async () => {
+	const res = await getProductOrderBatchNoOptions();
+	batchNoOptions.value = res.data;
 };
 // 鍏抽棴寮规
 const closeDia = () => {
@@ -2183,8 +2205,41 @@
 	let res = await userStore.getInfo();
 	currentFactoryName.value = res.user.currentFactoryName;
 };
+
+const exportSaleOutbound = row => {
+  saleOutboundExport({id: row.id})
+      .then(res => {
+        // 鍒涘缓Blob瀵硅薄
+        const blob = new Blob([res], {
+          type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+        });
+        // 鍒涘缓涓嬭浇閾炬帴
+        const url = window.URL.createObjectURL(blob);
+        const link = document.createElement("a");
+        link.href = url;
+        link.download = `閿�鍞嚭搴撳崟.docx`;
+
+        // 妯℃嫙鐐瑰嚮涓嬭浇
+        document.body.appendChild(link);
+        link.click();
+
+        // 娓呯悊涓存椂瀵硅薄
+        setTimeout(() => {
+          document.body.removeChild(link);
+          window.URL.revokeObjectURL(url);
+        }, 100);
+
+        ElMessage.success("瀵煎嚭鎴愬姛");
+      })
+      .catch(err => {
+        console.error("瀵煎嚭澶辫触:", err);
+        ElMessage.error("瀵煎嚭澶辫触锛岃閲嶈瘯");
+      });
+};
+
 onMounted(() => {
 	getList();
+  fetchBatchNoOptions();
 	userListNoPage().then(res => {
 		userList.value = res.data;
 	})

--
Gitblit v1.9.3