From fa34a64369d443e697c5b0520349878eeaaa8802 Mon Sep 17 00:00:00 2001
From: chenhj <1263187585@qq.com>
Date: 星期四, 23 四月 2026 17:22:22 +0800
Subject: [PATCH] Merge branch 'dev_NEW_pro' of http://114.132.189.42:9002/r/product-inventory-management into dev_NEW_pro

---
 src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue |   40 ---
 src/views/procurementManagement/procurementLedger/index.vue                |  116 --------
 src/api/collaborativeApproval/approvalManagement.js                        |   48 ---
 src/components/SvgIcon/index.vue                                           |    2 
 src/views/salesManagement/salesLedger/index.vue                            |   65 ----
 src/views/salesManagement/salesQuotation/index.vue                         |  226 +---------------
 src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue |  138 ----------
 src/views/collaborativeApproval/approvalManagement/index.vue               |  107 ++++----
 8 files changed, 104 insertions(+), 638 deletions(-)

diff --git a/src/api/collaborativeApproval/approvalManagement.js b/src/api/collaborativeApproval/approvalManagement.js
index 25059c4..c2ce4c7 100644
--- a/src/api/collaborativeApproval/approvalManagement.js
+++ b/src/api/collaborativeApproval/approvalManagement.js
@@ -1,53 +1,19 @@
 // 瀹℃壒绠$悊閰嶇疆
 import request from "@/utils/request";
 
