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