From ad3ecc9167a5f837e0a6292d8e697b799eb6bfc2 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期五, 17 四月 2026 15:57:31 +0800
Subject: [PATCH] 发货审批人列表来源修改

---
 src/api/system/user.js                                              |   62 +++--
 src/pages/sales/salesAccount/goOut.vue                              |    2 
 src/pages/cooperativeOffice/collaborativeApproval/contactSelect.vue |  576 ++++++++++++++++++++++++++-------------------------
 3 files changed, 332 insertions(+), 308 deletions(-)

diff --git a/src/api/system/user.js b/src/api/system/user.js
index 60f1913..32d5495 100644
--- a/src/api/system/user.js
+++ b/src/api/system/user.js
@@ -1,56 +1,64 @@
-import upload from '@/utils/upload'
-import request from '@/utils/request'
+import upload from "@/utils/upload";
+import request from "@/utils/request";
 
 // 鐢ㄦ埛瀵嗙爜閲嶇疆
 export function updateUserPwd(oldPassword, newPassword) {
   const data = {
     oldPassword,
-    newPassword
-  }
+    newPassword,
+  };
   return request({
-    url: '/system/user/profile/updatePwd',
-    method: 'put',
-    params: data
-  })
+    url: "/system/user/profile/updatePwd",
+    method: "put",
+    params: data,
+  });
 }
 
 // 鏌ヨ鐢ㄦ埛涓汉淇℃伅
 export function getUserProfile() {
   return request({
-    url: '/system/user/profile',
-    method: 'get'
-  })
+    url: "/system/user/profile",
+    method: "get",
+  });
 }
 
 // 淇敼鐢ㄦ埛涓汉淇℃伅
 export function updateUserProfile(data) {
   return request({
-    url: '/system/user/profile',
-    method: 'put',
-    data: data
-  })
+    url: "/system/user/profile",
+    method: "put",
+    data: data,
+  });
 }
 
 // 鐢ㄦ埛澶村儚涓婁紶
 export function uploadAvatar(data) {
   return request({
-    url: '/system/user/profile/avatar',
-    method: 'post',
-    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
-    data: data
-  })
+    url: "/system/user/profile/avatar",
+    method: "post",
+    headers: { "Content-Type": "application/x-www-form-urlencoded" },
+    data: data,
+  });
 }
 // 鏌ヨ鐢ㄦ埛鍒楄〃
 export function userListNoPage() {
   return request({
-    url: '/system/user/userListNoPage',
-    method: 'get'
-  })
+    url: "/system/user/userListNoPage",
+    method: "get",
+  });
 }
 // 鏌ヨ鐢ㄦ埛鍒楄〃
 export function userListNoPageByTenantId() {
   return request({
-    url: '/system/user/userListNoPageByTenantId',
-    method: 'get'
-  })
-}
\ No newline at end of file
+    url: "/system/user/userListNoPageByTenantId",
+    method: "get",
+  });
+}
+// 鏌ヨ瀹℃壒浜�
+export function approveUserList(query) {
+  return request({
+    url: "/approveUser/getList",
+    method: "get",
+    params: query,
+  });
+}
diff --git a/src/pages/cooperativeOffice/collaborativeApproval/contactSelect.vue b/src/pages/cooperativeOffice/collaborativeApproval/contactSelect.vue
index 31022f2..430c5c0 100644
--- a/src/pages/cooperativeOffice/collaborativeApproval/contactSelect.vue
+++ b/src/pages/cooperativeOffice/collaborativeApproval/contactSelect.vue
@@ -1,27 +1,29 @@
 <template>
   <view class="contact-select">
     <!-- 椤堕儴鏍囬鏍� -->
-    <PageHeader title="閫夋嫨鑱旂郴浜�" @back="goBack">
+    <PageHeader title="閫夋嫨鑱旂郴浜�"
+                @back="goBack">
       <template #right>
-        <text class="confirm-btn" @click="confirmSelect">纭畾</text>
+        <text class="confirm-btn"
+              @click="confirmSelect">纭畾</text>
       </template>
     </PageHeader>
-
     <!-- 鎼滅储妗� -->
