package com.rj.service; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.rj.entity.bz.DifyWorkflowAnalysis; import com.rj.entity.CustomerProfileAnalysis; import com.rj.service.biz.ICustomerProfileAnalysisService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.Map; /** * Dify工作流服务类 * 用于调用Dify平台的工作流API * * @author 李中华 * @date 2025/1/3 */ @Slf4j @Service public class DifyWorkflowService { @Value("${dify.api.base-url}") private String difyBaseUrl; @Value("${dify.api.workflow-endpoint-consultingScenar}") private String workflowEndpoint; @Value("${dify.api.summary-qiwei-token}")// 企微(一句话+分类别) app-WPuiaYg0iVLc2ws0iOfsAUC6 private String summaryQiweiToken; @Value("${dify.api.summary-ddc-token}")// DDC(一句话+分类别) app-rgaQbIir7vrVb1473Z3Puz6w private String summaryddcToken; @Value("${dify.api.summary-nameplate-token}")// 铭牌(一句话+分类别) //app-cv5glaYrY4zgjq0XIidSoJea private String summaryNameplateToken; @Value("${dify.api.portrait-3in1-token}")// 客户画像 app-Tpz9ByHyj5X6QCNpPX53QoBt private String portraitAllInToken; private final RestTemplate restTemplate; @Autowired private ICustomerProfileAnalysisService customerProfileAnalysisService; public DifyWorkflowService() { this.restTemplate = new RestTemplate(); } /** * 调用企微对话分析工作流 * * @param request 工作流请求参数 * @return 工作流响应结果 */ public DifyWorkflowResponse callConsultingScenarioWorkflow(DifyWorkflowRequest request) { try { String url = difyBaseUrl + workflowEndpoint; // 构建请求头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("Authorization", "Bearer " + summaryQiweiToken); // 构建请求体 Map requestBody = new HashMap<>(); requestBody.put("inputs", request.getInputs()); requestBody.put("response_mode", "blocking"); requestBody.put("user", request.getUserId()); HttpEntity> entity = new HttpEntity<>(requestBody, headers); log.info("调用Dify工作流API: {}", url); log.info("请求参数: {}", JSON.toJSONString(requestBody)); ResponseEntity response = restTemplate.exchange( url, HttpMethod.POST, entity, String.class ); log.info("Dify工作流响应状态: {}", response.getStatusCode()); log.info("Dify工作流响应内容: {}", response.getBody()); if (response.getStatusCode() == HttpStatus.OK) { JSONObject responseJson = JSON.parseObject(response.getBody()); return parseAndSaveWorkflowResponse(responseJson, request); } else { throw new RuntimeException("Dify工作流调用失败,状态码: " + response.getStatusCode()); } } catch (Exception e) { log.error("调用Dify工作流异常", e); throw new RuntimeException("调用Dify工作流异常: " + e.getMessage(), e); } } /** * 调用DCC对话分析工作流 * * @param request 工作流请求参数 * @return 工作流响应结果 */ public DifyWorkflowResponse callDCCScenarioWorkflow(DifyWorkflowRequest request) { try { String url = difyBaseUrl + workflowEndpoint; // 构建请求头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("Authorization", "Bearer " + summaryddcToken); // 构建请求体 Map requestBody = new HashMap<>(); requestBody.put("inputs", request.getInputs()); requestBody.put("response_mode", "blocking"); requestBody.put("user", request.getUserId()); HttpEntity> entity = new HttpEntity<>(requestBody, headers); log.info("调用DCC Dify工作流API: {}", url); log.info("DCC请求参数: {}", JSON.toJSONString(requestBody)); ResponseEntity response = restTemplate.exchange( url, HttpMethod.POST, entity, String.class ); log.info("DCC Dify工作流响应状态: {}", response.getStatusCode()); log.info("DCC Dify工作流响应内容: {}", response.getBody()); if (response.getStatusCode() == HttpStatus.OK) { JSONObject responseJson = JSON.parseObject(response.getBody()); return parseAndSaveWorkflowResponse(responseJson, request); } else { throw new RuntimeException("DCC Dify工作流调用失败,状态码: " + response.getStatusCode()); } } catch (Exception e) { log.error("调用DCC Dify工作流异常", e); throw new RuntimeException("调用DCC Dify工作流异常: " + e.getMessage(), e); } } /** * 调用客户画像分析工作流 * * @param request 工作流请求参数 * @return 工作流响应结果 */ public DifyWorkflowResponse callCustomerProfileAnalysisWorkflow(DifyWorkflowRequest request) { try { String url = difyBaseUrl + workflowEndpoint; // 构建请求头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("Authorization", "Bearer " + portraitAllInToken); // 构建请求体 Map requestBody = new HashMap<>(); requestBody.put("inputs", request.getInputs()); requestBody.put("response_mode", "blocking"); requestBody.put("user", request.getUserId()); HttpEntity> entity = new HttpEntity<>(requestBody, headers); log.info("调用客户画像分析Dify工作流API: {}", url); log.info("客户画像分析请求参数: {}", JSON.toJSONString(requestBody)); ResponseEntity response = restTemplate.exchange( url, HttpMethod.POST, entity, String.class ); log.info("客户画像分析Dify工作流响应状态: {}", response.getStatusCode()); log.info("客户画像分析Dify工作流响应内容: {}", response.getBody()); if (response.getStatusCode() == HttpStatus.OK) { JSONObject responseJson = JSON.parseObject(response.getBody()); return parseAndSaveCustomerProfileAnalysisResponse(responseJson, request); } else { throw new RuntimeException("客户画像分析Dify工作流调用失败,状态码: " + response.getStatusCode()); } } catch (Exception e) { log.error("调用客户画像分析Dify工作流异常", e); throw new RuntimeException("调用客户画像分析Dify工作流异常: " + e.getMessage(), e); } } /** * 解析工作流响应并保存数据 */ private DifyWorkflowResponse parseAndSaveWorkflowResponse(JSONObject responseJson, DifyWorkflowRequest request) { DifyWorkflowResponse response = new DifyWorkflowResponse(); if (responseJson.containsKey("data")) { JSONObject data = responseJson.getJSONObject("data"); response.setWorkflowRunId(data.getString("workflow_run_id")); response.setTaskId(data.getString("task_id")); response.setData(data); // 解析并保存分析结果到数据库 if (data.containsKey("outputs")) { JSONObject outputs = data.getJSONObject("outputs"); log.info("Dify工作流响应数据 outputs : {}", outputs); // 保存分析结果到数据库 saveAnalysisResultToDatabase(outputs, request); } } if (responseJson.containsKey("metadata")) { response.setMetadata(responseJson.getJSONObject("metadata")); } return response; } /** * 保存分析结果到数据库 */ private void saveAnalysisResultToDatabase(JSONObject outputs, DifyWorkflowRequest request) { try { DifyWorkflowAnalysis analysis = new DifyWorkflowAnalysis(); // 从outputs中提取数据 if (outputs.containsKey("data")) { JSONObject analysisData = outputs.getJSONObject("data"); // 提取分析结果摘要 if (analysisData.containsKey("analysisResult")) { analysis.setAnalysisResult(analysisData.getString("analysisResult")); } // 解析详细分析结果 if (analysisData.containsKey("analysisDetail")) { JSONObject analysisDetail = analysisData.getJSONObject("analysisDetail"); // 解析客户需求 if (analysisDetail.containsKey("customerNeeds")) { JSONObject customerNeeds = analysisDetail.getJSONObject("customerNeeds"); analysis.setCustomerSource(customerNeeds.getString("customerSource")); analysis.setCustomerOccupation(customerNeeds.getString("customerOccupation")); analysis.setCustomerHobbies(customerNeeds.getString("customerHobbies")); analysis.setHomeAddress(customerNeeds.getString("homeAddress")); analysis.setCarPurchaseNeed(customerNeeds.getString("carPurchase")); analysis.setPurchaseType(customerNeeds.getString("purchaseType")); analysis.setPurchaseBuyer(customerNeeds.getString("purchaseBuyer")); analysis.setCarUser(customerNeeds.getString("carUser")); analysis.setIntendedCarModel(customerNeeds.getString("intendedCarModel")); analysis.setCarQualifications(customerNeeds.getString("carQualifications")); analysis.setCarBudget(customerNeeds.getString("carBudget")); analysis.setFinancialInstallment(customerNeeds.getString("financialInstallment")); analysis.setPurchaseCycle(customerNeeds.getString("purchaseCycle")); analysis.setFocusPoints(customerNeeds.getString("focus")); analysis.setConcerns(customerNeeds.getString("concerns")); analysis.setCarContrast(customerNeeds.getString("carContrast")); } // 解析顾问服务 if (analysisDetail.containsKey("customerService")) { JSONObject customerService = analysisDetail.getJSONObject("customerService"); analysis.setProductDescription(customerService.getString("productDesc")); analysis.setSolution(customerService.getString("solution")); analysis.setQuotation(customerService.getString("quotation")); } // 解析后续行动和未解决问题 analysis.setAgreedFollowUpActions(analysisDetail.getString("agreedFollowUpActions")); analysis.setUnresolvedIssues(analysisDetail.getString("unresolvedIssues")); } } // 从outputs中提取其他字段 if (outputs.containsKey("unionId")) { analysis.setUnionId(outputs.getString("unionId")); } if (outputs.containsKey("consultantId")) { analysis.setConsultantId(outputs.getString("consultantId")); } if (outputs.containsKey("communicateDate")) { try { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); analysis.setCommunicateDate(LocalDateTime.parse(outputs.getString("communicateDate"), formatter)); } catch (Exception e) { log.warn("解析沟通时间失败: {}", outputs.getString("communicateDate"), e); analysis.setCommunicateDate(LocalDateTime.now()); } } if (outputs.containsKey("analysisScene")) { analysis.setAnalysisScene(outputs.getString("analysisScene")); } if (outputs.containsKey("analysisRecordId")) { analysis.setAnalysisRecordId(outputs.getString("analysisRecordId")); } if (outputs.containsKey("version")) { analysis.setVersion(outputs.getInteger("version")); } // 从request的inputs中提取原始对话内容 if (request.getInputs() != null && request.getInputs().containsKey("chat")) { analysis.setOriginalCorpus((String) request.getInputs().get("chat")); } // 设置创建时间和更新时间 LocalDateTime now = LocalDateTime.now(); analysis.setCreatedAt(now); analysis.setUpdatedAt(now); // 保存到数据库 // boolean saveResult = difyWorkflowAnalysisService.save(analysis); // if (saveResult) { // log.info("分析结果保存成功,ID: {}", analysis.getId()); // } else { // log.error("分析结果保存失败"); // } } catch (Exception e) { log.error("保存分析结果到数据库失败", e); } } /** * 解析客户画像分析工作流响应并保存数据 */ private DifyWorkflowResponse parseAndSaveCustomerProfileAnalysisResponse(JSONObject responseJson, DifyWorkflowRequest request) { DifyWorkflowResponse response = new DifyWorkflowResponse(); if (responseJson.containsKey("data")) { JSONObject data = responseJson.getJSONObject("data"); response.setWorkflowRunId(data.getString("workflow_run_id")); response.setTaskId(data.getString("task_id")); response.setData(data); // 解析并保存客户画像分析结果到数据库 if (data.containsKey("outputs")) { JSONObject outputs = data.getJSONObject("outputs"); log.info("客户画像分析Dify工作流响应数据 outputs : {}", outputs); // 保存客户画像分析结果到数据库 saveCustomerProfileAnalysisResultToDatabase(outputs, request); } } if (responseJson.containsKey("metadata")) { response.setMetadata(responseJson.getJSONObject("metadata")); } return response; } /** * 保存客户画像分析结果到数据库 */ private void saveCustomerProfileAnalysisResultToDatabase(JSONObject outputs, DifyWorkflowRequest request) { try { CustomerProfileAnalysis analysis = new CustomerProfileAnalysis(); // 从request的inputs中提取基础信息 Map inputs = request.getInputs(); if (inputs != null) { // 设置基础字段 analysis.setProfileAnalysisRecordId((String) inputs.get("aiAnalysisRequestld")); analysis.setRelatedBusinessId((String) inputs.get("businessId")); analysis.setAnalysisSceneType(parseAnalysisSceneType((String) inputs.get("analysisScene"))); // 解析沟通时间 if (inputs.containsKey("communicateDate")) { try { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); analysis.setInteractionDate(LocalDateTime.parse((String) inputs.get("communicateDate"), formatter)); } catch (Exception e) { log.warn("解析沟通时间失败: {}", inputs.get("communicateDate"), e); analysis.setInteractionDate(LocalDateTime.now()); } } // 设置原始对话内容(用于后续分析) if (inputs.containsKey("chat")) { // 这里可以保存原始对话内容,但实体类中没有对应字段,可以扩展 log.info("原始对话内容: {}", inputs.get("chat")); } } // 从outputs中提取客户画像分析结果字段 // Dify工作流现在直接输出与MySQL表字段名一致的JSON结构 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); // 保存到数据库 boolean saveResult = customerProfileAnalysisService.saveCustomerProfileAnalysis(analysis); if (saveResult) { log.info("客户画像分析结果保存成功,ID: {}", analysis.getId()); } else { log.error("客户画像分析结果保存失败"); } } catch (Exception e) { log.error("保存客户画像分析结果到数据库失败", e); } } /** * 解析分析场景类型 */ private Integer parseAnalysisSceneType(String analysisScene) { if (analysisScene == null) { return 1; // 默认企微会话 } switch (analysisScene.toLowerCase()) { case "wechat_chat": case "企微会话": return 1; case "ai_call": case "AI通话录音": return 2; case "ai_nameplate_flow": case "AI铭牌(客流)": return 3; case "ai_nameplate_test_drive": case "AI铭牌(试驾)": return 4; default: return 1; // 默认企微会话 } } /** * Dify工作流请求参数 */ public static class DifyWorkflowRequest { private Map inputs; private String userId; public DifyWorkflowRequest() {} public DifyWorkflowRequest(Map inputs, String userId) { this.inputs = inputs; this.userId = userId; } public Map getInputs() { return inputs; } public void setInputs(Map inputs) { this.inputs = inputs; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } } /** * Dify工作流响应结果 */ public static class DifyWorkflowResponse { private String workflowRunId; private String taskId; private JSONObject data; private JSONObject metadata; public String getWorkflowRunId() { return workflowRunId; } public void setWorkflowRunId(String workflowRunId) { this.workflowRunId = workflowRunId; } public String getTaskId() { return taskId; } public void setTaskId(String taskId) { this.taskId = taskId; } public JSONObject getData() { return data; } public void setData(JSONObject data) { this.data = data; } public JSONObject getMetadata() { return metadata; } public void setMetadata(JSONObject metadata) { this.metadata = metadata; } } }