ykt-team-wxapp/pages/home/consult.vue

215 lines
4.7 KiB
Vue
Raw Normal View History

2026-01-28 13:38:05 +08:00
<template>
<view class="consult-container">
<view class="consult-title">咨询互动</view>
<view class="consult-grid">
<view
class="consult-item"
v-for="item in consultItems"
:key="item.id"
@click="handleItemClick(item)"
>
2026-02-03 09:59:49 +08:00
<view class="item-icon" :style="{ background: item.bgColor }">
2026-01-28 13:38:05 +08:00
<image :src="item.icon" class="icon-img" mode="aspectFit" />
</view>
<view class="item-label">{{ item.label }}</view>
</view>
</view>
<!-- 选择咨询人弹窗 -->
<select-consultant-popup
ref="consultantPopup"
:customers="customers"
:corpId="corpId"
:teamId="teamId"
@confirm="handleConsultantConfirm"
@addNew="handleAddNewArchive"
/>
</view>
</template>
<script setup>
import { ref, computed } from "vue";
import { storeToRefs } from "pinia";
import useAccount from "@/store/account";
import api from "@/utils/api";
import { toast } from "@/utils/widget";
import SelectConsultantPopup from "./select-consultant-popup.vue";
const props = defineProps({
corpId: {
type: String,
default: "",
},
teamId: {
type: String,
default: "",
},
customers: {
type: Array,
default: () => [],
},
});
const { account } = storeToRefs(useAccount());
const consultantPopup = ref(null);
const consultItems = ref([
{
id: "chat",
label: "聊天咨询",
2026-02-03 09:59:49 +08:00
icon: "/static/home/聊天咨询.png",
bgColor: "linear-gradient(135deg, #5DADE2 0%, #3498DB 100%)",
2026-01-28 13:38:05 +08:00
needSelectConsultant: true,
},
{
id: "education",
label: "我的宣教",
2026-02-03 09:59:49 +08:00
icon: "/static/home/我的宣教.png",
bgColor: "linear-gradient(135deg, #F4D03F 0%, #F39C12 100%)",
2026-01-28 13:38:05 +08:00
path: "/pages/article/article-list",
},
{
id: "survey",
label: "我的问卷",
2026-02-03 09:59:49 +08:00
icon: "/static/home/我的问卷.png",
bgColor: "linear-gradient(135deg, #58D68D 0%, #27AE60 100%)",
path: "/pages/survey/survey-list",
2026-01-28 13:38:05 +08:00
},
{
id: "rating",
label: "服务评价",
2026-02-03 09:59:49 +08:00
icon: "/static/home/服务评价.png",
bgColor: "linear-gradient(135deg, #AF7AC5 0%, #8E44AD 100%)",
2026-01-28 13:38:05 +08:00
path: "",
},
]);
function handleItemClick(item) {
// 聊天咨询需要选择咨询人
if (item.needSelectConsultant) {
if (!props.customers || props.customers.length === 0) {
toast("请先添加档案");
// 跳转到档案管理页面
uni.navigateTo({
url: `/pages/archive/archive-manage?corpId=${props.corpId}&teamId=${props.teamId}`,
});
return;
}
// 打开选择咨询人弹窗
consultantPopup.value?.open();
return;
}
// 其他功能直接跳转
if (!item.path) {
toast("功能开发中");
return;
}
uni.navigateTo({
url: item.path,
fail: () => {
toast("页面跳转失败");
},
});
}
// 确认选择咨询人
async function handleConsultantConfirm(customer) {
console.log("选择的咨询人:", customer);
// 调用创建咨询群组接口
uni.showLoading({ title: "创建咨询中..." });
try {
const res = await api("createConsultGroup", {
teamId: props.teamId,
corpId: props.corpId,
customerId: customer._id,
2026-01-28 13:38:05 +08:00
customerImUserId: account.value.openid,
});
uni.hideLoading();
if (res && res.success) {
const { groupId, isExisting } = res.data;
// 跳转到聊天页面
uni.navigateTo({
url: `/pages/message/index?conversationID=GROUP${groupId}&groupID=${groupId}`,
});
} else {
toast(res?.message || "创建咨询失败");
}
} catch (error) {
uni.hideLoading();
console.error("创建咨询群组失败:", error);
toast("创建咨询失败");
}
}
// 新建档案
function handleAddNewArchive() {
uni.navigateTo({
url: `/pages/archive/edit-archive?corpId=${props.corpId}&teamId=${props.teamId}`,
});
}
</script>
<style lang="scss" scoped>
.consult-container {
2026-02-03 09:59:49 +08:00
padding: 24rpx 30rpx;
margin: 0 30rpx;
margin-top: 24rpx;
2026-01-28 13:38:05 +08:00
}
.consult-title {
2026-02-03 09:59:49 +08:00
font-size: 36rpx;
2026-01-28 13:38:05 +08:00
font-weight: 600;
color: #333;
2026-02-03 09:59:49 +08:00
margin-bottom: 24rpx;
2026-01-28 13:38:05 +08:00
}
.consult-grid {
2026-02-03 09:59:49 +08:00
background: #fff;
border-radius: 32rpx;
padding: 32rpx;
2026-01-28 13:38:05 +08:00
display: grid;
grid-template-columns: repeat(4, 1fr);
2026-02-03 09:59:49 +08:00
gap: 32rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08);
2026-01-28 13:38:05 +08:00
}
.consult-item {
display: flex;
flex-direction: column;
align-items: center;
gap: 16rpx;
cursor: pointer;
}
.item-icon {
2026-02-03 09:59:49 +08:00
width: 112rpx;
height: 112rpx;
border-radius: 50%;
2026-01-28 13:38:05 +08:00
display: flex;
align-items: center;
justify-content: center;
transition: transform 0.2s;
2026-02-03 09:59:49 +08:00
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
2026-01-28 13:38:05 +08:00
}
.consult-item:active .item-icon {
transform: scale(0.95);
}
.icon-img {
2026-02-03 09:59:49 +08:00
width: 64rpx;
height: 64rpx;
2026-01-28 13:38:05 +08:00
}
.item-label {
font-size: 28rpx;
color: #333;
text-align: center;
2026-02-03 09:59:49 +08:00
font-weight: 500;
2026-01-28 13:38:05 +08:00
}
</style>