use dotenvy::dotenv;
use open_lark::prelude::*;
use std::env;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
dotenv().ok();
let app_id = env::var("APP_ID").expect("APP_ID 环境变量未设置");
let app_secret = env::var("APP_SECRET").expect("APP_SECRET 环境变量未设置");
let client = LarkClient::builder(&app_id, &app_secret)
.with_app_type(AppType::SelfBuild)
.with_enable_token_cache(true)
.build();
println!("🎧 开始服务台模块演示...");
println!("\n👥 客服功能管理示例");
demo_agent_management(&client).await?;
println!("\n📅 客服工作日程示例");
demo_agent_schedule(&client).await?;
println!("\n🎯 客服技能管理示例");
demo_agent_skill(&client).await?;
println!("\n🎫 工单管理示例");
demo_ticket_management(&client).await?;
println!("\n✅ 服务台模块演示完成!");
Ok(())
}
async fn demo_agent_management(client: &LarkClient) -> Result<(), Box<dyn std::error::Error>> {
use open_lark::service::helpdesk::{models::UserIdType, v1::agent::*};
let agent_id = "agent_example_id";
let update_request = UpdateAgentRequest {
status: Some("online".to_string()),
agent_name: Some("示例客服".to_string()),
};
match client
.helpdesk
.v1
.agent
.patch(agent_id, update_request, Some(UserIdType::OpenId), None)
.await
{
Ok(response) => {
if let Some(data) = response.data {
println!(" ✅ 客服信息更新成功");
if let Some(name) = data.agent.agent_name {
println!(" 📱 客服名称: {name}");
}
if let Some(status) = data.agent.status {
println!(" 📊 客服状态: {status:?}");
}
}
}
Err(e) => {
println!(" ❌ 客服信息更新失败: {e:?}");
}
}
match client
.helpdesk
.v1
.agent
.agent_email(agent_id, Some(UserIdType::OpenId), None)
.await
{
Ok(response) => {
if let Some(data) = response.data {
println!(" ✅ 客服邮箱获取成功: {}", data.agent_email);
}
}
Err(e) => {
println!(" ❌ 客服邮箱获取失败: {e:?}");
}
}
Ok(())
}
async fn demo_agent_schedule(client: &LarkClient) -> Result<(), Box<dyn std::error::Error>> {
use open_lark::service::helpdesk::{models::UserIdType, v1::agent_schedule::*};
let agent_id = "agent_example_id";
let create_request = CreateAgentScheduleRequest {
start_time: "2024-01-01 09:00:00".to_string(),
end_time: "2024-01-01 18:00:00".to_string(),
repeat_type: Some("daily".to_string()),
};
match client
.helpdesk
.v1
.agent_schedule
.create(agent_id, create_request, Some(UserIdType::OpenId), None)
.await
{
Ok(response) => {
if let Some(data) = response.data {
println!(" ✅ 工作日程创建成功");
if let Some(schedule_id) = data.schedule.schedule_id {
println!(" 🆔 日程ID: {schedule_id}");
}
if let Some(start_time) = data.schedule.start_time {
println!(" ⏰ 开始时间: {start_time}");
}
if let Some(end_time) = data.schedule.end_time {
println!(" ⏰ 结束时间: {end_time}");
}
}
}
Err(e) => {
println!(" ❌ 工作日程创建失败: {e:?}");
}
}
match client
.helpdesk
.v1
.agent_schedule
.list(agent_id, Some(UserIdType::OpenId), None, Some(10), None)
.await
{
Ok(response) => {
if let Some(data) = response.data {
println!(
" ✅ 工作日程查询成功,找到 {} 个日程",
data.schedules.len()
);
for schedule in data.schedules.iter() {
if let Some(schedule_id) = &schedule.schedule_id {
println!(" 📅 日程ID: {schedule_id}");
}
}
}
}
Err(e) => {
println!(" ❌ 工作日程查询失败: {e:?}");
}
}
Ok(())
}
async fn demo_agent_skill(client: &LarkClient) -> Result<(), Box<dyn std::error::Error>> {
use open_lark::service::helpdesk::{models::UserIdType, v1::agent_skill::*};
let create_request = CreateAgentSkillRequest {
skill_name: "技术支持".to_string(),
description: Some("负责技术相关问题的解答".to_string()),
};
match client
.helpdesk
.v1
.agent_skill
.create(create_request, Some(UserIdType::OpenId), None)
.await
{
Ok(response) => {
if let Some(data) = response.data {
println!(" ✅ 客服技能创建成功");
if let Some(skill_name) = data.skill.skill_name {
println!(" 🎯 技能名称: {skill_name}");
}
if let Some(description) = data.skill.description {
println!(" 📝 技能描述: {description}");
}
}
}
Err(e) => {
println!(" ❌ 客服技能创建失败: {e:?}");
}
}
match client
.helpdesk
.v1
.agent_skill
.list(Some(UserIdType::OpenId), None, Some(10), None)
.await
{
Ok(response) => {
if let Some(data) = response.data {
println!(" ✅ 客服技能查询成功,找到 {} 个技能", data.skills.len());
for skill in data.skills.iter() {
if let Some(skill_name) = &skill.skill_name {
println!(" 🎯 技能: {skill_name}");
}
}
}
}
Err(e) => {
println!(" ❌ 客服技能查询失败: {e:?}");
}
}
Ok(())
}
async fn demo_ticket_management(client: &LarkClient) -> Result<(), Box<dyn std::error::Error>> {
use open_lark::service::helpdesk::{models::UserIdType, v1::ticket::*};
let start_service_request = StartServiceRequest {
open_id: "ou_example_user_open_id".to_string(),
helpdesk_id: "helpdesk_example_id".to_string(),
description: Some("用户遇到登录问题,需要技术支持".to_string()),
};
match client
.helpdesk
.v1
.ticket
.start_service(start_service_request, Some(UserIdType::OpenId), None)
.await
{
Ok(response) => {
if let Some(data) = response.data {
println!(" ✅ 服务台对话创建成功");
println!(" 💬 聊天群ID: {}", data.chat_id);
if let Some(ticket) = data.ticket {
if let Some(ticket_id) = ticket.ticket_id {
println!(" 🎫 工单ID: {ticket_id}");
}
if let Some(title) = ticket.title {
println!(" 📋 工单标题: {title}");
}
}
}
}
Err(e) => {
println!(" ❌ 服务台对话创建失败: {e:?}");
}
}
match client
.helpdesk
.v1
.ticket
.list(Some(UserIdType::OpenId), None, Some(10), None)
.await
{
Ok(response) => {
if let Some(data) = response.data {
println!(" ✅ 工单查询成功,找到 {} 个工单", data.tickets.len());
for ticket in data.tickets.iter() {
if let Some(ticket_id) = &ticket.ticket_id {
println!(" 🎫 工单ID: {ticket_id}");
}
if let Some(status) = &ticket.status {
println!(" 📊 状态: {status:?}");
}
if let Some(priority) = &ticket.priority {
println!(" 🚨 优先级: {priority:?}");
}
}
}
}
Err(e) => {
println!(" ❌ 工单查询失败: {e:?}");
}
}
Ok(())
}