From 377c0a70c094d024aeb0bb94f4b791c6d5530c1e Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 06 八月 2026 10:21:55 +0800
Subject: [PATCH] 新疆_马铃薯 1.不合格管理添加拒收逻辑
---
src/views/procurementManagement/procurementLedger/index.vue | 260 ++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 223 insertions(+), 37 deletions(-)
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index a65df53..47ec1e4 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -27,13 +27,13 @@
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-input v-model="searchForm.salesContractNo"-->
+<!-- placeholder="璇疯緭鍏�"-->
+<!-- clearable-->
+<!-- prefix-icon="Search"-->
+<!-- @change="handleQuery" />-->
+<!-- </el-form-item>-->
<el-form-item label="椤圭洰鍚嶇О锛�">
<el-input v-model="searchForm.projectName"
placeholder="璇疯緭鍏�"
@@ -217,10 +217,10 @@
prop="purchaseContractNumber"
width="160"
show-overflow-tooltip />
- <el-table-column label="閿�鍞悎鍚屽彿"
- prop="salesContractNo"
- width="160"
- show-overflow-tooltip />
+<!-- <el-table-column label="璁㈠崟鍙�"-->
+<!-- prop="salesContractNo"-->
+<!-- width="160"-->
+<!-- show-overflow-tooltip />-->
<el-table-column label="渚涘簲鍟嗗悕绉�"
prop="supplierName"
width="160"
@@ -278,7 +278,7 @@
show-overflow-tooltip />
<el-table-column fixed="right"
label="鎿嶄綔"
- width="120"
+ width="200"
align="center">
<template #default="scope">
<el-button link
@@ -288,6 +288,11 @@
<el-button link
type="primary"
@click="openFileDialog(scope.row)">闄勪欢</el-button>
+ <el-button link
+ type="primary"
+ v-if="scope.row.masterContractNo"
+ @click="openContractFileDialog(scope.row)">鎬诲悎鍚岄檮浠�
+ </el-button>
</template>
</el-table-column>
</el-table>
@@ -312,15 +317,6 @@
ref="formRef">
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="鎬诲悎鍚屽彿锛�">
- <el-input v-model="form.masterContractNo"
- placeholder="璇疯緭鍏�"
- clearable />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
<el-form-item label="閲囪喘鍚堝悓鍙凤細"
prop="purchaseContractNumber">
<el-input v-model="form.purchaseContractNumber"
@@ -328,21 +324,21 @@
clearable />
</el-form-item>
</el-col>
- <el-col :span="12">
- <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-col :span="12">-->
+<!-- <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>
<el-row :gutter="30">
<el-col :span="12">
@@ -351,7 +347,8 @@
<el-select v-model="form.supplierId"
placeholder="璇烽�夋嫨"
filterable
- clearable>
+ clearable
+ @change="handleSupplierChange">
<el-option v-for="item in supplierList"
:key="item.id"
:label="item.supplierName"
@@ -360,6 +357,22 @@
</el-select>
</el-form-item>
</el-col>
+ <el-col :span="12">
+ <el-form-item label="鎬诲悎鍚屽彿锛�">
+ <el-select v-model="form.masterContractNo"
+ placeholder="璇峰厛閫夋嫨渚涘簲鍟�"
+ filterable
+ clearable
+ :disabled="!form.supplierId">
+ <el-option v-for="item in contractList"
+ :key="item.id"
+ :label="item.masterContractNo"
+ :value="item.masterContractNo" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
<el-col :span="12">
<el-form-item label="椤圭洰鍚嶇О"
prop="projectName">
@@ -572,6 +585,35 @@
<el-tag v-else :type="scope.row.isChecked ? 'success' : 'info'">
{{ scope.row.isChecked ? '鏄�' : '鍚�' }}
</el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="閫夋嫨璁惧"
+ prop="deviceId"
+ width="150">
+ <template #default="scope">
+ <span v-if="scope.row.productType === 2">--</span>
+ <el-select v-else
+ v-model="scope.row.deviceId"
+ placeholder="璇烽�夋嫨璁惧"
+ filterable
+ clearable
+ @change="handleDeviceChange(scope.row, scope.$index)">
+ <el-option v-for="device in iotDeviceList"
+ :key="device.id"
+ :label="device.deviceName"
+ :value="device.id" />
+ </el-select>
+ </template>
+ </el-table-column>
+ <el-table-column label="搴撲綅"
+ prop="storageLocation"
+ width="120">
+ <template #default="scope">
+ <span v-if="scope.row.productType === 2">--</span>
+ <el-input v-else
+ v-model="scope.row.storageLocation"
+ placeholder="鑷姩鑾峰彇"
+ disabled />
</template>
</el-table-column>
<el-table-column label="鍏ュ簱瀹℃牳鐘舵��"
@@ -840,6 +882,32 @@
</el-row>
<el-row :gutter="30" v-if="productForm.productType !== 2">
<el-col :span="12">
+ <el-form-item label="閫夋嫨璁惧锛�"
+ prop="deviceId">
+ <el-select v-model="productForm.deviceId"
+ placeholder="璇烽�夋嫨璁惧"
+ filterable
+ clearable
+ style="width: 100%"
+ @change="handleProductDeviceChange">
+ <el-option v-for="device in iotDeviceList"
+ :key="device.id"
+ :label="device.deviceName"
+ :value="device.id" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="搴撲綅锛�"
+ prop="storageLocation">
+ <el-input v-model="productForm.storageLocation"
+ placeholder="閫夋嫨璁惧鍚庤嚜鍔ㄨ幏鍙�"
+ disabled />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30" v-if="productForm.productType !== 2">
+ <el-col :span="12">
<el-form-item label="鏄惁璐ㄦ锛�"
prop="isChecked">
<el-radio-group v-model="productForm.isChecked">
@@ -857,6 +925,28 @@
v-model:visible="fileListDialogVisible"
record-type="purchase_ledger"
:record-id="recordId" />
+ <!-- 鎬诲悎鍚岄檮浠跺脊绐� -->
+ <el-dialog
+ v-model="contractFileDialogVisible"
+ title="鎬诲悎鍚岄檮浠�"
+ width="700px"
+ :close-on-click-modal="false">
+ <el-table :data="contractFileList" border v-if="contractFileList.length">
+ <el-table-column prop="name" label="鏂囦欢鍚嶇О" show-overflow-tooltip />
+ <el-table-column prop="byteSize" label="鏂囦欢澶у皬" width="120">
+ <template #default="{ row }">
+ {{ formatFileSize(row.byteSize) }}
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" width="150">
+ <template #default="{ row }">
+ <el-link type="primary" :href="row.previewURL" target="_blank">棰勮</el-link>
+ <el-link type="primary" :href="row.downloadURL" style="margin-left: 10px">涓嬭浇</el-link>
+ </template>
+ </el-table-column>
+ </el-table>
+ <el-empty v-else description="鏆傛棤闄勪欢" />
+ </el-dialog>
</div>
</template>
@@ -914,6 +1004,10 @@
const sparePartsOptions = ref([]);
const salesContractList = ref([]);
const supplierList = ref([]);
+ const contractList = ref([]); // 渚涘簲鍟嗗悎鍚屽垪琛�
+ const iotDeviceList = ref([]); // IoT璁惧鍒楄〃
+ const contractFileDialogVisible = ref(false);
+ const contractFileList = ref([]);
const tableLoading = ref(false);
const recordId = ref();
const fileListDialogVisible = ref(false);
@@ -926,6 +1020,8 @@
import useUserStore from "@/store/modules/user";
import { modelList, productTreeList } from "@/api/basicData/product.js";
import { getSparePartsList } from "@/api/equipmentManagement/spareParts.js";
+ import { getSupplierContractList, getSupplierContractFilesByNo } from "@/api/basicData/supplierContract.js";
+ import { getIotDeviceList as getIotDeviceListApi } from "@/api/equipmentManagement/ledger.js";
import dayjs from "dayjs";
import FileUpload from "@/components/AttachmentUpload/file/index.vue";
@@ -966,6 +1062,7 @@
寰呭叆搴�: "info", // 寰呭叆搴� - 鐏拌壊
鍏ュ簱涓�: "warning", // 鍏ュ簱涓� - 姗欒壊
瀹屽叏鍏ュ簱: "success", // 瀹屽叏鍏ュ簱 - 缁胯壊
+ 宸查┏鍥�: "danger", // 宸查┏鍥� - 绾㈣壊
};
return typeMap[status] || "";
};
@@ -1145,6 +1242,8 @@
invoiceType: "",
warnNum: "",
isChecked: false,
+ deviceId: "",
+ storageLocation: "",
},
productRules: {
productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
@@ -1509,6 +1608,17 @@
type: 2,
});
productData.value = productRes.data || [];
+ // 缂栬緫鏃跺姞杞戒緵搴斿晢鐨勫悎鍚屽垪琛ㄤ互渚垮洖鏄炬�诲悎鍚屽彿
+ if (purchaseRes.supplierId) {
+ try {
+ const contractRes = await getSupplierContractList(purchaseRes.supplierId);
+ if (contractRes.code === 200) {
+ contractList.value = contractRes.data || [];
+ }
+ } catch (error) {
+ console.error('鑾峰彇渚涘簲鍟嗗悎鍚屽垪琛ㄥけ璐�:', error);
+ }
+ }
} catch (error) {
console.error("鍔犺浇閲囪喘鍙拌处鏁版嵁澶辫触:", error);
proxy.$modal.msgError("鍔犺浇鏁版嵁澶辫触");
@@ -2200,9 +2310,85 @@
}
};
+ // 渚涘簲鍟嗛�夋嫨鍙樺寲鏃讹紝鍔犺浇璇ヤ緵搴斿晢鐨勫悎鍚屽垪琛�
+ const handleSupplierChange = async (supplierId) => {
+ form.value.masterContractNo = '';
+ contractList.value = [];
+ if (!supplierId) return;
+
+ try {
+ const res = await getSupplierContractList(supplierId);
+ if (res.code === 200) {
+ contractList.value = res.data || [];
+ }
+ } catch (error) {
+ console.error('鑾峰彇渚涘簲鍟嗗悎鍚屽垪琛ㄥけ璐�:', error);
+ }
+ };
+
+ // 鏌ョ湅鎬诲悎鍚岄檮浠�
+ const openContractFileDialog = async (row) => {
+ if (!row.masterContractNo) {
+ proxy.$modal.msgWarning('璇ヨ褰曟病鏈夋�诲悎鍚屽彿');
+ return;
+ }
+ try {
+ const res = await getSupplierContractFilesByNo(row.masterContractNo);
+ if (res.code === 200) {
+ contractFileList.value = res.data || [];
+ contractFileDialogVisible.value = true;
+ }
+ } catch (error) {
+ console.error('鑾峰彇鍚堝悓闄勪欢澶辫触:', error);
+ }
+ };
+
+ // 鑾峰彇IoT璁惧鍒楄〃
+ // 鑾峰彇IoT璁惧鍒楄〃
+ const getIotDeviceList = async () => {
+ try {
+ const res = await getIotDeviceListApi();
+ if (res.data) {
+ iotDeviceList.value = res.data;
+ }
+ } catch (error) {
+ console.error("鑾峰彇IoT璁惧鍒楄〃澶辫触:", error);
+ }
+ };
+
+ // 璁惧閫夋嫨鍙樻洿鏃讹紝鑷姩濉厖搴撲綅
+ const handleDeviceChange = (row, index) => {
+ const device = iotDeviceList.value.find(d => d.id === row.deviceId);
+ if (device) {
+ row.storageLocation = device.storageLocation || '';
+ } else {
+ row.storageLocation = '';
+ }
+ };
+
+ // 浜у搧寮圭獥涓澶囬�夋嫨鍙樻洿鏃讹紝鑷姩濉厖搴撲綅
+ const handleProductDeviceChange = (deviceId) => {
+ const device = iotDeviceList.value.find(d => d.id === deviceId);
+ if (device) {
+ productForm.value.storageLocation = device.storageLocation || '';
+ } else {
+ productForm.value.storageLocation = '';
+ }
+ };
+
+ // 鏍煎紡鍖栨枃浠跺ぇ灏�
+ const formatFileSize = (bytes) => {
+ if (!bytes) return '0 B';
+ const k = 1024;
+ const sizes = ['B', 'KB', 'MB', 'GB'];
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
+ };
+
onMounted(() => {
getList();
getTemplateList();
+ getIotDeviceList();
});
</script>
--
Gitblit v1.9.3