From 5eef21ed1f6e1c97e048dd07543f21bc868f9bba Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期二, 10 三月 2026 14:38:16 +0800
Subject: [PATCH] fix: 入库前需加上仓库管理员审审批这一流程,审核通过后才能入库。另外在消息通知中需要展示这个审批信息
---
src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue | 96 ++++++++++++++++++++++++
src/api/inventoryManagement/stockInRecord.js | 17 ++++
src/views/collaborativeApproval/approvalProcess/index.vue | 8 +
src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue | 16 +++
src/views/inventoryManagement/receiptManagement/Record.vue | 66 ++++++++++++++++
5 files changed, 200 insertions(+), 3 deletions(-)
diff --git a/src/api/inventoryManagement/stockInRecord.js b/src/api/inventoryManagement/stockInRecord.js
index 1746bfe..7a438b6 100644
--- a/src/api/inventoryManagement/stockInRecord.js
+++ b/src/api/inventoryManagement/stockInRecord.js
@@ -9,6 +9,14 @@
});
};
+// 鏍规嵁 ID 鏌ヨ鍗曟潯鍏ュ簱璁板綍璇︽儏
+export const getStockInRecordById = (id) => {
+ return request({
+ url: "/stockInRecord/getById",
+ method: "get",
+ params: { id },
+ });
+};
export const updateStockInRecord = (id, data) => {
return request({
@@ -18,6 +26,15 @@
});
};
+// 閲嶆柊鎻愯捣瀹℃壒锛堟洿鏂板叆搴撹褰曪級
+export const updateStockInRecordForReApprove = (data) => {
+ return request({
+ url: "/stocklnRecord/updateStocklnRecord",
+ method: "post",
+ data,
+ });
+};
+
export const batchDeleteStockInRecords = (ids) => {
return request({
url: "/stockInRecord",
diff --git a/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue b/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
index 20a4ee6..c38d349 100644
--- a/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
+++ b/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
@@ -39,6 +39,59 @@
</el-form-item>
</el-col>
</el-row>
+ <!-- 鍏ュ簱瀹℃壒锛氬睍绀哄叆搴撲俊鎭� -->
+ <!-- <el-row v-if="isInventoryApproval">
+ <el-col :span="24">
+ <el-form-item label="鏄惁鍏ュ簱瀹℃牳閫氳繃锛�">
+ <el-tag :type="form.inventoryReview ? 'success' : 'danger'">
+ {{ form.inventoryReview ? '鏄�' : '鍚�' }}
+ </el-tag>
+ </el-form-item>
+ </el-col>
+ </el-row> -->
+ <el-row v-if="isInventoryApproval">
+ <el-col :span="12">
+ <el-form-item label="鍏ュ簱绫诲瀷锛�">
+ <el-tag type="info">
+ {{ form.storageType || '-' }}
+ </el-tag>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鍏ュ簱鏁伴噺锛�">
+ <el-tag type="warning">
+ {{ form.stockInNum ?? '-' }}
+ </el-tag>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <!-- 鍏ュ簱瀹℃壒锛氬睍绀哄叆搴撳彴璐︽槑缁嗭紙瀛楁褰㈠紡锛� -->
+ <el-row v-if="isInventoryApproval" style="margin-top: 10px">
+ <el-col :span="12">
+ <el-form-item label="浜у搧鍚嶇О锛�">
+ <el-tag type="info">
+ {{ currentStockIn.productName || '-' }}
+ </el-tag>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="瑙勬牸鍨嬪彿锛�">
+ <el-tag type="info">
+ {{ currentStockIn.model || '-' }}
+ </el-tag>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row v-if="isInventoryApproval">
+
+ <el-col :span="24">
+ <el-form-item label="鐢熶骇璁㈠崟鍙凤細">
+ <el-tag type="info">
+ {{ currentStockIn.productionOrderNo || '-' }}
+ </el-tag>
+ </el-form-item>
+ </el-col>
+ </el-row>
<!-- 瀹℃壒浜洪�夋嫨锛堝姩鎬佽妭鐐癸級 -->
<el-row :gutter="30">
<el-col :span="12">
@@ -168,6 +221,8 @@
</el-skeleton>
</div>
+
+
<el-form :model="{ activities }" ref="formRef" label-position="top">
<el-steps :active="getActiveStep()" finish-status="success" process-status="process" align-center direction="vertical">
<el-step
@@ -232,6 +287,7 @@
import { WarningFilled, Edit, Check, MoreFilled } from '@element-plus/icons-vue'
import { getQuotationList } from "@/api/salesManagement/salesQuotation.js";
import { getPurchaseByCode } from "@/api/procurementManagement/procurementLedger.js";
+import { getStockInRecordById } from "@/api/inventoryManagement/stockInRecord.js";
const emit = defineEmits(['close'])
const { proxy } = getCurrentInstance()
@@ -253,8 +309,11 @@
const currentQuotation = ref({})
const purchaseLoading = ref(false)
const currentPurchase = ref({})
+const stockInLoading = ref(false)
+const currentStockIn = ref({})
const isQuotationApproval = computed(() => Number(props.approveType) === 6)
const isPurchaseApproval = computed(() => Number(props.approveType) === 5)
+const isInventoryApproval = computed(() => Number(props.approveType) === 9)
const data = reactive({
form: {
@@ -264,6 +323,10 @@
approveDeptId: "",
approveReason: "",
checkResult: "",
+ inventoryReview: false,
+ storageType: "",
+ stockInNum: null,
+ recordId: null,
},
});
const { form } = toRefs(data);
@@ -295,6 +358,7 @@
dialogFormVisible.value = true;
currentQuotation.value = {}
currentPurchase.value = {}
+ currentStockIn.value = {}
userListNoPageByTenantId().then((res) => {
userList.value = res.data;
});
@@ -355,6 +419,28 @@
}
}
+ // 鍏ュ簱瀹℃壒锛氭牴鎹� recordId 鏌ヨ鍏ュ簱鍙拌处璇︽儏
+ if (isInventoryApproval.value) {
+ const recordId = row?.recordId;
+ form.value.recordId = recordId ?? form.value.recordId;
+ form.value.inventoryReview = row?.inventoryReview ?? form.value.inventoryReview;
+ form.value.storageType = row?.storageType ?? form.value.storageType;
+ if (recordId) {
+ stockInLoading.value = true;
+ getStockInRecordById(recordId)
+ .then((res) => {
+ currentStockIn.value = res?.data || res || {};
+ })
+ .catch((err) => {
+ console.error("鏌ヨ鍏ュ簱璁板綍澶辫触:", err);
+ proxy.$modal.msgError("鏌ヨ鍏ュ簱璁板綍澶辫触");
+ })
+ .finally(() => {
+ stockInLoading.value = false;
+ });
+ }
+ }
+
approveProcessDetails(row.approveId).then((res) => {
activities.value = res.data
// 澧炲姞isApproval瀛楁
@@ -392,6 +478,14 @@
return;
}
currentActivity.approveNodeStatus = status;
+ // 濮嬬粓甯︿笂褰撳墠瀹℃壒绫诲瀷锛堝叆搴撳鎵逛负 9锛�
+ currentActivity.approveType = Number(props.approveType);
+ // 鍏ュ簱瀹℃壒锛氭妸鍏ュ簱鐩稿叧瀛楁鍐欏叆褰撳墠鑺傜偣
+ if (isInventoryApproval.value) {
+ currentActivity.recordId = form.value.recordId;
+ currentActivity.storageType = form.value.storageType;
+ currentActivity.inventoryReview = status === 1;
+ }
// 鍒ゆ柇鏄惁涓烘渶鍚庝竴姝�
const isLast = activities.value.findIndex(a => a.isShen) === activities.value.length-1;
updateApproveNode({ ...currentActivity, isLast }).then(() => {
@@ -407,6 +501,8 @@
currentQuotation.value = {}
purchaseLoading.value = false
currentPurchase.value = {}
+ stockInLoading.value = false
+ currentStockIn.value = {}
emit('close')
};
defineExpose({
diff --git a/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue b/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
index 998fa33..40e510a 100644
--- a/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
+++ b/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
@@ -243,7 +243,10 @@
startDate: "", // 璇峰亣寮�濮嬫椂闂�
endDate: "", // 璇峰亣缁撴潫鏃堕棿
price: null, // 鎶ラ攢閲戦
- location: "" // 鍑哄樊鍦扮偣
+ location: "", // 鍑哄樊鍦扮偣
+ inventoryReview: false, // 鍏ュ簱鏄惁瀹℃牳閫氳繃
+ storageType: "", // 鍏ュ簱绫诲瀷锛堝悎鏍�/涓嶅悎鏍硷級
+ recordId: null, // 鍏ュ簱璁板綍ID
},
rules: {
approveTime: [{ required: false, message: "璇疯緭鍏�", trigger: "change" },],
@@ -316,6 +319,10 @@
currentApproveStatus.value = row.approveStatus
approveProcessGetInfo({id: row.approveId,approveReason: '1'}).then(res => {
form.value = {...res.data}
+ // 纭繚鍏ュ簱瀹℃壒鐩稿叧瀛楁浠庡垪琛ㄨ閫忎紶杩涙潵
+ form.value.recordId = row.recordId ?? form.value.recordId
+ form.value.inventoryReview = row.inventoryReview ?? form.value.inventoryReview
+ form.value.storageType = row.storageType ?? form.value.storageType
// 鍙嶆樉瀹℃壒浜�
if (res.data && res.data.approveUserIds) {
const userIds = res.data.approveUserIds.split(',')
@@ -365,6 +372,13 @@
// 鏀堕泦鎵�鏈夎妭鐐圭殑瀹℃壒浜篿d
form.value.approveUserIds = approverNodes.value.map(node => node.userId).join(',')
form.value.approveType = props.approveType
+
+ // 鍏ュ簱瀹℃壒锛氱洿鎺ラ�忎紶鍏ュ簱鐩稿叧瀛楁锛堢敱澶栭儴棰勫厛濉厖锛�
+ if (props.approveType == 9) {
+ // 纭繚甯冨皵绫诲瀷姝g‘
+ form.value.inventoryReview = !!form.value.inventoryReview
+ // storageType銆乺ecordId 鎸夌収鏌ュ嚭鏉ョ殑鏁版嵁鍘熸牱甯︾粰鍚庡彴
+ }
// 瀹℃壒浜哄繀濉牎楠�
const hasEmptyApprover = approverNodes.value.some(node => !node.userId)
if (hasEmptyApprover) {
diff --git a/src/views/collaborativeApproval/approvalProcess/index.vue b/src/views/collaborativeApproval/approvalProcess/index.vue
index 33bde47..f928375 100644
--- a/src/views/collaborativeApproval/approvalProcess/index.vue
+++ b/src/views/collaborativeApproval/approvalProcess/index.vue
@@ -9,6 +9,7 @@
<el-tab-pane label="閲囪喘瀹℃壒" name="5"></el-tab-pane>
<el-tab-pane label="鎶ヤ环瀹℃壒" name="6"></el-tab-pane>
<el-tab-pane label="鍙戣揣瀹℃壒" name="7"></el-tab-pane>
+ <el-tab-pane label="鍏ュ簱瀹℃壒" name="9"></el-tab-pane>
</el-tabs>
<div class="search_form">
@@ -38,14 +39,14 @@
<el-button
type="primary"
@click="openForm('add')"
- v-if="currentApproveType !== 5 && currentApproveType !== 6 && currentApproveType !== 7"
+ v-if="currentApproveType !== 5 && currentApproveType !== 6 && currentApproveType !== 7 && currentApproveType !== 9"
>鏂板</el-button>
<el-button @click="handleOut">瀵煎嚭</el-button>
<el-button
type="danger"
plain
@click="handleDelete"
- v-if="currentApproveType !== 5 && currentApproveType !== 6 && currentApproveType !== 7"
+ v-if="currentApproveType !== 5 && currentApproveType !== 6 && currentApproveType !== 7 && currentApproveType !== 9"
>鍒犻櫎</el-button>
</div>
</div>
@@ -212,6 +213,7 @@
currentApproveType.value === 5 ||
currentApproveType.value === 6 ||
currentApproveType.value === 7 ||
+ currentApproveType.value === 9 ||
row.approveStatus == 2 ||
row.approveStatus == 1 ||
row.approveStatus == 4
@@ -310,6 +312,7 @@
5: "/approveProcess/exportFive",
6: "/approveProcess/exportSix",
7: "/approveProcess/exportSeven",
+ 9: "/approveProcess/exportNine",
}
const url = urlMap[type] || urlMap[0]
const nameMap = {
@@ -321,6 +324,7 @@
5: "閲囪喘鐢宠瀹℃壒琛�",
6: "鎶ヤ环瀹℃壒琛�",
7: "鍙戣揣瀹℃壒琛�",
+ 9: "鍏ュ簱瀹℃壒琛�",
}
const fileName = nameMap[type] || nameMap[0]
proxy.download(url, {}, `${fileName}.xlsx`)
diff --git a/src/views/inventoryManagement/receiptManagement/Record.vue b/src/views/inventoryManagement/receiptManagement/Record.vue
index 3f90edf..11ee21d 100644
--- a/src/views/inventoryManagement/receiptManagement/Record.vue
+++ b/src/views/inventoryManagement/receiptManagement/Record.vue
@@ -73,6 +73,25 @@
<el-table-column label="鍏ュ簱鏁伴噺"
prop="stockInNum"
show-overflow-tooltip/>
+ <el-table-column label="瀹℃壒鐘舵��"
+ prop="approveStatus"
+ align="center"
+ width="180">
+ <template #default="scope">
+ <el-tag :type="getApproveStatusType(scope.row.approveStatus)">
+ {{ getApproveStatusText(scope.row.approveStatus) }}
+ </el-tag>
+ <el-button
+ v-if="scope.row.approveStatus === 3"
+ type="primary"
+ link
+ style="margin-left: 8px"
+ @click="handleReApprove(scope.row)"
+ >
+ 閲嶆柊鎻愯捣瀹℃壒
+ </el-button>
+ </template>
+ </el-table-column>
<el-table-column label="鍏ュ簱浜�"
prop="createBy"
show-overflow-tooltip/>
@@ -107,6 +126,7 @@
import {
getStockInRecordListPage,
batchDeleteStockInRecords,
+ updateStockInRecordForReApprove,
} from "@/api/inventoryManagement/stockInRecord.js";
import {
findAllQualifiedStockInRecordTypeOptions, findAllUnQualifiedStockInRecordTypeOptions,
@@ -152,6 +172,24 @@
return stockRecordTypeOptions.value.find(item => item.value === recordType)?.label || ''
}
+const getApproveStatusText = (status) => {
+ if (status === 0) return "寰呭鏍�";
+ if (status === 1) return "瀹℃牳涓�";
+ if (status === 2) return "瀹℃牳瀹屾垚";
+ if (status === 3) return "瀹℃牳鏈�氳繃";
+ if (status === 4) return "宸查噸鏂版彁浜�";
+ return "-";
+};
+
+const getApproveStatusType = (status) => {
+ if (status === 0) return "warning";
+ if (status === 1) return "primary";
+ if (status === 2) return "success";
+ if (status === 3) return "danger";
+ if (status === 4) return "info";
+ return "";
+};
+
const pageProductChange = obj => {
page.current = obj.page;
page.size = obj.limit;
@@ -195,6 +233,34 @@
const expandedRowKeys = ref([]);
+const handleReApprove = (row) => {
+ if (!row || !row.id) {
+ return;
+ }
+ ElMessageBox.confirm(
+ "璇ヨ褰曞鏍告湭閫氳繃锛屾槸鍚﹂噸鏂版彁璧峰叆搴撳鎵癸紵",
+ "閲嶆柊鎻愯捣瀹℃壒",
+ {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ }
+ )
+ .then(() => {
+ updateStockInRecordForReApprove({ ...row })
+ .then(() => {
+ proxy.$modal.msgSuccess("宸查噸鏂板彂璧峰鎵�");
+ getList();
+ })
+ .catch(() => {
+ proxy.$modal.msgError("閲嶆柊鍙戣捣瀹℃壒澶辫触");
+ });
+ })
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
+};
+
// 瀵煎嚭
const handleOut = () => {
ElMessageBox.confirm("鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
--
Gitblit v1.9.3