diff --git a/src/main/java/com/wok/supportbot/config/DatabaseInitConfig.java b/src/main/java/com/wok/supportbot/config/DatabaseInitConfig.java index 1e25d64..bc0d207 100644 --- a/src/main/java/com/wok/supportbot/config/DatabaseInitConfig.java +++ b/src/main/java/com/wok/supportbot/config/DatabaseInitConfig.java @@ -339,7 +339,6 @@ public class DatabaseInitConfig { name VARCHAR(100) NOT NULL, description TEXT, prompt TEXT, - sort_order INTEGER DEFAULT 0 NOT NULL, enabled BOOLEAN DEFAULT TRUE NOT NULL, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, @@ -347,7 +346,7 @@ public class DatabaseInitConfig { ) """; jdbcTemplate.execute(sql); - jdbcTemplate.execute("CREATE INDEX IF NOT EXISTS idx_customer_service_role_enabled ON customer_service_role (enabled, sort_order)"); + jdbcTemplate.execute("CREATE INDEX IF NOT EXISTS idx_customer_service_role_enabled ON customer_service_role (enabled)"); } private void createCustomerServiceRoleCategoryTable() { @@ -464,17 +463,17 @@ public class DatabaseInitConfig { """ 职责:回答用户关于业务办理、服务流程、常见问题、问题受理和进度说明的问题。 要求:优先依据知识库回答;资料不足时说明无法确认,并引导用户补充必要信息;涉及财务、行政制度细节时不要猜测,应提示转对应角色处理。 - """, 10); + """); upsertDefaultRole("finance", "财务", "付款、退款、发票、对账、报销、结算与费用规则", """ 职责:回答付款、退款、发票、对账、报销、结算、费用规则相关问题。 要求:金额、账户、票据、时间节点必须严谨;知识库没有依据时不得编造政策;需要用户提供单号、金额、日期、发票抬头等关键信息。 - """, 20); + """); upsertDefaultRole("administration", "行政", "办公制度、行政流程、资产、会议、考勤、用章、采购与后勤", """ 职责:回答办公制度、行政流程、资产、会议、考勤、入职、用章、采购、后勤等问题。 要求:优先依据公司制度和流程文件回答;涉及审批权限、特殊例外或未覆盖场景时提示按制度提交申请或联系行政负责人。 - """, 30); + """); retireObsoleteDefaultRoles(); } @@ -485,19 +484,18 @@ public class DatabaseInitConfig { upsertDefaultAccount("administration", "行政账号", "默认行政账号", "administration"); } - private void upsertDefaultRole(String roleKey, String name, String description, String prompt, int sortOrder) { + private void upsertDefaultRole(String roleKey, String name, String description, String prompt) { jdbcTemplate.update(""" - INSERT INTO customer_service_role (role_key, name, description, prompt, sort_order) - VALUES (?, ?, ?, ?, ?) + INSERT INTO customer_service_role (role_key, name, description, prompt) + VALUES (?, ?, ?, ?) ON CONFLICT (role_key) DO UPDATE SET name = EXCLUDED.name, description = EXCLUDED.description, prompt = EXCLUDED.prompt, - sort_order = EXCLUDED.sort_order, enabled = true, is_delete = false, update_time = CURRENT_TIMESTAMP - """, roleKey, name, description, prompt, sortOrder); + """, roleKey, name, description, prompt); } private void upsertDefaultAccount(String accountKey, String name, String description, String roleKey) { @@ -1122,7 +1120,6 @@ public class DatabaseInitConfig { executeComment("COLUMN customer_service_role.name", "角色名称"); executeComment("COLUMN customer_service_role.description", "角色描述"); executeComment("COLUMN customer_service_role.prompt", "系统提示词(角色人设与行为规范)"); - executeComment("COLUMN customer_service_role.sort_order", "排序权重"); executeComment("COLUMN customer_service_role.enabled", "是否启用"); executeComment("COLUMN customer_service_role.create_time", "创建时间"); executeComment("COLUMN customer_service_role.update_time", "更新时间"); diff --git a/src/main/java/com/wok/supportbot/controller/CustomerServiceRoleController.java b/src/main/java/com/wok/supportbot/controller/CustomerServiceRoleController.java index 28170e2..6946f3c 100644 --- a/src/main/java/com/wok/supportbot/controller/CustomerServiceRoleController.java +++ b/src/main/java/com/wok/supportbot/controller/CustomerServiceRoleController.java @@ -49,7 +49,7 @@ public class CustomerServiceRoleController { try { customerServiceRoleService.createRole( str(body.get("roleKey")), str(body.get("name")), str(body.get("description")), - str(body.get("prompt")), intOrNull(body.get("sortOrder")), boolOrNull(body.get("enabled"))); + str(body.get("prompt")), boolOrNull(body.get("enabled"))); return ResponseEntity.ok(Map.of("success", true, "message", "角色创建成功")); } catch (Exception e) { return ResponseEntity.status(500).body(Map.of("success", false, "message", "创建角色失败:" + e.getMessage())); @@ -62,7 +62,7 @@ public class CustomerServiceRoleController { try { customerServiceRoleService.updateRole(roleId, str(body.get("name")), str(body.get("description")), str(body.get("prompt")), - intOrNull(body.get("sortOrder")), boolOrNull(body.get("enabled"))); + boolOrNull(body.get("enabled"))); return ResponseEntity.ok(Map.of("success", true, "message", "角色更新成功")); } catch (Exception e) { return ResponseEntity.status(500).body(Map.of("success", false, "message", "更新角色失败:" + e.getMessage())); diff --git a/src/main/java/com/wok/supportbot/service/CustomerServiceRoleService.java b/src/main/java/com/wok/supportbot/service/CustomerServiceRoleService.java index 907d146..fd46d50 100644 --- a/src/main/java/com/wok/supportbot/service/CustomerServiceRoleService.java +++ b/src/main/java/com/wok/supportbot/service/CustomerServiceRoleService.java @@ -32,10 +32,10 @@ public class CustomerServiceRoleService { * @param includeDisabled true=包含已停用角色(管理页用);false=仅启用角色(对话页用) */ public List> listRoles(boolean includeDisabled) { - String roleSql = "SELECT id::text AS id, role_key, name, description, prompt, sort_order, enabled, allowed_mcp_tools " + String roleSql = "SELECT id::text AS id, role_key, name, description, prompt, enabled, allowed_mcp_tools " + "FROM customer_service_role WHERE is_delete = false " + (includeDisabled ? "" : "AND enabled = true ") - + "ORDER BY sort_order ASC, id ASC"; + + "ORDER BY id ASC"; List> roles = jdbcTemplate.queryForList(roleSql); String categorySql = """ @@ -94,7 +94,7 @@ public class CustomerServiceRoleService { * 新增角色。role_key 缺省时自动生成。 */ @Transactional(rollbackFor = Exception.class) - public void createRole(String roleKey, String name, String description, String prompt, Integer sortOrder, Boolean enabled) { + public void createRole(String roleKey, String name, String description, String prompt, Boolean enabled) { if (name == null || name.trim().isEmpty()) { throw new IllegalArgumentException("角色名称不能为空"); } @@ -102,11 +102,10 @@ public class CustomerServiceRoleService { ? "role_" + System.currentTimeMillis() : roleKey.trim(); jdbcTemplate.update(""" - INSERT INTO customer_service_role (role_key, name, description, prompt, sort_order, enabled) - VALUES (?, ?, ?, ?, ?, ?) + INSERT INTO customer_service_role (role_key, name, description, prompt, enabled) + VALUES (?, ?, ?, ?, ?) """, key, name.trim(), description, prompt, - sortOrder != null ? sortOrder : 0, enabled != null ? enabled : true); } @@ -114,7 +113,7 @@ public class CustomerServiceRoleService { * 编辑角色基本信息(不含知识库分类,分类走 {@link #updateRoleCategories})。 */ @Transactional(rollbackFor = Exception.class) - public void updateRole(Long roleId, String name, String description, String prompt, Integer sortOrder, Boolean enabled) { + public void updateRole(Long roleId, String name, String description, String prompt, Boolean enabled) { if (roleId == null || roleId <= 0) { throw new IllegalArgumentException("角色ID无效"); } @@ -123,11 +122,10 @@ public class CustomerServiceRoleService { } jdbcTemplate.update(""" UPDATE customer_service_role - SET name = ?, description = ?, prompt = ?, sort_order = ?, enabled = ?, update_time = CURRENT_TIMESTAMP + SET name = ?, description = ?, prompt = ?, enabled = ?, update_time = CURRENT_TIMESTAMP WHERE id = ? AND is_delete = false """, name.trim(), description, prompt, - sortOrder != null ? sortOrder : 0, enabled != null ? enabled : true, roleId); } diff --git a/src/main/resources/init-database.sql b/src/main/resources/init-database.sql index 5f131c3..7230806 100644 --- a/src/main/resources/init-database.sql +++ b/src/main/resources/init-database.sql @@ -137,7 +137,6 @@ CREATE TABLE IF NOT EXISTS customer_service_role ( name VARCHAR(100) NOT NULL, description TEXT, prompt TEXT, - sort_order INTEGER NOT NULL DEFAULT 0, enabled BOOLEAN NOT NULL DEFAULT TRUE, create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, @@ -145,7 +144,7 @@ CREATE TABLE IF NOT EXISTS customer_service_role ( allowed_mcp_tools JSONB NOT NULL DEFAULT '[]' ); -CREATE INDEX IF NOT EXISTS idx_customer_service_role_enabled ON customer_service_role (enabled, sort_order); +CREATE INDEX IF NOT EXISTS idx_customer_service_role_enabled ON customer_service_role (enabled); COMMENT ON TABLE customer_service_role IS '客服角色表'; COMMENT ON COLUMN customer_service_role.id IS '主键'; @@ -153,7 +152,6 @@ COMMENT ON COLUMN customer_service_role.role_key IS '角色标识符(唯一 COMMENT ON COLUMN customer_service_role.name IS '角色名称'; COMMENT ON COLUMN customer_service_role.description IS '角色描述'; COMMENT ON COLUMN customer_service_role.prompt IS '系统提示词'; -COMMENT ON COLUMN customer_service_role.sort_order IS '排序权重'; COMMENT ON COLUMN customer_service_role.enabled IS '是否启用'; COMMENT ON COLUMN customer_service_role.create_time IS '创建时间'; COMMENT ON COLUMN customer_service_role.update_time IS '更新时间'; @@ -161,16 +159,16 @@ COMMENT ON COLUMN customer_service_role.is_delete IS '逻辑删除'; COMMENT ON COLUMN customer_service_role.allowed_mcp_tools IS '允许使用的 MCP 工具列表(JSONB 数组,空=不允许,["*"]=全部允许)'; -- 默认角色种子数据 -INSERT INTO customer_service_role (role_key, name, description, sort_order, enabled) -VALUES ('general', '客服', '通用客服角色', 0, TRUE) +INSERT INTO customer_service_role (role_key, name, description, enabled) +VALUES ('general', '客服', '通用客服角色', TRUE) ON CONFLICT (role_key) DO NOTHING; -INSERT INTO customer_service_role (role_key, name, description, sort_order, enabled) -VALUES ('finance', '财务', '财务相关客服角色', 1, TRUE) +INSERT INTO customer_service_role (role_key, name, description, enabled) +VALUES ('finance', '财务', '财务相关客服角色', TRUE) ON CONFLICT (role_key) DO NOTHING; -INSERT INTO customer_service_role (role_key, name, description, sort_order, enabled) -VALUES ('administration', '行政', '行政相关客服角色', 2, TRUE) +INSERT INTO customer_service_role (role_key, name, description, enabled) +VALUES ('administration', '行政', '行政相关客服角色', TRUE) ON CONFLICT (role_key) DO NOTHING; -- ============================================================ diff --git a/src/main/resources/static/components/RoleManager.js b/src/main/resources/static/components/RoleManager.js index 7580eee..4235f8d 100644 --- a/src/main/resources/static/components/RoleManager.js +++ b/src/main/resources/static/components/RoleManager.js @@ -19,14 +19,24 @@ export default {
- - - - +
+ + +
+
+ + +
+
+ +
+
+
+ +
-
@@ -75,7 +85,7 @@ export default { setup() { const roles = ref([]) const editingId = ref('') - const form = reactive({ name: '', description: '', prompt: '', sortOrder: 0, enabled: true }) + const form = reactive({ name: '', description: '', prompt: '', enabled: true }) async function reload() { try { @@ -96,7 +106,6 @@ export default { form.name = '' form.description = '' form.prompt = '' - form.sortOrder = 0 form.enabled = true } @@ -105,7 +114,6 @@ export default { form.name = role.name || '' form.description = role.description || '' form.prompt = role.prompt || '' - form.sortOrder = Number(role.sort_order || 0) form.enabled = role.enabled !== false } @@ -118,7 +126,6 @@ export default { name: form.name, description: form.description, prompt: form.prompt, - sortOrder: form.sortOrder, enabled: form.enabled } try {