From a563ea879ef5fb6897e76d2df661e465dce2ab9b Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期一, 01 六月 2026 15:02:27 +0800
Subject: [PATCH] Merge branch 'dev_新疆_大罗素马铃薯new' of http://114.132.189.42:9002/r/product-inventory-management into dev_新疆_大罗素马铃薯new
---
src/views/index.vue | 37
src/views/qualityManagement/processInspection/components/formDia.vue | 68
src/views/qualityManagement/finalInspection/components/quickCheckDia.vue | 327 ++++++
src/views/qualityManagement/processInspection/components/quickCheckDia.vue | 327 ++++++
src/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue | 327 ++++++
src/views/qualityManagement/finalInspection/components/formDia.vue | 53
src/views/qualityManagement/rawMaterialInspection/index.vue | 35
src/views/salesManagement/salesLedger/index.vue | 15
src/views/qualityManagement/finalInspection/index.vue | 34
src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue | 456 +++++---
src/views/qualityManagement/processInspection/index.vue | 60 -
src/views/qualityManagement/metricBinding/index.vue | 14
src/views/inventoryManagement/dispatchLog/Record.vue | 1051 ++++++++++-----------
src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js | 7
src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue | 12
src/views/systemArchitecture/index.vue | 2
src/views/qualityManagement/rawMaterialInspection/components/formDia.vue | 10
src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js | 3
src/views/qualityManagement/metricMaintenance/index.vue | 12
19 files changed, 1,949 insertions(+), 901 deletions(-)
diff --git a/src/views/index.vue b/src/views/index.vue
index ea7b4ff..e14da5e 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -419,6 +419,8 @@
monthSaleHaveMoney: 0,
monthSaleMoney: 0,
todayInventoryNum: 0,
+ lastMonthSaleMoney: 0,
+ lastMonthPurchaseMoney: 0,
});
const qualityStatisticsObject = ref({
@@ -701,15 +703,29 @@
});
});
+// 璁$畻鐜瘮澧為暱鐜�
+const calculateGrowthRate = (current, last) => {
+ const currentVal = parseFloat(current) || 0;
+ const lastVal = parseFloat(last) || 0;
+ if (lastVal === 0) return currentVal > 0 ? 100 : 0;
+ return ((currentVal - lastVal) / lastVal * 100).toFixed(1);
+};
+
const dashboardCards = computed(() => [
{
key: "sales",
title: "閿�鍞暟鎹�",
desc: "鏈湀閿�鍞(鍏�)",
value: formatNumber(businessInfo.value.monthSaleMoney),
- subLabel: "鏈紑绁ㄩ噾棰�",
- subValue: formatNumber(businessInfo.value.monthSaleHaveMoney),
- trend: `鍗犳瘮 ${ratioText(businessInfo.value.monthSaleHaveMoney, businessInfo.value.monthSaleMoney)}`,
+ subLabel: "涓婃湀閿�鍞�",
+ subValue: formatNumber(businessInfo.value.lastMonthSaleMoney),
+ trend: (() => {
+ const rate = calculateGrowthRate(businessInfo.value.monthSaleMoney, businessInfo.value.lastMonthSaleMoney);
+ const num = parseFloat(rate);
+ if (num > 0) return `鐜瘮 鈫� ${rate}%`;
+ if (num < 0) return `鐜瘮 鈫� ${Math.abs(num)}%`;
+ return "鐜瘮鎸佸钩";
+ })(),
icon: DataLine,
visible: visibleModules.value.sales,
},
@@ -718,12 +734,15 @@
title: "閲囪喘鏁版嵁",
desc: "鏈湀閲囪喘棰�(鍏�)",
value: formatNumber(businessInfo.value.monthPurchaseMoney),
- subLabel: "寰呬粯娆鹃噾棰�",
- subValue: formatNumber(businessInfo.value.monthPurchaseHaveMoney),
- trend: `鍗犳瘮 ${ratioText(
- businessInfo.value.monthPurchaseHaveMoney,
- businessInfo.value.monthPurchaseMoney
- )}`,
+ subLabel: "涓婃湀閲囪喘",
+ subValue: formatNumber(businessInfo.value.lastMonthPurchaseMoney),
+ trend: (() => {
+ const rate = calculateGrowthRate(businessInfo.value.monthPurchaseMoney, businessInfo.value.lastMonthPurchaseMoney);
+ const num = parseFloat(rate);
+ if (num > 0) return `鐜瘮 鈫� ${rate}%`;
+ if (num < 0) return `鐜瘮 鈫� ${Math.abs(num)}%`;
+ return "鐜瘮鎸佸钩";
+ })(),
icon: ShoppingCartFull,
visible: visibleModules.value.procurement,
},
diff --git a/src/views/inventoryManagement/dispatchLog/Record.vue b/src/views/inventoryManagement/dispatchLog/Record.vue
index 2d7411d..431fd24 100644
--- a/src/views/inventoryManagement/dispatchLog/Record.vue
+++ b/src/views/inventoryManagement/dispatchLog/Record.vue
@@ -1,416 +1,411 @@
<template>
<div>
- <div class="search_form"
- style="margin-bottom: 10px">
- <el-form ref="searchFormRef"
- :model="searchForm"
- class="demo-form-inline">
+ <div class="search_form" style="margin-bottom: 10px">
+ <el-form ref="searchFormRef" :model="searchForm" class="demo-form-inline">
<el-row :gutter="20">
<el-col :span="4">
- <el-form-item label="鍑哄簱鏃ユ湡"
- prop="timeStr">
- <el-date-picker v-model="searchForm.timeStr"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable />
+ <el-form-item label="鍑哄簱鏃ユ湡" prop="timeStr">
+ <el-date-picker
+ v-model="searchForm.timeStr"
+ type="date"
+ placeholder="璇烽�夋嫨鏃ユ湡"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ clearable
+ />
</el-form-item>
</el-col>
<el-col :span="4">
- <el-form-item label="浜у搧澶х被"
- prop="productName">
- <el-input v-model="searchForm.productName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- clearable />
+ <el-form-item label="浜у搧澶х被" prop="productName">
+ <el-input
+ v-model="searchForm.productName"
+ style="width: 240px"
+ placeholder="璇疯緭鍏�"
+ clearable
+ />
</el-form-item>
</el-col>
<el-col :span="4">
- <el-form-item label="瑙勬牸鍨嬪彿"
- prop="model">
- <el-input v-model="searchForm.model"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- clearable />
+ <el-form-item label="瑙勬牸鍨嬪彿" prop="model">
+ <el-input
+ v-model="searchForm.model"
+ style="width: 240px"
+ placeholder="璇疯緭鍏�"
+ clearable
+ />
</el-form-item>
</el-col>
<el-col :span="4">
- <el-form-item label="鎵瑰彿"
- prop="batchNo">
- <el-input v-model="searchForm.batchNo"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- clearable />
+ <el-form-item label="鎵瑰彿" prop="batchNo">
+ <el-input
+ v-model="searchForm.batchNo"
+ style="width: 240px"
+ placeholder="璇疯緭鍏�"
+ clearable
+ />
</el-form-item>
</el-col>
<el-col :span="4">
- <el-form-item label="鏉ユ簮"
- prop="recordType">
- <el-select v-model="searchForm.recordType"
- style="width: 240px"
- placeholder="璇烽�夋嫨"
- clearable>
- <el-option v-for="item in stockRecordTypeOptions"
- :key="item.value"
- :label="item.label"
- :value="item.value" />
+ <el-form-item label="鏉ユ簮" prop="recordType">
+ <el-select
+ v-model="searchForm.recordType"
+ style="width: 240px"
+ placeholder="璇烽�夋嫨"
+ clearable
+ >
+ <el-option
+ v-for="item in stockRecordTypeOptions"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value"
+ />
</el-select>
</el-form-item>
</el-col>
<!-- 鎸夐挳 -->
<el-col :span="4">
<el-form-item>
- <el-button type="primary"
- @click="getList">
- 鎼滅储
- </el-button>
- <el-button @click="resetSearch">
- 閲嶇疆
- </el-button>
+ <el-button type="primary" @click="getList"> 鎼滅储 </el-button>
+ <el-button @click="resetSearch"> 閲嶇疆 </el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<div class="actions">
- <el-button type="primary"
- @click="handleBatchApprove">瀹℃壒</el-button>
+ <el-button type="primary" @click="handleBatchApprove">瀹℃壒</el-button>
<el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger"
- plain
- @click="handleDelete">鍒犻櫎</el-button>
- <el-button type="primary"
- plain
- @click="handlePrint">鎵撳嵃</el-button>
+ <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+ <el-button type="primary" plain @click="handlePrint">鎵撳嵃</el-button>
</div>
<div class="table_list">
- <el-table :data="tableData"
- border
- v-loading="tableLoading"
- @selection-change="handleSelectionChange"
- :expand-row-keys="expandedRowKeys"
- :row-key="(row) => row.id"
- style="width: 100%"
- height="calc(100vh - 18.5em)">
- <el-table-column align="center"
- type="selection"
- width="55" />
- <el-table-column align="center"
- label="搴忓彿"
- type="index"
- width="60" />
- <el-table-column label="鍑哄簱鎵规"
- prop="outboundBatches"
- min-width="100"
- show-overflow-tooltip />
- <el-table-column label="鍑哄簱鏃ユ湡"
- prop="createTime"
- show-overflow-tooltip />
- <el-table-column label="浜у搧澶х被"
- prop="productName"
- show-overflow-tooltip />
- <el-table-column label="瑙勬牸鍨嬪彿"
- prop="model"
- show-overflow-tooltip />
- <el-table-column label="鎵瑰彿"
- prop="batchNo"
- show-overflow-tooltip />
- <el-table-column label="鍗曚綅"
- prop="unit"
- show-overflow-tooltip />
- <el-table-column label="鍑哄簱鏁伴噺"
- prop="stockOutNum"
- show-overflow-tooltip />
- <el-table-column label="鍑哄簱浜�"
- prop="createBy"
- show-overflow-tooltip />
- <el-table-column label="鏉ユ簮"
- prop="recordType"
- show-overflow-tooltip>
+ <el-table
+ :data="tableData"
+ border
+ v-loading="tableLoading"
+ @selection-change="handleSelectionChange"
+ :expand-row-keys="expandedRowKeys"
+ :row-key="(row) => row.id"
+ style="width: 100%"
+ height="calc(100vh - 18.5em)"
+ >
+ <el-table-column align="center" type="selection" width="55" />
+ <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+ <el-table-column
+ label="鍑哄簱鎵规"
+ prop="outboundBatches"
+ min-width="100"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="鍑哄簱鏃ユ湡"
+ prop="updateTime"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="浜у搧澶х被"
+ prop="productName"
+ show-overflow-tooltip
+ />
+ <el-table-column label="瑙勬牸鍨嬪彿" prop="model" show-overflow-tooltip />
+ <el-table-column label="鎵瑰彿" prop="batchNo" show-overflow-tooltip />
+ <el-table-column label="鍗曚綅" prop="unit" show-overflow-tooltip />
+ <el-table-column
+ label="鍑哄簱鏁伴噺"
+ prop="stockOutNum"
+ show-overflow-tooltip
+ />
+ <el-table-column label="鍑哄簱浜�" prop="createBy" show-overflow-tooltip />
+ <el-table-column label="鏉ユ簮" prop="recordType" show-overflow-tooltip>
<template #default="scope">
{{ getRecordType(scope.row.recordType) }}
</template>
</el-table-column>
- <el-table-column label="瀹℃壒鐘舵��"
- prop="approvalStatus"
- show-overflow-tooltip>
+ <el-table-column
+ label="瀹℃壒鐘舵��"
+ prop="approvalStatus"
+ show-overflow-tooltip
+ >
<template #default="scope">
- <el-tag :type="getApprovalStatusTagType(scope.row.approvalStatus)"
- size="small">
+ <el-tag
+ :type="getApprovalStatusTagType(scope.row.approvalStatus)"
+ size="small"
+ >
{{ getApprovalStatusLabel(scope.row.approvalStatus) }}
</el-tag>
</template>
</el-table-column>
</el-table>
- <pagination v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange" />
+ <pagination
+ v-show="total > 0"
+ :total="total"
+ layout="total, sizes, prev, pager, next, jumper"
+ :page="page.current"
+ :limit="page.size"
+ @pagination="paginationChange"
+ />
</div>
</div>
</template>
<script setup>
- import pagination from "@/components/PIMTable/Pagination.vue";
- import { ref } from "vue";
- import { ElMessageBox } from "element-plus";
- import useUserStore from "@/store/modules/user";
- import { getCurrentDate } from "@/utils/index.js";
- import {
- getStockOutPage,
- delPendingStockOut,
- batchApproveStockOutRecords,
- } from "@/api/inventoryManagement/stockOut.js";
- import {
- findAllQualifiedStockOutRecordTypeOptions,
- findAllUnQualifiedStockOutRecordTypeOptions,
- } from "@/api/basicData/enum.js";
+import pagination from "@/components/PIMTable/Pagination.vue";
+import { ref } from "vue";
+import { ElMessageBox } from "element-plus";
+import useUserStore from "@/store/modules/user";
+import { getCurrentDate } from "@/utils/index.js";
+import {
+ getStockOutPage,
+ delPendingStockOut,
+ batchApproveStockOutRecords,
+} from "@/api/inventoryManagement/stockOut.js";
+import {
+ findAllQualifiedStockOutRecordTypeOptions,
+ findAllUnQualifiedStockOutRecordTypeOptions,
+} from "@/api/basicData/enum.js";
- const userStore = useUserStore();
- const { proxy } = getCurrentInstance();
- const tableData = ref([]);
- const selectedRows = ref([]);
- const tableLoading = ref(false);
- // 鏉ユ簮绫诲瀷閫夐」
- const stockRecordTypeOptions = ref([]);
- const page = reactive({
- current: 1,
- size: 100,
- });
- const total = ref(0);
+const userStore = useUserStore();
+const { proxy } = getCurrentInstance();
+const tableData = ref([]);
+const selectedRows = ref([]);
+const tableLoading = ref(false);
+// 鏉ユ簮绫诲瀷閫夐」
+const stockRecordTypeOptions = ref([]);
+const page = reactive({
+ current: 1,
+ size: 100,
+});
+const total = ref(0);
- const props = defineProps({
- type: {
- type: String,
- required: true,
- default: "0",
- },
- topParentProductId: {
- type: [String, Number],
- default: undefined,
- },
- });
+const props = defineProps({
+ type: {
+ type: String,
+ required: true,
+ default: "0",
+ },
+ topParentProductId: {
+ type: [String, Number],
+ default: undefined,
+ },
+});
- // 鎵撳嵃鐩稿叧
- const printPreviewVisible = ref(false);
- const printData = ref([]);
+// 鎵撳嵃鐩稿叧
+const printPreviewVisible = ref(false);
+const printData = ref([]);
- // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
- const data = reactive({
- searchForm: {
- supplierName: "",
- timeStr: "",
- recordType: "",
- },
- });
- const { searchForm } = toRefs(data);
+// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
+const data = reactive({
+ searchForm: {
+ supplierName: "",
+ timeStr: "",
+ recordType: "",
+ },
+});
+const { searchForm } = toRefs(data);
- const searchFormRef = ref(null);
+const searchFormRef = ref(null);
- const resetSearch = () => {
- searchFormRef.value?.resetFields();
- page.current = 1;
- getList();
- };
+const resetSearch = () => {
+ searchFormRef.value?.resetFields();
+ page.current = 1;
+ getList();
+};
- const paginationChange = obj => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
- };
- const getList = () => {
- tableLoading.value = true;
- getStockOutPage({
- ...searchForm.value,
- ...page,
- topParentProductId: props.topParentProductId,
+const paginationChange = (obj) => {
+ page.current = obj.page;
+ page.size = obj.limit;
+ getList();
+};
+const getList = () => {
+ tableLoading.value = true;
+ getStockOutPage({
+ ...searchForm.value,
+ ...page,
+ topParentProductId: props.topParentProductId,
+ })
+ .then((res) => {
+ tableLoading.value = false;
+ tableData.value = res.data.records;
+ tableData.value.map((item) => {
+ item.children = [];
+ });
+ total.value = res.data.total;
})
- .then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- tableData.value.map(item => {
- item.children = [];
- });
- total.value = res.data.total;
- })
- .catch(() => {
- tableLoading.value = false;
- });
- };
+ .catch(() => {
+ tableLoading.value = false;
+ });
+};
- const getRecordType = recordType => {
- return (
- stockRecordTypeOptions.value.find(item => item.value === recordType)
- ?.label || ""
- );
- };
+const getRecordType = (recordType) => {
+ return (
+ stockRecordTypeOptions.value.find((item) => item.value === recordType)
+ ?.label || ""
+ );
+};
- const approvalStatusLabelMap = {
- 0: "寰呭鎵�",
- 1: "閫氳繃",
- 2: "椹冲洖",
- 3: "寰呯‘璁�",
- pending: "寰呭鎵�",
- approved: "閫氳繃",
- rejected: "椹冲洖",
- PENDING: "寰呭鎵�",
- APPROVED: "閫氳繃",
- REJECTED: "椹冲洖",
- };
+const approvalStatusLabelMap = {
+ 0: "寰呭鎵�",
+ 1: "閫氳繃",
+ 2: "椹冲洖",
+ 3: "寰呯‘璁�",
+ pending: "寰呭鎵�",
+ approved: "閫氳繃",
+ rejected: "椹冲洖",
+ PENDING: "寰呭鎵�",
+ APPROVED: "閫氳繃",
+ REJECTED: "椹冲洖",
+};
- const getApprovalStatusLabel = status => {
- if (status === null || status === undefined || status === "") {
- return "寰呭鎵�";
- }
- return approvalStatusLabelMap[status] || "寰呭鎵�";
- };
+const getApprovalStatusLabel = (status) => {
+ if (status === null || status === undefined || status === "") {
+ return "寰呭鎵�";
+ }
+ return approvalStatusLabelMap[status] || "寰呭鎵�";
+};
- // 閫氳繃/椹冲洖鍥哄畾鑹诧紱鍏朵綑锛堝惈寰呭鎵广�佺┖鍊笺�佹湭鏄犲皠浣嗘枃妗堜负寰呭鎵癸級缁熶竴鐢� warning 棰勮鑹�
- const getApprovalStatusTagType = status => {
- if (
- status === 1 ||
- status === "1" ||
- status === "approved" ||
- status === "APPROVED"
- )
- return "success";
- if (
- status === 2 ||
- status === "2" ||
- status === "rejected" ||
- status === "REJECTED"
- )
- return "danger";
- return "warning";
- };
+// 閫氳繃/椹冲洖鍥哄畾鑹诧紱鍏朵綑锛堝惈寰呭鎵广�佺┖鍊笺�佹湭鏄犲皠浣嗘枃妗堜负寰呭鎵癸級缁熶竴鐢� warning 棰勮鑹�
+const getApprovalStatusTagType = (status) => {
+ if (
+ status === 1 ||
+ status === "1" ||
+ status === "approved" ||
+ status === "APPROVED"
+ )
+ return "success";
+ if (
+ status === 2 ||
+ status === "2" ||
+ status === "rejected" ||
+ status === "REJECTED"
+ )
+ return "danger";
+ return "warning";
+};
- // 鑾峰彇鏉ユ簮绫诲瀷閫夐」
- const fetchStockRecordTypeOptions = () => {
- if (props.type === "0") {
- findAllQualifiedStockOutRecordTypeOptions().then(res => {
- stockRecordTypeOptions.value = res.data;
- });
- return;
- }
- findAllUnQualifiedStockOutRecordTypeOptions().then(res => {
+// 鑾峰彇鏉ユ簮绫诲瀷閫夐」
+const fetchStockRecordTypeOptions = () => {
+ if (props.type === "0") {
+ findAllQualifiedStockOutRecordTypeOptions().then((res) => {
stockRecordTypeOptions.value = res.data;
});
- };
+ return;
+ }
+ findAllUnQualifiedStockOutRecordTypeOptions().then((res) => {
+ stockRecordTypeOptions.value = res.data;
+ });
+};
- // 琛ㄦ牸閫夋嫨鏁版嵁
- const handleSelectionChange = selection => {
- // 杩囨护鎺夊瓙鏁版嵁
- selectedRows.value = selection.filter(item => item.id);
- console.log("selection", selectedRows.value);
- };
- const expandedRowKeys = ref([]);
+// 琛ㄦ牸閫夋嫨鏁版嵁
+const handleSelectionChange = (selection) => {
+ // 杩囨护鎺夊瓙鏁版嵁
+ selectedRows.value = selection.filter((item) => item.id);
+ console.log("selection", selectedRows.value);
+};
+const expandedRowKeys = ref([]);
- const handleBatchApprove = () => {
- if (selectedRows.value.length === 0) {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- const ids = selectedRows.value.map(item => item.id);
- ElMessageBox.confirm("璇烽�夋嫨瀹℃壒缁撴灉", "瀹℃壒", {
- confirmButtonText: "閫氳繃",
- cancelButtonText: "椹冲洖",
- type: "warning",
- distinguishCancelAndClose: true,
+const handleBatchApprove = () => {
+ if (selectedRows.value.length === 0) {
+ proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+ return;
+ }
+ const ids = selectedRows.value.map((item) => item.id);
+ ElMessageBox.confirm("璇烽�夋嫨瀹℃壒缁撴灉", "瀹℃壒", {
+ confirmButtonText: "閫氳繃",
+ cancelButtonText: "椹冲洖",
+ type: "warning",
+ distinguishCancelAndClose: true,
+ })
+ .then(() => {
+ batchApproveStockOutRecords({ ids, approvalStatus: 1 })
+ .then(() => {
+ proxy.$modal.msgSuccess("瀹℃壒閫氳繃鎴愬姛");
+ getList();
+ })
+ .catch(() => {
+ proxy.$modal.msgError("瀹℃壒閫氳繃澶辫触");
+ });
})
- .then(() => {
- batchApproveStockOutRecords({ ids, approvalStatus: 1 })
+ .catch((action) => {
+ if (action === "cancel") {
+ batchApproveStockOutRecords({ ids, approvalStatus: 2 })
.then(() => {
- proxy.$modal.msgSuccess("瀹℃壒閫氳繃鎴愬姛");
+ proxy.$modal.msgSuccess("瀹℃壒椹冲洖鎴愬姛");
getList();
})
.catch(() => {
- proxy.$modal.msgError("瀹℃壒閫氳繃澶辫触");
+ proxy.$modal.msgError("瀹℃壒椹冲洖澶辫触");
});
- })
- .catch(action => {
- if (action === "cancel") {
- batchApproveStockOutRecords({ ids, approvalStatus: 2 })
- .then(() => {
- proxy.$modal.msgSuccess("瀹℃壒椹冲洖鎴愬姛");
- getList();
- })
- .catch(() => {
- proxy.$modal.msgError("瀹℃壒椹冲洖澶辫触");
- });
- return;
- }
- proxy.$modal.msg("宸插彇娑�");
- });
- };
+ return;
+ }
+ proxy.$modal.msg("宸插彇娑�");
+ });
+};
- // 瀵煎嚭
- const handleOut = () => {
- ElMessageBox.confirm("鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
+// 瀵煎嚭
+const handleOut = () => {
+ ElMessageBox.confirm("鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ })
+ .then(() => {
+ proxy.download(
+ "/stockOutRecord/exportStockOutRecord",
+ { type: props.type },
+ props.type === "0" ? "鍚堟牸鍑哄簱鍙拌处.xlsx" : "涓嶅悎鏍煎嚭搴撳彴璐�.xlsx"
+ );
})
- .then(() => {
- proxy.download(
- "/stockOutRecord/exportStockOutRecord",
- { type: props.type },
- props.type === "0" ? "鍚堟牸鍑哄簱鍙拌处.xlsx" : "涓嶅悎鏍煎嚭搴撳彴璐�.xlsx"
- );
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
- };
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
+};
- // 鍒犻櫎
- const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map(item => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
+// 鍒犻櫎
+const handleDelete = () => {
+ let ids = [];
+ if (selectedRows.value.length > 0) {
+ ids = selectedRows.value.map((item) => item.id);
+ } else {
+ proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+ return;
+ }
+ ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ })
+ .then(() => {
+ delPendingStockOut(ids).then((res) => {
+ proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+ getList();
+ });
})
- .then(() => {
- delPendingStockOut(ids).then(res => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
- };
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
+};
- // 鎵撳嵃鍔熻兘
- const handlePrint = () => {
- if (selectedRows.value.length === 0) {
- proxy.$modal.msgWarning("璇烽�夋嫨瑕佹墦鍗扮殑鏁版嵁");
- return;
- }
- printData.value = [...selectedRows.value];
- console.log("鎵撳嵃鏁版嵁:", printData.value);
- printPreviewVisible.value = true;
- };
+// 鎵撳嵃鍔熻兘
+const handlePrint = () => {
+ if (selectedRows.value.length === 0) {
+ proxy.$modal.msgWarning("璇烽�夋嫨瑕佹墦鍗扮殑鏁版嵁");
+ return;
+ }
+ printData.value = [...selectedRows.value];
+ console.log("鎵撳嵃鏁版嵁:", printData.value);
+ printPreviewVisible.value = true;
+};
- // 鎵ц鎵撳嵃
- const executePrint = () => {
- console.log("寮�濮嬫墽琛屾墦鍗帮紝鏁版嵁鏉℃暟:", printData.value.length);
- console.log("鎵撳嵃鏁版嵁:", printData.value);
+// 鎵ц鎵撳嵃
+const executePrint = () => {
+ console.log("寮�濮嬫墽琛屾墦鍗帮紝鏁版嵁鏉℃暟:", printData.value.length);
+ console.log("鎵撳嵃鏁版嵁:", printData.value);
- // 鍒涘缓涓�涓柊鐨勬墦鍗扮獥鍙�
- const printWindow = window.open("", "_blank", "width=800,height=600");
+ // 鍒涘缓涓�涓柊鐨勬墦鍗扮獥鍙�
+ const printWindow = window.open("", "_blank", "width=800,height=600");
- // 鏋勫缓鎵撳嵃鍐呭
- let printContent = `
+ // 鏋勫缓鎵撳嵃鍐呭
+ let printContent = `
<!DOCTYPE html>
<html>
<head>
@@ -545,9 +540,9 @@
<body>
`;
- // 涓烘瘡鏉℃暟鎹敓鎴愭墦鍗伴〉闈�
- printData.value.forEach((item, index) => {
- printContent += `
+ // 涓烘瘡鏉℃暟鎹敓鎴愭墦鍗伴〉闈�
+ printData.value.forEach((item, index) => {
+ printContent += `
<div class="print-page">
<div class="delivery-note">
<div class="header">
@@ -637,233 +632,233 @@
</div>
</div>
`;
- });
+ });
- printContent += `
+ printContent += `
</body>
</html>
`;
- // 鍐欏叆鍐呭鍒版柊绐楀彛
- printWindow.document.write(printContent);
- printWindow.document.close();
+ // 鍐欏叆鍐呭鍒版柊绐楀彛
+ printWindow.document.write(printContent);
+ printWindow.document.close();
- // 绛夊緟鍐呭鍔犺浇瀹屾垚鍚庢墦鍗�
- printWindow.onload = () => {
- setTimeout(() => {
- printWindow.print();
- printWindow.close();
- printPreviewVisible.value = false;
- }, 500);
- };
+ // 绛夊緟鍐呭鍔犺浇瀹屾垚鍚庢墦鍗�
+ printWindow.onload = () => {
+ setTimeout(() => {
+ printWindow.print();
+ printWindow.close();
+ printPreviewVisible.value = false;
+ }, 500);
};
+};
- // 鏍煎紡鍖栨棩鏈�
- const formatDate = dateString => {
- if (!dateString) return getCurrentDate();
- const date = new Date(dateString);
- const year = date.getFullYear();
- const month = String(date.getMonth() + 1).padStart(2, "0");
- const day = String(date.getDate()).padStart(2, "0");
- return `${year}/${month}/${day}`;
- };
+// 鏍煎紡鍖栨棩鏈�
+const formatDate = (dateString) => {
+ if (!dateString) return getCurrentDate();
+ const date = new Date(dateString);
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, "0");
+ const day = String(date.getDate()).padStart(2, "0");
+ return `${year}/${month}/${day}`;
+};
- // 鏍煎紡鍖栨棩鏈熸椂闂�
- const formatDateTime = date => {
- const year = date.getFullYear();
- const month = String(date.getMonth() + 1).padStart(2, "0");
- const day = String(date.getDate()).padStart(2, "0");
- const hours = String(date.getHours()).padStart(2, "0");
- const minutes = String(date.getMinutes()).padStart(2, "0");
- const seconds = String(date.getSeconds()).padStart(2, "0");
- return `${year}/${month}/${day} ${hours}:${minutes}:${seconds}`;
- };
- onMounted(() => {
+// 鏍煎紡鍖栨棩鏈熸椂闂�
+const formatDateTime = (date) => {
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, "0");
+ const day = String(date.getDate()).padStart(2, "0");
+ const hours = String(date.getHours()).padStart(2, "0");
+ const minutes = String(date.getMinutes()).padStart(2, "0");
+ const seconds = String(date.getSeconds()).padStart(2, "0");
+ return `${year}/${month}/${day} ${hours}:${minutes}:${seconds}`;
+};
+onMounted(() => {
+ getList();
+ fetchStockRecordTypeOptions();
+});
+
+watch(
+ () => props.topParentProductId,
+ () => {
+ page.current = 1;
getList();
- fetchStockRecordTypeOptions();
- });
-
- watch(
- () => props.topParentProductId,
- () => {
- page.current = 1;
- getList();
- }
- );
+ }
+);
</script>
<style scoped lang="scss">
- .print-preview-dialog {
- .el-dialog__body {
- padding: 0;
- max-height: 80vh;
- overflow-y: auto;
- }
+.print-preview-dialog {
+ .el-dialog__body {
+ padding: 0;
+ max-height: 80vh;
+ overflow-y: auto;
}
+}
- .print-preview-container {
- .print-preview-header {
- padding: 15px;
- border-bottom: 1px solid #e4e7ed;
- text-align: center;
-
- .el-button {
- margin: 0 10px;
- }
- }
-
- .print-preview-content {
- padding: 20px;
- background-color: #f5f5f5;
- min-height: 400px;
- }
- }
-
- .print-page {
- width: 220mm;
- height: 90mm;
- padding: 10mm;
- margin: 0 auto;
- background: white;
- box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
- margin-bottom: 10px;
- box-sizing: border-box;
- }
-
- .delivery-note {
- width: 100%;
- height: 100%;
- font-family: "SimSun", serif;
- font-size: 10px;
- line-height: 1.2;
- display: flex;
- flex-direction: column;
- }
-
- .header {
+.print-preview-container {
+ .print-preview-header {
+ padding: 15px;
+ border-bottom: 1px solid #e4e7ed;
text-align: center;
- margin-bottom: 8px;
- .company-name {
- font-size: 18px;
- font-weight: bold;
- margin-bottom: 4px;
- }
-
- .document-title {
- font-size: 16px;
- font-weight: bold;
+ .el-button {
+ margin: 0 10px;
}
}
- .info-section {
- margin-bottom: 8px;
- display: flex;
- justify-content: space-between;
- align-items: center;
+ .print-preview-content {
+ padding: 20px;
+ background-color: #f5f5f5;
+ min-height: 400px;
+ }
+}
- .info-row {
- line-height: 20px;
+.print-page {
+ width: 220mm;
+ height: 90mm;
+ padding: 10mm;
+ margin: 0 auto;
+ background: white;
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+ margin-bottom: 10px;
+ box-sizing: border-box;
+}
+
+.delivery-note {
+ width: 100%;
+ height: 100%;
+ font-family: "SimSun", serif;
+ font-size: 10px;
+ line-height: 1.2;
+ display: flex;
+ flex-direction: column;
+}
+
+.header {
+ text-align: center;
+ margin-bottom: 8px;
+
+ .company-name {
+ font-size: 18px;
+ font-weight: bold;
+ margin-bottom: 4px;
+ }
+
+ .document-title {
+ font-size: 16px;
+ font-weight: bold;
+ }
+}
+
+.info-section {
+ margin-bottom: 8px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ .info-row {
+ line-height: 20px;
+
+ .label {
+ font-weight: bold;
+ width: 60px;
+ font-size: 14px;
+ }
+
+ .value {
+ margin-right: 20px;
+ min-width: 80px;
+ font-size: 14px;
+ }
+ }
+}
+
+.table-section {
+ margin-bottom: 4px;
+ flex: 1;
+
+ .product-table {
+ width: 100%;
+ border-collapse: collapse;
+ border: 1px solid #000;
+
+ th,
+ td {
+ border: 1px solid #000;
+ padding: 6px;
+ text-align: center;
+ font-size: 14px;
+ line-height: 1.4;
+ }
+
+ th {
+ font-weight: bold;
+ }
+
+ .total-label {
+ text-align: right;
+ font-weight: bold;
+ }
+
+ .total-value {
+ font-weight: bold;
+ }
+ }
+}
+
+.footer-section {
+ .footer-row {
+ display: flex;
+ margin-bottom: 3px;
+ line-height: 20px;
+ justify-content: space-between;
+
+ .footer-item {
+ display: flex;
+ margin-right: 20px;
.label {
font-weight: bold;
- width: 60px;
+ width: 80px;
font-size: 14px;
}
.value {
- margin-right: 20px;
min-width: 80px;
font-size: 14px;
}
- }
- }
- .table-section {
- margin-bottom: 4px;
- flex: 1;
-
- .product-table {
- width: 100%;
- border-collapse: collapse;
- border: 1px solid #000;
-
- th,
- td {
- border: 1px solid #000;
- padding: 6px;
- text-align: center;
- font-size: 14px;
- line-height: 1.4;
- }
-
- th {
- font-weight: bold;
- }
-
- .total-label {
- text-align: right;
- font-weight: bold;
- }
-
- .total-value {
- font-weight: bold;
- }
- }
- }
-
- .footer-section {
- .footer-row {
- display: flex;
- margin-bottom: 3px;
- line-height: 20px;
- justify-content: space-between;
-
- .footer-item {
- display: flex;
- margin-right: 20px;
-
- .label {
- font-weight: bold;
- width: 80px;
- font-size: 14px;
- }
-
- .value {
- min-width: 80px;
- font-size: 14px;
- }
-
- &.address-item {
- .address-value {
- min-width: 200px;
- }
+ &.address-item {
+ .address-value {
+ min-width: 200px;
}
}
}
}
+}
- @media print {
- .app-container {
- display: none;
- }
-
- .print-page {
- box-shadow: none;
- margin: 0;
- padding: 10mm;
- padding-left: 20mm;
- page-break-inside: avoid;
- page-break-after: always;
- }
- .print-page:last-child {
- page-break-after: avoid;
- }
+@media print {
+ .app-container {
+ display: none;
}
- .actions {
- display: flex;
- justify-content: flex-end;
- margin-bottom: 10px;
+ .print-page {
+ box-shadow: none;
+ margin: 0;
+ padding: 10mm;
+ padding-left: 20mm;
+ page-break-inside: avoid;
+ page-break-after: always;
}
+ .print-page:last-child {
+ page-break-after: avoid;
+ }
+}
+
+.actions {
+ display: flex;
+ justify-content: flex-end;
+ margin-bottom: 10px;
+}
</style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js b/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
index 677e0bc..f983240 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
@@ -474,13 +474,14 @@
}
/** 缁勮瀹℃壒鎻愪氦 DTO */
-export function buildApproveInstanceDto(row, uiResult, comment, warehouse) {
+export function buildApproveInstanceDto(row, uiResult, comment, warehouse, extraData = {}) {
const opinion = (comment || "").trim();
return {
id: row?.id,
approveAction: mapApproveActionToApi(uiResult),
approveComment: opinion || (uiResult === "approved" ? "鍚屾剰" : ""),
warehouse: warehouse || row?.warehouse || "",
+ ...extraData,
};
}
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
index ffa727e..9689be8 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
@@ -3,32 +3,44 @@
<div class="approve-detail-panel">
<div class="detail-block">
<div class="detail-block-title">鍩烘湰淇℃伅</div>
- <el-descriptions :column="2"
- border>
- <el-descriptions-item label="涓氬姟鍗曞彿">{{ row.bizId || row.id || "鈥�" }}</el-descriptions-item>
+ <el-descriptions :column="2" border>
+ <el-descriptions-item label="涓氬姟鍗曞彿">{{
+ row.bizId || row.id || "鈥�"
+ }}</el-descriptions-item>
<el-descriptions-item label="瀹℃壒鐘舵��">
- <el-tag :type="approvalStatusTagType(row.approvalStatus)"
- size="small"
- effect="plain">
+ <el-tag
+ :type="approvalStatusTagType(row.approvalStatus)"
+ size="small"
+ effect="plain"
+ >
{{ approvalStatusLabel(row.approvalStatus) }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="瀹℃壒绫诲瀷">
- <span class="approve-type-cell"
- :style="approvalTypeStyle(row.approvalType)">
+ <span
+ class="approve-type-cell"
+ :style="approvalTypeStyle(row.approvalType)"
+ >
{{ approvalTypeLabel(row.approvalType) }}
</span>
</el-descriptions-item>
- <el-descriptions-item label="鐢宠浜虹紪鍙�">{{ row.applicantNo || "鈥�" }}</el-descriptions-item>
- <el-descriptions-item label="鐢宠浜哄悕绉�">{{ row.applicantName || "鈥�" }}</el-descriptions-item>
- <el-descriptions-item label="鐢宠鎽樿">{{ row.summary || "鈥�" }}</el-descriptions-item>
- <el-descriptions-item v-if="row.rejectReason"
- label="椹冲洖鍘熷洜"
- :span="2">
+ <el-descriptions-item label="鐢宠浜虹紪鍙�">{{
+ row.applicantNo || "鈥�"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="鐢宠浜哄悕绉�">{{
+ row.applicantName || "鈥�"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="鐢宠鎽樿">{{
+ row.summary || "鈥�"
+ }}</el-descriptions-item>
+ <el-descriptions-item
+ v-if="row.rejectReason"
+ label="椹冲洖鍘熷洜"
+ :span="2"
+ >
<span class="reject-text">{{ row.rejectReason }}</span>
</el-descriptions-item>
- <el-descriptions-item label="鍒涘缓鏃堕棿"
- :span="2">
+ <el-descriptions-item label="鍒涘缓鏃堕棿" :span="2">
{{ formatDisplayTime(row.createTime) }}
</el-descriptions-item>
</el-descriptions>
@@ -36,141 +48,226 @@
<div class="detail-block">
<div class="detail-block-title">濉姤鍐呭</div>
<!-- 榛樿琛ㄥ崟灞曠ず -->
- <FormPayloadFields v-if="!isSpecialApprovalType"
- :fields="formResolved.fields"
- :form-payload="formResolved.formPayload"
- readonly />
-
+ <FormPayloadFields
+ v-if="!isSpecialApprovalType"
+ :fields="formResolved.fields"
+ :form-payload="formResolved.formPayload"
+ readonly
+ />
+
<!-- 鍙戣揣瀹℃壒璇︽儏 -->
<template v-else-if="row.businessType === 7">
<div v-if="detailData.shippingInfo" class="shipment-detail">
<el-divider content-position="left">鍙戣揣璇︽儏</el-divider>
<el-descriptions :column="2" border>
- <el-descriptions-item label="閿�鍞鍗�">{{ detailData.shippingInfo.salesContractNo || "--" }}</el-descriptions-item>
- <el-descriptions-item label="鍙戣揣璁㈠崟鍙�">{{ detailData.shippingInfo.shippingNo || "--" }}</el-descriptions-item>
- <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ detailData.shippingInfo.customerName || "--" }}</el-descriptions-item>
- <el-descriptions-item label="鍙戣揣绫诲瀷">{{ detailData.shippingInfo.type || "--" }}</el-descriptions-item>
- <el-descriptions-item label="鍙戣揣鏃ユ湡">{{ detailData.shippingInfo.shippingDateDate || "--" }}</el-descriptions-item>
- <el-descriptions-item label="瀹℃牳鐘舵��">{{ detailData.shippingInfo.status || "--" }}</el-descriptions-item>
- <el-descriptions-item label="鍙戣揣杞︾墝鍙�">{{ detailData.shippingInfo.shippingCarNumber || "--" }}</el-descriptions-item>
- <el-descriptions-item label="蹇�掑叕鍙�">{{ detailData.shippingInfo.expressCompany || "--" }}</el-descriptions-item>
- <el-descriptions-item label="蹇�掑崟鍙�" :span="2">{{ detailData.shippingInfo.expressNumber || "--" }}</el-descriptions-item>
+ <el-descriptions-item label="閿�鍞鍗�">{{
+ detailData.shippingInfo.salesContractNo || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="鍑哄簱鎵瑰彿">{{
+ detailData.shippingInfo.outboundBatches || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="瀹㈡埛鍚嶇О">{{
+ detailData.shippingInfo.customerName || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="鍙戣揣绫诲瀷">{{
+ detailData.shippingInfo.type || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="鍙戣揣鏃ユ湡">{{
+ detailData.shippingInfo.shippingDateDate || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="瀹℃牳鐘舵��">{{
+ detailData.shippingInfo.status || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="鍙戣揣杞︾墝鍙�">{{
+ detailData.shippingInfo.shippingCarNumber || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="蹇�掑叕鍙�">{{
+ detailData.shippingInfo.expressCompany || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="蹇�掑崟鍙�" :span="2">{{
+ detailData.shippingInfo.expressNumber || "--"
+ }}</el-descriptions-item>
</el-descriptions>
- <div v-if="detailData.shippingProductDetailDtoList.length" style="margin-top: 20px;">
+ <div
+ v-if="detailData.shippingProductDetailDtoList.length"
+ style="margin-top: 20px"
+ >
<h4>浜у搧鏄庣粏</h4>
- <el-table :data="detailData.shippingProductDetailDtoList"
- border
- size="small"
- style="width: 100%">
- <el-table-column label="鎵瑰彿" prop="batchNo" min-width="160" show-overflow-tooltip />
- <el-table-column label="浜у搧鍚嶇О" prop="productName" min-width="160" show-overflow-tooltip />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" min-width="160" show-overflow-tooltip />
- <el-table-column label="鍙戣揣鏁伴噺" prop="deliveryQuantity" min-width="120" align="center" />
+ <el-table
+ :data="detailData.shippingProductDetailDtoList"
+ border
+ size="small"
+ style="width: 100%"
+ >
+ <el-table-column
+ label="鎵瑰彿"
+ prop="batchNo"
+ min-width="160"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="浜у搧鍚嶇О"
+ prop="productName"
+ min-width="160"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="瑙勬牸鍨嬪彿"
+ prop="specificationModel"
+ min-width="160"
+ show-overflow-tooltip
+ />
+ <el-table-column
+ label="鍙戣揣鏁伴噺"
+ prop="deliveryQuantity"
+ min-width="120"
+ align="center"
+ />
</el-table>
</div>
</div>
</template>
-
+
<!-- 閲囪喘瀹℃壒璇︽儏 -->
<template v-else-if="row.businessType === 5">
<div v-if="detailData" class="procurement-detail">
<el-divider content-position="left">閲囪喘璇︽儏</el-divider>
<el-descriptions :column="2" border>
- <el-descriptions-item label="閲囪喘鍚堝悓鍙�">{{ detailData.purchaseContractNumber || "--" }}</el-descriptions-item>
- <el-descriptions-item label="渚涘簲鍟嗗悕绉�">{{ detailData.supplierName || "--" }}</el-descriptions-item>
- <el-descriptions-item label="椤圭洰鍚嶇О">{{ detailData.projectName || "--" }}</el-descriptions-item>
- <el-descriptions-item label="閿�鍞悎鍚屽彿">{{ detailData.salesContractNo || "--" }}</el-descriptions-item>
- <el-descriptions-item label="绛捐鏃ユ湡">{{ detailData.executionDate || "--" }}</el-descriptions-item>
- <el-descriptions-item label="褰曞叆鏃ユ湡">{{ detailData.entryDate || "--" }}</el-descriptions-item>
- <el-descriptions-item label="浠樻鏂瑰紡">{{ detailData.paymentMethod || "--" }}</el-descriptions-item>
+ <el-descriptions-item label="閲囪喘鍚堝悓鍙�">{{
+ detailData.purchaseContractNumber || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="渚涘簲鍟嗗悕绉�">{{
+ detailData.supplierName || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="椤圭洰鍚嶇О">{{
+ detailData.projectName || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="閿�鍞悎鍚屽彿">{{
+ detailData.salesContractNo || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="绛捐鏃ユ湡">{{
+ detailData.executionDate || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="褰曞叆鏃ユ湡">{{
+ detailData.entryDate || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="浠樻鏂瑰紡">{{
+ detailData.paymentMethod || "--"
+ }}</el-descriptions-item>
<el-descriptions-item label="鍚堝悓閲戦" :span="2">
- <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">
+ <span style="font-size: 18px; color: #e6a23c; font-weight: bold">
楼{{ Number(detailData.contractAmount ?? 0).toFixed(2) }}
</span>
</el-descriptions-item>
</el-descriptions>
- <div v-if="detailData.productData.length" style="margin-top: 20px;">
+ <div v-if="detailData.productData.length" style="margin-top: 20px">
<h4>浜у搧鏄庣粏</h4>
- <el-table :data="detailData.productData"
- border
- style="width: 100%">
+ <el-table :data="detailData.productData" border style="width: 100%">
<el-table-column prop="productCategory" label="浜у搧鍚嶇О" />
<el-table-column prop="specificationModel" label="瑙勬牸鍨嬪彿" />
<el-table-column prop="unit" label="鍗曚綅" />
<el-table-column prop="quantity" label="鏁伴噺" />
<el-table-column prop="taxInclusiveUnitPrice" label="鍚◣鍗曚环">
- <template #default="scope">楼{{ Number(scope.row.taxInclusiveUnitPrice ?? 0).toFixed(2) }}</template>
+ <template #default="scope"
+ >楼{{
+ Number(scope.row.taxInclusiveUnitPrice ?? 0).toFixed(2)
+ }}</template
+ >
</el-table-column>
<el-table-column prop="taxInclusiveTotalPrice" label="鍚◣鎬讳环">
- <template #default="scope">楼{{ Number(scope.row.taxInclusiveTotalPrice ?? 0).toFixed(2) }}</template>
+ <template #default="scope"
+ >楼{{
+ Number(scope.row.taxInclusiveTotalPrice ?? 0).toFixed(2)
+ }}</template
+ >
</el-table-column>
</el-table>
</div>
</div>
</template>
-
+
<!-- 鎶ヤ环瀹℃壒璇︽儏 -->
<template v-else-if="row.businessType === 6">
<div v-if="detailData" class="quotation-detail">
<el-divider content-position="left">鎶ヤ环璇︽儏</el-divider>
<el-descriptions :column="2" border>
- <el-descriptions-item label="鎶ヤ环鍗曞彿">{{ detailData.quotationNo || "--" }}</el-descriptions-item>
- <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ detailData.customer || "--" }}</el-descriptions-item>
- <el-descriptions-item label="涓氬姟鍛�">{{ detailData.salesperson || "--" }}</el-descriptions-item>
- <el-descriptions-item label="鎶ヤ环鏃ユ湡">{{ detailData.quotationDate || "--" }}</el-descriptions-item>
- <el-descriptions-item label="鏈夋晥鏈熻嚦">{{ detailData.validDate || "--" }}</el-descriptions-item>
- <el-descriptions-item label="浠樻鏂瑰紡">{{ detailData.paymentMethod || "--" }}</el-descriptions-item>
+ <el-descriptions-item label="鎶ヤ环鍗曞彿">{{
+ detailData.quotationNo || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="瀹㈡埛鍚嶇О">{{
+ detailData.customer || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="涓氬姟鍛�">{{
+ detailData.salesperson || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="鎶ヤ环鏃ユ湡">{{
+ detailData.quotationDate || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="鏈夋晥鏈熻嚦">{{
+ detailData.validDate || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="浠樻鏂瑰紡">{{
+ detailData.paymentMethod || "--"
+ }}</el-descriptions-item>
<el-descriptions-item label="鎶ヤ环鎬婚" :span="2">
- <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">
+ <span style="font-size: 18px; color: #e6a23c; font-weight: bold">
楼{{ Number(detailData.totalAmount ?? 0).toFixed(2) }}
</span>
</el-descriptions-item>
</el-descriptions>
- <div v-if="detailData.products?.length" style="margin-top: 20px;">
+ <div v-if="detailData.products?.length" style="margin-top: 20px">
<h4>浜у搧鏄庣粏</h4>
- <el-table :data="detailData.products"
- border
- style="width: 100%">
+ <el-table :data="detailData.products" border style="width: 100%">
<el-table-column prop="product" label="浜у搧鍚嶇О" />
<el-table-column prop="specification" label="瑙勬牸鍨嬪彿" />
<el-table-column prop="unit" label="鍗曚綅" />
<el-table-column prop="unitPrice" label="鍗曚环">
- <template #default="scope">楼{{ Number(scope.row.unitPrice ?? 0).toFixed(2) }}</template>
+ <template #default="scope"
+ >楼{{ Number(scope.row.unitPrice ?? 0).toFixed(2) }}</template
+ >
</el-table-column>
</el-table>
</div>
- <div v-if="detailData.remark" style="margin-top: 20px;">
+ <div v-if="detailData.remark" style="margin-top: 20px">
<h4>澶囨敞</h4>
<p>{{ detailData.remark }}</p>
</div>
</div>
</template>
</div>
- <div v-if="attachmentList.length"
- class="detail-block">
+ <div v-if="attachmentList.length" class="detail-block">
<div class="detail-block-title">闄勪欢鍒楄〃</div>
<div class="attachment-list">
- <div v-for="file in attachmentList"
- :key="file.id"
- class="attachment-item">
+ <div
+ v-for="file in attachmentList"
+ :key="file.id"
+ class="attachment-item"
+ >
<el-icon class="file-icon">
<Paperclip />
</el-icon>
- <span class="file-name"
- :title="file.name || file.originalFilename">
+ <span class="file-name" :title="file.name || file.originalFilename">
{{ file.name || file.originalFilename }}
</span>
<div class="file-actions">
- <el-link v-if="file.previewURL || file.url"
- type="primary"
- :underline="false"
- @click="openFile(file.previewURL || file.url)">棰勮</el-link>
- <el-divider v-if="(file.previewURL || file.url) && file.downloadURL"
- direction="vertical" />
- <el-link v-if="file.downloadURL"
- type="primary"
- :underline="false"
- @click="openFile(file.downloadURL)">涓嬭浇</el-link>
+ <el-link
+ v-if="file.previewURL || file.url"
+ type="primary"
+ :underline="false"
+ @click="openFile(file.previewURL || file.url)"
+ >棰勮</el-link
+ >
+ <el-divider
+ v-if="(file.previewURL || file.url) && file.downloadURL"
+ direction="vertical"
+ />
+ <el-link
+ v-if="file.downloadURL"
+ type="primary"
+ :underline="false"
+ @click="openFile(file.downloadURL)"
+ >涓嬭浇</el-link
+ >
</div>
</div>
</div>
@@ -179,108 +276,107 @@
</template>
<script setup>
- import { computed } from "vue";
- import { Paperclip } from "@element-plus/icons-vue";
- import { formatDisplayTime } from "../../approve-template/approveTemplateConstants.js";
- import {
- approvalTypeLabel,
- approvalTypeStyle,
- approvalStatusLabel,
- approvalStatusTagType,
- resolveInstanceFormFields,
- } from "../approveListConstants.js";
- import FormPayloadFields from "./FormPayloadFields.vue";
+import { computed } from "vue";
+import { Paperclip } from "@element-plus/icons-vue";
+import { formatDisplayTime } from "../../approve-template/approveTemplateConstants.js";
+import {
+ approvalTypeLabel,
+ approvalTypeStyle,
+ approvalStatusLabel,
+ approvalStatusTagType,
+ resolveInstanceFormFields,
+} from "../approveListConstants.js";
+import FormPayloadFields from "./FormPayloadFields.vue";
- const props = defineProps({
- row: { type: Object, default: () => ({}) },
- detailData: { type: Object, default: () => ({}) },
- });
+const props = defineProps({
+ row: { type: Object, default: () => ({}) },
+ detailData: { type: Object, default: () => ({}) },
+});
- const formResolved = computed(() => resolveInstanceFormFields(props.row));
+const formResolved = computed(() => resolveInstanceFormFields(props.row));
+// 鏄惁涓虹壒娈婂鎵圭被鍨嬶紙閲囪喘銆佸彂璐с�佹姤浠凤級
+const isSpecialApprovalType = computed(() => {
+ return [5, 7, 6].includes(props.row.businessType);
+});
- // 鏄惁涓虹壒娈婂鎵圭被鍨嬶紙閲囪喘銆佸彂璐с�佹姤浠凤級
- const isSpecialApprovalType = computed(() => {
- return [5, 7, 6].includes(props.row.businessType);
- });
+// 璇︽儏鏁版嵁锛堢洿鎺ヤ娇鐢ㄤ紶鍏ョ殑 detail-data 鍙傛暟锛�
+const detailData = computed(() => {
+ return props.detailData || {};
+});
- // 璇︽儏鏁版嵁锛堢洿鎺ヤ娇鐢ㄤ紶鍏ョ殑 detail-data 鍙傛暟锛�
- const detailData = computed(() => {
- return props.detailData || {};
- });
+const attachmentList = computed(() => {
+ const list = props.row.storageBlobVOList || props.row.storageBlobDTOs || [];
+ return Array.isArray(list) ? list : [];
+});
- const attachmentList = computed(() => {
- const list = props.row.storageBlobVOList || props.row.storageBlobDTOs || [];
- return Array.isArray(list) ? list : [];
- });
-
- function openFile(url) {
- if (!url) return;
- window.open(url, "_blank");
- }
+function openFile(url) {
+ if (!url) return;
+ window.open(url, "_blank");
+}
</script>
<style scoped>
- .approve-detail-panel {
- display: flex;
- flex-direction: column;
- gap: 20px;
- }
- .detail-block-title {
- font-size: 14px;
- font-weight: 600;
- color: var(--el-text-color-primary);
- margin: 0 0 12px;
- padding-left: 10px;
- border-left: 3px solid var(--el-color-primary);
- line-height: 1.4;
- }
- .approve-type-cell {
- display: inline-block;
- padding: 2px 10px;
- border-radius: 4px;
- font-size: 13px;
- line-height: 1.5;
- }
- .reject-text {
- color: var(--el-color-danger);
- }
+.approve-detail-panel {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+}
+.detail-block-title {
+ font-size: 14px;
+ font-weight: 600;
+ color: var(--el-text-color-primary);
+ margin: 0 0 12px;
+ padding-left: 10px;
+ border-left: 3px solid var(--el-color-primary);
+ line-height: 1.4;
+}
+.approve-type-cell {
+ display: inline-block;
+ padding: 2px 10px;
+ border-radius: 4px;
+ font-size: 13px;
+ line-height: 1.5;
+}
+.reject-text {
+ color: var(--el-color-danger);
+}
- .attachment-list {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
- gap: 12px;
- }
- .attachment-item {
- display: flex;
- align-items: center;
- padding: 10px 12px;
- background-color: var(--el-fill-color-light);
- border-radius: 6px;
- border: 1px solid var(--el-border-color-lighter);
- transition: all 0.3s;
- }
- .attachment-item:hover {
- border-color: var(--el-color-primary-light-5);
- background-color: var(--el-color-primary-light-9);
- }
- .file-icon {
- font-size: 18px;
- color: var(--el-text-color-secondary);
- margin-right: 10px;
- }
- .file-name {
- flex: 1;
- font-size: 13px;
- color: var(--el-text-color-primary);
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- margin-right: 12px;
- }
- .file-actions {
- display: flex;
- align-items: center;
- flex-shrink: 0;
- }
-</style>
\ No newline at end of file
+.attachment-list {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+ gap: 12px;
+}
+.attachment-item {
+ display: flex;
+ align-items: center;
+ padding: 10px 12px;
+ background-color: var(--el-fill-color-light);
+ border-radius: 6px;
+ border: 1px solid var(--el-border-color-lighter);
+ transition: all 0.3s;
+}
+.attachment-item:hover {
+ border-color: var(--el-color-primary-light-5);
+ background-color: var(--el-color-primary-light-9);
+}
+.file-icon {
+ font-size: 18px;
+ color: var(--el-text-color-secondary);
+ margin-right: 10px;
+}
+.file-name {
+ flex: 1;
+ font-size: 13px;
+ color: var(--el-text-color-primary);
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ margin-right: 12px;
+}
+.file-actions {
+ display: flex;
+ align-items: center;
+ flex-shrink: 0;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
index 2dd2474..ae568b3 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
@@ -665,8 +665,13 @@
if (approveSubmitting.value) return { ok: false };
approveSubmitting.value = true;
try {
+ // 鍙戣揣瀹℃壒鏃朵紶閫掑嚭搴撴壒鍙�
+ const extraData = {};
+ if (Number(row.businessType) === 7 && detailData.value?.shippingInfo?.outboundBatches) {
+ extraData.outboundBatches = detailData.value.shippingInfo.outboundBatches;
+ }
await approveApprovalInstance(
- buildApproveInstanceDto(row, result, approveOpinion.value, approveDialog.warehouse)
+ buildApproveInstanceDto(row, result, approveOpinion.value, approveDialog.warehouse, extraData)
);
approveDialog.visible = false;
await fetchApprovalList();
diff --git a/src/views/qualityManagement/finalInspection/components/formDia.vue b/src/views/qualityManagement/finalInspection/components/formDia.vue
index 458ab96..9fcb6b1 100644
--- a/src/views/qualityManagement/finalInspection/components/formDia.vue
+++ b/src/views/qualityManagement/finalInspection/components/formDia.vue
@@ -190,7 +190,7 @@
import {userListNoPage} from "@/api/system/user.js";
import {qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId} from "@/api/qualityManagement/metricMaintenance.js";
import {qualityInspectParamInfo} from "@/api/qualityManagement/qualityInspectParam.js";
-import {ledgerListNoPage} from "@/api/salesManagement/salesLedger.js";
+import {ledgerListNoPage, productList} from "@/api/salesManagement/salesLedger.js";
const { proxy } = getCurrentInstance()
const emit = defineEmits(['close'])
@@ -216,18 +216,18 @@
salesContractNo: "",
},
rules: {
- checkTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- process: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+ process: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
testStandardId: [{ required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- qualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ quantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+ qualifiedQuantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+ unqualifiedQuantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
+ checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "change" }],
},
});
const { form, rules } = toRefs(data);
@@ -296,6 +296,30 @@
form.value = {}
testStandardOptions.value = [];
tableData.value = [];
+
+ // 鏂板妯″紡涓嬶紝榛樿璁剧疆浜у搧鍚嶇О涓�"椹搩钖洩鑺辩矇"(id=320)
+ if (operationType.value === 'add') {
+ const defaultProductId = 320;
+ form.value.productId = defaultProductId;
+ currentProductId.value = defaultProductId;
+ form.value.productName = '椹搩钖洩鑺辩矇';
+ // 鍔犺浇瑙勬牸鍨嬪彿鍒楄〃
+ try {
+ const modelRes = await modelList({ id: defaultProductId });
+ modelOptions.value = modelRes || [];
+ // 榛樿閫変腑绗竴涓鏍煎瀷鍙�
+ if (modelOptions.value.length > 0) {
+ const firstModel = modelOptions.value[0];
+ form.value.productModelId = firstModel.id;
+ form.value.model = firstModel.model || '';
+ form.value.unit = firstModel.unit || '';
+ }
+ // 鍔犺浇鎸囨爣閫夐」
+ getList();
+ } catch (e) {
+ console.error('鍔犺浇榛樿浜у搧瑙勬牸鍨嬪彿澶辫触', e);
+ }
+ }
if (operationType.value === 'edit' || operationType.value === 'view') {
// 鍏堜繚瀛� testStandardId锛岄伩鍏嶈娓呯┖
@@ -387,12 +411,25 @@
}
// 閿�鍞鍗曢�夋嫨鍙樺寲澶勭悊
-const handleSalesLedgerChange = (value) => {
+const handleSalesLedgerChange = async (value) => {
const selectedItem = salesLedgerOptions.value.find(item => item.id == value);
if (selectedItem) {
form.value.salesContractNo = selectedItem.salesContractNo || '';
+ // 鏍规嵁閿�鍞鍗旾D鏌ヨ浜у搧淇℃伅锛屽彧璧嬪�兼暟閲�
+ try {
+ const res = await productList({ salesLedgerId: value, type: 1 });
+ const productData = res.data && res.data.length > 0 ? res.data[0] : null;
+ if (productData) {
+ // 鍙嚜鍔ㄥ甫鍏ユ暟閲�
+ form.value.quantity = productData.quantity || 0;
+ }
+ } catch (e) {
+ console.error('鏌ヨ閿�鍞鍗曚骇鍝佷俊鎭け璐�', e);
+ proxy.$modal.msgError('鏌ヨ閿�鍞鍗曚骇鍝佷俊鎭け璐�');
+ }
} else {
form.value.salesContractNo = '';
+ form.value.quantity = undefined;
}
}
diff --git a/src/views/qualityManagement/finalInspection/components/quickCheckDia.vue b/src/views/qualityManagement/finalInspection/components/quickCheckDia.vue
new file mode 100644
index 0000000..cf78973
--- /dev/null
+++ b/src/views/qualityManagement/finalInspection/components/quickCheckDia.vue
@@ -0,0 +1,327 @@
+<template>
+ <div>
+ <el-dialog
+ v-model="dialogVisible"
+ title="蹇�熸楠�"
+ width="70%"
+ @close="closeDialog"
+ >
+ <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
+ <el-select v-model="form.checkResult" placeholder="璇烽�夋嫨妫�娴嬬粨鏋�" style="width: 100%" @change="handleCheckResultChange">
+ <el-option label="鍚堟牸" value="鍚堟牸" />
+ <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
+ <el-option label="閮ㄥ垎鍚堟牸" value="閮ㄥ垎鍚堟牸" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鎸囨爣閫夋嫨锛�" prop="testStandardId">
+ <el-select v-model="form.testStandardId" placeholder="璇烽�夋嫨鎸囨爣" style="width: 100%" @change="handleTestStandardChange">
+ <el-option
+ v-for="item in testStandardOptions"
+ :key="item.id"
+ :label="item.standardName || item.standardNo"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <template v-if="form.checkResult">
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="鏁伴噺锛�" prop="quantity">
+ <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏ユ暟閲�" clearable :precision="2" @change="handleQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
+ <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏ユ娴嬪崟浣�" clearable/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="鍚堟牸鏁伴噺锛�" prop="qualifiedQuantity">
+ <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.qualifiedQuantity" placeholder="璇疯緭鍏ュ悎鏍兼暟閲�" clearable :precision="2" @change="handleQualifiedQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="涓嶅悎鏍兼暟閲忥細" prop="unqualifiedQuantity">
+ <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.unqualifiedQuantity" placeholder="璇疯緭鍏ヤ笉鍚堟牸鏁伴噺" clearable :precision="2" @change="handleUnqualifiedQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="妫�楠屽憳锛�" prop="checkName">
+ <el-select v-model="form.checkName" placeholder="璇烽�夋嫨妫�楠屽憳" clearable style="width: 100%">
+ <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
+ <el-date-picker
+ v-model="form.checkTime"
+ type="date"
+ placeholder="璇烽�夋嫨妫�娴嬫棩鏈�"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ clearable
+ style="width: 100%"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </template>
+ </el-form>
+ <PIMTable
+ rowKey="id"
+ :column="tableColumn"
+ :tableData="tableData"
+ :tableLoading="tableLoading"
+ height="400"
+ >
+ <template #slot="{ row }">
+ <el-input v-model="row.testValue" clearable/>
+ </template>
+ </PIMTable>
+ <template #footer>
+ <div class="dialog-footer">
+ <el-button type="primary" @click="submitForm">纭</el-button>
+ <el-button @click="closeDialog">鍙栨秷</el-button>
+ </div>
+ </template>
+ </el-dialog>
+ </div>
+</template>
+
+<script setup>
+import { ref, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
+import { userListNoPage } from "@/api/system/user.js";
+import { batchQuickInspect } from "@/api/qualityManagement/rawMaterialInspection.js";
+import { qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId } from "@/api/qualityManagement/metricMaintenance.js";
+
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(['close', 'success']);
+
+const dialogVisible = ref(false);
+const userList = ref([]);
+const selectedIds = ref([]);
+const selectedRows = ref([]);
+const testStandardOptions = ref([]);
+const inspectType = ref(2); // 鍑哄巶妫�楠岀被鍨�
+
+const data = reactive({
+ form: {
+ checkResult: '',
+ testStandardId: '',
+ quantity: undefined,
+ qualifiedQuantity: undefined,
+ unqualifiedQuantity: undefined,
+ checkCompany: '',
+ checkName: '',
+ checkTime: '',
+ },
+ rules: {
+ checkResult: [{ required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change" }],
+ testStandardId: [{ required: true, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
+ quantity: [{ required: true, message: "璇疯緭鍏ユ暟閲�", trigger: "blur" }],
+ qualifiedQuantity: [{ required: true, message: "璇疯緭鍏ュ悎鏍兼暟閲�", trigger: "blur" }],
+ unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏ヤ笉鍚堟牸鏁伴噺", trigger: "blur" }],
+ checkCompany: [{ required: true, message: "璇疯緭鍏ユ娴嬪崟浣�", trigger: "blur" }],
+ checkName: [{ required: true, message: "璇烽�夋嫨妫�楠屽憳", trigger: "change" }],
+ checkTime: [{ required: true, message: "璇烽�夋嫨妫�娴嬫棩鏈�", trigger: "change" }],
+ },
+});
+const { form, rules } = toRefs(data);
+
+const tableColumn = ref([
+ {
+ label: "鎸囨爣",
+ prop: "parameterItem",
+ },
+ {
+ label: "鍗曚綅",
+ prop: "unit",
+ },
+ {
+ label: "鏍囧噯鍊�",
+ prop: "standardValue",
+ },
+ {
+ label: "鍐呮帶鍊�",
+ prop: "controlValue",
+ },
+ {
+ label: "妫�楠屽��",
+ prop: "testValue",
+ dataType: 'slot',
+ slot: 'slot',
+ },
+]);
+const tableData = ref([]);
+const tableLoading = ref(false);
+
+// 鎵撳紑寮规
+const openDialog = async (ids, rows) => {
+ selectedIds.value = ids;
+ selectedRows.value = rows;
+ dialogVisible.value = true;
+
+ // 鍔犺浇鐢ㄦ埛鍒楄〃
+ const userListsRes = await userListNoPage();
+ userList.value = userListsRes.data;
+
+ // 鍔犺浇鎸囨爣閫夐」锛堟牴鎹涓�涓�変腑琛岀殑浜у搧ID锛�
+ if (rows && rows.length > 0 && rows[0].productId) {
+ const params = {
+ productId: rows[0].productId,
+ inspectType: 2
+ };
+ const res = await qualityInspectDetailByProductId(params);
+ testStandardOptions.value = res.data || [];
+ } else {
+ testStandardOptions.value = [];
+ }
+
+ // 閲嶇疆琛ㄥ崟
+ form.value = {
+ checkResult: '',
+ testStandardId: '',
+ quantity: undefined,
+ qualifiedQuantity: undefined,
+ unqualifiedQuantity: undefined,
+ checkCompany: '',
+ checkName: '',
+ checkTime: '',
+ };
+ tableData.value = [];
+
+ await nextTick();
+ proxy.$refs.formRef?.clearValidate();
+};
+
+// 鎸囨爣閫夋嫨鍙樺寲澶勭悊
+const handleTestStandardChange = async (testStandardId) => {
+ if (!testStandardId) {
+ tableData.value = [];
+ return;
+ }
+ tableLoading.value = true;
+ try {
+ const res = await getQualityTestStandardParamByTestStandardId(testStandardId);
+ tableData.value = (res.data || []).map(item => ({
+ ...item,
+ id: null,
+ testValue: ''
+ }));
+ } catch (error) {
+ console.error('鑾峰彇鏍囧噯鍙傛暟澶辫触:', error);
+ tableData.value = [];
+ } finally {
+ tableLoading.value = false;
+ }
+};
+
+// 妫�娴嬬粨鏋滃彉鍖栧鐞�
+const handleCheckResultChange = (value) => {
+ if (value === '鍚堟牸') {
+ // 鍚堟牸鏃讹紝鍚堟牸鏁伴噺绛変簬鏁伴噺锛屼笉鍚堟牸鏁伴噺涓�0
+ form.value.qualifiedQuantity = form.value.quantity || 0;
+ form.value.unqualifiedQuantity = 0;
+ } else if (value === '涓嶅悎鏍�') {
+ // 涓嶅悎鏍兼椂锛屽悎鏍兼暟閲忎负0锛屼笉鍚堟牸鏁伴噺绛変簬鏁伴噺
+ form.value.qualifiedQuantity = 0;
+ form.value.unqualifiedQuantity = form.value.quantity || 0;
+ }
+};
+
+// 鏁伴噺鍙樺寲澶勭悊
+const handleQuantityChange = (value) => {
+ if (form.value.checkResult === '鍚堟牸') {
+ form.value.qualifiedQuantity = value || 0;
+ form.value.unqualifiedQuantity = 0;
+ } else if (form.value.checkResult === '涓嶅悎鏍�') {
+ form.value.qualifiedQuantity = 0;
+ form.value.unqualifiedQuantity = value || 0;
+ }
+};
+
+// 鍚堟牸鏁伴噺鍙樺寲澶勭悊
+const handleQualifiedQuantityChange = (value) => {
+ const quantity = form.value.quantity || 0;
+ if (value > quantity) {
+ proxy.$modal.msgWarning("鍚堟牸鏁伴噺涓嶈兘澶т簬鎬绘暟閲�");
+ form.value.qualifiedQuantity = quantity;
+ form.value.unqualifiedQuantity = 0;
+ } else {
+ form.value.unqualifiedQuantity = Number((quantity - value).toFixed(2));
+ }
+ updateCheckResult();
+};
+
+// 涓嶅悎鏍兼暟閲忓彉鍖栧鐞�
+const handleUnqualifiedQuantityChange = (value) => {
+ const quantity = form.value.quantity || 0;
+ if (value > quantity) {
+ proxy.$modal.msgWarning("涓嶅悎鏍兼暟閲忎笉鑳藉ぇ浜庢�绘暟閲�");
+ form.value.unqualifiedQuantity = quantity;
+ form.value.qualifiedQuantity = 0;
+ } else {
+ form.value.qualifiedQuantity = Number((quantity - value).toFixed(2));
+ }
+ updateCheckResult();
+};
+
+// 鏍规嵁鍚堟牸/涓嶅悎鏍兼暟閲忔洿鏂版娴嬬粨鏋�
+const updateCheckResult = () => {
+ const qualified = form.value.qualifiedQuantity || 0;
+ const unqualified = form.value.unqualifiedQuantity || 0;
+ const quantity = form.value.quantity || 0;
+
+ if (qualified === quantity && unqualified === 0) {
+ form.value.checkResult = '鍚堟牸';
+ } else if (unqualified === quantity && qualified === 0) {
+ form.value.checkResult = '涓嶅悎鏍�';
+ } else if (qualified > 0 && unqualified > 0) {
+ form.value.checkResult = '閮ㄥ垎鍚堟牸';
+ }
+};
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = () => {
+ proxy.$refs.formRef.validate((valid) => {
+ if (valid) {
+ const data = {
+ ids: selectedIds.value,
+ inspectType: inspectType.value,
+ ...form.value,
+ paramList: tableData.value
+ };
+ batchQuickInspect(data).then(res => {
+ proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+ emit('success');
+ closeDialog();
+ });
+ }
+ });
+};
+
+// 鍏抽棴寮规
+const closeDialog = () => {
+ dialogVisible.value = false;
+ emit('close');
+};
+
+defineExpose({
+ openDialog,
+});
+</script>
+
+<style scoped>
+</style>
diff --git a/src/views/qualityManagement/finalInspection/index.vue b/src/views/qualityManagement/finalInspection/index.vue
index 81d5595..88ba755 100644
--- a/src/views/qualityManagement/finalInspection/index.vue
+++ b/src/views/qualityManagement/finalInspection/index.vue
@@ -69,6 +69,9 @@
@close="handleQuery"></FormDia>
<files-dia ref="filesDia"
@close="handleQuery"></files-dia>
+ <QuickCheckDia ref="quickCheckDia"
+ @close="handleQuery"
+ @success="getList"></QuickCheckDia>
<el-dialog v-model="dialogFormVisible"
title="缂栬緫妫�楠屽憳"
width="30%"
@@ -115,6 +118,7 @@
} from "vue";
import InspectionFormDia from "@/views/qualityManagement/finalInspection/components/inspectionFormDia.vue";
import FormDia from "@/views/qualityManagement/finalInspection/components/formDia.vue";
+ import QuickCheckDia from "@/views/qualityManagement/finalInspection/components/quickCheckDia.vue";
import { ElMessageBox } from "element-plus";
import {
downloadQualityInspect,
@@ -122,7 +126,6 @@
qualityInspectListPage,
qualityInspectUpdate,
submitQualityInspect,
- batchQuickInspect,
} from "@/api/qualityManagement/rawMaterialInspection.js";
import FilesDia from "@/views/qualityManagement/finalInspection/components/filesDia.vue";
import dayjs from "dayjs";
@@ -322,6 +325,7 @@
const formDia = ref();
const filesDia = ref();
const inspectionFormDia = ref();
+ const quickCheckDia = ref();
const { proxy } = getCurrentInstance();
const userStore = useUserStore();
const userList = ref([]);
@@ -402,32 +406,8 @@
return;
}
- const totalCount = selectedRows.value.length;
- const submittedCount = totalCount - unSubmittedRows.length;
-
- let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
- if (submittedCount > 0) {
- confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
- }
- confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
-
- ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- dangerouslyUseHTMLString: false,
- })
- .then(() => {
- // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
- const ids = unSubmittedRows.map(item => item.id);
- batchQuickInspect(ids).then(res => {
- proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
+ const ids = unSubmittedRows.map(item => item.id);
+ quickCheckDia.value?.openDialog(ids, unSubmittedRows);
};
// 鎵撳紑鏂板妫�楠屽脊妗�
diff --git a/src/views/qualityManagement/metricBinding/index.vue b/src/views/qualityManagement/metricBinding/index.vue
index 1ac268a..5d115d6 100644
--- a/src/views/qualityManagement/metricBinding/index.vue
+++ b/src/views/qualityManagement/metricBinding/index.vue
@@ -141,8 +141,8 @@
</el-form>
<template #footer>
<span class="dialog-footer">
- <el-button @click="closeBindingDialog">鍙栨秷</el-button>
<el-button type="primary" @click="submitBinding">纭畾</el-button>
+ <el-button @click="closeBindingDialog">鍙栨秷</el-button>
</span>
</template>
</el-dialog>
@@ -215,18 +215,6 @@
formatData: (val) => {
const map = { 0: '鍘熸潗鏂欐楠�', 1: '杩囩▼妫�楠�', 2: '鍑哄巶妫�楠�' }
return map[val] || val
- }
- },
- {
- label: '宸ュ簭',
- prop: 'processId',
- align: 'center',
- dataType: 'tag',
- formatData: (val) => {
- const target = processOptions.value.find(
- (item) => String(item.value) === String(val)
- )
- return target?.label || val
}
},
{
diff --git a/src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue b/src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue
index 38d535a..381dac4 100644
--- a/src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue
+++ b/src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue
@@ -27,16 +27,6 @@
<el-option label="鍑哄巶妫�楠�" value="2" />
</el-select>
</el-form-item>
- <el-form-item label="宸ュ簭" prop="processId">
- <el-select v-model="form.processId" placeholder="璇烽�夋嫨宸ュ簭" style="width: 100%">
- <el-option
- v-for="item in processOptions"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
<el-form-item label="鐘舵��" prop="state">
<el-select v-model="form.state" placeholder="璇烽�夋嫨鐘舵��" style="width: 100%">
<el-option label="鑽夌" value="0" />
@@ -96,7 +86,7 @@
const formRef = ref(null)
-const computedTitle = computed(() => {
+ const computedTitle = computed(() => {
if (props.operationType === 'edit') return '缂栬緫妫�娴嬫爣鍑�'
if (props.operationType === 'copy') return '澶嶅埗妫�娴嬫爣鍑�'
return '鏂板妫�娴嬫爣鍑�'
diff --git a/src/views/qualityManagement/metricMaintenance/index.vue b/src/views/qualityManagement/metricMaintenance/index.vue
index deb3e5f..8d1dd1c 100644
--- a/src/views/qualityManagement/metricMaintenance/index.vue
+++ b/src/views/qualityManagement/metricMaintenance/index.vue
@@ -310,18 +310,6 @@
}
},
{
- label: '宸ュ簭',
- prop: 'processId',
- align: 'center',
- dataType: 'tag',
- formatData: (val) => {
- const target = processOptions.value.find(
- (item) => String(item.value) === String(val)
- )
- return target?.label || val
- }
- },
- {
label: '鐘舵��',
prop: 'state',
headerSlot: 'stateHeader',
diff --git a/src/views/qualityManagement/processInspection/components/formDia.vue b/src/views/qualityManagement/processInspection/components/formDia.vue
index 635360f..3dac79e 100644
--- a/src/views/qualityManagement/processInspection/components/formDia.vue
+++ b/src/views/qualityManagement/processInspection/components/formDia.vue
@@ -11,17 +11,18 @@
ref="formRef">
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="宸ュ簭锛�"
- prop="process">
- <el-select v-model="form.process"
- placeholder="璇烽�夋嫨宸ュ簭"
+ <el-form-item label="閲囪喘鍚堝悓鍙凤細"
+ prop="purchaseContractNo">
+ <el-select v-model="form.purchaseContractNo"
+ placeholder="璇烽�夋嫨"
clearable
- :disabled="isViewMode || processQuantityDisabled"
+ filterable
+ :disabled="isViewMode"
style="width: 100%">
- <el-option v-for="item in processList"
- :key="item.name"
- :label="item.name"
- :value="item.name" />
+ <el-option v-for="item in purchaseContractList"
+ :key="item.id"
+ :label="item.purchaseContractNumber + ' - ' + item.supplierName"
+ :value="item.purchaseContractNumber" />
</el-select>
</el-form-item>
</el-col>
@@ -216,7 +217,7 @@
getCurrentInstance,
nextTick,
} from "vue";
- import { getOptions } from "@/api/procurementManagement/procurementLedger.js";
+ import { getOptions, purchaseListPage } from "@/api/procurementManagement/procurementLedger.js";
import { modelList, productTreeList } from "@/api/basicData/product.js";
import {
qualityInspectAdd,
@@ -228,7 +229,7 @@
} from "@/api/qualityManagement/metricMaintenance.js";
import { userListNoPage } from "@/api/system/user.js";
import { qualityInspectParamInfo } from "@/api/qualityManagement/qualityInspectParam.js";
- import { list } from "@/api/productionManagement/productionProcess";
+
import qualified from "@/views/inventoryManagement/stockManagement/Qualified.vue";
const { proxy } = getCurrentInstance();
const emit = defineEmits(["close"]);
@@ -238,7 +239,6 @@
const data = reactive({
form: {
checkTime: "",
- process: "",
checkName: "",
productName: "",
productId: "",
@@ -251,20 +251,21 @@
unqualifiedQuantity: "",
checkCompany: "",
checkResult: "",
+ purchaseContractNo: "",
},
rules: {
- checkTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- process: [{ required: true, message: "璇烽�夋嫨宸ュ簭", trigger: "change" }],
+ checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
testStandardId: [{ required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- qualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ quantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+ qualifiedQuantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+ unqualifiedQuantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
+ purchaseContractNo: [{ required: false, message: "璇烽�夋嫨", trigger: "change" }],
+ checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "change" }],
},
});
const userList = ref([]);
@@ -276,9 +277,10 @@
const v = form.value || {};
return !!(v.productMainId != null || v.purchaseLedgerId != null);
});
- const processList = ref([]); // 宸ュ簭涓嬫媺鍒楄〃锛堝伐搴忓悕绉� name锛�
+
const supplierList = ref([]);
const productOptions = ref([]);
+ const purchaseContractList = ref([]); // 閲囪喘鍚堝悓鍙峰垪琛�
const tableColumn = ref([
{
label: "鎸囨爣",
@@ -315,20 +317,19 @@
getOptions().then(res => {
supplierList.value = res.data;
});
- // 鍔犺浇宸ュ簭涓嬫媺鍒楄〃
- try {
- const res = await list({ size: -1, current: -1 });
- processList.value = res.data.records || [];
- } catch (e) {
- console.error("鍔犺浇宸ュ簭鍒楄〃澶辫触", e);
- processList.value = [];
- }
let userLists = await userListNoPage();
userList.value = userLists.data;
- // 鍏堥噸缃〃鍗曟暟鎹紙淇濇寔瀛楁瀹屾暣锛岄伩鍏嶅脊绐楅娆℃覆鏌撴椂瑙﹀彂蹇呭~绾㈡鈥滈棯涓�涓嬧�濓級
+ // 鍔犺浇閲囪喘鍚堝悓鍙峰垪琛�
+ try {
+ const contractRes = await purchaseListPage({ pageNum: -1, pageSize: -1 });
+ purchaseContractList.value = contractRes.data?.records || [];
+ } catch (e) {
+ console.error("鍔犺浇閲囪喘鍚堝悓鍙峰け璐�", e);
+ purchaseContractList.value = [];
+ }
+ // 鍏堥噸缃〃鍗曟暟鎹紙淇濇寔瀛楁瀹屾暣锛岄伩鍏嶅脊绐楅娆℃覆鏌撴椂瑙﹀彂蹇呭~绾㈡"闂竴涓�"锛�
form.value = {
checkTime: "",
- process: "",
checkName: "",
productName: "",
productId: "",
@@ -339,6 +340,7 @@
quantity: "",
checkCompany: "",
checkResult: "",
+ purchaseContractNo: "",
};
testStandardOptions.value = [];
tableData.value = [];
@@ -370,7 +372,6 @@
let params = {
productId: currentProductId.value,
inspectType: 1,
- process: form.value.process || "",
};
qualityInspectDetailByProductId(params).then(res => {
testStandardOptions.value = res.data || [];
@@ -518,9 +519,16 @@
return;
}
+ // 鏍规嵁閲囪喘鍚堝悓鍙锋煡鎵惧搴旂殑 purchaseLedgerId
+ const selectedContract = purchaseContractList.value.find(
+ item => item.purchaseContractNumber === form.value.purchaseContractNo
+ );
+ const purchaseLedgerId = selectedContract ? selectedContract.id : null;
+
const data = {
...form.value,
process: processName, // 淇濈暀 process 瀛楁浠ュ吋瀹瑰悗绔�
+ purchaseLedgerId: purchaseLedgerId, // 鎻愪氦 purchaseLedgerId
qualityInspectParams: tableData.value,
};
if (operationType.value === "add") {
diff --git a/src/views/qualityManagement/processInspection/components/quickCheckDia.vue b/src/views/qualityManagement/processInspection/components/quickCheckDia.vue
new file mode 100644
index 0000000..0aa069b
--- /dev/null
+++ b/src/views/qualityManagement/processInspection/components/quickCheckDia.vue
@@ -0,0 +1,327 @@
+<template>
+ <div>
+ <el-dialog
+ v-model="dialogVisible"
+ title="蹇�熸楠�"
+ width="70%"
+ @close="closeDialog"
+ >
+ <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
+ <el-select v-model="form.checkResult" placeholder="璇烽�夋嫨妫�娴嬬粨鏋�" style="width: 100%" @change="handleCheckResultChange">
+ <el-option label="鍚堟牸" value="鍚堟牸" />
+ <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
+ <el-option label="閮ㄥ垎鍚堟牸" value="閮ㄥ垎鍚堟牸" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鎸囨爣閫夋嫨锛�" prop="testStandardId">
+ <el-select v-model="form.testStandardId" placeholder="璇烽�夋嫨鎸囨爣" style="width: 100%" @change="handleTestStandardChange">
+ <el-option
+ v-for="item in testStandardOptions"
+ :key="item.id"
+ :label="item.standardName || item.standardNo"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <template v-if="form.checkResult">
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="鏁伴噺锛�" prop="quantity">
+ <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏ユ暟閲�" clearable :precision="2" @change="handleQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
+ <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏ユ娴嬪崟浣�" clearable/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="鍚堟牸鏁伴噺锛�" prop="qualifiedQuantity">
+ <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.qualifiedQuantity" placeholder="璇疯緭鍏ュ悎鏍兼暟閲�" clearable :precision="2" @change="handleQualifiedQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="涓嶅悎鏍兼暟閲忥細" prop="unqualifiedQuantity">
+ <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.unqualifiedQuantity" placeholder="璇疯緭鍏ヤ笉鍚堟牸鏁伴噺" clearable :precision="2" @change="handleUnqualifiedQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="妫�楠屽憳锛�" prop="checkName">
+ <el-select v-model="form.checkName" placeholder="璇烽�夋嫨妫�楠屽憳" clearable style="width: 100%">
+ <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
+ <el-date-picker
+ v-model="form.checkTime"
+ type="date"
+ placeholder="璇烽�夋嫨妫�娴嬫棩鏈�"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ clearable
+ style="width: 100%"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </template>
+ </el-form>
+ <PIMTable
+ rowKey="id"
+ :column="tableColumn"
+ :tableData="tableData"
+ :tableLoading="tableLoading"
+ height="400"
+ >
+ <template #slot="{ row }">
+ <el-input v-model="row.testValue" clearable/>
+ </template>
+ </PIMTable>
+ <template #footer>
+ <div class="dialog-footer">
+ <el-button type="primary" @click="submitForm">纭</el-button>
+ <el-button @click="closeDialog">鍙栨秷</el-button>
+ </div>
+ </template>
+ </el-dialog>
+ </div>
+</template>
+
+<script setup>
+import { ref, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
+import { userListNoPage } from "@/api/system/user.js";
+import { batchQuickInspect } from "@/api/qualityManagement/rawMaterialInspection.js";
+import { qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId } from "@/api/qualityManagement/metricMaintenance.js";
+
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(['close', 'success']);
+
+const dialogVisible = ref(false);
+const userList = ref([]);
+const selectedIds = ref([]);
+const selectedRows = ref([]);
+const testStandardOptions = ref([]);
+const inspectType = ref(1); // 杩囩▼妫�楠岀被鍨�
+
+const data = reactive({
+ form: {
+ checkResult: '',
+ testStandardId: '',
+ quantity: undefined,
+ qualifiedQuantity: undefined,
+ unqualifiedQuantity: undefined,
+ checkCompany: '',
+ checkName: '',
+ checkTime: '',
+ },
+ rules: {
+ checkResult: [{ required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change" }],
+ testStandardId: [{ required: true, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
+ quantity: [{ required: true, message: "璇疯緭鍏ユ暟閲�", trigger: "blur" }],
+ qualifiedQuantity: [{ required: true, message: "璇疯緭鍏ュ悎鏍兼暟閲�", trigger: "blur" }],
+ unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏ヤ笉鍚堟牸鏁伴噺", trigger: "blur" }],
+ checkCompany: [{ required: true, message: "璇疯緭鍏ユ娴嬪崟浣�", trigger: "blur" }],
+ checkName: [{ required: true, message: "璇烽�夋嫨妫�楠屽憳", trigger: "change" }],
+ checkTime: [{ required: true, message: "璇烽�夋嫨妫�娴嬫棩鏈�", trigger: "change" }],
+ },
+});
+const { form, rules } = toRefs(data);
+
+const tableColumn = ref([
+ {
+ label: "鎸囨爣",
+ prop: "parameterItem",
+ },
+ {
+ label: "鍗曚綅",
+ prop: "unit",
+ },
+ {
+ label: "鏍囧噯鍊�",
+ prop: "standardValue",
+ },
+ {
+ label: "鍐呮帶鍊�",
+ prop: "controlValue",
+ },
+ {
+ label: "妫�楠屽��",
+ prop: "testValue",
+ dataType: 'slot',
+ slot: 'slot',
+ },
+]);
+const tableData = ref([]);
+const tableLoading = ref(false);
+
+// 鎵撳紑寮规
+const openDialog = async (ids, rows) => {
+ selectedIds.value = ids;
+ selectedRows.value = rows;
+ dialogVisible.value = true;
+
+ // 鍔犺浇鐢ㄦ埛鍒楄〃
+ const userListsRes = await userListNoPage();
+ userList.value = userListsRes.data;
+
+ // 鍔犺浇鎸囨爣閫夐」锛堟牴鎹涓�涓�変腑琛岀殑浜у搧ID锛�
+ if (rows && rows.length > 0 && rows[0].productId) {
+ const params = {
+ productId: rows[0].productId,
+ inspectType: 1
+ };
+ const res = await qualityInspectDetailByProductId(params);
+ testStandardOptions.value = res.data || [];
+ } else {
+ testStandardOptions.value = [];
+ }
+
+ // 閲嶇疆琛ㄥ崟
+ form.value = {
+ checkResult: '',
+ testStandardId: '',
+ quantity: undefined,
+ qualifiedQuantity: undefined,
+ unqualifiedQuantity: undefined,
+ checkCompany: '',
+ checkName: '',
+ checkTime: '',
+ };
+ tableData.value = [];
+
+ await nextTick();
+ proxy.$refs.formRef?.clearValidate();
+};
+
+// 鎸囨爣閫夋嫨鍙樺寲澶勭悊
+const handleTestStandardChange = async (testStandardId) => {
+ if (!testStandardId) {
+ tableData.value = [];
+ return;
+ }
+ tableLoading.value = true;
+ try {
+ const res = await getQualityTestStandardParamByTestStandardId(testStandardId);
+ tableData.value = (res.data || []).map(item => ({
+ ...item,
+ id: null,
+ testValue: ''
+ }));
+ } catch (error) {
+ console.error('鑾峰彇鏍囧噯鍙傛暟澶辫触:', error);
+ tableData.value = [];
+ } finally {
+ tableLoading.value = false;
+ }
+};
+
+// 妫�娴嬬粨鏋滃彉鍖栧鐞�
+const handleCheckResultChange = (value) => {
+ if (value === '鍚堟牸') {
+ // 鍚堟牸鏃讹紝鍚堟牸鏁伴噺绛変簬鏁伴噺锛屼笉鍚堟牸鏁伴噺涓�0
+ form.value.qualifiedQuantity = form.value.quantity || 0;
+ form.value.unqualifiedQuantity = 0;
+ } else if (value === '涓嶅悎鏍�') {
+ // 涓嶅悎鏍兼椂锛屽悎鏍兼暟閲忎负0锛屼笉鍚堟牸鏁伴噺绛変簬鏁伴噺
+ form.value.qualifiedQuantity = 0;
+ form.value.unqualifiedQuantity = form.value.quantity || 0;
+ }
+};
+
+// 鏁伴噺鍙樺寲澶勭悊
+const handleQuantityChange = (value) => {
+ if (form.value.checkResult === '鍚堟牸') {
+ form.value.qualifiedQuantity = value || 0;
+ form.value.unqualifiedQuantity = 0;
+ } else if (form.value.checkResult === '涓嶅悎鏍�') {
+ form.value.qualifiedQuantity = 0;
+ form.value.unqualifiedQuantity = value || 0;
+ }
+};
+
+// 鍚堟牸鏁伴噺鍙樺寲澶勭悊
+const handleQualifiedQuantityChange = (value) => {
+ const quantity = form.value.quantity || 0;
+ if (value > quantity) {
+ proxy.$modal.msgWarning("鍚堟牸鏁伴噺涓嶈兘澶т簬鎬绘暟閲�");
+ form.value.qualifiedQuantity = quantity;
+ form.value.unqualifiedQuantity = 0;
+ } else {
+ form.value.unqualifiedQuantity = Number((quantity - value).toFixed(2));
+ }
+ updateCheckResult();
+};
+
+// 涓嶅悎鏍兼暟閲忓彉鍖栧鐞�
+const handleUnqualifiedQuantityChange = (value) => {
+ const quantity = form.value.quantity || 0;
+ if (value > quantity) {
+ proxy.$modal.msgWarning("涓嶅悎鏍兼暟閲忎笉鑳藉ぇ浜庢�绘暟閲�");
+ form.value.unqualifiedQuantity = quantity;
+ form.value.qualifiedQuantity = 0;
+ } else {
+ form.value.qualifiedQuantity = Number((quantity - value).toFixed(2));
+ }
+ updateCheckResult();
+};
+
+// 鏍规嵁鍚堟牸/涓嶅悎鏍兼暟閲忔洿鏂版娴嬬粨鏋�
+const updateCheckResult = () => {
+ const qualified = form.value.qualifiedQuantity || 0;
+ const unqualified = form.value.unqualifiedQuantity || 0;
+ const quantity = form.value.quantity || 0;
+
+ if (qualified === quantity && unqualified === 0) {
+ form.value.checkResult = '鍚堟牸';
+ } else if (unqualified === quantity && qualified === 0) {
+ form.value.checkResult = '涓嶅悎鏍�';
+ } else if (qualified > 0 && unqualified > 0) {
+ form.value.checkResult = '閮ㄥ垎鍚堟牸';
+ }
+};
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = () => {
+ proxy.$refs.formRef.validate((valid) => {
+ if (valid) {
+ const data = {
+ ids: selectedIds.value,
+ inspectType: inspectType.value,
+ ...form.value,
+ paramList: tableData.value
+ };
+ batchQuickInspect(data).then(res => {
+ proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+ emit('success');
+ closeDialog();
+ });
+ }
+ });
+};
+
+// 鍏抽棴寮规
+const closeDialog = () => {
+ dialogVisible.value = false;
+ emit('close');
+};
+
+defineExpose({
+ openDialog,
+});
+</script>
+
+<style scoped>
+</style>
diff --git a/src/views/qualityManagement/processInspection/index.vue b/src/views/qualityManagement/processInspection/index.vue
index 85e3811..9fe630a 100644
--- a/src/views/qualityManagement/processInspection/index.vue
+++ b/src/views/qualityManagement/processInspection/index.vue
@@ -2,13 +2,6 @@
<div class="app-container">
<div class="search_form mb20">
<div>
- <span class="search_title">宸ュ簭锛�</span>
- <el-input v-model="searchForm.process"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ伐搴忔悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search" />
<span style="margin-left: 10px"
class="search_title">妫�娴嬫棩鏈燂細</span>
<el-date-picker v-model="searchForm.entryDate"
@@ -18,14 +11,6 @@
placeholder="璇烽�夋嫨"
clearable
@change="changeDaterange" />
- <span style="margin-left: 10px"
- class="search_title">鐢熶骇宸ュ崟鍙凤細</span>
- <el-input v-model="searchForm.workOrderNo"
- style="width: 240px"
- placeholder="璇疯緭鍏ョ敓浜у伐鍗曞彿鎼滅储"
- @change="handleQuery"
- clearable
- :prefix-icon="Search" />
<el-button type="primary"
@click="handleQuery"
style="margin-left: 10px">鎼滅储</el-button>
@@ -54,6 +39,9 @@
@close="handleQuery"></FormDia>
<files-dia ref="filesDia"
@close="handleQuery"></files-dia>
+ <QuickCheckDia ref="quickCheckDia"
+ @close="handleQuery"
+ @success="getList"></QuickCheckDia>
<el-dialog v-model="dialogFormVisible"
title="缂栬緫妫�楠屽憳"
width="30%"
@@ -100,6 +88,7 @@
} from "vue";
import InspectionFormDia from "@/views/qualityManagement/processInspection/components/inspectionFormDia.vue";
import FormDia from "@/views/qualityManagement/processInspection/components/formDia.vue";
+ import QuickCheckDia from "@/views/qualityManagement/processInspection/components/quickCheckDia.vue";
import { ElMessageBox } from "element-plus";
import {
downloadQualityInspect,
@@ -107,7 +96,6 @@
qualityInspectListPage,
qualityInspectUpdate,
submitQualityInspect,
- batchQuickInspect,
} from "@/api/qualityManagement/rawMaterialInspection.js";
import FilesDia from "@/views/qualityManagement/processInspection/components/filesDia.vue";
import dayjs from "dayjs";
@@ -116,7 +104,6 @@
const data = reactive({
searchForm: {
- process: "",
entryDate: undefined, // 褰曞叆鏃ユ湡
workOrderNo: "",
entryDateStart: undefined,
@@ -135,13 +122,13 @@
width: 120,
},
{
- label: "宸ュ簭",
- prop: "process",
- width: 230,
- },
- {
label: "妫�楠屽憳",
prop: "checkName",
+ },
+ {
+ label: "閲囪喘鍚堝悓鍙�",
+ prop: "purchaseContractNo",
+ width: 150,
},
{
label: "浜у搧鍚嶇О",
@@ -311,6 +298,7 @@
const formDia = ref();
const filesDia = ref();
const inspectionFormDia = ref();
+ const quickCheckDia = ref();
const { proxy } = getCurrentInstance();
const userStore = useUserStore();
const changeDaterange = value => {
@@ -385,32 +373,8 @@
return;
}
- const totalCount = selectedRows.value.length;
- const submittedCount = totalCount - unSubmittedRows.length;
-
- let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
- if (submittedCount > 0) {
- confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
- }
- confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
-
- ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- dangerouslyUseHTMLString: false,
- })
- .then(() => {
- // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
- const ids = unSubmittedRows.map(item => item.id);
- batchQuickInspect(ids).then(res => {
- proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
+ const ids = unSubmittedRows.map(item => item.id);
+ quickCheckDia.value?.openDialog(ids, unSubmittedRows);
};
// 鎵撳紑鏂板妫�楠屽脊妗�
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
index 8bcc72b..8c91275 100644
--- a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
@@ -197,18 +197,18 @@
checkResult: "",
},
rules: {
- checkTime: [{required: true, message: "璇疯緭鍏�", trigger: "blur"},],
+ checkTime: [{required: false, message: "璇疯緭鍏�", trigger: "blur"},],
supplier: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
checkName: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
productId: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
productModelId: [{required: true, message: "璇烽�夋嫨浜у搧鍨嬪彿", trigger: "change"}],
testStandardId: [{required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change"}],
unit: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
- quantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- qualifiedQuantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- unqualifiedQuantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
+ quantity: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
+ qualifiedQuantity: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
+ unqualifiedQuantity: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
checkCompany: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
- checkResult: [{required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change"}],
+ checkResult: [{required: false, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change"}],
},
});
const tableColumn = ref([
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue
new file mode 100644
index 0000000..b8229ef
--- /dev/null
+++ b/src/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue
@@ -0,0 +1,327 @@
+<template>
+ <div>
+ <el-dialog
+ v-model="dialogVisible"
+ title="蹇�熸楠�"
+ width="70%"
+ @close="closeDialog"
+ >
+ <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
+ <el-select v-model="form.checkResult" placeholder="璇烽�夋嫨妫�娴嬬粨鏋�" style="width: 100%" @change="handleCheckResultChange">
+ <el-option label="鍚堟牸" value="鍚堟牸" />
+ <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
+ <el-option label="閮ㄥ垎鍚堟牸" value="閮ㄥ垎鍚堟牸" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鎸囨爣閫夋嫨锛�" prop="testStandardId">
+ <el-select v-model="form.testStandardId" placeholder="璇烽�夋嫨鎸囨爣" style="width: 100%" @change="handleTestStandardChange">
+ <el-option
+ v-for="item in testStandardOptions"
+ :key="item.id"
+ :label="item.standardName || item.standardNo"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <template v-if="form.checkResult">
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="鏁伴噺锛�" prop="quantity">
+ <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏ユ暟閲�" clearable :precision="2" @change="handleQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
+ <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏ユ娴嬪崟浣�" clearable/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="鍚堟牸鏁伴噺锛�" prop="qualifiedQuantity">
+ <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.qualifiedQuantity" placeholder="璇疯緭鍏ュ悎鏍兼暟閲�" clearable :precision="2" @change="handleQualifiedQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="涓嶅悎鏍兼暟閲忥細" prop="unqualifiedQuantity">
+ <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.unqualifiedQuantity" placeholder="璇疯緭鍏ヤ笉鍚堟牸鏁伴噺" clearable :precision="2" @change="handleUnqualifiedQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="妫�楠屽憳锛�" prop="checkName">
+ <el-select v-model="form.checkName" placeholder="璇烽�夋嫨妫�楠屽憳" clearable style="width: 100%">
+ <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
+ <el-date-picker
+ v-model="form.checkTime"
+ type="date"
+ placeholder="璇烽�夋嫨妫�娴嬫棩鏈�"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ clearable
+ style="width: 100%"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </template>
+ </el-form>
+ <PIMTable
+ rowKey="id"
+ :column="tableColumn"
+ :tableData="tableData"
+ :tableLoading="tableLoading"
+ height="400"
+ >
+ <template #slot="{ row }">
+ <el-input v-model="row.testValue" clearable/>
+ </template>
+ </PIMTable>
+ <template #footer>
+ <div class="dialog-footer">
+ <el-button type="primary" @click="submitForm">纭</el-button>
+ <el-button @click="closeDialog">鍙栨秷</el-button>
+ </div>
+ </template>
+ </el-dialog>
+ </div>
+</template>
+
+<script setup>
+import { ref, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
+import { userListNoPage } from "@/api/system/user.js";
+import { batchQuickInspect } from "@/api/qualityManagement/rawMaterialInspection.js";
+import { qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId } from "@/api/qualityManagement/metricMaintenance.js";
+
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(['close', 'success']);
+
+const dialogVisible = ref(false);
+const userList = ref([]);
+const selectedIds = ref([]);
+const selectedRows = ref([]);
+const testStandardOptions = ref([]);
+const inspectType = ref(0); // 鍘熸潗鏂欐楠岀被鍨�
+
+const data = reactive({
+ form: {
+ checkResult: '',
+ testStandardId: '',
+ quantity: undefined,
+ qualifiedQuantity: undefined,
+ unqualifiedQuantity: undefined,
+ checkCompany: '',
+ checkName: '',
+ checkTime: '',
+ },
+ rules: {
+ checkResult: [{ required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change" }],
+ testStandardId: [{ required: true, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
+ quantity: [{ required: true, message: "璇疯緭鍏ユ暟閲�", trigger: "blur" }],
+ qualifiedQuantity: [{ required: true, message: "璇疯緭鍏ュ悎鏍兼暟閲�", trigger: "blur" }],
+ unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏ヤ笉鍚堟牸鏁伴噺", trigger: "blur" }],
+ checkCompany: [{ required: true, message: "璇疯緭鍏ユ娴嬪崟浣�", trigger: "blur" }],
+ checkName: [{ required: true, message: "璇烽�夋嫨妫�楠屽憳", trigger: "change" }],
+ checkTime: [{ required: true, message: "璇烽�夋嫨妫�娴嬫棩鏈�", trigger: "change" }],
+ },
+});
+const { form, rules } = toRefs(data);
+
+const tableColumn = ref([
+ {
+ label: "鎸囨爣",
+ prop: "parameterItem",
+ },
+ {
+ label: "鍗曚綅",
+ prop: "unit",
+ },
+ {
+ label: "鏍囧噯鍊�",
+ prop: "standardValue",
+ },
+ {
+ label: "鍐呮帶鍊�",
+ prop: "controlValue",
+ },
+ {
+ label: "妫�楠屽��",
+ prop: "testValue",
+ dataType: 'slot',
+ slot: 'slot',
+ },
+]);
+const tableData = ref([]);
+const tableLoading = ref(false);
+
+// 鎵撳紑寮规
+const openDialog = async (ids, rows) => {
+ selectedIds.value = ids;
+ selectedRows.value = rows;
+ dialogVisible.value = true;
+
+ // 鍔犺浇鐢ㄦ埛鍒楄〃
+ const userListsRes = await userListNoPage();
+ userList.value = userListsRes.data;
+
+ // 鍔犺浇鎸囨爣閫夐」锛堟牴鎹涓�涓�変腑琛岀殑浜у搧ID锛�
+ if (rows && rows.length > 0 && rows[0].productId) {
+ const params = {
+ productId: rows[0].productId,
+ inspectType: 0
+ };
+ const res = await qualityInspectDetailByProductId(params);
+ testStandardOptions.value = res.data || [];
+ } else {
+ testStandardOptions.value = [];
+ }
+
+ // 閲嶇疆琛ㄥ崟
+ form.value = {
+ checkResult: '',
+ testStandardId: '',
+ quantity: undefined,
+ qualifiedQuantity: undefined,
+ unqualifiedQuantity: undefined,
+ checkCompany: '',
+ checkName: '',
+ checkTime: '',
+ };
+ tableData.value = [];
+
+ await nextTick();
+ proxy.$refs.formRef?.clearValidate();
+};
+
+// 鎸囨爣閫夋嫨鍙樺寲澶勭悊
+const handleTestStandardChange = async (testStandardId) => {
+ if (!testStandardId) {
+ tableData.value = [];
+ return;
+ }
+ tableLoading.value = true;
+ try {
+ const res = await getQualityTestStandardParamByTestStandardId(testStandardId);
+ tableData.value = (res.data || []).map(item => ({
+ ...item,
+ id: null,
+ testValue: ''
+ }));
+ } catch (error) {
+ console.error('鑾峰彇鏍囧噯鍙傛暟澶辫触:', error);
+ tableData.value = [];
+ } finally {
+ tableLoading.value = false;
+ }
+};
+
+// 妫�娴嬬粨鏋滃彉鍖栧鐞�
+const handleCheckResultChange = (value) => {
+ if (value === '鍚堟牸') {
+ // 鍚堟牸鏃讹紝鍚堟牸鏁伴噺绛変簬鏁伴噺锛屼笉鍚堟牸鏁伴噺涓�0
+ form.value.qualifiedQuantity = form.value.quantity || 0;
+ form.value.unqualifiedQuantity = 0;
+ } else if (value === '涓嶅悎鏍�') {
+ // 涓嶅悎鏍兼椂锛屽悎鏍兼暟閲忎负0锛屼笉鍚堟牸鏁伴噺绛変簬鏁伴噺
+ form.value.qualifiedQuantity = 0;
+ form.value.unqualifiedQuantity = form.value.quantity || 0;
+ }
+};
+
+// 鏁伴噺鍙樺寲澶勭悊
+const handleQuantityChange = (value) => {
+ if (form.value.checkResult === '鍚堟牸') {
+ form.value.qualifiedQuantity = value || 0;
+ form.value.unqualifiedQuantity = 0;
+ } else if (form.value.checkResult === '涓嶅悎鏍�') {
+ form.value.qualifiedQuantity = 0;
+ form.value.unqualifiedQuantity = value || 0;
+ }
+};
+
+// 鍚堟牸鏁伴噺鍙樺寲澶勭悊
+const handleQualifiedQuantityChange = (value) => {
+ const quantity = form.value.quantity || 0;
+ if (value > quantity) {
+ proxy.$modal.msgWarning("鍚堟牸鏁伴噺涓嶈兘澶т簬鎬绘暟閲�");
+ form.value.qualifiedQuantity = quantity;
+ form.value.unqualifiedQuantity = 0;
+ } else {
+ form.value.unqualifiedQuantity = Number((quantity - value).toFixed(2));
+ }
+ updateCheckResult();
+};
+
+// 涓嶅悎鏍兼暟閲忓彉鍖栧鐞�
+const handleUnqualifiedQuantityChange = (value) => {
+ const quantity = form.value.quantity || 0;
+ if (value > quantity) {
+ proxy.$modal.msgWarning("涓嶅悎鏍兼暟閲忎笉鑳藉ぇ浜庢�绘暟閲�");
+ form.value.unqualifiedQuantity = quantity;
+ form.value.qualifiedQuantity = 0;
+ } else {
+ form.value.qualifiedQuantity = Number((quantity - value).toFixed(2));
+ }
+ updateCheckResult();
+};
+
+// 鏍规嵁鍚堟牸/涓嶅悎鏍兼暟閲忔洿鏂版娴嬬粨鏋�
+const updateCheckResult = () => {
+ const qualified = form.value.qualifiedQuantity || 0;
+ const unqualified = form.value.unqualifiedQuantity || 0;
+ const quantity = form.value.quantity || 0;
+
+ if (qualified === quantity && unqualified === 0) {
+ form.value.checkResult = '鍚堟牸';
+ } else if (unqualified === quantity && qualified === 0) {
+ form.value.checkResult = '涓嶅悎鏍�';
+ } else if (qualified > 0 && unqualified > 0) {
+ form.value.checkResult = '閮ㄥ垎鍚堟牸';
+ }
+};
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = () => {
+ proxy.$refs.formRef.validate((valid) => {
+ if (valid) {
+ const data = {
+ ids: selectedIds.value,
+ inspectType: inspectType.value,
+ ...form.value,
+ paramList: tableData.value
+ };
+ batchQuickInspect(data).then(res => {
+ proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+ emit('success');
+ closeDialog();
+ });
+ }
+ });
+};
+
+// 鍏抽棴寮规
+const closeDialog = () => {
+ dialogVisible.value = false;
+ emit('close');
+};
+
+defineExpose({
+ openDialog,
+});
+</script>
+
+<style scoped>
+</style>
diff --git a/src/views/qualityManagement/rawMaterialInspection/index.vue b/src/views/qualityManagement/rawMaterialInspection/index.vue
index 609176e..df33f61 100644
--- a/src/views/qualityManagement/rawMaterialInspection/index.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/index.vue
@@ -55,6 +55,9 @@
@close="handleQuery"></FormDia>
<files-dia ref="filesDia"
@close="handleQuery"></files-dia>
+ <QuickCheckDia ref="quickCheckDia"
+ @close="handleQuery"
+ @success="getList"></QuickCheckDia>
<el-dialog v-model="dialogFormVisible"
title="缂栬緫妫�楠屽憳"
width="30%"
@@ -101,6 +104,7 @@
} from "vue";
import InspectionFormDia from "@/views/qualityManagement/rawMaterialInspection/components/inspectionFormDia.vue";
import FormDia from "@/views/qualityManagement/rawMaterialInspection/components/formDia.vue";
+ import QuickCheckDia from "@/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue";
import { ElMessageBox } from "element-plus";
import {
downloadQualityInspect,
@@ -108,7 +112,6 @@
qualityInspectListPage,
qualityInspectUpdate,
submitQualityInspect,
- batchQuickInspect,
} from "@/api/qualityManagement/rawMaterialInspection.js";
import FilesDia from "@/views/qualityManagement/rawMaterialInspection/components/filesDia.vue";
import dayjs from "dayjs";
@@ -322,6 +325,7 @@
const formDia = ref();
const filesDia = ref();
const inspectionFormDia = ref();
+ const quickCheckDia = ref();
const { proxy } = getCurrentInstance();
const userStore = useUserStore();
const changeDaterange = value => {
@@ -396,33 +400,8 @@
return;
}
- const totalCount = selectedRows.value.length;
- const unSubmittedCount = unSubmittedRows.length;
- const submittedCount = totalCount - unSubmittedCount;
-
- let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
- if (submittedCount > 0) {
- confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
- }
- confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
-
- ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- dangerouslyUseHTMLString: false,
- })
- .then(() => {
- // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
- const ids = unSubmittedRows.map(item => item.id);
- batchQuickInspect(ids).then(res => {
- proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
+ const ids = unSubmittedRows.map(item => item.id);
+ quickCheckDia.value?.openDialog(ids, unSubmittedRows);
};
// 鎵撳紑闄勪欢寮规
const openFilesFormDia = (type, row) => {
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index e7300a4..3f467cd 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -1083,6 +1083,15 @@
/>
</el-form-item>
</el-col>
+ <el-col :span="24" v-if="deliveryForm.type === '璐ц溅'">
+ <el-form-item label="鍑哄簱鎵瑰彿锛�" prop="outboundBatches">
+ <el-input
+ v-model="deliveryForm.outboundBatches"
+ placeholder="璇疯緭鍏ュ嚭搴撴壒鍙�"
+ clearable
+ />
+ </el-form-item>
+ </el-col>
<el-col :span="24" v-else>
<el-form-item label="蹇�掑叕鍙革細" prop="expressCompany">
<el-input
@@ -1421,6 +1430,7 @@
expressCompany: "",
expressNumber: "",
type: "璐ц溅", // 璐ц溅, 蹇��
+ outboundBatches: "",
},
deliveryRules: {
shippingCarNumber: [
@@ -2880,6 +2890,7 @@
type: "璐ц溅",
batchNo: [],
batchNoList,
+ outboundBatches: "",
};
deliveryFileList.value = [];
deliveryFormVisible.value = true;
@@ -2923,6 +2934,10 @@
deliveryForm.value.type === "璐ц溅"
? deliveryForm.value.shippingCarNumber
: "",
+ outboundBatches:
+ deliveryForm.value.type === "璐ц溅"
+ ? deliveryForm.value.outboundBatches
+ : "",
expressCompany:
deliveryForm.value.type === "蹇��"
? deliveryForm.value.expressCompany
diff --git a/src/views/systemArchitecture/index.vue b/src/views/systemArchitecture/index.vue
index a070122..8e38c9d 100644
--- a/src/views/systemArchitecture/index.vue
+++ b/src/views/systemArchitecture/index.vue
@@ -107,6 +107,7 @@
</div>
</section>
+ <!-- 鐢熶骇妯″潡宸查殣钘�
<section class="section-card section-card--bottom">
<article class="module-title module-title--produce">
<div class="module-title__icon">
@@ -132,6 +133,7 @@
</template>
</div>
</section>
+ -->
<section class="section-card section-card--bottom">
<article class="module-title module-title--store">
--
Gitblit v1.9.3