From 2362a3399f333aec47afc83caf0bfb1887af24a5 Mon Sep 17 00:00:00 2001
From: 曹睿 <360930172@qq.com>
Date: 星期四, 10 七月 2025 14:16:15 +0800
Subject: [PATCH] Merge branch 'dev' of http://114.132.189.42:9002/r/product-inventory-management into dev

---
 src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue |   55 +++++--------
 src/api/collaborativeApproval/approvalProcess.js                           |   15 +++
 src/api/system/user.js                                                     |    8 ++
 src/views/basicData/supplierManage/index.vue                               |    3 
 src/store/modules/user.js                                                  |    1 
 src/views/basicData/customerFile/index.vue                                 |    2 
 src/views/basicData/product/index.vue                                      |   65 ++++++++++++---
 src/views/inventoryManagement/issueManagement/index.vue                    |    4 
 src/views/inventoryManagement/stockManagement/index.vue                    |    4 
 src/views/collaborativeApproval/approvalProcess/index.vue                  |   19 ++--
 src/views/salesManagement/salesLedger/index.vue                            |    8 +
 src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue |   48 +++++++----
 12 files changed, 149 insertions(+), 83 deletions(-)

diff --git a/src/api/collaborativeApproval/approvalProcess.js b/src/api/collaborativeApproval/approvalProcess.js
index 4f8ca33..415bed8 100644
--- a/src/api/collaborativeApproval/approvalProcess.js
+++ b/src/api/collaborativeApproval/approvalProcess.js
@@ -38,6 +38,14 @@
         data: query,
     })
 }
+// 鎻愪氦瀹℃壒
+export function updateApproveNode(query) {
+    return request({
+        url: '/approveNode/updateApproveNode',
+        method: 'post',
+        data: query,
+    })
+}
 // 鍒犻櫎瀹℃壒娴佺▼
 export function approveProcessDelete(query) {
     return request({
@@ -45,4 +53,11 @@
         method: 'delete',
         data: query,
     })
+}
+// 鏌ヨ瀹℃壒娴佺▼
+export function approveProcessDetails(query) {
+    return request({
+        url: '/approveNode/details/' + query,
+        method: 'get',
+    })
 }
\ No newline at end of file
diff --git a/src/api/system/user.js b/src/api/system/user.js
index 7192d9b..431f6b0 100644
--- a/src/api/system/user.js
+++ b/src/api/system/user.js
@@ -135,6 +135,14 @@
   })
 }
 // 鏌ヨ鐢ㄦ埛鍒楄〃
