From ebd0ec4f51288042b6fc5bf714b1febbb63cfacc Mon Sep 17 00:00:00 2001
From: chenyao <1219716595@qq.com>
Date: Fri, 09 Jan 2026 18:03:49 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 uniapps/work-app/src/pages/voiceCall/index.vue |  235 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 228 insertions(+), 7 deletions(-)

diff --git a/uniapps/work-app/src/pages/voiceCall/index.vue b/uniapps/work-app/src/pages/voiceCall/index.vue
index a8deaa9..f689e10 100644
--- a/uniapps/work-app/src/pages/voiceCall/index.vue
+++ b/uniapps/work-app/src/pages/voiceCall/index.vue
@@ -1,14 +1,235 @@
 <template>
-	<view class="eventTickets">
-		语音通话
-	</view>
+  <div class="voiceCallContainer" :style="{ paddingTop: topMargin + 'px' }">
+    <!-- 顶部搜索栏 -->
+    <div class="searchBar">
+      <up-search placeholder="请输入关键字搜索" v-model="defaultParam.searchKeyword"  :animation="true"   :show-action="false"></up-search>
+    </div>
+
+    <!-- 联系人列表 -->
+    <div class="contactList" @scrolltolower="onScrollToLower">
+      <div
+        class="contactItem"
+        v-for="(contact, index) in contacts"
+        :key="index"
+      >
+        <div class="itemBox">
+          <!-- 头像 -->
+          <div class="contactAvatar">
+            <image :src="contact.avatar || defaultAvatar"  />
+          </div>
+
+          <!-- 联系人信息 -->
+          <div class="contactInfo">
+            <div class="contactName">{{ contact.friendNickName  || '未知联系人' }}</div>
+            <div class="contactDept">{{ contact.deptName || '未知部门' }}</div>
+          </div>
+
+          <!-- 电话按钮 -->
+          <div class="callButton" @click="makeCall(contact)">
+            <image src="@/static/images/voiceVal/phoneVal.svg"  />
+          </div>
+        </div>
+
+      </div>
+
+      <!-- 加载提示 -->
+      <div class="loadingMore">
+        <text v-if="loading">加载中...</text>
+        <text v-else-if="!hasMore && contacts.length > 0">没有更多数据了</text>
+      </div>
+    </div>
+  </div>
 </template>
 
-<script setup></script>
+<script setup>
+import { getStatusBarHeight } from '@/utils/common';
+const topMargin = getStatusBarHeight()
+import { getPhoneBookListApi } from '@/api/voiceCall/index.js'
+import { onShow } from '@dcloudio/uni-app'
+import defaultAvatar  from '/static/images/defaultAvatar.svg'
+// 联系人数据
+const contacts = ref([])
+const defaultParam =ref( {
+  current: 1,
+  size: 10,
+  searchKeyword:''
+})
+
+// 加载状态
+const loading = ref(false)
+const hasMore = ref(true)
+
+// 获取通讯录
+const getPhoneBookList = () => {
+  if (loading.value || !hasMore.value) return
+
+  loading.value = true
+  // 添加分页参数
+  const params = {
+    current: defaultParam.value.current,
+    size: defaultParam.value.size,
+    searchKeyword: defaultParam.value.searchKeyword
+  }
+
+  getPhoneBookListApi(params).then(res => {
+    const response = res.data.data
+    console.log('通讯录',  response)
+
+    if (defaultParam.value.current === 1) {
+      contacts.value = response.records
+    } else {
+      contacts.value = [...contacts.value, ...response.records]
+    }
+
+    // 判断是否还有更多数据
+    if (response.records.length < defaultParam.value.size || response.current >= response.pages) {
+      hasMore.value = false
+    } else {
+      hasMore.value = true
+    }
+
+  }).catch(err => {
+    console.error('获取通讯录失败:', err)
+    const errorMsg = err.msg || err.message || '获取通讯录失败'
+    uni.showToast({
+      title: errorMsg,
+      icon: 'none',
+      duration: 3000
+    })
+  }).finally(() => {
+    loading.value = false
+  })
+}
+
+// 加载更多
+const loadMore = () => {
+  if (loading.value || !hasMore.value) return
+
+  defaultParam.value.current++
+  getPhoneBookList()
+}
+
+// 拨打电话方法
+const makeCall = (contact) => {
+  const contactName = contact.friendNickName || '未知联系人'
+  console.log('拨打电话给', contactName)
+  // 这里可以添加实际的拨打电话逻辑
+  uni.showToast({
+    title: `正在拨打${contactName}的电话`,
+    icon: 'none'
+  })
+}
+
+onShow(() => {
+  // 重置分页参数
+  defaultParam.value.current = 1
+  hasMore.value = true
+  getPhoneBookList()
+});
+
+// 监听滚动到底部
+const onScrollToLower = () => {
+  loadMore()
+}
+</script>
 
 <style scoped lang="scss">
-.eventTickets {
-	width: 100%;
-	height: 100%;
+.voiceCallContainer {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  box-sizing: border-box;
 }
+
+.searchBar {
+  padding: 20rpx;
+  display: flex;
+  align-items: center;
+  height: 108rpx;
+}
+
+.contactList {
+  margin: 0 24rpx;
+  background: #fff;
+  border-radius: 12rpx;
+  overflow-y: auto;
+  height: 0;
+  flex-grow: 1;
+  align-content: flex-start;
+}
+
+.contactItem {
+  display: flex;
+  align-items: center;
+  padding: 0 24rpx;
+
+}
+
+.itemBox {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  width: 100%;
+  height: 98rpx;
+  border-bottom: 1rpx solid #EBEBEB;
+}
+
+.contactAvatar {
+  width: 80rpx;
+  height: 80rpx;
+  margin-right: 26rpx;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.contactAvatar image {
+  width: 60rpx;
+  height: 60rpx;
+}
+
+.contactInfo {
+  flex: 1;
+  display: flex;
+  justify-content: space-around;
+  align-items: center;
+}
+
+.contactName {
+  font-family: Source Han Sans CN, Source Han Sans CN;
+  font-weight: 500;
+  font-size: 30rpx;
+  color: #222324;
+  margin-bottom: 8rpx;
+}
+
+.contactDept {
+  font-family: Source Han Sans CN, Source Han Sans CN;
+  font-weight: 400;
+  font-size: 30rpx;
+  color: #222324;
+}
+
+.callButton {
+  width: 80rpx;
+  height: 80rpx;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.callButton image {
+  width: 60rpx;
+  height: 60rpx;
+
+}
+  .loadingMore {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    height: 80rpx;
+    font-size: 28rpx;
+    color: #999;
+  }
 </style>

--
Gitblit v1.9.3