调用dify联调客户画像

This commit is contained in:
spllzh
2025-09-20 09:45:18 +08:00
parent d321af7e7c
commit e83d803e70
42 changed files with 1029 additions and 549 deletions

View File

@@ -1,16 +1,287 @@
package com.rj;
import com.alibaba.fastjson.JSONObject;
import dev.langchain4j.model.openai.OpenAiChatModel;
import java.util.concurrent.Semaphore;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Author: 李中华 wx: spllzh email(qq): 28668817@qq.com
* Date: 2025/8/4 9:55
**/
public class AppTest {
private static Semaphore semaphore = new Semaphore(3); // 限制并发数为3
private static AtomicInteger completedTasks = new AtomicInteger(0);
public static void main(String[] args) {
System.out.println("Hello World!");
System.out.println("==========================================");
System.out.println("Semaphore测试程序");
System.out.println("==========================================");
System.out.println("请选择要运行的测试:");
System.out.println("1. 基础并发控制测试 (threadPoolTest)");
System.out.println("2. 资源池场景测试 (testResourcePool)");
System.out.println("3. 公平性测试 (testSemaphoreFairness)");
System.out.println("4. 运行所有测试");
System.out.println("5. 其他测试 (indexof3, parseJson等)");
System.out.println("==========================================");
// 默认运行基础测试
System.out.println("运行基础并发控制测试...\n");
threadPoolTest111();
// 可以取消注释下面的代码来运行其他测试
// System.out.println("\n运行资源池场景测试...\n");
// testResourcePool();
// System.out.println("\n运行公平性测试...\n");
// testSemaphoreFairness();
// 其他测试
// indexof3();
// parseJson();
// parseJsonForMQ();
}
/**
* Semaphore测试方法 - 测试并发控制功能
* 使用线程池模拟多个任务并发执行通过Semaphore限制同时执行的任务数量
*/
public static void threadPoolTest111() {
System.out.println("==========================================");
System.out.println("Semaphore并发控制测试开始");
System.out.println("==========================================");
System.out.println("Semaphore许可数: " + semaphore.availablePermits());
System.out.println("总任务数: 10");
System.out.println("最大并发数: 3");
System.out.println("==========================================");
// 创建线程池
ExecutorService executor = Executors.newFixedThreadPool(10);
long startTime = System.currentTimeMillis();
// 提交10个任务
for (int i = 1; i <= 10; i++) {
final int taskId = i;
executor.submit(() -> {
try {
// 获取许可
System.out.println(String.format("[任务%d] 尝试获取许可,当前可用许可数: %d",
taskId, semaphore.availablePermits()));
semaphore.acquire(); // 获取许可
System.out.println(String.format("[任务%d] ✅ 成功获取许可,开始执行任务", taskId));
System.out.println(String.format("[任务%d] 当前可用许可数: %d",
taskId, semaphore.availablePermits()));
// 模拟任务执行2秒
Thread.sleep(8000);
System.out.println(String.format("[任务%d] 🎯 任务执行完成", taskId));
} catch (InterruptedException e) {
System.out.println(String.format("[任务%d] ❌ 任务被中断: %s", taskId, e.getMessage()));
Thread.currentThread().interrupt();
} finally {
// 释放许可
semaphore.release();
completedTasks.incrementAndGet();
System.out.println(String.format("[任务%d] 🔓 释放许可,当前可用许可数: %d",
taskId, semaphore.availablePermits()));
}
});
}
// 等待所有任务完成
executor.shutdown();
try {
if (!executor.awaitTermination(30, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException e) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}
long endTime = System.currentTimeMillis();
// 输出测试结果
System.out.println("==========================================");
System.out.println("Semaphore测试结果统计");
System.out.println("==========================================");
System.out.println("总任务数: 10");
System.out.println("完成任务数: " + completedTasks.get());
System.out.println("总耗时: " + (endTime - startTime) + "ms");
System.out.println("最终可用许可数: " + semaphore.availablePermits());
System.out.println("==========================================");
// 测试Semaphore的其他功能
testSemaphoreFeatures();
}
/**
* 测试Semaphore的其他功能
*/
private static void testSemaphoreFeatures() {
System.out.println("\n==========================================");
System.out.println("Semaphore功能特性测试");
System.out.println("==========================================");
// 测试tryAcquire - 非阻塞获取许可
System.out.println("1. 测试tryAcquire()方法:");
boolean acquired = semaphore.tryAcquire();
System.out.println("tryAcquire()结果: " + acquired);
if (acquired) {
System.out.println("成功获取许可,可用许可数: " + semaphore.availablePermits());
semaphore.release();
System.out.println("释放许可后,可用许可数: " + semaphore.availablePermits());
}
// 测试tryAcquire(timeout) - 带超时的获取许可
System.out.println("\n2. 测试tryAcquire(timeout)方法:");
try {
boolean acquiredWithTimeout = semaphore.tryAcquire(1, TimeUnit.SECONDS);
System.out.println("tryAcquire(1秒)结果: " + acquiredWithTimeout);
if (acquiredWithTimeout) {
semaphore.release();
}
} catch (InterruptedException e) {
System.out.println("tryAcquire(timeout)被中断: " + e.getMessage());
}
// 测试acquire(permits) - 获取多个许可
System.out.println("\n3. 测试acquire(permits)方法:");
try {
System.out.println("尝试获取2个许可...");
semaphore.acquire(2);
System.out.println("成功获取2个许可可用许可数: " + semaphore.availablePermits());
semaphore.release(2);
System.out.println("释放2个许可后可用许可数: " + semaphore.availablePermits());
} catch (InterruptedException e) {
System.out.println("acquire(permits)被中断: " + e.getMessage());
}
// 测试availablePermits() - 获取可用许可数
System.out.println("\n4. 当前Semaphore状态:");
System.out.println("可用许可数: " + semaphore.availablePermits());
System.out.println("是否有等待的线程: " + semaphore.hasQueuedThreads());
System.out.println("等待队列长度: " + semaphore.getQueueLength());
System.out.println("==========================================");
System.out.println("Semaphore功能测试完成");
System.out.println("==========================================");
}
/**
* 测试Semaphore在资源池场景下的应用
* 模拟数据库连接池的使用
*/
public static void testResourcePool() {
System.out.println("\n==========================================");
System.out.println("Semaphore资源池场景测试");
System.out.println("==========================================");
// 模拟数据库连接池最多3个连接
Semaphore connectionPool = new Semaphore(3);
ExecutorService executor = Executors.newFixedThreadPool(5);
// 模拟5个客户端同时请求数据库连接
for (int i = 1; i <= 5; i++) {
final int clientId = i;
executor.submit(() -> {
try {
System.out.println(String.format("[客户端%d] 请求数据库连接...", clientId));
// 尝试获取连接
if (connectionPool.tryAcquire(2, TimeUnit.SECONDS)) {
System.out.println(String.format("[客户端%d] ✅ 获得数据库连接,剩余连接数: %d",
clientId, connectionPool.availablePermits()));
// 模拟数据库操作
Thread.sleep(3000);
System.out.println(String.format("[客户端%d] 🎯 数据库操作完成", clientId));
// 释放连接
connectionPool.release();
System.out.println(String.format("[客户端%d] 🔓 释放数据库连接,剩余连接数: %d",
clientId, connectionPool.availablePermits()));
} else {
System.out.println(String.format("[客户端%d] ❌ 获取数据库连接超时", clientId));
}
} catch (InterruptedException e) {
System.out.println(String.format("[客户端%d] ❌ 操作被中断: %s", clientId, e.getMessage()));
Thread.currentThread().interrupt();
}
});
}
executor.shutdown();
try {
if (!executor.awaitTermination(10, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException e) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}
System.out.println("==========================================");
System.out.println("资源池场景测试完成");
System.out.println("==========================================");
}
/**
* 测试Semaphore的公平性
*/
public static void testSemaphoreFairness() {
System.out.println("\n==========================================");
System.out.println("Semaphore公平性测试");
System.out.println("==========================================");
// 创建公平的Semaphore
Semaphore fairSemaphore = new Semaphore(1, true); // 公平模式
ExecutorService executor = Executors.newFixedThreadPool(3);
// 创建3个线程每个线程尝试获取许可
for (int i = 1; i <= 3; i++) {
final int threadId = i;
executor.submit(() -> {
try {
System.out.println(String.format("[线程%d] 尝试获取许可...", threadId));
fairSemaphore.acquire();
System.out.println(String.format("[线程%d] ✅ 获得许可", threadId));
// 模拟工作
Thread.sleep(1000);
System.out.println(String.format("[线程%d] 🎯 工作完成,释放许可", threadId));
fairSemaphore.release();
} catch (InterruptedException e) {
System.out.println(String.format("[线程%d] ❌ 被中断: %s", threadId, e.getMessage()));
Thread.currentThread().interrupt();
}
});
}
executor.shutdown();
try {
if (!executor.awaitTermination(5, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException e) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}
System.out.println("==========================================");
System.out.println("公平性测试完成");
System.out.println("==========================================");
}
public AppTest( String testName )
@@ -28,4 +299,68 @@ public class AppTest {
System.out.println(chat);
}
public static void indexof3( )
{
System.out.println( "Hello World!" );
String ss = "SMART_ASSISTANT_NAMEPLATE-1967863854687916032";
if (ss.indexOf("SMART_ASSISTANT_NAMEPLATE")>=0){
System.out.println("ddd: ");
}
System.out.println("ttt: "+ss.indexOf("SMART_ASSISTANT_NAMEPLATE1"));
}
public static void parseJsonForMQ(){
String jsonNamplate="{\"outputs\":{\"customerFlowId\":\"1919618280323473410\",\"data\":{\"analysisDetail\":{\"purchaseIntention\":{\"familyIncomeLevel\":\"未提及\",\"targetModel\":\"XC907座\",\"carBudget\":\"全款落地价44-47万\",\"financialInstallment\":\"未提及\",\"purchaseCycle\":\"5月前完成购车\",\"preferredConfiguration\":\"B5或B6智逸配置\",\"preferredPowerType\":\"未提及\",\"preferredColor\":\"未提及\",\"purchaseType\":\"未提及\"},\"purchaseConsideration\":{\"comparedVehicles\":\"未提及\",\"concerns\":\"报价与心理预期不符\",\"focusPoints\":\"价格、配置、优惠政策\"},\"consultantProposal\":{\"financialPlan\":\"未提及\",\"consultantQuote\":\"B5车型全款落地近50万B6暂无车\",\"preferentialPolicies\":\"可申请优惠至47万\"},\"followUpSuggestions\":\"明确客户心理预算,提供详细报价和优惠政策,邀约到店体验试驾以促成成交。\",\"testDriveExperience\":\"未提及\",\"existingVehicle\":{\"licensePlateStatus\":\"未提及\",\"existingCarBrand\":\"未提及\",\"existingCarUsageYears\":\"未提及\"},\"basicInfo\":{\"carUser\":\"未提及\",\"occupation\":\"未提及\",\"educationLevel\":\"未提及\",\"hobbies\":\"未提及\",\"carPurchasePurpose\":\"未提及\",\"familyDailyTravelNumber\":\"未提及\",\"buyerType\":\"个人\",\"customerSource\":\"未提及\",\"purchaseQualification\":\"未提及\",\"homeAddress\":\"瑞丽\"}},\"analysisResult\":\"客户对XC90车型感兴趣预算全款44-47万左右希望了解具体报价并对比其他店价格。顾问建议客户到店详谈优惠政策和配置细节。\"},\"analysisScene\":\"3\",\"analysisRecordId\":\"SMART_ASSISTANT_NAMEPLATE-1968176478541664256\",\"version\":2},\"workflow_id\":\"745dc920-8ba0-4e95-8efb-1c8b68f21344\",\"id\":\"d08b3fc9-4986-477d-91d7-b43468ac757a\",\"status\":\"succeeded\"}";
String jsonstr ="{\"outputs\":{\"customerFlowId\":\"1919618280323473410\",\"data\":{\"analysisDetail\":{\"purchaseIntention\":{\"familyIncomeLevel\":\"未提及\",\"targetModel\":\"XC907座\",\"carBudget\":\"全款落地价44-47万\",\"financialInstallment\":\"未提及\",\"purchaseCycle\":\"5月前完成购车\",\"preferredConfiguration\":\"B5或B6智逸配置\",\"preferredPowerType\":\"未提及\",\"preferredColor\":\"未提及\",\"purchaseType\":\"未提及\"},\"purchaseConsideration\":{\"comparedVehicles\":\"未提及\",\"concerns\":\"报价与心理预期不符\",\"focusPoints\":\"价格、配置、优惠政策\"},\"consultantProposal\":{\"financialPlan\":\"未提及\",\"consultantQuote\":\"B5车型全款落地近50万B6暂无车\",\"preferentialPolicies\":\"可申请优惠至47万\"},\"followUpSuggestions\":\"明确客户心理预算,提供详细报价和优惠政策,邀约到店体验试驾以促成成交。\",\"testDriveExperience\":\"未提及\",\"existingVehicle\":{\"licensePlateStatus\":\"未提及\",\"existingCarBrand\":\"未提及\",\"existingCarUsageYears\":\"未提及\"},\"basicInfo\":{\"carUser\":\"未提及\",\"occupation\":\"未提及\",\"educationLevel\":\"未提及\",\"hobbies\":\"未提及\",\"carPurchasePurpose\":\"未提及\",\"familyDailyTravelNumber\":\"未提及\",\"buyerType\":\"个人\",\"customerSource\":\"未提及\",\"purchaseQualification\":\"未提及\",\"homeAddress\":\"瑞丽\"}},\"analysisResult\":\"客户对XC90车型感兴趣预算全款44-47万左右希望了解具体报价并对比其他店价格。顾问建议客户到店详谈优惠政策和配置细节。\"},\"analysisScene\":\"3\",\"analysisRecordId\":\"SMART_ASSISTANT_NAMEPLATE-1968176478541664256\",\"version\":2},\"workflow_id\":\"745dc920-8ba0-4e95-8efb-1c8b68f21344\",\"id\":\"d08b3fc9-4986-477d-91d7-b43468ac757a\",\"status\":\"succeeded\"}";
JSONObject analysisResp = JSONObject.parseObject(jsonstr);
String text = analysisResp.getString("outputs");
JSONObject outputss = JSONObject.parseObject(text);
String businessType = outputss.getString("businessType");
System.out.println("businessType is : "+businessType);
String businessId = outputss.getString("businessId");
System.out.println("businessId is : "+businessId);
String aiAnalysisRequestId = outputss.getString("aiAnalysisRequestid") ;
System.out.println("aiAnalysisRequestId is : "+aiAnalysisRequestId);
if (aiAnalysisRequestId.indexOf("CORPUS_PORTRAIT_NAMEPLATE")>=0){
businessType="CORPUS_PORTRAIT_NAMEPLATE";
}
System.out.println("businessType is : "+businessType);
}
public static void parseJson(){
String jsonPortraint1 = "{\"id\":\"fc32c67a-920f-43e0-9ec8-1c26b31785ee\",\"workflow_id\":\"e0ea47de-9861-45a8-adc6-f46655587419\",\"status\":\"succeeded\",\"outputs\":{\"result\":{\"info\":\"{\\n \\\"address\\\": \\\"未提及\\\",\\n \\\"buyCarUse\\\": \\\"未提及\\\",\\n \\\"actualDriver\\\": \\\"未提及\\\",\\n \\\"familyStructure\\\": \\\"未提及\\\",\\n \\\"familyNum\\\": 0,\\n \\\"familyIncomeMonth\\\": \\\"未提及\\\",\\n \\\"industry\\\": \\\"未提及\\\",\\n \\\"occupation\\\": \\\"未提及\\\",\\n \\\"enterpriseType\\\": \\\"未提及\\\",\\n \\\"avocation\\\": \\\"未提及\\\",\\n \\\"educationalLevel\\\": \\\"未提及\\\",\\n \\\"bookCarDate\\\": \\\"未提及\\\",\\n \\\"buyType\\\": \\\"首购\\\",\\n \\\"carBudget\\\": \\\"未提及\\\",\\n \\\"paymentMethod\\\": \\\"未提及\\\",\\n \\\"keepVehicleBrand\\\": [\\\"未提及\\\"],\\n \\\"failBrand\\\": [\\\"未提及\\\"],\\n \\\"carQuality\\\": \\\"未提及\\\",\\n \\\"remark\\\": \\\"对话中未提及任何有效信息,无法得出相关结论。\\\"\\n}\",\"entities\":\"{\\n \\\"brand\\\": \\\"中性\\\",\\n \\\"design\\\": \\\"中性\\\",\\n \\\"color\\\": \\\"中性\\\",\\n \\\"size\\\": \\\"中性\\\",\\n \\\"space\\\": \\\"中性\\\",\\n \\\"interior\\\": \\\"中性\\\",\\n \\\"audio\\\": \\\"中性\\\",\\n \\\"ivinfo\\\": \\\"中性\\\",\\n \\\"fsd\\\": \\\"中性\\\",\\n \\\"mileage\\\": \\\"中性\\\",\\n \\\"safety\\\": \\\"中性\\\",\\n \\\"eco\\\": \\\"中性\\\",\\n \\\"liscense\\\": \\\"中性\\\",\\n \\\"price\\\": \\\"中性\\\",\\n \\\"benefit\\\": \\\"中性\\\",\\n \\\"cost\\\": \\\"中性\\\",\\n \\\"value\\\": \\\"中性\\\",\\n \\\"power\\\": \\\"中性\\\",\\n \\\"control\\\": \\\"中性\\\",\\n \\\"tradein\\\": \\\"中性\\\",\\n \\\"finance\\\": \\\"中性\\\",\\n \\\"warranty\\\": \\\"中性\\\",\\n \\\"delivery\\\": \\\"中性\\\"\\n}\"},\"communicateDate\":\"Tue May 06 12:55:00 CST 2025\",\"analysisScene\":\"3\",\"analysisRecordId\":\"CORPUS_PORTRAIT_NAMEPLATE-1967954224931184640\",\"businessId\":\"1919618280323473410\",\"businessType\":\"CORPUS_PORTRAIT_NAMEPLATE\"},\"elapsed_time\":9.988657537847757,\"total_tokens\":4720,\"total_steps\":6,\"created_at\":1758031825,\"finished_at\":1758031835,\"aiAnalysisRequestId\":\"CORPUS_PORTRAIT_NAMEPLATE-1967954224931184640\"}" ;
String jsonNameplate1 ="{\"difyResponse\": {\"status\": \"succeeded\", \"id\": \"cb8de7e4-b96b-4588-bc6a-b9d3f296a814\", \"workflow_id\": \"745dc920-8ba0-4e95-8efb-1c8b68f21344\", \"outputs\": {\"analysisScene\": \"3\", \"customerFlowId\": \"1919618280323473410\", \"analysisRecordId\": \"SMART_ASSISTANT_NAMEPLATE-1967944330802950144\", \"version\": 2, \"data\": {\"analysisResult\": \"\\u5ba2\\u6237\\u5728\\u745e\\u4e3d\\uff0c\\u5bf9XC90 B6\\u667a\\u90387\\u5ea7\\u611f\\u5174\\u8da3\\uff0c\\u9884\\u7b9744\\u4e07\\u5de6\\u53f3\\u5168\\u6b3e\\u843d\\u5730\\uff0c\\u987e\\u95ee\\u62a5\\u4ef747\\u4e07\\uff0c\\u5ba2\\u6237\\u6682\\u672a\\u63a5\\u53d7\\u5e76\\u8ba1\\u5212\\u5bf9\\u6bd4\\u5176\\u4ed6\\u5e97\\u4ef7\\u683c\\u3002\", \"analysisDetail\": {\"basicInfo\": {\"customerSource\": \"\\u672a\\u63d0\\u53ca\", \"occupation\": \"\\u672a\\u63d0\\u53ca\", \"educationLevel\": \"\\u672a\\u63d0\\u53ca\", \"hobbies\": \"\\u672a\\u63d0\\u53ca\", \"homeAddress\": \"\\u5ba2\\u6237\\u5728\\u745e\\u4e3d\", \"carPurchasePurpose\": \"\\u672a\\u63d0\\u53ca\", \"buyerType\": \"\\u4e2a\\u4eba\", \"carUser\": \"\\u672a\\u63d0\\u53ca\", \"purchaseQualification\": \"\\u672a\\u63d0\\u53ca\", \"familyDailyTravelNumber\": \"\\u672a\\u63d0\\u53ca\"}, \"purchaseIntention\": {\"targetModel\": \"XC90 B6\\u667a\\u90387\\u5ea7\", \"preferredColor\": \"\\u672a\\u63d0\\u53ca\", \"preferredConfiguration\": \"\\u672a\\u63d0\\u53ca\", \"preferredPowerType\": \"\\u672a\\u63d0\\u53ca\", \"carBudget\": \"\\u5ba2\\u6237\\u9884\\u7b97\\u5168\\u6b3e\\u843d\\u5730\\u4ef744\\u4e07\\u5de6\\u53f3\", \"financialInstallment\": \"\\u5168\\u6b3e\\u8d2d\\u8f66\", \"familyIncomeLevel\": \"\\u672a\\u63d0\\u53ca\", \"purchaseType\": \"\\u672a\\u63d0\\u53ca\", \"purchaseCycle\": \"5\\u6708\\u524d\\u8d2d\\u8f66\"}, \"purchaseConsideration\": {\"focusPoints\": \"\\u4ef7\\u683c\\u3001\\u8f66\\u578b\\u914d\\u7f6e\", \"concerns\": \"\\u672a\\u63d0\\u53ca\", \"comparedVehicles\": \"\\u672a\\u63d0\\u53ca\"}, \"existingVehicle\": {\"existingCarBrand\": \"\\u672a\\u63d0\\u53ca\", \"existingCarUsageYears\": \"\\u672a\\u63d0\\u53ca\", \"licensePlateStatus\": \"\\u672a\\u63d0\\u53ca\"}, \"consultantProposal\": {\"consultantQuote\": \"\\u987e\\u95ee\\u62a5\\u4ef7\\u5168\\u6b3e\\u843d\\u5730\\u4ef747\\u4e07\\u5de6\\u53f3\", \"financialPlan\": \"\\u672a\\u63d0\\u53ca\", \"preferentialPolicies\": \"\\u672a\\u63d0\\u53ca\"}, \"testDriveExperience\": \"\\u672a\\u63d0\\u53ca\", \"followUpSuggestions\": \"\\u5efa\\u8bae\\u660e\\u786e\\u5ba2\\u6237\\u5173\\u6ce8\\u70b9\\uff0c\\u63d0\\u4f9b\\u66f4\\u8be6\\u7ec6\\u4f18\\u60e0\\u653f\\u7b56\\u53ca\\u5bf9\\u6bd4\\u4fe1\\u606f\\uff0c\\u4ee5\\u4e89\\u53d6\\u5ba2\\u6237\\u8fdb\\u5e97\\u6d3d\\u8c08\\u3002\"}}}}, \"customerFlowId\": \"1919618280323473410\", \"aiAnalysisRequestId\": \"SMART_ASSISTANT_NAMEPLATE-1967944330802950144\"}";
String jsonStr="{\"outputs\":{\"customerFlowId\":\"1919618280323473410\",\"data\":{\"analysisDetail\":{\"purchaseIntention\":{\"familyIncomeLevel\":\"未提及\",\"targetModel\":\"XC907座\",\"carBudget\":\"全款落地价44-47万\",\"financialInstallment\":\"未提及\",\"purchaseCycle\":\"5月前完成购车\",\"preferredConfiguration\":\"B5或B6智逸配置\",\"preferredPowerType\":\"未提及\",\"preferredColor\":\"未提及\",\"purchaseType\":\"未提及\"},\"purchaseConsideration\":{\"comparedVehicles\":\"未提及\",\"concerns\":\"报价与心理预期不符\",\"focusPoints\":\"价格、配置、优惠政策\"},\"consultantProposal\":{\"financialPlan\":\"未提及\",\"consultantQuote\":\"B5车型全款落地近50万B6暂无车\",\"preferentialPolicies\":\"可申请优惠至47万\"},\"followUpSuggestions\":\"明确客户心理预算,提供详细报价和优惠政策,邀约到店体验试驾以促成成交。\",\"testDriveExperience\":\"未提及\",\"existingVehicle\":{\"licensePlateStatus\":\"未提及\",\"existingCarBrand\":\"未提及\",\"existingCarUsageYears\":\"未提及\"},\"basicInfo\":{\"carUser\":\"未提及\",\"occupation\":\"未提及\",\"educationLevel\":\"未提及\",\"hobbies\":\"未提及\",\"carPurchasePurpose\":\"未提及\",\"familyDailyTravelNumber\":\"未提及\",\"buyerType\":\"个人\",\"customerSource\":\"未提及\",\"purchaseQualification\":\"未提及\",\"homeAddress\":\"瑞丽\"}},\"analysisResult\":\"客户对XC90车型感兴趣预算全款44-47万左右希望了解具体报价并对比其他店价格。顾问建议客户到店详谈优惠政策和配置细节。\"},\"analysisScene\":\"3\",\"analysisRecordId\":\"SMART_ASSISTANT_NAMEPLATE-1968176478541664256\",\"version\":2},\"workflow_id\":\"745dc920-8ba0-4e95-8efb-1c8b68f21344\",\"id\":\"d08b3fc9-4986-477d-91d7-b43468ac757a\",\"status\":\"succeeded\"}";
JSONObject analysisResp = JSONObject.parseObject(jsonStr);
String text = analysisResp.getString("outputs");
JSONObject outputss = JSONObject.parseObject(text);
String businessType = outputss.getString("businessType");
System.out.println("businessType is : "+businessType);
String businessId = outputss.getString("businessId");
System.out.println("businessId is : "+businessId);
String aiAnalysisRequestId = outputss.getString("aiAnalysisRequestid") ;
System.out.println("aiAnalysisRequestId is : "+aiAnalysisRequestId);
if (aiAnalysisRequestId.indexOf("CORPUS_PORTRAIT_NAMEPLATE")>=0){
businessType="CORPUS_PORTRAIT_NAMEPLATE";
}
System.out.println("businessType is : "+businessType);
}
}

View File

@@ -0,0 +1,105 @@
package com.rj;
import com.alibaba.dashscope.audio.asr.transcription.*;
import com.alibaba.dashscope.common.TaskStatus;
import com.google.gson.*;
import java.util.Arrays;
import java.util.List;
/**
* Author: Li Zhonghua wx: spllzh email(qq): 28668817@qq.com
* Date: 2025/8/22 18:43
*
* https://help.aliyun.com/zh/model-studio/paraformer-recorded-speech-recognition-java-sdk
*
*
**/
public class AudioAsynCallTest {
public static void main(String[] args) {
// 检查API Key
String apiKey = System.getenv("DASHSCOPE_API_KEY");
if (apiKey == null || apiKey.trim().isEmpty()) {
System.err.println("错误: 请设置环境变量 DASHSCOPE_API_KEY");
System.err.println("请按照以下步骤操作:");
System.err.println("1. 登录阿里云控制台");
System.err.println("2. 进入通义千问服务");
System.err.println("3. 获取API Key");
System.err.println("4. 设置环境变量: export DASHSCOPE_API_KEY=your-api-key");
System.exit(1);
}
System.out.println(apiKey); //sk-0e5049c56b0f4ad3b65119c309a7eddc
// 创建转写请求参数
TranscriptionParam param =
TranscriptionParam.builder()
.apiKey(apiKey)
.model("paraformer-v2")
// "language_hints"只支持paraformer-v2模型
.parameter("language_hints", new String[]{"zh", "en"})
.fileUrls(
Arrays.asList(
"https://api.huayang-star.com/api/audio/1957424645898579969_a2db5d76-b52c-4289-9c7e-ed55d7f15e42.mp3",
"https://api.huayang-star.com/api/audio/1957424665985101825_7b9b03f4-a458-4eb6-ac7b-b5cf827a2315.mp3",
"https://api.huayang-star.com/api/audio/1957424645898579969_a2db5d76-b52c-4289-9c7e-ed55d7f15e42.mp3"))
.build();
try {
Transcription transcription = new Transcription();
System.out.println("开始提交转写请求...");
// 提交转写请求
TranscriptionResult result = transcription.asyncCall(param);
System.out.println("RequestId: " + result.getRequestId());
System.out.println("TaskId: " + result.getTaskId());
// Loop to get task execution results until task ends
System.out.println("开始轮询任务状态...");
int maxRetries = 60; // 最多等待60秒
int retryCount = 0;
while (retryCount < maxRetries) {
result = transcription.fetch(TranscriptionQueryParam.FromTranscriptionParam(param, result.getTaskId()));
System.out.println("任务状态: " + result.getTaskStatus() + " (重试次数: " + (retryCount + 1) + ")");
if (result.getTaskStatus() == TaskStatus.SUCCEEDED) {
System.out.println("任务成功完成!");
List<TranscriptionTaskResult> taskResultList = result.getResults();
break;
} else if (result.getTaskStatus() == TaskStatus.FAILED) {
System.err.println("任务失败");
System.exit(1);
}
Thread.sleep(1000);
retryCount++;
}
if (retryCount >= maxRetries) {
System.err.println("任务超时,请检查网络连接或稍后重试");
System.exit(1);
}
// 打印结果
System.out.println("转写结果:");
System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(result.getOutput()));
} catch (Exception e) {
System.err.println("发生错误: " + e.getMessage());
e.printStackTrace();
// 提供具体的错误解决建议
if (e.getMessage().contains("AccessDenied")) {
System.err.println("\n可能的解决方案:");
System.err.println("1. 检查API Key是否正确");
System.err.println("2. 确认API Key有足够的权限");
System.err.println("3. 检查音频文件URL是否可访问");
System.err.println("4. 确认阿里云账户余额充足");
}
}
System.exit(0);
}
}

View File

@@ -1,420 +0,0 @@
package com.rj.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.rj.entity.CustomerProfileAnalysis;
import com.rj.service.biz.ICustomerProfileAnalysisService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.time.LocalDateTime;
/**
* 客户画像分析字段映射测试
*
* @author 李中华
* @date 2025/1/3
*/
@SpringBootTest
public class CustomerProfileAnalysisFieldMappingTest {
@Autowired
private ICustomerProfileAnalysisService customerProfileAnalysisService;
@Test
public void testFieldMapping() {
// 模拟Dify工作流输出使用MySQL表字段名
String difyOutputJson = """
{
"result": {
"info": {
"dealer_code": "BJ001",
"opportunity_id": "OPP_20250103_001",
"client_id": "CLIENT_12345",
"client_name": "张三",
"client_phone": "13800138000",
"home_address": "北京市朝阳区",
"vehicle_usage": "家庭接送",
"primary_driver": "本人",
"family_composition": "已婚-1孩",
"family_size": "3",
"monthly_income": "2万-3万元",
"industry_sector": "IT互联网科技/软件行业",
"job_title": "企业职员",
"company_type": "民营企业",
"hobby": "旅游",
"education_level": "本科",
"purchase_date": "1个月内",
"purchase_type": "置换",
"budget_range": "40-50万",
"payment_way": "分期",
"current_brand": "宝马",
"competitor_brand": "奔驰",
"purchase_qualification": "",
"interest_focus": "智能驾驶、安全性能",
"concern_point": "保养成本、保值率",
"notes": "关注安全性能"
},
"entities": {
"entity_brand": "积极",
"entity_brand_reason": "客户对沃尔沃品牌的安全理念很认可",
"entity_design": "中性",
"entity_design_reason": "客户对外观设计没有特别偏好",
"entity_color": "积极",
"entity_color_reason": "客户喜欢深色系,认为更显档次",
"entity_size": "积极",
"entity_size_reason": "客户认为车身尺寸适中,适合城市驾驶",
"entity_space": "积极",
"entity_space_reason": "客户对车内空间很满意,特别是后排",
"entity_interior": "中性",
"entity_interior_reason": "客户对内饰材质没有特别要求",
"entity_audio": "中性",
"entity_audio_reason": "客户对音响系统没有特别关注",
"entity_ivinfo": "积极",
"entity_ivinfo_reason": "客户对车机系统的智能化很感兴趣",
"entity_fsd": "积极",
"entity_fsd_reason": "客户对自动驾驶功能很期待",
"entity_mileage": "中性",
"entity_mileage_reason": "客户对续航里程没有特别要求",
"entity_safety": "积极",
"entity_safety_reason": "客户最关注安全性能,这是主要购买动机",
"entity_eco": "积极",
"entity_eco_reason": "客户支持环保理念,认为电动车是趋势",
"entity_liscense": "中性",
"entity_liscense_reason": "客户对绿牌政策了解不多",
"entity_price": "中性",
"entity_price_reason": "客户认为价格在可接受范围内",
"entity_benefit": "积极",
"entity_benefit_reason": "客户对购车权益很满意",
"entity_cost": "中性",
"entity_cost_reason": "客户对用车成本有一定关注",
"entity_value": "积极",
"entity_value_reason": "客户认为性价比不错",
"entity_power": "中性",
"entity_power_reason": "客户对动力性能没有特别要求",
"entity_control": "中性",
"entity_control_reason": "客户对操控性能没有特别关注",
"entity_tradein": "积极",
"entity_tradein_reason": "客户对置换政策很满意",
"entity_finance": "积极",
"entity_finance_reason": "客户对金融方案很感兴趣",
"entity_warranty": "积极",
"entity_warranty_reason": "客户对质保政策很满意",
"entity_delivery": "中性",
"entity_delivery_reason": "客户对交付时间没有特别要求"
}
}
}
""";
// 解析JSON
JSONObject outputs = JSON.parseObject(difyOutputJson);
// 创建客户画像分析对象
CustomerProfileAnalysis analysis = new CustomerProfileAnalysis();
// 设置基础字段
analysis.setProfileAnalysisRecordId("test_ai_req_20250103_001");
analysis.setRelatedBusinessId("test_business_12345");
analysis.setAnalysisSceneType(1);
analysis.setInteractionDate(LocalDateTime.now());
// 模拟字段映射逻辑
if (outputs.containsKey("result")) {
JSONObject result = outputs.getJSONObject("result");
// 解析info部分客户基础信息
if (result.containsKey("info")) {
JSONObject info = result.getJSONObject("info");
// 直接使用MySQL表字段名进行赋值
if (info.containsKey("dealer_code")) {
analysis.setDealerCode(info.getString("dealer_code"));
}
if (info.containsKey("opportunity_id")) {
analysis.setOpportunityId(info.getString("opportunity_id"));
}
if (info.containsKey("client_id")) {
analysis.setClientId(info.getString("client_id"));
}
if (info.containsKey("client_name")) {
analysis.setClientName(info.getString("client_name"));
}
if (info.containsKey("client_phone")) {
analysis.setClientPhone(info.getString("client_phone"));
}
if (info.containsKey("home_address")) {
analysis.setHomeAddress(info.getString("home_address"));
}
if (info.containsKey("vehicle_usage")) {
analysis.setVehicleUsage(info.getString("vehicle_usage"));
}
if (info.containsKey("primary_driver")) {
analysis.setPrimaryDriver(info.getString("primary_driver"));
}
if (info.containsKey("family_composition")) {
analysis.setFamilyComposition(info.getString("family_composition"));
}
if (info.containsKey("family_size")) {
analysis.setFamilySize(info.getString("family_size"));
}
if (info.containsKey("monthly_income")) {
analysis.setMonthlyIncome(info.getString("monthly_income"));
}
if (info.containsKey("industry_sector")) {
analysis.setIndustrySector(info.getString("industry_sector"));
}
if (info.containsKey("job_title")) {
analysis.setJobTitle(info.getString("job_title"));
}
if (info.containsKey("company_type")) {
analysis.setCompanyType(info.getString("company_type"));
}
if (info.containsKey("hobby")) {
analysis.setHobby(info.getString("hobby"));
}
if (info.containsKey("education_level")) {
analysis.setEducationLevel(info.getString("education_level"));
}
if (info.containsKey("purchase_date")) {
analysis.setPurchaseDate(info.getString("purchase_date"));
}
if (info.containsKey("purchase_type")) {
analysis.setPurchaseType(info.getString("purchase_type"));
}
if (info.containsKey("budget_range")) {
analysis.setBudgetRange(info.getString("budget_range"));
}
if (info.containsKey("payment_way")) {
analysis.setPaymentWay(info.getString("payment_way"));
}
if (info.containsKey("current_brand")) {
analysis.setCurrentBrand(info.getString("current_brand"));
}
if (info.containsKey("competitor_brand")) {
analysis.setCompetitorBrand(info.getString("competitor_brand"));
}
if (info.containsKey("purchase_qualification")) {
analysis.setPurchaseQualification(info.getString("purchase_qualification"));
}
if (info.containsKey("interest_focus")) {
analysis.setInterestFocus(info.getString("interest_focus"));
}
if (info.containsKey("concern_point")) {
analysis.setConcernPoint(info.getString("concern_point"));
}
if (info.containsKey("notes")) {
analysis.setNotes(info.getString("notes"));
}
}
// 解析entities部分情感分析
if (result.containsKey("entities")) {
JSONObject entities = result.getJSONObject("entities");
// 直接使用MySQL表字段名进行赋值
if (entities.containsKey("entity_brand")) {
analysis.setEntityBrand(entities.getString("entity_brand"));
}
if (entities.containsKey("entity_brand_reason")) {
analysis.setEntityBrandReason(entities.getString("entity_brand_reason"));
}
if (entities.containsKey("entity_design")) {
analysis.setEntityDesign(entities.getString("entity_design"));
}
if (entities.containsKey("entity_design_reason")) {
analysis.setEntityDesignReason(entities.getString("entity_design_reason"));
}
if (entities.containsKey("entity_color")) {
analysis.setEntityColor(entities.getString("entity_color"));
}
if (entities.containsKey("entity_color_reason")) {
analysis.setEntityColorReason(entities.getString("entity_color_reason"));
}
if (entities.containsKey("entity_size")) {
analysis.setEntitySize(entities.getString("entity_size"));
}
if (entities.containsKey("entity_size_reason")) {
analysis.setEntitySizeReason(entities.getString("entity_size_reason"));
}
if (entities.containsKey("entity_space")) {
analysis.setEntitySpace(entities.getString("entity_space"));
}
if (entities.containsKey("entity_space_reason")) {
analysis.setEntitySpaceReason(entities.getString("entity_space_reason"));
}
if (entities.containsKey("entity_interior")) {
analysis.setEntityInterior(entities.getString("entity_interior"));
}
if (entities.containsKey("entity_interior_reason")) {
analysis.setEntityInteriorReason(entities.getString("entity_interior_reason"));
}
if (entities.containsKey("entity_audio")) {
analysis.setEntityAudio(entities.getString("entity_audio"));
}
if (entities.containsKey("entity_audio_reason")) {
analysis.setEntityAudioReason(entities.getString("entity_audio_reason"));
}
if (entities.containsKey("entity_ivinfo")) {
analysis.setEntityIvinfo(entities.getString("entity_ivinfo"));
}
if (entities.containsKey("entity_ivinfo_reason")) {
analysis.setEntityIvinfoReason(entities.getString("entity_ivinfo_reason"));
}
if (entities.containsKey("entity_fsd")) {
analysis.setEntityFsd(entities.getString("entity_fsd"));
}
if (entities.containsKey("entity_fsd_reason")) {
analysis.setEntityFsdReason(entities.getString("entity_fsd_reason"));
}
if (entities.containsKey("entity_mileage")) {
analysis.setEntityMileage(entities.getString("entity_mileage"));
}
if (entities.containsKey("entity_mileage_reason")) {
analysis.setEntityMileageReason(entities.getString("entity_mileage_reason"));
}
if (entities.containsKey("entity_safety")) {
analysis.setEntitySafety(entities.getString("entity_safety"));
}
if (entities.containsKey("entity_safety_reason")) {
analysis.setEntitySafetyReason(entities.getString("entity_safety_reason"));
}
if (entities.containsKey("entity_eco")) {
analysis.setEntityEco(entities.getString("entity_eco"));
}
if (entities.containsKey("entity_eco_reason")) {
analysis.setEntityEcoReason(entities.getString("entity_eco_reason"));
}
if (entities.containsKey("entity_liscense")) {
analysis.setEntityLiscense(entities.getString("entity_liscense"));
}
if (entities.containsKey("entity_liscense_reason")) {
analysis.setEntityLiscenseReason(entities.getString("entity_liscense_reason"));
}
if (entities.containsKey("entity_price")) {
analysis.setEntityPrice(entities.getString("entity_price"));
}
if (entities.containsKey("entity_price_reason")) {
analysis.setEntityPriceReason(entities.getString("entity_price_reason"));
}
if (entities.containsKey("entity_benefit")) {
analysis.setEntityBenefit(entities.getString("entity_benefit"));
}
if (entities.containsKey("entity_benefit_reason")) {
analysis.setEntityBenefitReason(entities.getString("entity_benefit_reason"));
}
if (entities.containsKey("entity_cost")) {
analysis.setEntityCost(entities.getString("entity_cost"));
}
if (entities.containsKey("entity_cost_reason")) {
analysis.setEntityCostReason(entities.getString("entity_cost_reason"));
}
if (entities.containsKey("entity_value")) {
analysis.setEntityValue(entities.getString("entity_value"));
}
if (entities.containsKey("entity_value_reason")) {
analysis.setEntityValueReason(entities.getString("entity_value_reason"));
}
if (entities.containsKey("entity_power")) {
analysis.setEntityPower(entities.getString("entity_power"));
}
if (entities.containsKey("entity_power_reason")) {
analysis.setEntityPowerReason(entities.getString("entity_power_reason"));
}
if (entities.containsKey("entity_control")) {
analysis.setEntityControl(entities.getString("entity_control"));
}
if (entities.containsKey("entity_control_reason")) {
analysis.setEntityControlReason(entities.getString("entity_control_reason"));
}
if (entities.containsKey("entity_tradein")) {
analysis.setEntityTradein(entities.getString("entity_tradein"));
}
if (entities.containsKey("entity_tradein_reason")) {
analysis.setEntityTradeinReason(entities.getString("entity_tradein_reason"));
}
if (entities.containsKey("entity_finance")) {
analysis.setEntityFinance(entities.getString("entity_finance"));
}
if (entities.containsKey("entity_finance_reason")) {
analysis.setEntityFinanceReason(entities.getString("entity_finance_reason"));
}
if (entities.containsKey("entity_warranty")) {
analysis.setEntityWarranty(entities.getString("entity_warranty"));
}
if (entities.containsKey("entity_warranty_reason")) {
analysis.setEntityWarrantyReason(entities.getString("entity_warranty_reason"));
}
if (entities.containsKey("entity_delivery")) {
analysis.setEntityDelivery(entities.getString("entity_delivery"));
}
if (entities.containsKey("entity_delivery_reason")) {
analysis.setEntityDeliveryReason(entities.getString("entity_delivery_reason"));
}
}
}
// 设置系统字段
LocalDateTime now = LocalDateTime.now();
analysis.setCreatedAt(now);
analysis.setUpdatedAt(now);
analysis.setRecordVersion(0);
analysis.setIsDeleted(0);
// 验证字段映射结果
System.out.println("=== 客户基础信息字段映射验证 ===");
System.out.println("详细地址: " + analysis.getHomeAddress());
System.out.println("购车用途: " + analysis.getVehicleUsage());
System.out.println("实际驾驶人: " + analysis.getPrimaryDriver());
System.out.println("家庭结构: " + analysis.getFamilyComposition());
System.out.println("家庭人数: " + analysis.getFamilySize());
System.out.println("家庭月收入: " + analysis.getMonthlyIncome());
System.out.println("所属行业: " + analysis.getIndustrySector());
System.out.println("职业: " + analysis.getJobTitle());
System.out.println("企业性质: " + analysis.getCompanyType());
System.out.println("个人爱好: " + analysis.getHobby());
System.out.println("教育水平: " + analysis.getEducationLevel());
System.out.println("预购日期: " + analysis.getPurchaseDate());
System.out.println("购买类型: " + analysis.getPurchaseType());
System.out.println("购车预算: " + analysis.getBudgetRange());
System.out.println("付款方式: " + analysis.getPaymentWay());
System.out.println("保有品牌: " + analysis.getCurrentBrand());
System.out.println("竞品品牌: " + analysis.getCompetitorBrand());
System.out.println("购车资质: " + analysis.getPurchaseQualification());
System.out.println("备注: " + analysis.getNotes());
System.out.println("\n=== 实体情感分析字段映射验证 ===");
System.out.println("品牌情感: " + analysis.getEntityBrand());
System.out.println("外观设计情感: " + analysis.getEntityDesign());
System.out.println("颜色情感: " + analysis.getEntityColor());
System.out.println("尺寸情感: " + analysis.getEntitySize());
System.out.println("空间情感: " + analysis.getEntitySpace());
System.out.println("内饰情感: " + analysis.getEntityInterior());
System.out.println("音响情感: " + analysis.getEntityAudio());
System.out.println("车机情感: " + analysis.getEntityIvinfo());
System.out.println("智驾情感: " + analysis.getEntityFsd());
System.out.println("续航情感: " + analysis.getEntityMileage());
System.out.println("安全情感: " + analysis.getEntitySafety());
System.out.println("环保情感: " + analysis.getEntityEco());
System.out.println("绿牌情感: " + analysis.getEntityLiscense());
System.out.println("价格情感: " + analysis.getEntityPrice());
System.out.println("权益情感: " + analysis.getEntityBenefit());
System.out.println("成本情感: " + analysis.getEntityCost());
System.out.println("性价比情感: " + analysis.getEntityValue());
System.out.println("动力情感: " + analysis.getEntityPower());
System.out.println("操控情感: " + analysis.getEntityControl());
System.out.println("置换情感: " + analysis.getEntityTradein());
System.out.println("金融情感: " + analysis.getEntityFinance());
System.out.println("质保情感: " + analysis.getEntityWarranty());
System.out.println("交付情感: " + analysis.getEntityDelivery());
// 保存到数据库进行测试
boolean saveResult = customerProfileAnalysisService.saveCustomerProfileAnalysis(analysis);
System.out.println("\n=== 数据库保存结果 ===");
System.out.println("保存成功: " + saveResult);
if (saveResult) {
System.out.println("记录ID: " + analysis.getId());
}
}
}

View File

@@ -0,0 +1,145 @@
package com.rj.service;
import com.rj.service.DifyWorkflowService.DifyWorkflowRequest;
import com.rj.service.DifyWorkflowService.DifyWorkflowResponse;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import java.util.HashMap;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.*;
/**
* Dify工作流服务测试类
*
* @author 李中华
* @date 2025/1/3
*/
@SpringBootTest
@ActiveProfiles("test")
public class DifyWorkflowServiceTest {
@Autowired
private DifyWorkflowService difyWorkflowService;
@Test
public void testCallConsultingScenarioWorkflow() {
// 准备测试数据
Map<String, Object> inputs = new HashMap<>();
inputs.put("unionId", "test_union_12345");
inputs.put("consultantId", "consultant_67890");
inputs.put("communicateDate", "2025-01-03 10:30:00");
inputs.put("analysisScene", "sales_consultation");
inputs.put("aiAnalysisRequestId", "ai_req_20250103_001");
inputs.put("version", 1);
inputs.put("chat", "客户你好我想了解一下沃尔沃XC60这款车。\n" +
"顾问您好很高兴为您介绍沃尔沃XC60。这是一款非常优秀的中型SUV请问您主要关注哪些方面呢\n" +
"客户:我比较关心安全性能和油耗表现。\n" +
"顾问XC60在安全方面表现非常出色配备了City Safety城市安全系统还有Pilot Assist领航辅助系统。油耗方面2.0T发动机百公里综合油耗约8.5L。\n" +
"客户:价格大概是多少?\n" +
"顾问XC60的指导价在37.39-47.49万元之间目前有优惠活动可以优惠3万元左右。\n" +
"客户我预算在40万以内有什么推荐的配置吗\n" +
"顾问根据您的预算我推荐智逸豪华版指导价39.69万优惠后36.69万,完全符合您的预算。\n" +
"客户:好的,我考虑一下,什么时候可以试驾?\n" +
"顾问明天下午2点可以安排试驾您方便吗\n" +
"客户:可以的,我明天下午过去。\n" +
"顾问好的我为您预约明天下午2点的试驾地址是...");
DifyWorkflowRequest request = new DifyWorkflowRequest(inputs, "consultant_67890");
try {
// 调用工作流服务
DifyWorkflowResponse response = difyWorkflowService.callConsultingScenarioWorkflow(request);
// 验证响应结果
assertNotNull(response, "响应结果不应为空");
assertNotNull(response.getData(), "响应数据不应为空");
System.out.println("工作流调用成功!");
System.out.println("工作流运行ID: " + response.getWorkflowRunId());
System.out.println("任务ID: " + response.getTaskId());
System.out.println("响应数据: " + response.getData().toJSONString());
} catch (Exception e) {
System.err.println("工作流调用失败: " + e.getMessage());
e.printStackTrace();
// 在测试环境中如果网络不可达或API不可用我们不应该让测试失败
// 这里只是记录错误,不抛出异常
}
}
@Test
public void testWorkflowRequestCreation() {
// 测试请求对象创建
Map<String, Object> inputs = new HashMap<>();
inputs.put("testKey", "testValue");
DifyWorkflowRequest request = new DifyWorkflowRequest(inputs, "testUser");
assertEquals(inputs, request.getInputs());
assertEquals("testUser", request.getUserId());
}
@Test
public void testCallDCCScenarioWorkflow() {
// 准备DCC测试数据
Map<String, Object> inputs = new HashMap<>();
inputs.put("unionId", "dcc_union_12345");
inputs.put("consultantId", "dcc_consultant_67890");
inputs.put("communicateDate", "2025-01-03 14:30:00");
inputs.put("analysisScene", "dcc_consultation");
inputs.put("aiAnalysisRequestId", "dcc_ai_req_20250103_001");
inputs.put("version", 1);
inputs.put("chat", "客户您好我想咨询一下DCC服务。\n" +
"顾问您好欢迎咨询DCC服务。请问您需要了解哪方面的服务呢\n" +
"客户:我想了解一下数据中心的建设方案。\n" +
"顾问:好的,我们提供完整的数据中心建设解决方案。请问您的企业规模大概是多少?\n" +
"客户我们是一家中型企业大概有500名员工。\n" +
"顾问了解了。对于500人规模的企业我们推荐中小型数据中心方案包括服务器、存储、网络设备等。\n" +
"客户:大概需要多少预算?\n" +
"顾问根据您的规模预计投资在200-300万元左右包括硬件设备、软件许可和建设费用。\n" +
"客户:建设周期大概多长?\n" +
"顾问从设计到交付大概需要3-4个月的时间。\n" +
"客户:好的,我需要和公司讨论一下,什么时候可以安排详细的技术交流?\n" +
"顾问明天上午10点可以安排技术交流您方便吗\n" +
"客户:可以的,我明天上午过去。\n" +
"顾问好的我为您预约明天上午10点的技术交流地址是...");
DifyWorkflowRequest request = new DifyWorkflowRequest(inputs, "dcc_consultant_67890");
try {
// 调用DCC工作流服务
DifyWorkflowResponse response = difyWorkflowService.callDCCScenarioWorkflow(request);
// 验证响应结果
assertNotNull(response, "DCC响应结果不应为空");
assertNotNull(response.getWorkflowRunId(), "DCC工作流运行ID不应为空");
assertNotNull(response.getData(), "DCC响应数据不应为空");
System.out.println("DCC工作流调用成功");
System.out.println("DCC工作流运行ID: " + response.getWorkflowRunId());
System.out.println("DCC任务ID: " + response.getTaskId());
System.out.println("DCC响应数据: " + response.getData().toJSONString());
} catch (Exception e) {
System.err.println("DCC工作流调用失败: " + e.getMessage());
e.printStackTrace();
// 在测试环境中如果网络不可达或API不可用我们不应该让测试失败
// 这里只是记录错误,不抛出异常
}
}
@Test
public void testWorkflowResponseCreation() {
// 测试响应对象创建
DifyWorkflowResponse response = new DifyWorkflowResponse();
response.setWorkflowRunId("test_run_id");
response.setTaskId("test_task_id");
assertEquals("test_run_id", response.getWorkflowRunId());
assertEquals("test_task_id", response.getTaskId());
}
}

View File

@@ -0,0 +1,171 @@
package com.rj.speech;
import com.google.gson.*;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* 快速语音识别结果演示
* 直接测试您提供的transcription_url
* Author: Li Zhonghua wx: spllzh email(qq): 28668817@qq.com
* Date: 2025/8/24
*/
public class DownloadParse {
public static void main(String[] args) {
System.out.println("🎤 快速语音识别结果演示");
System.out.println("==================================");
// 您提供的transcription_url
String transcriptionUrl = "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/prod/paraformer-v2/20250824/10%3A42/83ab4e35-2db8-4eea-b890-7a6ed353f722-1.json?Expires=1756089779&OSSAccessKeyId=LTAI5tQZd8AEcZX6KZV4G8qL&Signature=KzkVdetZnpVu1WkLqt6PRMtjIxU%3D";
try {
System.out.println("📥 开始下载识别结果...");
System.out.println("URL: " + transcriptionUrl);
String jsonContent = downloadTranscriptionResult(transcriptionUrl);
if (jsonContent != null) {
System.out.println("✅ 下载成功,开始解析...");
parseAndOutputTranscription(jsonContent);
} else {
System.err.println("❌ 下载失败");
}
} catch (Exception e) {
System.err.println("💥 发生错误: " + e.getMessage());
e.printStackTrace();
}
System.out.println("\n🏁 演示完成");
}
/**
* 下载识别结果文件
*/
private static String downloadTranscriptionResult(String transcriptionUrl) {
try {
System.out.println("正在下载识别结果...");
HttpURLConnection connection = (HttpURLConnection) new URL(transcriptionUrl).openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(10000);
connection.setReadTimeout(30000);
connection.connect();
if (connection.getResponseCode() == 200) {
BufferedReader reader = new BufferedReader(
new InputStreamReader(connection.getInputStream(), "UTF-8")
);
StringBuilder content = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
content.append(line);
}
reader.close();
System.out.println("下载完成,文件大小: " + content.length() + " 字符");
return content.toString();
} else {
System.err.println("下载失败HTTP状态码: " + connection.getResponseCode());
return null;
}
} catch (Exception e) {
System.err.println("下载识别结果时发生错误: " + e.getMessage());
return null;
}
}
/**
* 解析并输出识别内容
*/
private static void parseAndOutputTranscription(String jsonContent) {
try {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonObject jsonObject = gson.fromJson(jsonContent, JsonObject.class);
System.out.println("\n🎉 识别内容解析结果:");
System.out.println("==================================");
if (jsonObject.has("transcripts")) {
JsonArray transcripts = jsonObject.getAsJsonArray("transcripts");
for (JsonElement transcriptElement : transcripts) {
JsonObject transcript = transcriptElement.getAsJsonObject();
if (transcript.has("sentences")) {
JsonArray sentences = transcript.getAsJsonArray("sentences");
System.out.println("🗣️ 识别到的文本内容:");
System.out.println("----------------------------------------");
StringBuilder fullText = new StringBuilder();
for (JsonElement sentenceElement : sentences) {
JsonObject sentence = sentenceElement.getAsJsonObject();
String content = "";
String startTime = "";
String endTime = "";
String speakerId = "未知";
if (sentence.has("text")) {
content = sentence.get("text").getAsString();
fullText.append(content).append(" ");
}
if (sentence.has("begin_time")) {
startTime = formatTime(sentence.get("begin_time").getAsDouble());
}
if (sentence.has("end_time")) {
endTime = formatTime(sentence.get("end_time").getAsDouble());
}
if (sentence.has("speaker_id")) {
speakerId = sentence.get("speaker_id").getAsString();
}
// 输出带时间戳和说话人ID的句子
if (!"未知".equals(speakerId)) {
System.out.printf("👤 说话人%s [%s - %s]: %s\n", speakerId, startTime, endTime, content);
} else {
System.out.printf("💬 [%s - %s]: %s\n", startTime, endTime, content);
}
}
System.out.println("----------------------------------------");
System.out.println("📝 完整识别文本:");
System.out.println(fullText.toString().trim());
System.out.println("----------------------------------------");
System.out.println("✅ 识别内容解析完成");
}
}
} else {
System.out.println("⚠️ 未找到识别文本内容");
// 输出原始JSON以便调试
System.out.println("原始JSON内容:");
System.out.println(gson.toJson(jsonObject));
}
} catch (Exception e) {
System.err.println("❌ 解析识别内容失败: " + e.getMessage());
e.printStackTrace();
}
}
/**
* 格式化时间显示
*/
private static String formatTime(double milliseconds) {
int minutes = (int) (milliseconds / 60000);
int secs = (int) ((milliseconds % 60000) / 1000);
int millis = (int) (milliseconds % 1000);
return String.format("%02d:%02d.%03d", minutes, secs, millis);
}
}