+export function userListNoPageByTenantId() {
+  return request({
+    url: '/system/user/userListNoPageByTenantId',
+    method: 'get'
+  })
+}
+
+// 鏌ヨ鐢ㄦ埛鍒楄〃
 export function userListNoPage() {
   return request({
     url: '/system/user/userListNoPage',
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index 5623661..2dd2797 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -52,6 +52,7 @@
             this.avatar = avatar
             this.currentFactoryName = user.currentFactoryName
             this.nickName = user.nickName
+            this.currentDeptId = user.currentDeptId
             resolve(res)
           }).catch(error => {
             reject(error)
diff --git a/src/views/basicData/customerFile/index.vue b/src/views/basicData/customerFile/index.vue
index f0c1186..2294dd7 100644
--- a/src/views/basicData/customerFile/index.vue
+++ b/src/views/basicData/customerFile/index.vue
@@ -309,7 +309,7 @@
 const tableLoading = ref(false);
 const page = reactive({
   current: 1,
-  size: 10,
+  size: 100,
   total: 0,
 });
 const total = ref(0);
diff --git a/src/views/basicData/product/index.vue b/src/views/basicData/product/index.vue
index b17be1f..3aa263e 100644
--- a/src/views/basicData/product/index.vue
+++ b/src/views/basicData/product/index.vue
@@ -55,7 +55,7 @@
                 >
                   缂栬緫
                 </el-button>
-                <el-button type="primary" link @click="openProDia('add', data)">
+                <el-button type="primary" link @click="openProDia('add', data)" :disabled="node.level >= 3">
                   娣诲姞浜у搧
                 </el-button>
                 <el-button
@@ -99,7 +99,7 @@
         @pagination="pagination"
       ></PIMTable>
     </div>
-    <el-dialog v-model="productDia" title="浜у搧" width="400px">
+    <el-dialog v-model="productDia" title="浜у搧" width="400px" @keydown.enter.prevent>
       <el-form
         :model="form"
         label-width="140px"
@@ -114,6 +114,7 @@
                 v-model="form.productName"
                 placeholder="璇疯緭鍏ヤ骇鍝佸悕绉�"
                 clearable
+                @keydown.enter.prevent
               />
             </el-form-item>
           </el-col>
@@ -131,6 +132,7 @@
       title="瑙勬牸鍨嬪彿"
       width="400px"
       @close="closeModelDia"
+      @keydown.enter.prevent
     >
       <el-form
         :model="modelForm"
@@ -146,6 +148,7 @@
                 v-model="modelForm.model"
                 placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
                 clearable
+                @keydown.enter.prevent
               />
             </el-form-item>
           </el-col>
@@ -157,6 +160,7 @@
                 v-model="modelForm.unit"
                 placeholder="璇疯緭鍏ュ崟浣�"
                 clearable
+                @keydown.enter.prevent
               />
             </el-form-item>
           </el-col>
@@ -315,16 +319,53 @@
   proxy.$refs.formRef.resetFields();
   productDia.value = false;
 };
+// 灏佽涓�涓畨鍏ㄧ殑纭妗嗭紝褰诲簳闃绘Enter閿Е鍙�
+const safeConfirm = (message, title) => {
+  // 鏍囪鏄惁鏄紶鏍囩偣鍑伙紙鐐瑰嚮鎸夐挳浼氳Е鍙慺ocus浜嬩欢锛�
+  let isMouseClick = false;
+
+  return new Promise((resolve, reject) => {
+    const box = ElMessageBox.confirm(message, title, {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+      beforeClose: (action, instance, done) => {
+        if (action === "confirm") {
+          // 鍙湁榧犳爣鐐瑰嚮鏃舵墠鍏佽纭
+          if (isMouseClick) {
+            done();
+            resolve();
+          } else {
+            // Enter閿Е鍙戞椂闃绘
+            done(false);
+          }
+        } else {
+          // 鍙栨秷鎿嶄綔鐩存帴鍏佽
+          done();
+          reject();
+        }
+      }
+    });
+
+    // 鐩戝惉纭鎸夐挳鐨刦ocus浜嬩欢锛堥紶鏍囩偣鍑讳細瑙﹀彂锛孍nter閿笉浼氾級
+    setTimeout(() => {
+      const confirmBtn = document.querySelector('.el-message-box__btns .el-button--primary');
+      if (confirmBtn) {
+        confirmBtn.addEventListener('focus', () => {
+          isMouseClick = true;
+        });
+      }
+    }, 0); // 寤惰繜鑾峰彇锛岀‘淇滵OM宸叉覆鏌�
+  });
+};
+// 鍒犻櫎浜у搧
 // 鍒犻櫎浜у搧
 const remove = (node, data) => {
-  let ids = [];
-  ids.push(data.id);
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
+  let ids = [data.id];
+  // 浣跨敤灏佽鐨剆afeConfirm
+  safeConfirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず")
     .then(() => {
+      // 纭鍒犻櫎閫昏緫
       tableLoading.value = true;
       delProduct(ids)
         .then((res) => {
@@ -400,11 +441,7 @@
     proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
     return;
   }
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
+  safeConfirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず")
     .then(() => {
       tableLoading.value = true;
       delProductModel(ids)
diff --git a/src/views/basicData/supplierManage/index.vue b/src/views/basicData/supplierManage/index.vue
index 22216e3..f5eb792 100644
--- a/src/views/basicData/supplierManage/index.vue
+++ b/src/views/basicData/supplierManage/index.vue
@@ -35,6 +35,7 @@
         :isSelection="true"
         @selection-change="handleSelectionChange"
         :tableLoading="tableLoading"
+				@pagination="pagination"
       ></PIMTable>
     </div>
     <el-dialog
@@ -297,7 +298,7 @@
 const tableLoading = ref(false);
 const page = reactive({
   current: 1,
-  size: 10,
+  size: 100,
   total: 0,
 });
 
diff --git a/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue b/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
index 57b5e38..7e9488a 100644
--- a/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
+++ b/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
@@ -13,24 +13,24 @@
               :key="index"
               :type="activity.current ? 'primary' : ''"
               :hollow="activity.current"
-              :timestamp="activity.timestamp"
+              :timestamp="activity.approveNodeTime"
           >
             <el-card>
-              <span style="font-size: 18px;font-weight: 700">{{activity.content}}</span>
+              <span style="font-size: 18px;font-weight: 700">鑺傜偣{{activity.approveNodeOrder}}</span>
               <div style="margin: 10px 0">
-                <span style="font-size: 16px;font-weight: 600">瀹℃壒浜猴細{{activity.people}}</span>
+                <span style="font-size: 16px;font-weight: 600">瀹℃壒浜猴細{{activity.approveNodeUser}}</span>
               </div>
               <div>
                 <span style="margin-bottom: 8px;display: inline-block;font-size: 16px;font-weight: 600">瀹℃壒鎰忚锛�</span>
                 <el-form-item
-                  v-if="activity.current"
-                  :prop="'activities.' + index + '.value'"
+                  v-if="activity.approveNodeRemark == 1"
+                  :prop="'activities.' + index + '.approveNodeReason'"
                   :rules="[{ required: true, message: '瀹℃壒鎰忚涓嶈兘涓虹┖', trigger: 'blur' }]"
                 >
-                  <el-input v-model="activity.value" clearable type="textarea" :disabled="operationType === 'view'"></el-input>
+                  <el-input v-model="activity.approveNodeReason" clearable type="textarea" :disabled="operationType === 'view'"></el-input>
                 </el-form-item>
                 <el-form-item v-else>
-                  <el-input v-model="activity.value" clearable type="textarea" disabled></el-input>
+                  <el-input v-model="activity.approveNodeReason" clearable type="textarea" disabled></el-input>
                 </el-form-item>
               </div>
             </el-card>
@@ -39,7 +39,8 @@
       </el-form>
       <template #footer v-if="operationType === 'approval'">
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">纭</el-button>
+          <el-button type="primary" @click="submitForm(2)">涓嶉�氳繃</el-button>
+          <el-button type="primary" @click="submitForm(1)">閫氳繃</el-button>
           <el-button @click="closeDia">鍙栨秷</el-button>
         </div>
       </template>
@@ -49,44 +50,32 @@
 
 <script setup>
 import {getCurrentInstance, ref} from "vue";
+import {approveProcessDetails, updateApproveNode} from "../../../../api/collaborativeApproval/approvalProcess.js";
 const emit = defineEmits(['close'])
 const { proxy } = getCurrentInstance()
 
 const dialogFormVisible = ref(false);
 const operationType = ref('')
-const activities = ref([
-  {
-    content: '鑺傜偣1',
-    timestamp: '',
-    type: 'primary',
-    hollow: true,
-    people: 'admin',
-    value: ''
-  },
-  {
-    content: '鑺傜偣2',
-    timestamp: '',
-    type: '',
-    hollow: false,
-    current: true,
-    people: 'admin',
-    value: ''
-  },
-])
+const activities = ref([])
 const formRef = ref(null);
 
 // 鎵撳紑寮规
 const openDialog = (type, row) => {
   operationType.value = type;
   dialogFormVisible.value = true;
+	approveProcessDetails(row.approveId).then((res) => {
+		console.log(res)
+		activities.value = res.data
+	})
 }
 // 鎻愪氦瀹℃壒
-const submitForm = () => {
-  formRef.value.validate(valid => {
-    if (valid) {
-      // 鏍¢獙閫氳繃鍚庣殑閫昏緫
-    }
-  })
+const submitForm = (status) => {
+	const filteredActivities = activities.value.filter(activity => activity.approveNodeRemark == 1);
+	filteredActivities[0].approveNodeStatus = status
+	updateApproveNode(filteredActivities[0]).then(() => {
+		proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+		closeDia();
+	})
 }
 // 鍏抽棴寮规
 const closeDia = () => {
diff --git a/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue b/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
index 585bc43..e02d3ee 100644
--- a/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
+++ b/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
@@ -18,6 +18,7 @@
           <el-col :span="24">
             <el-form-item label="鐢宠閮ㄩ棬锛�" prop="approveDeptId">
 							<el-select
+								disabled
 								v-model="form.approveDeptId"
 								placeholder="閫夋嫨閮ㄩ棬"
 							>
@@ -81,7 +82,17 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鐢宠浜猴細" prop="approveUser">
-              <el-input v-model="form.approveUser" placeholder="璇疯緭鍏�" clearable/>
+							<el-select
+								v-model="form.approveUser"
+								placeholder="閫夋嫨浜哄憳"
+							>
+								<el-option
+									v-for="user in userList"
+									:key="user.userId"
+									:label="user.nickName"
+									:value="user.userId"
+								/>
+							</el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -116,7 +127,7 @@
   approveProcessUpdate,
   getDept
 } from "../../../../api/collaborativeApproval/approvalProcess.js";
-import {userListNoPage} from "../../../../api/system/user.js";
+import {userListNoPage, getUserProfile} from "../../../../api/system/user.js";
 const { proxy } = getCurrentInstance()
 const emit = defineEmits(['close'])
 import useUserStore from "@/store/modules/user";
@@ -171,26 +182,27 @@
 	approverNodes.value = [
 		{ id: 1, userId: null }
 	]
-  form.value.approveUser = userStore.nickName;
+	console.log(userStore)
+  form.value.approveUser = userStore.id;
   form.value.approveTime = getCurrentDate();
+  
+  // 鑾峰彇褰撳墠鐢ㄦ埛淇℃伅骞惰缃儴闂↖D
+  form.value.approveDeptId = userStore.currentDeptId
   if (operationType.value === 'edit') {
     approveProcessGetInfo({id: row.approveId,approveReason: '1'}).then(res => {
 			form.value = {...res.data}
       // 鍙嶆樉瀹℃壒浜�
-      // if (res.data && res.data.approverIds) {
-      //   const nameArr = res.data.approverIds.split('锛�')
-      //   approverNodes.value = nameArr.map((name, idx) => {
-      //     const user = userList.value.find(u => u.name === name)
-      //     return { id: idx + 1, userId: user ? user.id : null }
-      //   })
-      //   nextApproverId = nameArr.length + 1
-      // } else if (row.approverList && Array.isArray(row.approverList) && row.approverList.length > 0) {
-      //   approverNodes.value = row.approverList.map((userId, idx) => ({ id: idx + 1, userId }))
-      //   nextApproverId = row.approverList.length + 1
-      // } else {
-      //   approverNodes.value = [{ id: 1, userId: null }]
-      //   nextApproverId = 2
-      // }
+      if (res.data && res.data.approveUserIds) {
+        const userIds = res.data.approveUserIds.split(',')
+        approverNodes.value = userIds.map((userId, idx) => ({
+          id: idx + 1, 
+          userId: parseInt(userId.trim())
+        }))
+        nextApproverId = userIds.length + 1
+      } else {
+        approverNodes.value = [{ id: 1, userId: null }]
+        nextApproverId = 2
+      }
     })
   }
 }
@@ -216,7 +228,7 @@
 // 鎻愪氦浜у搧琛ㄥ崟
 const submitForm = () => {
   // 鏀堕泦鎵�鏈夎妭鐐圭殑瀹℃壒浜篿d
-  form.value.approverIds = approverNodes.value.map(node => node.userId).join(',')
+  form.value.approveUserIds = approverNodes.value.map(node => node.userId).join(',')
   // 瀹℃壒浜哄繀濉牎楠�
   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 ab98ab8..10fbf29 100644
--- a/src/views/collaborativeApproval/approvalProcess/index.vue
+++ b/src/views/collaborativeApproval/approvalProcess/index.vue
@@ -2,11 +2,11 @@
   <div class="app-container">
     <div class="search_form">
       <div>
-        <span class="search_title">渚涘簲鍟嗭細</span>
+        <span class="search_title">娴佺▼缂栧彿锛�</span>
         <el-input
-            v-model="searchForm.supplier"
+            v-model="searchForm.approveId"
             style="width: 240px"
-            placeholder="璇疯緭鍏ヤ緵搴斿晢鎼滅储"
+            placeholder="璇疯緭鍏ユ祦绋嬬紪鍙锋悳绱�"
             @change="handleQuery"
             clearable
             :prefix-icon="Search"
@@ -43,14 +43,13 @@
 import { Search } from "@element-plus/icons-vue";
 import {onMounted, ref} from "vue";
 import {ElMessageBox} from "element-plus";
-import {qualityInspectDel, qualityInspectListPage} from "@/api/qualityManagement/rawMaterialInspection.js";
 import InfoFormDia from "@/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue";
 import ApprovalDia from "@/views/collaborativeApproval/approvalProcess/components/approvalDia.vue";
 import {approveProcessDelete, approveProcessListPage} from "../../../api/collaborativeApproval/approvalProcess.js";
 
 const data = reactive({
   searchForm: {
-    supplier: "",
+		approveId: "",
   },
 });
 const { searchForm } = toRefs(data);
@@ -85,19 +84,21 @@
   {
     label: "娴佺▼缂栧彿",
     prop: "approveId",
-    width: 230
+    width: 170
   },
   {
     label: "鐢宠閮ㄩ棬",
     prop: "approveDeptName",
+		width: 220
   },
   {
     label: "瀹℃壒浜嬬敱",
     prop: "approveReason",
+		width: 200
   },
   {
     label: "鐢宠浜�",
-    prop: "approveUser",
+    prop: "approveUserName",
   },
   {
     label: "鐢宠鏃ユ湡",
@@ -110,7 +111,7 @@
   },
   {
     label: "褰撳墠瀹℃壒浜�",
-    prop: "checkCompany",
+    prop: "approveUserCurrentName",
     width: 120
   },
   {
@@ -199,7 +200,7 @@
 const handleDelete = () => {
   let ids = [];
   if (selectedRows.value.length > 0) {
-    ids = selectedRows.value.map((item) => item.id);
+    ids = selectedRows.value.map((item) => item.approveId);
   } else {
     proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
     return;
diff --git a/src/views/inventoryManagement/issueManagement/index.vue b/src/views/inventoryManagement/issueManagement/index.vue
index 2c28e35..859dc94 100644
--- a/src/views/inventoryManagement/issueManagement/index.vue
+++ b/src/views/inventoryManagement/issueManagement/index.vue
@@ -71,7 +71,7 @@
 import { ref } from 'vue'
 import { ElMessageBox } from "element-plus";
 import useUserStore from '@/store/modules/user'
-import { userListNoPage } from "@/api/system/user.js";
+import { userListNoPageByTenantId } from "@/api/system/user.js";
 import {
   getStockInPage
 } from "@/api/inventoryManagement/stockIn.js";
@@ -185,7 +185,7 @@
   console.log('form',form.value)
   // 鍔犺浇鐢ㄦ埛鍒楄〃
   try {
-    const userLists = await userListNoPage()
+    const userLists = await userListNoPageByTenantId()
     userList.value = userLists.data
   } catch (error) {
     console.error('鍔犺浇鐢ㄦ埛鍒楄〃澶辫触:', error)
diff --git a/src/views/inventoryManagement/stockManagement/index.vue b/src/views/inventoryManagement/stockManagement/index.vue
index 6356d7a..86f1a76 100644
--- a/src/views/inventoryManagement/stockManagement/index.vue
+++ b/src/views/inventoryManagement/stockManagement/index.vue
@@ -140,7 +140,7 @@
 import { ref } from 'vue'
 import { ElMessageBox } from "element-plus";
 import useUserStore from '@/store/modules/user'
-import { userListNoPage } from "@/api/system/user.js";
+import { userListNoPageByTenantId } from "@/api/system/user.js";
 import { productTreeList,modelList } from "@/api/basicData/product.js"
 import {
   getStockManagePage ,
@@ -257,7 +257,7 @@
   operationType.value = type
   form.value = {}
   productData.value = []
-  let userLists = await userListNoPage()
+  let userLists = await userListNoPageByTenantId()
   userList.value = userLists.data
   // customerList().then(res => {
   //   customerOption.value = res
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 3ec809b..5a269d6 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -153,7 +153,7 @@
         <el-row>
           <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate">
             <el-button type="primary" @click="openProductForm('add')">娣诲姞</el-button>
-            <el-button plain type="danger" @click="deleteProduct">鍒犻櫎</el-button>
+            <el-button plain type="danger" @click="deleteProduct" >鍒犻櫎</el-button>
           </el-form-item>
         </el-row>
         <el-table :data="productData" border @selection-change="productSelected" show-summary
@@ -631,14 +631,15 @@
 const submitForm = () => {
   proxy.$refs["formRef"].validate((valid) => {
     if (valid) {
-      if (productData.value.length > 0) {
+			console.log('productData.value--', productData.value)
+      if (productData.value !== null && productData.value.length > 0) {
         form.value.productData = proxy.HaveJson(productData.value);
       } else {
         proxy.$modal.msgWarning("璇锋坊鍔犱骇鍝佷俊鎭�");
         return;
       }
       let tempFileIds = [];
-      if (fileList.value.length > 0) {
+      if (fileList.value !== null && fileList.value.length > 0) {
         tempFileIds = fileList.value.map((item) => item.tempId);
       }
       form.value.tempFileIds = tempFileIds;
@@ -682,6 +683,7 @@
 };
 const submitProductEdit = () => {
   productForm.value.salesLedgerId = currentId.value;
+  productForm.value.type = 1
   addOrUpdateSalesLedgerProduct(productForm.value).then((res) => {
     proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
     closeProductDia();

--
Gitblit v1.9.3