-<!--    <view class="search-section">-->
-<!--      <van-search-->
-<!--        v-model="searchValue"-->
-<!--        placeholder="鎼滅储鑱旂郴浜�"-->
-<!--        @search="onSearch"-->
-<!--        @input="onSearch"-->
-<!--      />-->
-<!--    </view>-->
-
+    <!--    <view class="search-section">-->
+    <!--      <van-search-->
+    <!--        v-model="searchValue"-->
+    <!--        placeholder="鎼滅储鑱旂郴浜�"-->
+    <!--        @search="onSearch"-->
+    <!--        @input="onSearch"-->
+    <!--      />-->
+    <!--    </view>-->
     <!-- 宸查�夋嫨鐨勮仈绯讳汉 -->
-    <view class="selected-section" v-if="selectedContact">
+    <view class="selected-section"
+          v-if="selectedContact">
       <view class="selected-header">
         <text class="selected-title">宸查�夋嫨</text>
-        <text class="clear-btn" @click="clearSelected">娓呯┖</text>
+        <text class="clear-btn"
+              @click="clearSelected">娓呯┖</text>
       </view>
       <view class="selected-item">
         <view class="contact-avatar">
@@ -30,36 +32,33 @@
         <view class="contact-details">
           <text class="contact-name">{{ selectedContact.nickName }}</text>
         </view>
-        <u-icon name="close" size="16" color="#999" @click="clearSelected" />
+        <u-icon name="close"
+                size="16"
+                color="#999"
+                @click="clearSelected" />
       </view>
     </view>
-
     <!-- 鑱旂郴浜哄垪琛� -->
     <view class="contact-list">
       <view class="list-header">
         <text class="list-title">鍏ㄩ儴鑱旂郴浜�</text>
       </view>
-      
-      <u-list
-        v-model:loading="loading"
-        :finished="finished"
-        finished-text="娌℃湁鏇村浜�"
-        @load="onLoad"
-      >
-        <view 
-          v-for="contact in userList"
-          :key="contact.userId"
-          class="contact-item"
-          :class="{ 'selected': isSelected(contact) }"
-          @click="selectContact(contact)"
-        >
+      <u-list v-model:loading="loading"
+              :finished="finished"
+              finished-text="娌℃湁鏇村浜�"
+              @load="onLoading">
+        <view v-for="contact in userList"
+              :key="contact.userId"
+              class="contact-item"
+              :class="{ 'selected': isSelected(contact) }"
+              @click="selectContact(contact)">
           <view class="contact-info">
             <view class="contact-avatar">
               <text class="avatar-text">{{ contact.nickName.charAt(0) }}</text>
             </view>
             <view class="contact-details">
               <text class="contact-name">{{ contact.nickName }}</text>
-<!--              <text class="contact-dept">{{ contact.department }}</text>-->
+              <!--              <text class="contact-dept">{{ contact.department }}</text>-->
             </view>
           </view>
         </view>
@@ -69,277 +68,294 @@
 </template>
 
 <script setup>
-import { ref, onMounted } from 'vue'
-import { userListNoPageByTenantId } from "@/api/system/user"
+  import { ref, onMounted } from "vue";
+  import { userListNoPageByTenantId, approveUserList } from "@/api/system/user";
+  import { onLoad } from "@dcloudio/uni-app";
+  const loading = ref(false);
+  const finished = ref(false);
+  const selectedContact = ref(null);
+  const userList = ref([]);
 
-const loading = ref(false)
-const finished = ref(false)
-const selectedContact = ref(null)
-const userList = ref([])
+  // 鎺ユ敹浼犻�掔殑鍙傛暟
+  const stepIndex = ref(0);
 
-// 鎺ユ敹浼犻�掔殑鍙傛暟
-const stepIndex = ref(0)
+  onMounted(() => {
+    // 浠庢湰鍦板瓨鍌ㄨ幏鍙栧弬鏁�
+    const storedStepIndex = uni.getStorageSync("stepIndex");
+    if (storedStepIndex !== undefined && storedStepIndex !== null) {
+      stepIndex.value = parseInt(storedStepIndex);
+    }
 
-onMounted(() => {
-  // 浠庢湰鍦板瓨鍌ㄨ幏鍙栧弬鏁�
-  const storedStepIndex = uni.getStorageSync('stepIndex');
-  if (storedStepIndex !== undefined && storedStepIndex !== null) {
-    stepIndex.value = parseInt(storedStepIndex)
-  }
-  
-  // 鍒濆鍖栬仈绯讳汉鏁版嵁
-  initContacts()
-})
+    // 鍒濆鍖栬仈绯讳汉鏁版嵁
+    initContacts();
+  });
 
