扣子配置

This commit is contained in:
tanglong 2026-07-21 14:37:53 +08:00
parent a6d7ec6349
commit 53344d1fc0
4 changed files with 66 additions and 2 deletions

View File

@ -127,6 +127,10 @@ public class CustomerDailyReportService {
return new Caller(safeUserId, true, safeUserId, "企业微信管理员", "", "", "企业微信应用管理员",
"", "WECOM_APP_ADMIN", "ALL_ORGANIZATION");
}
Caller directoryAdmin = resolveDirectoryAdmin(safeUserId);
if (directoryAdmin != null) {
return directoryAdmin;
}
try {
Caller direct = jdbc.queryForObject("""
SELECT COALESCE(NULLIF(u.user_id, ''), c.boss_user_id, '') user_id,
@ -154,6 +158,24 @@ public class CustomerDailyReportService {
.anyMatch(id -> id.trim().equalsIgnoreCase(wecomUserId));
}
private Caller resolveDirectoryAdmin(String wecomUserId) {
try {
return jdbc.queryForObject("""
SELECT employee_name, COALESCE(xuebang_account, '') xuebang_account,
COALESCE(primary_role_name, '') primary_role_name,
COALESCE(data_scope_type, '') data_scope_type
FROM employee_directory
WHERE LOWER(wecom_user_id) = LOWER(:wecomUserId)
AND (primary_role_code = 'GROUP_ADMIN' OR data_scope_type = 'ALL_ORGANIZATION')
LIMIT 1
""", Map.of("wecomUserId", wecomUserId), (rs, row) -> new Caller(
wecomUserId, true, rs.getString("xuebang_account"), rs.getString("employee_name"), "", "",
rs.getString("primary_role_name"), "", "EMPLOYEE_DIRECTORY_ADMIN", rs.getString("data_scope_type")));
} catch (EmptyResultDataAccessException ignored) {
return null;
}
}
private Caller resolveLegacy(String wecomUserId) {
Map<String, Object> legacy;
try {

View File

@ -63,7 +63,7 @@ public class CustomerDailyReportIntentHandler implements SemanticIntentHandler {
} catch (Exception e) {
if (e instanceof org.springframework.web.server.ResponseStatusException status
&& status.getStatusCode().value() == 403) {
return "无权限查看:你的企业微信账号不在可查询的组织范围内。";
return "无权限查看:你的企业微信账号不在可查询的组织范围内。UserID:" + context.wecomUserId();
}
log.error("customer daily report intent failed wecomUserId={} range={}~{} err={}",
context.wecomUserId(), range.startDate(), range.endDate(), e.getMessage(), e);

View File

@ -38,7 +38,7 @@ foundation:
coze:
base-url: https://api.coze.cn
chat-path: /v1/workflows/chat
api-key: ${COZE_API_KEY:cztei_q6SLPbgARC2LugTaJNRUEsm8LhH4aFpWEy1C2vEyMIEiuSfpUnRS2cVSFAqjmkUtE}
api-key: cztei_lWf5IOm3zAkc1UumQc6wFcuDz32mHCuh7ETBRhoIanyupu6MgCfzc5eKHcKczkoXv
default-workflow: wecom-default
workflows:
wecom-default:

View File

@ -0,0 +1,42 @@
package com.company.agentfoundation.integration.coze.service;
import com.company.agentfoundation.config.FoundationProperties;
import com.company.agentfoundation.integration.coze.client.CozeWorkflowClient;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
class CozeWorkflowServiceTest {
@Test
void extractsAnswerContentFromCozeEventStream() {
FoundationProperties properties = new FoundationProperties();
properties.getCoze().setApiKey("test-key");
properties.getCoze().setDefaultWorkflow("wecom-default");
FoundationProperties.Coze.Workflow workflow = new FoundationProperties.Coze.Workflow();
workflow.setWorkflowId("7661923520095862811");
workflow.setAppId("7661851003527954473");
workflow.setParameters(new HashMap<>());
properties.getCoze().getWorkflows().put("wecom-default", workflow);
CozeWorkflowClient client = mock(CozeWorkflowClient.class);
when(client.chat(any())).thenReturn("""
event: conversation.message.completed
data: {"role":"assistant","type":"answer","content":"企业微信智能表格批量写入成功"}
event: conversation.chat.completed
data: {"status":"completed"}
event: done
data: {}
""");
CozeWorkflowService service = new CozeWorkflowService(properties, client, new ObjectMapper());
assertThat(service.chatDefault("同步测试表")).isEqualTo("企业微信智能表格批量写入成功");
}
}