-// 鏌ヨ瀹℃壒閰嶇疆鍒楄〃
-export function getApprovalConfigList(approveType) {
+// 鏌ヨ瀹℃壒娴佺▼閰嶇疆鑺傜偣鍒楄〃
+export function getApproveProcessConfigNodeList(type) {
     return request({
-        url: '/approvalConfig/list',
+        url: '/approveProcessConfigNode/list',
         method: 'get',
-        params: { approveType },
+        params: { type },
     })
 }
 
-// 鏌ヨ瀹℃壒閰嶇疆璇︽儏
-export function getApprovalConfigDetail(id) {
+// 鏂板瀹℃壒娴佺▼閰嶇疆鑺傜偣
+export function addApproveProcessConfigNode(data) {
     return request({
-        url: '/approvalConfig/get/' + id,
-        method: 'get',
-    })
-}
-
-// 鏂板瀹℃壒閰嶇疆
-export function addApprovalConfig(data) {
-    return request({
-        url: '/approvalConfig/add',
-        method: 'post',
-        data: data,
-    })
-}
-
-// 淇敼瀹℃壒閰嶇疆
-export function updateApprovalConfig(data) {
-    return request({
-        url: '/approvalConfig/update',
-        method: 'post',
-        data: data,
-    })
-}
-
-// 鍒犻櫎瀹℃壒閰嶇疆
-export function deleteApprovalConfig(id) {
-    return request({
-        url: '/approvalConfig/delete/' + id,
-        method: 'delete',
-    })
-}
-
-// 鎵归噺淇濆瓨瀹℃壒閰嶇疆
-export function batchSaveApprovalConfig(data) {
-    return request({
-        url: '/approvalConfig/batchSave',
+        url: '/approveProcessConfigNode/add',
         method: 'post',
         data: data,
     })
diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue
index 41f64c9..2b8368f 100644
--- a/src/components/SvgIcon/index.vue
+++ b/src/components/SvgIcon/index.vue
@@ -9,7 +9,7 @@
   props: {
     iconClass: {
       type: String,
-      required: true
+      default: ''
     },
     className: {
       type: String,
diff --git a/src/views/collaborativeApproval/approvalManagement/index.vue b/src/views/collaborativeApproval/approvalManagement/index.vue
index 1eb20c8..4638392 100644
--- a/src/views/collaborativeApproval/approvalManagement/index.vue
+++ b/src/views/collaborativeApproval/approvalManagement/index.vue
@@ -188,6 +188,8 @@
   Suitcase, Calendar, Location, Money, ShoppingCart, DocumentChecked,
   Van, ArrowRight, User, InfoFilled
 } from '@element-plus/icons-vue';
+import { getApproveProcessConfigNodeList, addApproveProcessConfigNode } from '@/api/collaborativeApproval/approvalManagement';
+import { userListNoPage } from '@/api/system/user';
 
 // 褰撳墠閫変腑鐨勬爣绛鹃〉
 const activeTab = ref('1');
@@ -271,44 +273,8 @@
   return texts[index] || `绗�${index + 1}绾;
 };
 
-// 鑾峰彇瀹℃壒浜烘暟閲�
-const getApproverCount = (typeValue) => {
-  const type = Number(typeValue);
-  const data = mockConfigData[type] || [];
-  return data.length;
-};
-
-// 妯℃嫙鐢ㄦ埛鍒楄〃鏁版嵁
-const userList = ref([
-  { userId: 1, nickName: '寮犱笁' },
-  { userId: 2, nickName: '鏉庡洓' },
-  { userId: 3, nickName: '鐜嬩簲' },
-  { userId: 4, nickName: '璧靛叚' },
-  { userId: 5, nickName: '瀛欎竷' },
-  { userId: 6, nickName: '鍛ㄥ叓' },
-  { userId: 7, nickName: '鍚翠節' },
-  { userId: 8, nickName: '閮戝崄' },
-]);
-
-// 妯℃嫙瀹℃壒閰嶇疆鏁版嵁瀛樺偍锛堟寜瀹℃壒绫诲瀷鍒嗙被锛�
-const mockConfigData = {
-  1: [
-    { id: 1, approveType: 1, approverId: 1, approverName: '寮犱笁', sortOrder: 1 },
-    { id: 2, approveType: 1, approverId: 2, approverName: '鏉庡洓', sortOrder: 2 },
-  ],
-  2: [
-    { id: 3, approveType: 2, approverId: 3, approverName: '鐜嬩簲', sortOrder: 1 },
-  ],
-  3: [],
-  4: [
-    { id: 4, approveType: 4, approverId: 1, approverName: '寮犱笁', sortOrder: 1 },
-    { id: 5, approveType: 4, approverId: 3, approverName: '鐜嬩簲', sortOrder: 2 },
-    { id: 6, approveType: 4, approverId: 5, approverName: '瀛欎竷', sortOrder: 3 },
-  ],
-  5: [],
-  6: [],
-  7: [],
-};
+// 瀹℃壒浜哄垪琛紙鐪熷疄鎺ュ彛锛�
+const userList = ref([]);
 
 // 瀹℃壒浜哄垪琛�
 const approverList = ref([]);
@@ -326,14 +292,40 @@
 };
 
 // 鍔犺浇瀹℃壒閰嶇疆鏁版嵁锛堟ā鎷燂級
-const loadData = () => {
+const loadData = async () => {
   loading.value = true;
-  setTimeout(() => {
-    const data = mockConfigData[currentApproveType.value] || [];
-    approverList.value = data.sort((a, b) => a.sortOrder - b.sortOrder);
+  try {
+    const res = await getApproveProcessConfigNodeList(currentApproveType.value);
+    const source = Array.isArray(res?.data)
+      ? res.data
+      : Array.isArray(res?.rows)
+        ? res.rows
+        : Array.isArray(res?.data?.records)
+          ? res.data.records
+          : [];
+    const data = source.map((item, index) => ({
+      ...item,
+      sortOrder: item.nodeOrder ?? item.sortOrder ?? index + 1,
+    }));
+    approverList.value = data.sort((a, b) => (a.sortOrder || 0) - (b.sortOrder || 0));
     originalList.value = JSON.parse(JSON.stringify(approverList.value));
+  } catch (error) {
+    approverList.value = [];
+    originalList.value = [];
+    ElMessage.error('鍔犺浇瀹℃壒閰嶇疆澶辫触');
+  } finally {
     loading.value = false;
-  }, 300);
+  }
+};
+
+const loadUserList = async () => {
+  try {
+    const res = await userListNoPage();
+    userList.value = Array.isArray(res?.data) ? res.data : [];
+  } catch (error) {
+    userList.value = [];
+    ElMessage.error('鍔犺浇浜哄憳鍒楄〃澶辫触');
+  }
 };
 
 // 瀹℃壒浜洪�夋嫨鍙樺寲
@@ -393,8 +385,8 @@
   approverList.value[index + 1].sortOrder = index + 2;
 };
 
-// 淇濆瓨閰嶇疆锛堟ā鎷燂級
-const handleSave = () => {
+// 淇濆瓨閰嶇疆
+const handleSave = async () => {
   if (approverList.value.length === 0) {
     ElMessage.warning('璇疯嚦灏戦厤缃竴涓鎵逛汉');
     return;
@@ -414,17 +406,21 @@
   }
 
   saveLoading.value = true;
-  setTimeout(() => {
-    mockConfigData[currentApproveType.value] = approverList.value.map((item, index) => ({
-      ...item,
-      id: item.id || Date.now() + index,
-      sortOrder: index + 1,
+  try {
+    const payload = approverList.value.map((item, index) => ({
+      approveType: currentApproveType.value,
+      nodeOrder: index + 1,
+      approverId: item.approverId,
+      approverName: item.approverName,
     }));
-    originalList.value = JSON.parse(JSON.stringify(mockConfigData[currentApproveType.value]));
-    approverList.value = JSON.parse(JSON.stringify(originalList.value));
+    await addApproveProcessConfigNode(payload);
     ElMessage.success('淇濆瓨鎴愬姛');
+    await loadData();
+  } catch (error) {
+    ElMessage.error('淇濆瓨澶辫触');
+  } finally {
     saveLoading.value = false;
-  }, 500);
+  }
 };
 
 // 閲嶇疆
@@ -445,8 +441,9 @@
     .catch(() => {});
 };
 
-onMounted(() => {
-  loadData();
+onMounted(async () => {
+  await loadUserList();
+  await loadData();
 });
 </script>
 
diff --git a/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue b/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
index 20a4ee6..1269621 100644
--- a/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
+++ b/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
@@ -39,39 +39,6 @@
 						</el-form-item>
 					</el-col>
 				</el-row>
-				<!-- 瀹℃壒浜洪�夋嫨锛堝姩鎬佽妭鐐癸級 -->
-				<el-row :gutter="30">
-					<el-col :span="12">
-						<el-form-item label="鐢宠浜猴細" prop="approveUser">
-							<el-select
-								v-model="form.approveUser"
-								placeholder="閫夋嫨浜哄憳"
-								disabled
-							>
-								<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">
-						<el-form-item label="鐢宠鏃ユ湡锛�" prop="approveTime">
-							<el-date-picker
-								v-model="form.approveTime"
-								type="date"
-								placeholder="璇烽�夋嫨鏃ユ湡"
-								value-format="YYYY-MM-DD"
-								format="YYYY-MM-DD"
-								clearable
-								style="width: 100%"
-								disabled
-							/>
-						</el-form-item>
-					</el-col>
-				</el-row>
 			</el-form>
 
       <!-- 鎶ヤ环瀹℃壒锛氬睍绀烘姤浠疯鎯咃紙澶嶇敤閿�鍞姤浠�"鏌ョ湅璇︽儏瀵硅瘽妗�"鍐呭缁撴瀯锛� -->
@@ -228,7 +195,6 @@
 	updateApproveNode
 } from "@/api/collaborativeApproval/approvalProcess.js";
 import useUserStore from "@/store/modules/user.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
 import { WarningFilled, Edit, Check, MoreFilled } from '@element-plus/icons-vue'
 import { getQuotationList } from "@/api/salesManagement/salesQuotation.js";
 import { getPurchaseByCode } from "@/api/procurementManagement/procurementLedger.js";
@@ -248,7 +214,6 @@
 const formRef = ref(null);
 const userStore = useUserStore()
 const productOptions = ref([]);
-const userList = ref([])
 const quotationLoading = ref(false)
 const currentQuotation = ref({})
 const purchaseLoading = ref(false)
@@ -258,9 +223,7 @@
 
 const data = reactive({
 	form: {
-		approveTime: "",
 		approveId: "",
-		approveUser: "",
 		approveDeptId: "",
 		approveReason: "",
 		checkResult: "",
@@ -295,9 +258,6 @@
   dialogFormVisible.value = true;
   currentQuotation.value = {}
   currentPurchase.value = {}
-	userListNoPageByTenantId().then((res) => {
-		userList.value = res.data;
-	});
 	form.value = {...row}
 	// 绔嬪嵆娓呴櫎琛ㄥ崟楠岃瘉鐘舵�侊紙鍥犱负瀛楁鏄痙isabled鐨勶紝涓嶉渶瑕侀獙璇侊級
 	nextTick(() => {
diff --git a/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue b/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
index 998fa33..8328ee6 100644
--- a/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
+++ b/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
@@ -97,82 +97,7 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <!-- 瀹℃壒浜洪�夋嫨锛堝姩鎬佽妭鐐癸級 -->
-        <el-row>
-          <el-col :span="24">
-            <el-form-item>
-              <template #label>
-                <span>瀹℃壒浜洪�夋嫨锛�</span>
-                <el-button type="primary" @click="addApproverNode" style="margin-left: 8px;">鏂板鑺傜偣</el-button>
-              </template>
-              <div style="display: flex; align-items: flex-end; flex-wrap: wrap;">
-                <div
-                  v-for="(node, index) in approverNodes"
-                  :key="node.id"
-                  style="margin-right: 30px; text-align: center; margin-bottom: 10px;"
-                >
-                  <div>
-                    <span>瀹℃壒浜�</span>
-                    鈫�
-                  </div>
-                  <el-select
-                    v-model="node.userId"
-                    placeholder="閫夋嫨浜哄憳"
-                    style="width: 120px; margin-bottom: 8px;"
-                  >
-                    <el-option
-                      v-for="user in userList"
-                      :key="user.userId"
-                      :label="user.nickName"
-                      :value="user.userId"
-                    />
-                  </el-select>
-                  <div>
-                    <el-button
-                      type="danger"
-                      size="small"
-                      @click="removeApproverNode(index)"
-                      v-if="approverNodes.length > 1"
-                    >鍒犻櫎</el-button>
-                  </div>
-                </div>
-              </div>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="鐢宠浜猴細" prop="approveUser">
-							<el-select
-								v-model="form.approveUser"
-								placeholder="閫夋嫨浜哄憳"
-                filterable
-                default-first-option
-                :reserve-keyword="false"
-							>
-								<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">
-            <el-form-item label="鐢宠鏃ユ湡锛�" prop="approveTime">
-              <el-date-picker
-                  v-model="form.approveTime"
-                  type="date"
-                  placeholder="璇烽�夋嫨鏃ユ湡"
-                  value-format="YYYY-MM-DD"
-                  format="YYYY-MM-DD"
-                  clearable
-                  style="width: 100%"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
+
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
@@ -211,13 +136,10 @@
 import {
   delLedgerFile,
 } from "@/api/salesManagement/salesLedger.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
 import { getToken } from "@/utils/auth";
 const { proxy } = getCurrentInstance()
 const emit = defineEmits(['close'])
 import useUserStore from "@/store/modules/user";
-import { getCurrentDate } from "@/utils/index.js";
-import log from "@/views/monitor/job/log.vue";
 const userStore = useUserStore();
 
 const dialogFormVisible = ref(false);
@@ -231,24 +153,19 @@
 });
 const data = reactive({
   form: {
-    approveTime: "",
     approveId: "",
-    approveUser: "",
-		approveDeptId: "",
+    approveDeptId: "",
     approveDeptName: "",
     approveReason: "",
     checkResult: "",
     tempFileIds: [],
-    approverList: [], // 鏂板瀛楁锛屽瓨鍌ㄦ墍鏈夎妭鐐圭殑瀹℃壒浜篿d
     startDate: "", // 璇峰亣寮�濮嬫椂闂�
     endDate: "", // 璇峰亣缁撴潫鏃堕棿
     price: null, // 鎶ラ攢閲戦
     location: "" // 鍑哄樊鍦扮偣
   },
   rules: {
-    approveTime: [{ required: false, message: "璇疯緭鍏�", trigger: "change" },],
     approveId: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
-    approveUser: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
     approveDeptName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     approveReason: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
@@ -268,18 +185,7 @@
   }
 })
 
-// 瀹℃壒浜鸿妭鐐圭浉鍏�
-const approverNodes = ref([
-  { id: 1, userId: null }
-])
-let nextApproverId = 2
-const userList = ref([])
-function addApproverNode() {
-  approverNodes.value.push({ id: nextApproverId++, userId: null })
-}
-function removeApproverNode(index) {
-  approverNodes.value.splice(index, 1)
-}
+
 // 澶勭悊閮ㄩ棬閫夋嫨鍙樺寲
 const handleDeptChange = (deptId) => {
   if (deptId) {
@@ -295,39 +201,19 @@
 const openDialog = (type, row) => {
   operationType.value = type;
   dialogFormVisible.value = true;
-	userListNoPageByTenantId().then((res) => {
-    userList.value = res.data;
-  });
-	form.value = {}
-	approverNodes.value = [
-		{ id: 1, userId: null }
-	]
-  form.value.approveUser = userStore.id;
-  form.value.approveTime = getCurrentDate();
-  
+  form.value = {}
+
   // 鑾峰彇褰撳墠鐢ㄦ埛淇℃伅骞惰缃儴闂↖D
   form.value.approveDeptId = userStore.currentDeptId
-  
+
   // 鍔犺浇閮ㄩ棬閫夐」锛屽苟鍦ㄥ姞杞藉畬鎴愬悗璁剧疆閮ㄩ棬鍚嶇О
   getProductOptions();
   if (operationType.value === 'edit') {
     fileList.value = row.commonFileList
     form.value.tempFileIds = fileList.value.map(file => file.id)
-		currentApproveStatus.value = row.approveStatus
+    currentApproveStatus.value = row.approveStatus
     approveProcessGetInfo({id: row.approveId,approveReason: '1'}).then(res => {
-			form.value = {...res.data}
-      // 鍙嶆樉瀹℃壒浜�
-      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
-      }
+      form.value = {...res.data}
     })
   }
 }
@@ -362,15 +248,7 @@
 }
 // 鎻愪氦浜у搧琛ㄥ崟
 const submitForm = () => {
-  // 鏀堕泦鎵�鏈夎妭鐐圭殑瀹℃壒浜篿d
-  form.value.approveUserIds = approverNodes.value.map(node => node.userId).join(',')
   form.value.approveType = props.approveType
-  // 瀹℃壒浜哄繀濉牎楠�
-  const hasEmptyApprover = approverNodes.value.some(node => !node.userId)
-  if (hasEmptyApprover) {
-    proxy.$modal.msgError("璇蜂负鎵�鏈夊鎵硅妭鐐归�夋嫨瀹℃壒浜猴紒")
-    return
-  }
   // 褰� approveType 涓� 2 鏃讹紝鏍¢獙璇峰亣鏃堕棿
   if (props.approveType == 2) {
     if (!form.value.startDate) {
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 0543286..32b54a9 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -274,15 +274,7 @@
           <el-col :span="12">
             <el-form-item label="褰曞叆浜猴細"
                           prop="recorderId">
-              <el-select v-model="form.recorderId"
-                         placeholder="璇烽�夋嫨"
-                         clearable
-                         filterable>
-                <el-option v-for="item in userList"
-                           :key="item.userId"
-                           :label="item.nickName"
-                           :value="item.userId" />
-              </el-select>
+              <el-input v-model="form.recorderName" placeholder="鑷姩濉厖" disabled />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -295,50 +287,6 @@
                               type="date"
                               placeholder="璇烽�夋嫨"
                               clearable />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="24">
-            <el-form-item>
-              <template #label>
-                <div style="display: flex; align-items: center; justify-content: space-between; width: 100%;">
-                  <span>瀹℃壒浜洪�夋嫨锛�</span>
-                  <el-button type="primary" size="small" @click="addApproverNode" icon="Plus">鏂板鑺傜偣</el-button>
-                </div>
-              </template>
-              <div class="approver-nodes-container">
-                <div
-                  v-for="(node, index) in approverNodes"
-                  :key="node.id"
-                  class="approver-node-item"
-                >
-                  <div class="approver-node-header">
-                    <span class="approver-node-label">瀹℃壒鑺傜偣 {{ index + 1 }}</span>
-                    <el-button
-                      v-if="approverNodes.length > 1"
-                      type="danger"
-                      size="small"
-                      text
-                      @click="removeApproverNode(index)"
-                      icon="Delete"
-                    >鍒犻櫎</el-button>
-                  </div>
-                  <el-select
-                    v-model="node.userId"
-                    placeholder="璇烽�夋嫨瀹℃壒浜�"
-                    filterable
-                    style="width: 100%;"
-                  >
-                    <el-option
-                      v-for="user in userList"
-                      :key="user.userId"
-                      :label="user.nickName"
-                      :value="user.userId"
-                    />
-                  </el-select>
-                </div>
-              </div>
             </el-form-item>
           </el-col>
         </el-row>
@@ -713,7 +661,6 @@
   } from "vue";
   import { Search, Delete } from "@element-plus/icons-vue";
   import { ElMessageBox, ElMessage } from "element-plus";
-  import { userListNoPage } from "@/api/system/user.js";
   import FormDialog from '@/components/Dialog/FormDialog.vue';
   import FileListDialog from '@/components/Dialog/FileListDialog.vue';
   import {
@@ -745,7 +692,6 @@
   const selectedRows = ref([]);
   const productSelectedRows = ref([]);
   const modelOptions = ref([]);
-  const userList = ref([]);
   const productOptions = ref([]);
   const salesContractList = ref([]);
   const supplierList = ref([]);
@@ -761,16 +707,6 @@
   import dayjs from "dayjs";
 
   const userStore = useUserStore();
-
-  // 瀹℃壒浜鸿妭鐐癸紙浠块攢鍞彴璐﹀彂璐у鎵逛汉锛�
-  const approverNodes = ref([{ id: 1, userId: null }]);
-  let nextApproverId = 2;
-  const addApproverNode = () => {
-    approverNodes.value.push({ id: nextApproverId++, userId: null });
-  };
-  const removeApproverNode = (index) => {
-    approverNodes.value.splice(index, 1);
-  };
 
   // 璁㈠崟瀹℃壒鐘舵�佹樉绀烘枃鏈�
   const approvalStatusText = {
@@ -910,20 +846,18 @@
       salesLedgerId: "",
       projectName: "",
       recorderId: "",
+			recorderName: "",
       entryDate: "",
       productData: [],
       supplierName: "",
       supplierId: "",
       paymentMethod: "",
       executionDate: "",
-      isChecked: true,
+      isChecked: false,
     },
     rules: {
       purchaseContractNumber: [
         { required: true, message: "璇疯緭鍏�", trigger: "blur" },
-      ],
-      approverId: [
-        { required: true, message: "璇烽�夋嫨瀹℃壒浜�", trigger: "change" },
       ],
       projectName: [
         { required: true, message: "璇疯緭鍏ラ」鐩悕绉�", trigger: "blur" },
@@ -964,7 +898,7 @@
       taxExclusiveTotalPrice: "",
       invoiceType: "",
       warnNum: "",
-      isChecked: true,
+      isChecked: false,
     },
     productRules: {
       productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
@@ -1123,19 +1057,13 @@
     }
 
     try {
-      // 鑾峰彇瀹℃壒浜篒D瀛楃涓�
-      const approveUserIds = approverNodes.value
-        .filter(node => node.userId)
-        .map(node => node.userId)
-        .join(",");
-      
       let params = {
         productData: proxy.HaveJson(productData.value),
         supplierId: form.value.supplierId,
         paymentMethod: form.value.paymentMethod,
         recorderId: form.value.recorderId,
+				recorderName: form.value.recorderName,
         projectName: form.value.projectName,
-        approveUserIds: approveUserIds,
         templateName: templateName.value.trim(),
       };
       console.log("template params ===>", params, "currentTemplateId:", currentTemplateId.value);
@@ -1286,18 +1214,13 @@
     templateName.value = "";
     filterInputValue.value = "";
     isTemplateNameDuplicate.value = false;
-    // 閲嶇疆瀹℃壒浜鸿妭鐐癸紙榛樿涓�涓┖鑺傜偣锛�
-    approverNodes.value = [{ id: 1, userId: null }];
-    nextApproverId = 2;
     try {
       // 骞惰鍔犺浇鍩虹鏁版嵁
-      const [userRes, salesRes, supplierRes] = await Promise.all([
-        userListNoPage(),
+      const [salesRes, supplierRes] = await Promise.all([
         getSalesNo(),
         getOptions(),
       ]);
 
-      userList.value = userRes.data || [];
       salesContractList.value = salesRes || [];
       // 渚涘簲鍟嗚繃婊ゅ嚭isWhite=0 鐨勬暟鎹�
       supplierList.value = (supplierRes.data || []).filter(
@@ -1305,7 +1228,7 @@
       );
 
       // 璁剧疆榛樿鍊�
-      form.value.recorderId = userStore.id;
+      form.value.recorderName = userStore.nickName;
       form.value.entryDate = getCurrentDate();
 
       if (type === "add") {
@@ -1327,15 +1250,6 @@
           form.value = { ...purchaseRes };
           productData.value = purchaseRes.productData || [];
           fileList.value = purchaseRes.salesLedgerFiles || [];
-          // 濡傛灉缂栬緫鏃舵湁瀹℃壒浜猴紝瑙f瀽瀹℃壒浜篒D瀛楃涓插苟璁剧疆鍒拌妭鐐逛腑
-          if (purchaseRes.approveUserIds) {
-            const approverIds = purchaseRes.approveUserIds.split(",");
-            approverNodes.value = approverIds.map((id, index) => ({
-              id: index + 1,
-              userId: Number(id)
-            }));
-            nextApproverId = approverIds.length + 1;
-          }
         } catch (error) {
           console.error("鍔犺浇閲囪喘鍙拌处鏁版嵁澶辫触:", error);
           proxy.$modal.msgError("鍔犺浇鏁版嵁澶辫触");
@@ -1404,14 +1318,6 @@
   const submitForm = () => {
     proxy.$refs["formRef"].validate(valid => {
       if (valid) {
-        // 瀹℃壒浜哄繀濉牎楠岋紙鎵�鏈夎妭鐐归兘瑕侀�変汉锛�
-        const hasEmptyApprover = approverNodes.value.some(node => !node.userId);
-        if (hasEmptyApprover) {
-          proxy.$modal.msgError("璇蜂负鎵�鏈夊鎵硅妭鐐归�夋嫨瀹℃壒浜猴紒");
-          return;
-        }
-        const approveUserIds = approverNodes.value.map(node => node.userId).join(",");
-        
         if (productData.value.length > 0) {
           // 鏂板鏃讹紝闇�瑕佷粠姣忎釜浜у搧瀵硅薄涓垹闄� id 瀛楁
           let processedProductData = productData.value;
@@ -1432,7 +1338,6 @@
         }
         form.value.tempFileIds = tempFileIds;
         form.value.type = 2;
-        form.value.approveUserIds = approveUserIds;
 
         // 濡傛灉salesLedgerId涓虹┖锛屽垯涓嶄紶閫抯alesContractNo
         if (!form.value.salesLedgerId) {
@@ -1456,9 +1361,6 @@
   // 鍏抽棴寮规
   const closeDia = () => {
     proxy.resetForm("formRef");
-    // 閲嶇疆瀹℃壒浜鸿妭鐐癸紙榛樿涓�涓┖鑺傜偣锛�
-    approverNodes.value = [{ id: 1, userId: null }];
-    nextApproverId = 2;
     dialogFormVisible.value = false;
   };
   // 鎵撳紑浜у搧寮规
@@ -1475,6 +1377,10 @@
     // 绛夊緟 DOM 鏇存柊
     await nextTick();
     
+    if (type === "add") {
+      productForm.value.isChecked = false;
+    }
+
     if (type === "edit") {
       // 澶嶅埗琛屾暟鎹�
       productForm.value = { ...row };
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 7c9ebf8..6b2cfcf 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -593,49 +593,7 @@
 					</el-col>
 				</el-row>
 
-        <!-- 瀹℃壒浜洪�夋嫨锛堜豢鍗忓悓瀹℃壒閲岀殑瀹℃壒浜鸿妭鐐归�夋嫨锛� -->
-        <el-row>
-          <el-col :span="24">
-            <el-form-item>
-              <template #label>
-                <span>瀹℃壒浜洪�夋嫨锛�</span>
-                <el-button type="primary" @click="addApproverNode" style="margin-left: 8px;">鏂板鑺傜偣</el-button>
-              </template>
-              <div style="display: flex; align-items: flex-end; flex-wrap: wrap;">
-                <div
-                  v-for="(node, index) in approverNodes"
-                  :key="node.id"
-                  style="margin-right: 20px; text-align: center; margin-bottom: 10px;"
-                >
-                  <div>
-                    <span>瀹℃壒浜�</span>
-                    鈫�
-                  </div>
-                  <el-select
-                    v-model="node.userId"
-                    placeholder="閫夋嫨浜哄憳"
-                    filterable
-                    style="width: 140px; margin-bottom: 8px;"
-                  >
-                    <el-option
-                      v-for="user in userList"
-                      :key="user.userId"
-                      :label="user.nickName"
-                      :value="user.userId"
-                    />
-                  </el-select>
-                  <div>
-                    <el-button
-                      type="danger"
-                      @click="removeApproverNode(index)"
-                      v-if="approverNodes.length > 1"
-                    >鍒犻櫎</el-button>
-                  </div>
-                </div>
-              </div>
-            </el-form-item>
-          </el-col>
-        </el-row>
+
 			</el-form>
 			<template #footer>
 				<div class="dialog-footer">
@@ -808,16 +766,6 @@
   },
 });
 const { deliveryForm, deliveryRules } = toRefs(deliveryFormData);
-
-// 鍙戣揣瀹℃壒浜鸿妭鐐癸紙浠垮崗鍚屽鎵� infoFormDia.vue锛�
-const approverNodes = ref([{ id: 1, userId: null }]);
-let nextApproverId = 2;
-const addApproverNode = () => {
-  approverNodes.value.push({ id: nextApproverId++, userId: null });
-};
-const removeApproverNode = (index) => {
-  approverNodes.value.splice(index, 1);
-};
 
 // 瀵煎叆鐩稿叧
 const importUploadRef = ref(null);
@@ -2178,9 +2126,6 @@
   deliveryForm.value = {
     type: "璐ц溅",
   };
-  // 閲嶇疆瀹℃壒浜鸿妭鐐癸紙榛樿涓�涓┖鑺傜偣锛�
-  approverNodes.value = [{ id: 1, userId: null }];
-  nextApproverId = 2;
 	deliveryFormVisible.value = true;
 };
 
@@ -2188,13 +2133,6 @@
 const submitDelivery = () => {
   proxy.$refs["deliveryFormRef"].validate((valid) => {
     if (valid) {
-      // 瀹℃壒浜哄繀濉牎楠岋紙鎵�鏈夎妭鐐归兘瑕侀�変汉锛�
-      const hasEmptyApprover = approverNodes.value.some(node => !node.userId);
-      if (hasEmptyApprover) {
-        proxy.$modal.msgError("璇蜂负鎵�鏈夊鎵硅妭鐐归�夋嫨瀹℃壒浜猴紒");
-        return;
-      }
-      const approveUserIds = approverNodes.value.map(node => node.userId).join(",");
       // 淇濆瓨褰撳墠灞曞紑鐨勮ID锛屼互渚垮彂璐у悗閲嶆柊鍔犺浇瀛愯〃鏍兼暟鎹�
       const currentExpandedKeys = [...expandedRowKeys.value];
       const salesLedgerId = currentDeliveryRow.value.salesLedgerId;
@@ -2202,7 +2140,6 @@
         salesLedgerId: salesLedgerId,
         salesLedgerProductId: currentDeliveryRow.value.id,
         type: deliveryForm.value.type,
-				approveUserIds,
       })
         .then(() => {
           proxy.$modal.msgSuccess("鍙戣揣鎴愬姛");
diff --git a/src/views/salesManagement/salesQuotation/index.vue b/src/views/salesManagement/salesQuotation/index.vue
index 01174d7..ee93e46 100644
--- a/src/views/salesManagement/salesQuotation/index.vue
+++ b/src/views/salesManagement/salesQuotation/index.vue
@@ -155,63 +155,6 @@
           </div>
         </el-card>
 
-        <!-- 瀹℃壒浜轰俊鎭� -->
-        <el-card class="form-card" shadow="hover">
-          <template #header>
-            <div class="card-header-wrapper">
-              <el-icon class="card-icon"><UserFilled /></el-icon>
-              <span class="card-title">瀹℃壒浜洪�夋嫨</span>
-              <el-button type="primary" size="small" @click="addApproverNode" class="header-btn">
-                <el-icon><Plus /></el-icon>
-                鏂板鑺傜偣
-              </el-button>
-            </div>
-          </template>
-          <div class="form-content">
-            <el-row>
-              <el-col :span="24">
-                <el-form-item>
-                  <div class="approver-nodes-container">
-                    <div
-                      v-for="(node, index) in approverNodes"
-                      :key="node.id"
-                      class="approver-node-item"
-                    >
-                      <div class="approver-node-label">
-                        <span class="node-step">{{ index + 1 }}</span>
-                        <span class="node-text">瀹℃壒浜�</span>
-                        <el-icon class="arrow-icon"><ArrowRight /></el-icon>
-                      </div>
-                      <el-select
-                        v-model="node.userId"
-                        placeholder="閫夋嫨浜哄憳"
-                        class="approver-select"
-												filterable
-                        clearable
-                      >
-                        <el-option
-                          v-for="user in userList"
-                          :key="user.userId"
-                          :label="user.nickName"
-                          :value="user.userId"
-                        />
-                      </el-select>
-                      <el-button
-                        type="danger"
-                        size="small"
-                        :icon="Delete"
-                        @click="removeApproverNode(index)"
-                        v-if="approverNodes.length > 1"
-                        class="remove-btn"
-                      >鍒犻櫎</el-button>
-                    </div>
-                  </div>
-                </el-form-item>
-              </el-col>
-            </el-row>
-          </div>
-        </el-card>
-
         <!-- 浜у搧淇℃伅 -->
         <el-card class="form-card" shadow="hover">
           <template #header>
@@ -353,14 +296,14 @@
 <script setup>
 import { ref, reactive, computed, onMounted, markRaw, shallowRef } from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
-import { Search, Document, UserFilled, Box, EditPen, Plus, ArrowRight, Delete } from '@element-plus/icons-vue'
+import { Search, Document, Box, EditPen, Plus } from '@element-plus/icons-vue'
 import Pagination from '@/components/PIMTable/Pagination.vue'
 import FormDialog from '@/components/Dialog/FormDialog.vue'
 import {getQuotationList,addQuotation,updateQuotation,deleteQuotation} from '@/api/salesManagement/salesQuotation.js'
-import {userListNoPage} from "@/api/system/user.js";
 import {customerList} from "@/api/salesManagement/salesLedger.js";
 import {modelList, productTreeList} from "@/api/basicData/product.js";
 import {listCustomerPrivatePool} from "@/api/basicData/customerFile.js";
+import { userListNoPage } from "@/api/system/user.js";
 
 // 鍝嶅簲寮忔暟鎹�
 const loading = ref(false)
@@ -371,6 +314,7 @@
 })
 
 const quotationList = ref([])
+const userList = ref([])
 const productOptions = ref([]);
 const modelOptions = ref([]);
 const pagination = reactive({
@@ -424,29 +368,12 @@
   })
   return r
 })
-const userList = ref([]);
 const customerOption = ref([]);
-
-// 瀹℃壒浜鸿妭鐐圭浉鍏�
-const approverNodes = ref([
-  { id: 1, userId: null }
-])
-let nextApproverId = 2
 
 const isEdit = ref(false)
 const editId = ref(null)
 const currentQuotation = ref({})
 const formRef = ref()
-
-// 娣诲姞瀹℃壒浜鸿妭鐐�
-function addApproverNode() {
-  approverNodes.value.push({ id: nextApproverId++, userId: null })
-}
-
-// 鍒犻櫎瀹℃壒浜鸿妭鐐�
-function removeApproverNode(index) {
-  approverNodes.value.splice(index, 1)
-}
 
 // 璁$畻灞炴��
 const filteredList = computed(() => {
@@ -478,21 +405,11 @@
   dialogTitle.value = '鏂板鎶ヤ环'
   isEdit.value = false
   resetForm()
-  // 閲嶇疆瀹℃壒浜鸿妭鐐�
-  approverNodes.value = [{ id: 1, userId: null }]
-  nextApproverId = 2
   dialogVisible.value = true
-	let userLists = await userListNoPage();
-	// 鍙鍒堕渶瑕佺殑瀛楁锛岄伩鍏嶅皢缁勪欢寮曠敤鏀惧叆鍝嶅簲寮忓璞�
-	userList.value = (userLists.data || []).map(item => ({
-    userId: item.userId,
-    nickName: item.nickName || '',
-    userName: item.userName || ''
-  }));
-	getProductOptions();
-	listCustomerPrivatePool({current: -1,size:-1}).then((res) => {
-		customerOption.value = res.data.records;
-	});
+  getProductOptions();
+  listCustomerPrivatePool({current: -1,size:-1}).then((res) => {
+    customerOption.value = res.data.records;
+  });
 }
 const getProductOptions = () => {
 	// 杩斿洖 Promise锛屼究浜庣紪杈戞椂 await 纭繚鑳藉弽鏄�
@@ -676,28 +593,7 @@
   form.discountRate = row.discountRate || 0
   form.discountAmount = row.discountAmount || 0
   form.totalAmount = row.totalAmount || 0
-  
-  // 鍙嶆樉瀹℃壒浜�
-  if (row.approveUserIds) {
-    const userIds = row.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
-  }
-  
-  // 鍔犺浇鐢ㄦ埛鍒楄〃
-  let userLists = await userListNoPage();
-  userList.value = (userLists.data || []).map(item => ({
-    userId: item.userId,
-    nickName: item.nickName || '',
-    userName: item.userName || ''
-  }));
-  
+
   dialogVisible.value = true
 }
 
@@ -784,22 +680,12 @@
         return
       }
 
-      // 瀹℃壒浜哄繀濉牎楠�
-      const hasEmptyApprover = approverNodes.value.some(node => !node.userId)
-      if (hasEmptyApprover) {
-        ElMessage.error('璇蜂负鎵�鏈夊鎵硅妭鐐归�夋嫨瀹℃壒浜猴紒')
-        return
-      }
-      
-      // 鏀堕泦鎵�鏈夎妭鐐圭殑瀹℃壒浜篿d
-      form.approveUserIds = approverNodes.value.map(node => node.userId).join(',')
-      
       // 璁$畻鎵�鏈変骇鍝佺殑鍗曚环鎬诲拰
       form.totalAmount = form.products.reduce((sum, product) => {
         const price = Number(product.unitPrice) || 0
         return sum + price
       }, 0)
-      
+
       if (isEdit.value) {
         // 缂栬緫
         const index = quotationList.value.findIndex(item => item.id === editId.value)
@@ -823,7 +709,7 @@
           }
         })
       }
-      
+
     }
   })
 }
@@ -877,12 +763,23 @@
       pagination.total = res.data.total
     }
   })
-	customerList().then((res) => {
-		customerOption.value = res;
-	});
+	// customerList().then((res) => {
+	// 	customerOption.value = res;
+	// });
+}
+
+const getUserList = async () => {
+  try {
+    const res = await userListNoPage()
+    userList.value = Array.isArray(res?.data) ? res.data : []
+  } catch (error) {
+    userList.value = []
+    ElMessage.error('鍔犺浇涓氬姟鍛樺垪琛ㄥけ璐�')
+  }
 }
 
 onMounted(()=>{
+  getUserList()
   handleSearch()
 })
 </script>
@@ -975,71 +872,6 @@
   }
 }
 
-.approver-nodes-container {
-  display: flex;
-  flex-wrap: wrap;
-  gap: 24px;
-  padding: 12px 0;
-}
-
-.approver-node-item {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  gap: 12px;
-  padding: 16px;
-  background: #f8f9fa;
-  border-radius: 8px;
-  border: 1px solid #e4e7ed;
-  transition: all 0.3s ease;
-  min-width: 180px;
-  
-  &:hover {
-    border-color: #409eff;
-    background: #f0f7ff;
-    box-shadow: 0 2px 8px rgba(64, 158, 255, 0.1);
-  }
-}
-
-.approver-node-label {
-  display: flex;
-  align-items: center;
-  gap: 8px;
-  font-size: 14px;
-  color: #606266;
-  
-  .node-step {
-    display: inline-flex;
-    align-items: center;
-    justify-content: center;
-    width: 24px;
-    height: 24px;
-    background: #409eff;
-    color: #fff;
-    border-radius: 50%;
-    font-size: 12px;
-    font-weight: 600;
-  }
-  
-  .node-text {
-    font-weight: 500;
-  }
-  
-  .arrow-icon {
-    color: #909399;
-    font-size: 14px;
-  }
-}
-
-.approver-select {
-  width: 100%;
-  min-width: 150px;
-}
-
-.remove-btn {
-  margin-top: 4px;
-}
-
 .product-table {
   :deep(.el-table__header) {
     background-color: #f5f7fa;
@@ -1066,14 +898,4 @@
   text-align: right;
 }
 
-// 鍝嶅簲寮忎紭鍖�
-@media (max-width: 1200px) {
-  .approver-nodes-container {
-    gap: 16px;
-  }
-  
-  .approver-node-item {
-    min-width: 160px;
-  }
-}
 </style>

--
Gitblit v1.9.3