-const initContacts = () => {
-  userListNoPageByTenantId().then((res) => {
-    userList.value = res.data
-  })
-  finished.value = true
-}
+  const initContacts = () => {
+    if (approveType.value) {
+      approveUserList({ approveType: approveType.value }).then(res => {
+        userList.value = [...res.data];
+        userList.value.forEach(item => {
+          item.nickName = item.nickName || item.userName;
+        });
+      });
+    } else {
+      userListNoPageByTenantId().then(res => {
+        userList.value = res.data;
+      });
+    }
+    finished.value = true;
+  };
 
-const onLoad = () => {
-  // 妯℃嫙鍔犺浇鏇村鏁版嵁
-  setTimeout(() => {
-    loading.value = false
-    finished.value = true
-  }, 1000)
-}
+  const onLoading = () => {
+    // 妯℃嫙鍔犺浇鏇村鏁版嵁
+    setTimeout(() => {
+      loading.value = false;
+      finished.value = true;
+    }, 1000);
+  };
 
-const isSelected = (contact) => {
-  return selectedContact.value && selectedContact.value.userId === contact.userId
-}
+  const isSelected = contact => {
+    return (
+      selectedContact.value && selectedContact.value.userId === contact.userId
+    );
+  };
 
-const selectContact = (contact) => {
-  // 鍗曢�夋ā寮忥紝鐩存帴鏇挎崲閫変腑鐨勮仈绯讳汉
-  selectedContact.value = contact
-}
+  const selectContact = contact => {
+    // 鍗曢�夋ā寮忥紝鐩存帴鏇挎崲閫変腑鐨勮仈绯讳汉
+    selectedContact.value = contact;
+  };
 
-const clearSelected = () => {
-  selectedContact.value = null
-}
+  const clearSelected = () => {
+    selectedContact.value = null;
+  };
 
-const goBack = () => {
-  uni.removeStorageSync('stepIndex');
-  uni.navigateBack()
-}
+  const goBack = () => {
+    uni.removeStorageSync("stepIndex");
+    uni.navigateBack();
+  };
 
-const confirmSelect = () => {
-  if (!selectedContact.value) {
-    uni.showToast({
-      title: '璇烽�夋嫨涓�涓仈绯讳汉',
-      icon: 'none'
-    })
-    return
-  }
-  // 浣跨敤 uni.$emit 鍙戦�佹暟鎹�
-  uni.$emit('selectContact', {
-    stepIndex: stepIndex.value,
-    contact: selectedContact.value
-  })
-  uni.navigateBack()
-}
+  const confirmSelect = () => {
+    if (!selectedContact.value) {
+      uni.showToast({
+        title: "璇烽�夋嫨涓�涓仈绯讳汉",
+        icon: "none",
+      });
+      return;
+    }
+    // 浣跨敤 uni.$emit 鍙戦�佹暟鎹�
+    uni.$emit("selectContact", {
+      stepIndex: stepIndex.value,
+      contact: selectedContact.value,
+    });
+    uni.navigateBack();
+  };
+  const approveType = ref(null);
+  onLoad(options => {
+    if (options.approveType) {
+      approveType.value = options.approveType;
+    }
+  });
 </script>
 
 <style scoped lang="scss">
-.contact-select {
-  min-height: 100vh;
-  background: #f8f9fa;
-}
-
-.header {
-  background: #ffffff;
-	padding: 16px 20px;
-	display: flex;
-	align-items: center;
-	justify-content: space-between;
-	border-bottom: 1px solid #f0f0f0;
-	position: sticky;
-	/* 鍏煎 iOS 鍒樻捣/鐏靛姩宀涘畨鍏ㄥ尯 */
-	padding-top: calc(env(safe-area-inset-top));
-	top: 0;
-	z-index: 100;
-	position: relative;
-}
-
-.title {
-  font-size: 18px;
-  font-weight: 600;
-  color: #333;
-}
-
-.confirm-btn {
-  color: #006cfb;
-  font-size: 16px;
-  font-weight: 500;
-}
-
-.search-section {
-  background: #fff;
-  padding: 12px 16px;
-  border-bottom: 1px solid #f0f0f0;
-}
-
-.selected-section {
-  background: #fff;
-  margin-top: 8px;
-  padding: 16px;
-}
-
-.selected-header {
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  margin-bottom: 12px;
-}
-
-.selected-title {
-  font-size: 14px;
-  color: #333;
-  font-weight: 500;
-}
-
-.clear-btn {
-  color: #006cfb;
-  font-size: 14px;
-}
-
-.selected-item {
-  display: flex;
-  align-items: center;
-  background: #f0f8ff;
-  border: 1px solid #006cfb;
-  border-radius: 12px;
-  padding: 12px;
-  gap: 12px;
-  position: relative;
-  
-  &::before {
-    content: '';
-    position: absolute;
-    top: -2px;
-    right: -2px;
-    width: 16px;
-    height: 16px;
-    background: #52c41a;
-    border-radius: 50%;
-    border: 2px solid #fff;
-    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+  .contact-select {
+    min-height: 100vh;
+    background: #f8f9fa;
   }
-  
-  &::after {
-    content: '鉁�';
-    position: absolute;
-    top: -1px;
-    right: -1px;
-    width: 16px;
-    height: 16px;
+
+  .header {
+    background: #ffffff;
+    padding: 16px 20px;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    border-bottom: 1px solid #f0f0f0;
+    position: sticky;
+    /* 鍏煎 iOS 鍒樻捣/鐏靛姩宀涘畨鍏ㄥ尯 */
+    padding-top: calc(env(safe-area-inset-top));
+    top: 0;
+    z-index: 100;
+    position: relative;
+  }
+
+  .title {
+    font-size: 18px;
+    font-weight: 600;
+    color: #333;
+  }
+
+  .confirm-btn {
+    color: #006cfb;
+    font-size: 16px;
+    font-weight: 500;
+  }
+
+  .search-section {
+    background: #fff;
+    padding: 12px 16px;
+    border-bottom: 1px solid #f0f0f0;
+  }
+
+  .selected-section {
+    background: #fff;
+    margin-top: 8px;
+    padding: 16px;
+  }
+
+  .selected-header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin-bottom: 12px;
+  }
+
+  .selected-title {
+    font-size: 14px;
+    color: #333;
+    font-weight: 500;
+  }
+
+  .clear-btn {
+    color: #006cfb;
+    font-size: 14px;
+  }
+
+  .selected-item {
+    display: flex;
+    align-items: center;
+    background: #f0f8ff;
+    border: 1px solid #006cfb;
+    border-radius: 12px;
+    padding: 12px;
+    gap: 12px;
+    position: relative;
+
+    &::before {
+      content: "";
+      position: absolute;
+      top: -2px;
+      right: -2px;
+      width: 16px;
+      height: 16px;
+      background: #52c41a;
+      border-radius: 50%;
+      border: 2px solid #fff;
+      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+    }
+
+    &::after {
+      content: "鉁�";
+      position: absolute;
+      top: -1px;
+      right: -1px;
+      width: 16px;
+      height: 16px;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      font-size: 10px;
+      color: #fff;
+      font-weight: bold;
+    }
+  }
+
+  .contact-list {
+    background: #fff;
+    margin-top: 8px;
+  }
+
+  .list-header {
+    padding: 16px;
+    border-bottom: 1px solid #f0f0f0;
+  }
+
+  .list-title {
+    font-size: 14px;
+    color: #666;
+  }
+
+  .contact-item {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 12px 16px;
+    border-bottom: 1px solid #f8f9fa;
+    transition: all 0.2s;
+    position: relative;
+
+    &.selected {
+      background-color: #f0f8ff;
+
+      &::before {
+        content: "";
+        position: absolute;
+        left: 8px;
+        top: 50%;
+        transform: translateY(-50%);
+        width: 4px;
+        height: 4px;
+        background: #006cfb;
+        border-radius: 50%;
+        box-shadow: 0 0 0 4px rgba(0, 108, 251, 0.2);
+      }
+    }
+
+    &:active {
+      background-color: #f5f5f5;
+    }
+  }
+
+  .contact-info {
+    display: flex;
+    align-items: center;
+    flex: 1;
+    padding-left: 16px;
+  }
+
+  .contact-avatar {
+    width: 40px;
+    height: 40px;
+    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+    border-radius: 50%;
     display: flex;
     align-items: center;
     justify-content: center;
-    font-size: 10px;
-    color: #fff;
-    font-weight: bold;
+    margin-right: 12px;
+    position: relative;
   }
-}
 
-.contact-list {
-  background: #fff;
-  margin-top: 8px;
-}
+  .avatar-text {
+    color: #fff;
+    font-size: 16px;
+    font-weight: 500;
+  }
 
-.list-header {
-  padding: 16px;
-  border-bottom: 1px solid #f0f0f0;
-}
+  .contact-details {
+    flex: 1;
+  }
 
-.list-title {
-  font-size: 14px;
-  color: #666;
-}
+  .contact-name {
+    display: block;
+    font-size: 16px;
+    color: #333;
+  }
 
-.contact-item {
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  padding: 12px 16px;
-  border-bottom: 1px solid #f8f9fa;
-  transition: all 0.2s;
-  position: relative;
-  
-  &.selected {
-    background-color: #f0f8ff;
-    
-    &::before {
-      content: '';
-      position: absolute;
-      left: 8px;
-      top: 50%;
-      transform: translateY(-50%);
-      width: 4px;
-      height: 4px;
-      background: #006cfb;
-      border-radius: 50%;
-      box-shadow: 0 0 0 4px rgba(0, 108, 251, 0.2);
+  .contact-dept {
+    font-size: 12px;
+    color: #999;
+  }
+
+  // 鑷畾涔夊崟閫夋寜閽牱寮�
+  /* uview-plus鐨剅adio缁勪欢鏍峰紡涓嶉渶瑕侀澶栫殑deep鏍峰紡绌块�忥紝淇濇寔鍘熸湁鏍峰紡 */
+
+  @keyframes ripple {
+    0% {
+      transform: scale(0.8);
+      opacity: 1;
+    }
+    100% {
+      transform: scale(1.2);
+      opacity: 0;
     }
   }
-  
-  &:active {
-    background-color: #f5f5f5;
-  }
-}
-
-.contact-info {
-  display: flex;
-  align-items: center;
-  flex: 1;
-  padding-left: 16px;
-}
-
-.contact-avatar {
-  width: 40px;
-  height: 40px;
-  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-  border-radius: 50%;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  margin-right: 12px;
-  position: relative;
-}
-
-.avatar-text {
-  color: #fff;
-  font-size: 16px;
-  font-weight: 500;
-}
-
-.contact-details {
-  flex: 1;
-}
-
-.contact-name {
-  display: block;
-  font-size: 16px;
-  color: #333;
-}
-
-.contact-dept {
-  font-size: 12px;
-  color: #999;
-}
-
-// 鑷畾涔夊崟閫夋寜閽牱寮�
-/* uview-plus鐨剅adio缁勪欢鏍峰紡涓嶉渶瑕侀澶栫殑deep鏍峰紡绌块�忥紝淇濇寔鍘熸湁鏍峰紡 */
-
-@keyframes ripple {
-  0% {
-    transform: scale(0.8);
-    opacity: 1;
-  }
-  100% {
-    transform: scale(1.2);
-    opacity: 0;
-  }
-}
 </style>
\ No newline at end of file
diff --git a/src/pages/sales/salesAccount/goOut.vue b/src/pages/sales/salesAccount/goOut.vue
index 9980e5f..35e2a3f 100644
--- a/src/pages/sales/salesAccount/goOut.vue
+++ b/src/pages/sales/salesAccount/goOut.vue
@@ -242,7 +242,7 @@
     // 璺宠浆鍒拌仈绯讳汉閫夋嫨椤甸潰
     uni.setStorageSync("stepIndex", stepIndex);
     uni.navigateTo({
-      url: "/pages/cooperativeOffice/collaborativeApproval/contactSelect",
+      url: "/pages/cooperativeOffice/collaborativeApproval/contactSelect?approveType=7",
     });
   };
 

--
Gitblit v1.9.3