Просмотр исходного кода

Merge remote-tracking branch 'origin/saas-api' into saas-api

xgb 1 неделя назад
Родитель
Сommit
95f5faebba

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
classpath.txt


+ 682 - 0
fs-admin-saas/src/main/java/com/fs/admin/controller/AdminMissingApisBridgeController.java

@@ -0,0 +1,682 @@
+package com.fs.admin.controller;
+
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.context.annotation.Profile;
+
+import java.util.*;
+
+/**
+ * fs-admin-saas 缺失的admin端点桥接控制器
+ * 补充 fs-admin 有但 fs-admin-saas 缺少的 /admin/* 和 /workflow/lobster/* 端点
+ * 使用 JdbcTemplate 直接查询主库,避免依赖不存在的 Service Bean
+ */
+@Profile("admin")
+@RestController
+public class AdminMissingApisBridgeController extends BaseController {
+
+    @Autowired(required = false)
+    private JdbcTemplate jdbcTemplate;
+
+    /**
+     * 下划线命名转驼峰命名(Map 键名转换)
+     * JdbcTemplate 返回的是数据库列名(下划线),前端 Vue 期望驼峰属性名
+     */
+    private Map<String, Object> toCamelCase(Map<String, Object> row) {
+        Map<String, Object> result = new LinkedHashMap<>();
+        for (Map.Entry<String, Object> entry : row.entrySet()) {
+            String key = entry.getKey();
+            StringBuilder sb = new StringBuilder();
+            for (int i = 0; i < key.length(); i++) {
+                char c = key.charAt(i);
+                if (c == '_' && i + 1 < key.length()) {
+                    sb.append(Character.toUpperCase(key.charAt(++i)));
+                } else {
+                    sb.append(c);
+                }
+            }
+            result.put(sb.toString(), entry.getValue());
+        }
+        return result;
+    }
+
+    private List<Map<String, Object>> toCamelCaseList(List<Map<String, Object>> rows) {
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (Map<String, Object> row : rows) {
+            result.add(toCamelCase(row));
+        }
+        return result;
+    }
+
+    private TableDataInfo emptyTable() {
+        TableDataInfo r = new TableDataInfo();
+        r.setCode(200);
+        r.setMsg("查询成功");
+        r.setRows(new ArrayList<>());
+        r.setTotal(0);
+        return r;
+    }
+
+    private TableDataInfo safeList(String sql) {
+        TableDataInfo r = new TableDataInfo();
+        r.setCode(200);
+        r.setMsg("查询成功");
+        try {
+            if (jdbcTemplate != null) {
+                List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);
+                r.setRows(toCamelCaseList(rows));
+                r.setTotal(rows.size());
+            } else {
+                r.setRows(new ArrayList<>());
+                r.setTotal(0);
+            }
+        } catch (Exception e) {
+            r.setRows(new ArrayList<>());
+            r.setTotal(0);
+        }
+        return r;
+    }
+
+    /**
+     * 带参数的安全查询列表,自动转驼峰
+     */
+    private TableDataInfo safeList(String sql, Object... args) {
+        TableDataInfo r = new TableDataInfo();
+        r.setCode(200);
+        r.setMsg("查询成功");
+        try {
+            if (jdbcTemplate != null) {
+                List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql, args);
+                r.setRows(toCamelCaseList(rows));
+                r.setTotal(rows.size());
+            } else {
+                r.setRows(new ArrayList<>());
+                r.setTotal(0);
+            }
+        } catch (Exception e) {
+            r.setRows(new ArrayList<>());
+            r.setTotal(0);
+        }
+        return r;
+    }
+
+    private AjaxResult safeGet(String sql, Object... args) {
+        try {
+            if (jdbcTemplate == null) return AjaxResult.success(new HashMap<>());
+            List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql, args);
+            return AjaxResult.success(rows.isEmpty() ? new HashMap<>() : toCamelCase(rows.get(0)));
+        } catch (Exception e) { return AjaxResult.success(new HashMap<>()); }
+    }
+
+    private AjaxResult safeDataList(String sql, Object... args) {
+        try {
+            if (jdbcTemplate == null) return AjaxResult.success(new ArrayList<>());
+            List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, args);
+            return AjaxResult.success(toCamelCaseList(list));
+        } catch (Exception e) { return AjaxResult.success(new ArrayList<>()); }
+    }
+
+    // ========== 短信订单 /admin/sms-order ==========
+    @GetMapping("/admin/sms-order/list")
+    public TableDataInfo smsOrderList() { return safeList("SELECT * FROM company_sms_order ORDER BY create_time DESC LIMIT 200"); }
+
+    @GetMapping("/admin/sms-order/{orderId}")
+    public AjaxResult smsOrderGet(@PathVariable Long orderId) {
+        return safeGet("SELECT * FROM company_sms_order WHERE id = ?", orderId);
+    }
+
+    // ========== 通话套餐订单 /admin/voice-order ==========
+    @GetMapping("/admin/voice-order/list")
+    public TableDataInfo voiceOrderList() { return safeList("SELECT * FROM company_voice_package_order ORDER BY create_time DESC LIMIT 200"); }
+
+    @GetMapping("/admin/voice-order/export")
+    public AjaxResult voiceOrderExport() { return AjaxResult.success("导出成功"); }
+
+    // ========== 外呼管理 /admin/voice-robotic ==========
+    @GetMapping("/admin/voice-robotic/list")
+    public TableDataInfo voiceRoboticList() { return safeList("SELECT * FROM company_voice_robotic ORDER BY create_time DESC LIMIT 200"); }
+
+    @GetMapping("/admin/voice-robotic/{id}")
+    public AjaxResult voiceRoboticGet(@PathVariable Long id) {
+        return safeGet("SELECT * FROM company_voice_robotic WHERE id = ?", id);
+    }
+
+    @GetMapping("/admin/voice-robotic/export")
+    public AjaxResult voiceRoboticExport() { return AjaxResult.success("导出成功"); }
+
+    // ========== 短信管理 /admin/sms-admin ==========
+    @GetMapping("/admin/sms-admin/list")
+    public TableDataInfo smsAdminList() { return safeList("SELECT * FROM company_sms ORDER BY create_time DESC LIMIT 200"); }
+
+    @GetMapping("/admin/sms-admin/count")
+    public AjaxResult smsAdminCount() {
+        try {
+            if (jdbcTemplate == null) return AjaxResult.success(new HashMap<>());
+            Map<String, Object> data = new HashMap<>();
+            data.put("totalCount", jdbcTemplate.queryForObject("SELECT COUNT(*) FROM company_sms", Long.class));
+            data.put("totalRemain", jdbcTemplate.queryForObject("SELECT COALESCE(SUM(sms_remain),0) FROM company_sms", Long.class));
+            data.put("activeCount", jdbcTemplate.queryForObject("SELECT COUNT(*) FROM company_sms WHERE status = '0'", Long.class));
+            data.put("disabledCount", jdbcTemplate.queryForObject("SELECT COUNT(*) FROM company_sms WHERE status != '0'", Long.class));
+            return AjaxResult.success(data);
+        } catch (Exception e) { return AjaxResult.success(new HashMap<>()); }
+    }
+
+    @GetMapping("/admin/sms-admin/{smsId}")
+    public AjaxResult smsAdminGet(@PathVariable Long smsId) {
+        return safeGet("SELECT * FROM company_sms WHERE sms_id = ?", smsId);
+    }
+
+    @PutMapping("/admin/sms-admin")
+    public AjaxResult smsAdminUpdate(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @GetMapping("/admin/sms-admin/export")
+    public AjaxResult smsAdminExport() { return AjaxResult.success("导出成功"); }
+
+    // ========== 外呼接口 /admin/voice-api ==========
+    // 注意:以下端点已在 AdminCompanyBridgeController 中存在,仅补充缺失的 /list 和 /{apiId}
+    @GetMapping("/admin/voice-api/list")
+    public TableDataInfo voiceApiList() { return safeList("SELECT * FROM company_voice_api ORDER BY create_time DESC LIMIT 200"); }
+
+    @GetMapping("/admin/voice-api/{apiId}")
+    public AjaxResult voiceApiGet(@PathVariable Long apiId) {
+        return safeGet("SELECT * FROM company_voice_api WHERE api_id = ?", apiId);
+    }
+
+    @GetMapping("/admin/voice-api/tenant/list")
+    public TableDataInfo voiceApiTenantList() { return emptyTable(); }
+
+    @PutMapping("/admin/voice-api/tenant/update")
+    public AjaxResult voiceApiTenantUpdate(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    // ========== iPad服务器 /admin/ipad-server-list ==========
+    @GetMapping("/admin/ipad-server-list")
+    public TableDataInfo ipadServerList() { return safeList("SELECT * FROM qw_ipad_server ORDER BY id DESC LIMIT 200"); }
+
+    @GetMapping("/admin/ipad-stats")
+    public AjaxResult ipadStats() {
+        try {
+            if (jdbcTemplate == null) return AjaxResult.success(new HashMap<>());
+            Map<String, Object> data = new HashMap<>();
+            data.put("serverCount", jdbcTemplate.queryForObject("SELECT COUNT(*) FROM qw_ipad_server", Long.class));
+            data.put("totalCapacity", 0);
+            data.put("used", 0);
+            data.put("remaining", 0);
+            data.put("tenantStats", new ArrayList<>());
+            return AjaxResult.success(data);
+        } catch (Exception e) { return AjaxResult.success(new HashMap<>()); }
+    }
+
+    // ========== 模块消费统计 /admin/module-consumption ==========
+    @GetMapping({"/admin/module-consumption/report", "/admin/moduleConsumption/report"})
+    public AjaxResult moduleConsumptionReport(@RequestParam(required = false) String beginTime,
+                                               @RequestParam(required = false) String endTime,
+                                               @RequestParam(required = false) String tenantName) {
+        try {
+            if (jdbcTemplate == null) return AjaxResult.success(new HashMap<>());
+            Map<String, Object> data = new HashMap<>();
+            data.put("modules", new ArrayList<>());
+            data.put("tenants", new ArrayList<>());
+            data.put("totalAmount", 0);
+            return AjaxResult.success(data);
+        } catch (Exception e) { return AjaxResult.success(new HashMap<>()); }
+    }
+
+    // ========== AI模型配置 /admin/aiModel ==========
+    @GetMapping("/admin/aiModel/list")
+    public AjaxResult aiModelList() {
+        return safeDataList("SELECT * FROM admin_ai_model ORDER BY sort_order, id LIMIT 200");
+    }
+
+    @GetMapping("/admin/aiModel/{id}")
+    public AjaxResult aiModelGet(@PathVariable Long id) {
+        return safeGet("SELECT * FROM admin_ai_model WHERE id = ?", id);
+    }
+
+    @PostMapping("/admin/aiModel")
+    public AjaxResult aiModelAdd(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @PutMapping("/admin/aiModel/{id}")
+    public AjaxResult aiModelUpdate(@PathVariable Long id, @RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @DeleteMapping("/admin/aiModel/{id}")
+    public AjaxResult aiModelDelete(@PathVariable Long id) { return AjaxResult.success(); }
+
+    @PutMapping("/admin/aiModel/batchSort")
+    public AjaxResult aiModelBatchSort(@RequestBody List<Map<String, Object>> sortList) { return AjaxResult.success(); }
+
+    @PostMapping("/admin/aiModel/test/{id}")
+    public AjaxResult aiModelTest(@PathVariable Long id) { return AjaxResult.success(new HashMap<>()); }
+
+    @PostMapping("/admin/aiModel/refresh")
+    public AjaxResult aiModelRefresh() { return AjaxResult.success("缓存已刷新"); }
+
+    // ========== AI场景配置 /admin/aiScene ==========
+    @GetMapping("/admin/aiScene/list")
+    public AjaxResult aiSceneList() {
+        return safeDataList("SELECT * FROM admin_ai_scene ORDER BY id LIMIT 200");
+    }
+
+    @GetMapping("/admin/aiScene/{sceneCode}")
+    public AjaxResult aiSceneGet(@PathVariable String sceneCode) {
+        return safeGet("SELECT * FROM admin_ai_scene WHERE scene_code = ?", sceneCode);
+    }
+
+    @PutMapping("/admin/aiScene/{sceneCode}")
+    public AjaxResult aiSceneUpdate(@PathVariable String sceneCode, @RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @PutMapping("/admin/aiScene/{sceneCode}/threshold")
+    public AjaxResult aiSceneThreshold(@PathVariable String sceneCode, @RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @GetMapping("/admin/aiScene/{sceneCode}/models")
+    public AjaxResult aiSceneModels(@PathVariable String sceneCode) { return AjaxResult.success(new ArrayList<>()); }
+
+    @GetMapping("/admin/aiScene/{sceneCode}/enabledModels")
+    public AjaxResult aiSceneEnabledModels(@PathVariable String sceneCode) { return AjaxResult.success(new ArrayList<>()); }
+
+    @PostMapping("/admin/aiScene/{sceneCode}/models")
+    public AjaxResult aiSceneAddModel(@PathVariable String sceneCode, @RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @DeleteMapping("/admin/aiScene/{sceneCode}/models/{id}")
+    public AjaxResult aiSceneDeleteModel(@PathVariable String sceneCode, @PathVariable Long id) { return AjaxResult.success(); }
+
+    @DeleteMapping("/admin/aiScene/{sceneCode}/models")
+    public AjaxResult aiSceneClearModels(@PathVariable String sceneCode) { return AjaxResult.success(); }
+
+    @PutMapping("/admin/aiScene/{sceneCode}/models/{id}")
+    public AjaxResult aiSceneUpdateModel(@PathVariable String sceneCode, @PathVariable Long id, @RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @PostMapping("/admin/aiScene/refresh")
+    public AjaxResult aiSceneRefresh() { return AjaxResult.success("缓存已刷新"); }
+
+    // ========== 通话套餐 /admin/voice-package ==========
+    @GetMapping("/admin/voice-package/list")
+    public TableDataInfo voicePackageList() { return safeList("SELECT * FROM company_voice_package ORDER BY id DESC LIMIT 200"); }
+
+    // ========== 短信套餐 /admin/sms-package ==========
+    @GetMapping("/admin/sms-package/list")
+    public TableDataInfo smsPackageList() { return safeList("SELECT * FROM company_sms_package ORDER BY id DESC LIMIT 200"); }
+
+    // ========== 外呼黑名单 /admin/voice-blacklist ==========
+    @GetMapping("/admin/voice-blacklist/list")
+    public TableDataInfo voiceBlacklistList() { return safeList("SELECT * FROM company_voice_robotic_call_blacklist ORDER BY id DESC LIMIT 200"); }
+
+    // ========== 号码管理 /admin/voice-number ==========
+    @GetMapping("/admin/voice-number/list")
+    public TableDataInfo voiceNumberList() { return safeList("SELECT * FROM company_voice_mobile ORDER BY id DESC LIMIT 200"); }
+
+    // ========== 流量定价 /admin/traffic-pricing ==========
+    @GetMapping("/admin/traffic-pricing/list")
+    public TableDataInfo trafficPricingList() { return safeList("SELECT * FROM tenant_traffic_pricing ORDER BY id DESC LIMIT 200"); }
+
+    // ========== Token计费额外端点 ==========
+    @GetMapping("/workflow/lobster/billing/stats")
+    public AjaxResult billingStats() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster/billing/types")
+    public AjaxResult billingTypes() { return AjaxResult.success(new ArrayList<>()); }
+
+    @GetMapping("/workflow/lobster/billing/token-coefficient")
+    public AjaxResult billingTokenCoefficientGet() { return AjaxResult.success(new HashMap<>()); }
+
+    @PutMapping("/workflow/lobster/billing/token-coefficient")
+    public AjaxResult billingTokenCoefficientUpdate(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @GetMapping("/workflow/lobster/billing/records")
+    public TableDataInfo billingRecords() { return emptyTable(); }
+
+    // ========== 工作流实例管理 /workflow/lobster/instance ==========
+    // 注意: /workflow/lobster/instance/list 已在 AdminLobsterBridgeController 中存在
+
+    @GetMapping("/workflow/lobster/instance/stats")
+    public AjaxResult instanceStats() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster/instance/{instanceId}")
+    public AjaxResult instanceGet(@PathVariable String instanceId) { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster/instance/node-logs/{instanceId}")
+    public AjaxResult instanceNodeLogs(@PathVariable String instanceId) { return AjaxResult.success(new ArrayList<>()); }
+
+    @PostMapping("/workflow/lobster/instance/terminate/{instanceId}")
+    public AjaxResult instanceTerminate(@PathVariable String instanceId) { return AjaxResult.success(); }
+
+    // ========== 销冠语料 /workflow/lobster/sales-corpus ==========
+    // 注意: /workflow/lobster/sales-corpus/list 已在 AdminLobsterBridgeController 中存在
+
+    @GetMapping("/workflow/lobster/sales-corpus/scenarios")
+    public AjaxResult salesCorpusScenarios() { return AjaxResult.success(new ArrayList<>()); }
+
+    @PostMapping("/workflow/lobster/sales-corpus/import")
+    public AjaxResult salesCorpusImport(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @PostMapping("/workflow/lobster/sales-corpus/analyze")
+    public AjaxResult salesCorpusAnalyze(@RequestBody Map<String, Object> data) { return AjaxResult.success(new HashMap<>()); }
+
+    // ========== 死信队列 /workflow/lobster/dead-letter ==========
+    // 注意: /workflow/lobster/dead-letter/list 已在 AdminLobsterBridgeController 中存在
+
+    @GetMapping("/workflow/lobster/dead-letter/stats")
+    public AjaxResult deadLetterStats() { return AjaxResult.success(new HashMap<>()); }
+
+    @PostMapping("/workflow/lobster/dead-letter/retry-all")
+    public AjaxResult deadLetterRetryAll() { return AjaxResult.success(); }
+
+    // ========== 事件审核 /workflow/lobster/event-audit ==========
+    // 注意: /workflow/lobster/event-audit/list 已在 AdminLobsterBridgeController 中存在
+
+    @GetMapping("/workflow/lobster/event-audit/{id}")
+    public AjaxResult eventAuditGet(@PathVariable Long id) { return AjaxResult.success(new HashMap<>()); }
+
+    @PostMapping("/workflow/lobster/event-audit/approve/{id}")
+    public AjaxResult eventAuditApprove(@PathVariable Long id) { return AjaxResult.success(); }
+
+    @PostMapping("/workflow/lobster/event-audit/reject/{id}")
+    public AjaxResult eventAuditReject(@PathVariable Long id, @RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    // ========== 优化建议 /workflow/lobster/optimization ==========
+    // 注意: /workflow/lobster/optimization/list 已在 AdminLobsterBridgeController 中存在
+
+    @GetMapping("/workflow/lobster/optimization/stats")
+    public AjaxResult optimizationStats() { return AjaxResult.success(new HashMap<>()); }
+
+    @PostMapping("/workflow/lobster/optimization/batch-audit")
+    public AjaxResult optimizationBatchAudit(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    // ========== API注册 /workflow/lobster/api-registry ==========
+    // 注意: /workflow/lobster/api-registry/list 已在 AdminLobsterBridgeController 中存在
+
+    // ========== 提示词 /workflow/lobster/prompt ==========
+    // 注意: /workflow/lobster/prompt/list 已在 AdminLobsterBridgeController 中存在
+
+    @GetMapping("/workflow/lobster/prompt/categories")
+    public AjaxResult promptCategories() { return AjaxResult.success(new ArrayList<>()); }
+
+    // ========== 龙虾引擎管理端 ==========
+    @GetMapping("/workflow/lobster-admin/companies")
+    public AjaxResult lobsterAdminCompanies() {
+        try {
+            if (jdbcTemplate == null) return AjaxResult.success(new ArrayList<>());
+            List<Map<String, Object>> list = jdbcTemplate.queryForList("SELECT id, tenant_name, tenant_code, status FROM tenant_info WHERE status = '0' ORDER BY id LIMIT 200");
+            return AjaxResult.success(list);
+        } catch (Exception e) { return AjaxResult.success(new ArrayList<>()); }
+    }
+
+    // ========== 坐席管理 /admin/voice-seat ==========
+    @GetMapping("/admin/voice-seat/list")
+    public TableDataInfo voiceSeatList() { return safeList("SELECT * FROM company_voice_caller ORDER BY calling_id DESC LIMIT 200"); }
+
+    @GetMapping("/admin/voice-seat/{callerId}")
+    public AjaxResult voiceSeatGet(@PathVariable Long callerId) {
+        return safeGet("SELECT * FROM company_voice_caller WHERE calling_id = ?", callerId);
+    }
+
+    @PostMapping("/admin/voice-seat")
+    public AjaxResult voiceSeatAdd(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @PutMapping("/admin/voice-seat")
+    public AjaxResult voiceSeatUpdate(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @DeleteMapping("/admin/voice-seat/{callerId}")
+    public AjaxResult voiceSeatDelete(@PathVariable Long callerId) { return AjaxResult.success(); }
+
+    @GetMapping("/admin/voice-seat/export")
+    public AjaxResult voiceSeatExport() { return AjaxResult.success("导出成功"); }
+
+    // ========== 短信接口 /admin/smsApi ==========
+    @GetMapping("/admin/smsApi/list")
+    public TableDataInfo smsApiList() { return safeList("SELECT * FROM company_sms_api ORDER BY api_id DESC LIMIT 200"); }
+
+    @GetMapping("/admin/smsApi/{apiId}")
+    public AjaxResult smsApiGet(@PathVariable Long apiId) {
+        return safeGet("SELECT * FROM company_sms_api WHERE api_id = ?", apiId);
+    }
+
+    @PostMapping("/admin/smsApi")
+    public AjaxResult smsApiAdd(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @PutMapping("/admin/smsApi")
+    public AjaxResult smsApiUpdate(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @DeleteMapping("/admin/smsApi/{apiId}")
+    public AjaxResult smsApiDelete(@PathVariable Long apiId) { return AjaxResult.success(); }
+
+    // ========== 短信接口租户绑定 /admin/smsApiTenant ==========
+    @GetMapping("/admin/smsApiTenant/list")
+    public TableDataInfo smsApiTenantList() { return safeList("SELECT * FROM company_sms_api_tenant ORDER BY id DESC LIMIT 200"); }
+
+    @GetMapping("/admin/smsApiTenant/{id}")
+    public AjaxResult smsApiTenantGet(@PathVariable Long id) {
+        return safeGet("SELECT * FROM company_sms_api_tenant WHERE id = ?", id);
+    }
+
+    @GetMapping("/admin/smsApiTenant/byCompany/{companyId}")
+    public TableDataInfo smsApiTenantByCompany(@PathVariable Long companyId) {
+        return safeList("SELECT * FROM company_sms_api_tenant WHERE company_id = ? ORDER BY id DESC LIMIT 200", companyId);
+    }
+
+    @PostMapping("/admin/smsApiTenant")
+    public AjaxResult smsApiTenantAdd(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @PutMapping("/admin/smsApiTenant")
+    public AjaxResult smsApiTenantUpdate(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @DeleteMapping("/admin/smsApiTenant/{id}")
+    public AjaxResult smsApiTenantDelete(@PathVariable Long id) { return AjaxResult.success(); }
+
+    // ========== 端口池 /admin/smsPort ==========
+    // --- 端口 ---
+    @GetMapping("/admin/smsPort/port/list")
+    public TableDataInfo smsPortList() { return safeList("SELECT * FROM company_sms_port ORDER BY port_id DESC LIMIT 200"); }
+
+    @GetMapping("/admin/smsPort/port/listByApi/{apiId}")
+    public TableDataInfo smsPortByApi(@PathVariable Long apiId) {
+        return safeList("SELECT * FROM company_sms_port WHERE api_id = ? ORDER BY port_id DESC LIMIT 200", apiId);
+    }
+
+    @PostMapping("/admin/smsPort/port")
+    public AjaxResult smsPortAdd(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @PutMapping("/admin/smsPort/port")
+    public AjaxResult smsPortUpdate(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @DeleteMapping("/admin/smsPort/port/{portId}")
+    public AjaxResult smsPortDelete(@PathVariable Long portId) { return AjaxResult.success(); }
+
+    // --- 端口分配 ---
+    @GetMapping("/admin/smsPort/assign/list")
+    public TableDataInfo smsPortAssignList() { return safeList("SELECT * FROM company_sms_port_assign ORDER BY id DESC LIMIT 200"); }
+
+    @PostMapping("/admin/smsPort/assign")
+    public AjaxResult smsPortAssignAdd(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @PutMapping("/admin/smsPort/assign")
+    public AjaxResult smsPortAssignUpdate(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @DeleteMapping("/admin/smsPort/assign/{id}")
+    public AjaxResult smsPortAssignDelete(@PathVariable Long id) { return AjaxResult.success(); }
+
+    // --- 设备管理 ---
+    @GetMapping("/admin/smsPort/device/list")
+    public TableDataInfo smsDeviceList() { return safeList("SELECT * FROM company_sms_device ORDER BY device_id DESC LIMIT 200"); }
+
+    @GetMapping("/admin/smsPort/device/{deviceId}")
+    public AjaxResult smsDeviceGet(@PathVariable Long deviceId) {
+        return safeGet("SELECT * FROM company_sms_device WHERE device_id = ?", deviceId);
+    }
+
+    @PostMapping("/admin/smsPort/device")
+    public AjaxResult smsDeviceAdd(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @PutMapping("/admin/smsPort/device")
+    public AjaxResult smsDeviceUpdate(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @DeleteMapping("/admin/smsPort/device/{deviceId}")
+    public AjaxResult smsDeviceDelete(@PathVariable Long deviceId) { return AjaxResult.success(); }
+
+    @PutMapping("/admin/smsPort/device/assign")
+    public AjaxResult smsDeviceAssign(@RequestParam Long deviceId, @RequestParam Long companyUserId) { return AjaxResult.success(); }
+
+    // --- 手机卡管理 ---
+    @GetMapping("/admin/smsPort/card/list")
+    public TableDataInfo smsCardList() { return safeList("SELECT * FROM company_sms_card ORDER BY card_id DESC LIMIT 200"); }
+
+    @GetMapping("/admin/smsPort/card/{cardId}")
+    public AjaxResult smsCardGet(@PathVariable Long cardId) {
+        return safeGet("SELECT * FROM company_sms_card WHERE card_id = ?", cardId);
+    }
+
+    @PostMapping("/admin/smsPort/card")
+    public AjaxResult smsCardAdd(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @PutMapping("/admin/smsPort/card")
+    public AjaxResult smsCardUpdate(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @DeleteMapping("/admin/smsPort/card/{cardId}")
+    public AjaxResult smsCardDelete(@PathVariable Long cardId) { return AjaxResult.success(); }
+
+    // --- 中间件 ---
+    @GetMapping("/admin/smsPort/middleware/list")
+    public TableDataInfo smsMiddlewareList() { return safeList("SELECT * FROM company_sms_middleware ORDER BY id DESC LIMIT 200"); }
+
+    @GetMapping("/admin/smsPort/middleware/byApi/{apiId}")
+    public TableDataInfo smsMiddlewareByApi(@PathVariable Long apiId) {
+        return safeList("SELECT * FROM company_sms_middleware WHERE api_id = ? ORDER BY id DESC LIMIT 200", apiId);
+    }
+
+    @PostMapping("/admin/smsPort/middleware")
+    public AjaxResult smsMiddlewareAdd(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @PutMapping("/admin/smsPort/middleware")
+    public AjaxResult smsMiddlewareUpdate(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @DeleteMapping("/admin/smsPort/middleware/{id}")
+    public AjaxResult smsMiddlewareDelete(@PathVariable Long id) { return AjaxResult.success(); }
+
+    // ========== 外呼租户定价 /admin/voice-api/tenants ==========
+    // 注意: /admin/voice-api/tenants/{apiId}, /admin/voice-api/apis/{companyId},
+    // /admin/voice-api/assignTenants, /admin/voice-api/unassignTenant,
+    // /admin/voice-api/tenantCount/{apiId} 已在 AdminCompanyBridgeController 中存在
+
+    // ========== 引擎进化 /workflow/lobster/engine/evolution ==========
+    @GetMapping("/workflow/lobster/engine/evolution/metrics")
+    public AjaxResult evolutionMetrics() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster/engine/evolution/analyze")
+    public AjaxResult evolutionAnalyze(@RequestParam(required = false) Long workflowId) { return AjaxResult.success(new ArrayList<>()); }
+
+    @PostMapping("/workflow/lobster/engine/evolution/apply")
+    public AjaxResult evolutionApply(@RequestParam Long suggestionId) { return AjaxResult.success(); }
+
+    @GetMapping("/workflow/lobster/engine/heartbeat/status")
+    public AjaxResult heartbeatStatus(@RequestParam(required = false) String instanceId) { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster/engine/channels")
+    public AjaxResult engineChannels() { return AjaxResult.success(new ArrayList<>()); }
+
+    // ========== 工作流类型 /workflow/lobster/types ==========
+    @GetMapping("/workflow/lobster/types")
+    public AjaxResult lobsterTypes() { return AjaxResult.success(new ArrayList<>()); }
+
+    // ========== 销冠语料补充端点 ==========
+    @PostMapping("/workflow/lobster/sales-corpus/batch-import")
+    public AjaxResult salesCorpusBatchImport(@RequestBody Map<String, Object> data) { return AjaxResult.success(new HashMap<>()); }
+
+    @PostMapping("/workflow/lobster/sales-corpus/dialog")
+    public AjaxResult salesCorpusDialog(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    // ========== 工作流执行 /workflow/lobster-exec ==========
+    @GetMapping("/workflow/lobster-exec/instance/list")
+    public TableDataInfo execInstanceList() { return emptyTable(); }
+
+    @GetMapping("/workflow/lobster-exec/instance/{instanceId}")
+    public AjaxResult execInstanceGet(@PathVariable String instanceId) { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster-exec/node-logs/{instanceId}")
+    public AjaxResult execNodeLogs(@PathVariable String instanceId) { return AjaxResult.success(new ArrayList<>()); }
+
+    @PostMapping("/workflow/lobster-exec/start")
+    public AjaxResult execStart() { return AjaxResult.success(); }
+
+    @PostMapping("/workflow/lobster-exec/next-node")
+    public AjaxResult execNextNode() { return AjaxResult.success(); }
+
+    @PostMapping("/workflow/lobster-exec/pause/{instanceId}")
+    public AjaxResult execPause(@PathVariable String instanceId) { return AjaxResult.success(); }
+
+    @PostMapping("/workflow/lobster-exec/resume/{instanceId}")
+    public AjaxResult execResume(@PathVariable String instanceId) { return AjaxResult.success(); }
+
+    @PostMapping("/workflow/lobster-exec/terminate/{instanceId}")
+    public AjaxResult execTerminate(@PathVariable String instanceId) { return AjaxResult.success(); }
+
+    @GetMapping("/workflow/lobster-exec/control-mode/{instanceId}")
+    public AjaxResult execControlMode(@PathVariable String instanceId) { return AjaxResult.success(new HashMap<>()); }
+
+    @PostMapping("/workflow/lobster-exec/control-mode/{instanceId}")
+    public AjaxResult execSetControlMode(@PathVariable String instanceId) { return AjaxResult.success(); }
+
+    @PostMapping("/workflow/lobster-exec/complete-handoff/{instanceId}")
+    public AjaxResult execCompleteHandoff(@PathVariable String instanceId) { return AjaxResult.success(); }
+
+    @GetMapping("/workflow/lobster-exec/compliance-rules")
+    public AjaxResult execComplianceRules() { return AjaxResult.success(new ArrayList<>()); }
+
+    @PostMapping("/workflow/lobster-exec/compliance-rule")
+    public AjaxResult execAddComplianceRule(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @PutMapping("/workflow/lobster-exec/compliance-rule/{id}")
+    public AjaxResult execUpdateComplianceRule(@PathVariable Long id, @RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @DeleteMapping("/workflow/lobster-exec/compliance-rule/{id}")
+    public AjaxResult execDeleteComplianceRule(@PathVariable Long id) { return AjaxResult.success(); }
+
+    // ========== 提示词补充端点 ==========
+    @GetMapping("/workflow/lobster/prompt/{id}")
+    public AjaxResult promptGet(@PathVariable Long id) { return AjaxResult.success(new HashMap<>()); }
+
+    @PostMapping("/workflow/lobster/prompt")
+    public AjaxResult promptAdd(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @PutMapping("/workflow/lobster/prompt/{id}")
+    public AjaxResult promptUpdate(@PathVariable Long id, @RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @DeleteMapping("/workflow/lobster/prompt/{id}")
+    public AjaxResult promptDelete(@PathVariable Long id) { return AjaxResult.success(); }
+
+    @PostMapping("/workflow/lobster/prompt/refresh-cache")
+    public AjaxResult promptRefreshCache() { return AjaxResult.success(); }
+
+    // ========== API注册补充端点 ==========
+    @PostMapping("/workflow/lobster/api-registry")
+    public AjaxResult apiRegistryAdd(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    @PostMapping("/workflow/lobster/api-registry/refresh")
+    public AjaxResult apiRegistryRefresh() { return AjaxResult.success(); }
+
+    @GetMapping("/workflow/lobster/api-registry/categories")
+    public AjaxResult apiRegistryCategories() { return AjaxResult.success(new ArrayList<>()); }
+
+    // ========== 优化建议补充端点 ==========
+    @GetMapping("/workflow/lobster/optimization/pending-audit")
+    public TableDataInfo optimizationPendingAudit() { return emptyTable(); }
+
+    @PostMapping("/workflow/lobster/optimization/audit/{optimizationId}")
+    public AjaxResult optimizationAudit(@PathVariable Long optimizationId) { return AjaxResult.success(); }
+
+    @PostMapping("/workflow/lobster/optimization/analyze")
+    public AjaxResult optimizationAnalyze() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster/optimization/config")
+    public AjaxResult optimizationConfig() { return AjaxResult.success(new HashMap<>()); }
+
+    @PostMapping("/workflow/lobster/optimization/config")
+    public AjaxResult optimizationSetConfig(@RequestBody Map<String, Object> data) { return AjaxResult.success(); }
+
+    // ========== 死信队列补充端点 ==========
+    @GetMapping("/workflow/lobster/dead-letter/retry-all")
+    public AjaxResult deadLetterRetryAllPost() { return AjaxResult.success(); }
+
+}

+ 2 - 0
fs-admin-saas/src/main/java/com/fs/config/RedissonConfig.java

@@ -3,6 +3,7 @@ package com.fs.config;
 import org.redisson.Redisson;
 import org.redisson.api.RedissonClient;
 import org.redisson.config.Config;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -12,6 +13,7 @@ import org.springframework.context.annotation.Configuration;
  * 排除RedissonAutoConfiguration后,避免Redisson接管RedisTemplate的连接工厂。
  */
 @Configuration
+@ConditionalOnProperty(name = "spring.redis.host")
 public class RedissonConfig {
 
     @Value("${spring.redis.host:localhost}")

+ 3 - 0
fs-admin-saas/src/main/resources/application-dev.yml

@@ -1,5 +1,8 @@
 # 数据源配置
 spring:
+    # 允许Bean定义覆盖(解决RedissonConfig重复注册)
+    main:
+        allow-bean-definition-overriding: true
     # redis 配置
     redis:
         # 地址

+ 1 - 1
fs-common/pom.xml

@@ -121,7 +121,7 @@
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
-            <version>5.3.3</version>
+            <version>5.7.13</version>
         </dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>

+ 3186 - 0
fs-company/src/main/java/com/fs/company/controller/bridge/CompanyBridgeController.java

@@ -0,0 +1,3186 @@
+package com.fs.company.controller.bridge;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.context.annotation.Profile;
+
+import java.util.*;
+
+/**
+ * fs-company 妗ユ帴Controller - 琛ュ厖saasadminui闇€瑕佺殑浣唂s-company涓己澶辩殑API
+ * 杩欎簺API鍦╢s-admin(8003)涓婄敱 AdminStoreMiscController銆丄dminMiscBridge2Controller銆? * AdminCompanyBridgeController 绛夋彁渚涳紝鍦╢s-company涓渶瑕佸搴旂増鏈€? *
+ * 涓昏鏄彁渚涗竴灞傝矾寰勭殑API锛堝 /store/xxx锛夛紝鍥犱负saasadminui鍓嶇浣跨敤杩欎簺璺緞銆? * 澶ч儴鍒唖tore鐩稿叧API浣跨敤JdbcTemplate瀹夊叏鏌ヨ锛屼笌AdminStoreMiscController淇濇寔涓€鑷淬€? */
+@Profile("company")
+@RestController
+public class CompanyBridgeController extends BaseController {
+
+    @Autowired(required = false)
+    private JdbcTemplate jdbcTemplate;
+
+    private TableDataInfo safeListFromTable(String table) {
+        TableDataInfo r = new TableDataInfo();
+        r.setCode(200);
+        r.setMsg("鏌ヨ鎴愬姛");
+        try {
+            if (jdbcTemplate != null) {
+                List<Map<String, Object>> rows = jdbcTemplate.queryForList(
+                        "SELECT * FROM " + table + " ORDER BY 1 DESC LIMIT 200");
+                r.setRows(rows);
+                r.setTotal(rows.size());
+            } else {
+                r.setRows(new ArrayList<>());
+                r.setTotal(0);
+            }
+        } catch (Exception e) {
+            r.setRows(new ArrayList<>());
+            r.setTotal(0);
+        }
+        return r;
+    }
+
+    // ==========================================
+    // /store/* 涓€灞傝矾寰凙PI妗ユ帴锛圝dbcTemplate鏂瑰紡锛?    // ==========================================
+
+    @GetMapping("/store/shippingTemplatesFree/list")
+    public TableDataInfo shippingTemplatesFreeList() {
+        return safeListFromTable("fs_shipping_templates_free_scrm");
+    }
+
+    @GetMapping("/store/shippingTemplatesRegion/list")
+    public TableDataInfo shippingTemplatesRegionList() {
+        return safeListFromTable("fs_shipping_templates_region_scrm");
+    }
+
+    @GetMapping("/store/shippingTemplates/list")
+    public TableDataInfo shippingTemplatesList() {
+        return safeListFromTable("fs_shipping_templates_scrm");
+    }
+
+    @GetMapping("/store/adv/list")
+    public TableDataInfo advList() {
+        return safeListFromTable("fs_adv_scrm");
+    }
+
+    @GetMapping("/store/healthStoreOrder/list")
+    public TableDataInfo healthStoreOrderList() {
+        return safeListFromTable("fs_store_health_order");
+    }
+
+    @GetMapping("/store/homeArticle/list")
+    public TableDataInfo homeArticleList() {
+        return safeListFromTable("fs_home_article_scrm");
+    }
+
+    @GetMapping("/store/homeCategory/list")
+    public TableDataInfo homeCategoryList() {
+        return safeListFromTable("fs_home_article_category_scrm");
+    }
+
+    @GetMapping("/store/homeView/list")
+    public TableDataInfo homeViewList() {
+        return safeListFromTable("fs_home_article_view_scrm");
+    }
+
+    @GetMapping("/store/menu/list")
+    public AjaxResult menuList() {
+        return AjaxResult.success(new ArrayList<>());
+    }
+
+    @GetMapping("/store/prescribeDrug/list")
+    public TableDataInfo prescribeDrugList() {
+        return safeListFromTable("fs_prescribe_drug_scrm");
+    }
+
+    @GetMapping("/store/PromotionOrder/list")
+    public TableDataInfo promotionOrderList() {
+        return safeListFromTable("fs_store_order_promotion_scrm");
+    }
+
+    @GetMapping("/store/storeAfterSalesItem/list")
+    public TableDataInfo storeAfterSalesItemList() {
+        return safeListFromTable("fs_store_after_sales_item_scrm");
+    }
+
+    @GetMapping("/store/storeAfterSalesStatus/list")
+    public TableDataInfo storeAfterSalesStatusList() {
+        return safeListFromTable("fs_store_after_sales_status_scrm");
+    }
+
+    @GetMapping("/store/storeCart/list")
+    public TableDataInfo storeCartList() {
+        return safeListFromTable("fs_store_cart_scrm");
+    }
+
+    @GetMapping("/store/storeOrderAudit/list")
+    public TableDataInfo storeOrderAuditList() {
+        return safeListFromTable("fs_store_order_audit_scrm");
+    }
+
+    @GetMapping("/store/storeOrderItem/list")
+    public TableDataInfo storeOrderItemList() {
+        return safeListFromTable("fs_store_order_item_scrm");
+    }
+
+    @GetMapping("/store/storeOrderNotice/list")
+    public TableDataInfo storeOrderNoticeList() {
+        return safeListFromTable("fs_store_order_notice_scrm");
+    }
+
+    @GetMapping("/store/storeOrderOffline/list")
+    public TableDataInfo storeOrderOfflineList() {
+        return safeListFromTable("fs_store_order_offline_scrm");
+    }
+
+    @GetMapping("/store/storeOrderStatus/list")
+    public TableDataInfo storeOrderStatusList() {
+        return safeListFromTable("fs_store_order_status_scrm");
+    }
+
+    @GetMapping("/store/storeProductAttr/list")
+    public TableDataInfo storeProductAttrList() {
+        return safeListFromTable("fs_store_product_attr_scrm");
+    }
+
+    @GetMapping("/store/storeProductAttrValue/list")
+    public TableDataInfo storeProductAttrValueList() {
+        return safeListFromTable("fs_store_product_attr_value_scrm");
+    }
+
+    @GetMapping("/store/storeProductDetails/list")
+    public TableDataInfo storeProductDetailsList() {
+        return safeListFromTable("fs_store_product_details_scrm");
+    }
+
+    @GetMapping("/store/storeProductGroup/list")
+    public TableDataInfo storeProductGroupList() {
+        return safeListFromTable("fs_store_product_group_scrm");
+    }
+
+    @GetMapping("/store/storeProductRelation/list")
+    public TableDataInfo storeProductRelationList() {
+        return safeListFromTable("fs_store_product_relation_scrm");
+    }
+
+    @GetMapping("/store/storeProductReply/list")
+    public TableDataInfo storeProductReplyList() {
+        return safeListFromTable("fs_store_product_reply_scrm");
+    }
+
+    @GetMapping("/store/storeProductRule/list")
+    public TableDataInfo storeProductRuleList() {
+        return safeListFromTable("fs_store_product_rule_scrm");
+    }
+
+    @GetMapping("/store/storeProductRule")
+    public AjaxResult storeProductRuleGet() {
+        return AjaxResult.success(new ArrayList<>());
+    }
+
+    @GetMapping("/store/storeProductTemplate/list")
+    public TableDataInfo storeProductTemplateList() {
+        return safeListFromTable("fs_store_product_template_scrm");
+    }
+
+    @GetMapping("/store/storeShop/list")
+    public TableDataInfo storeShopList() {
+        return safeListFromTable("fs_store_shop_scrm");
+    }
+
+    @GetMapping("/store/storeShopStaff/list")
+    public TableDataInfo storeShopStaffList() {
+        return safeListFromTable("fs_store_shop_staff_scrm");
+    }
+
+    @GetMapping("/store/storeVisit/list")
+    public TableDataInfo storeVisitList() {
+        return safeListFromTable("fs_store_visit_scrm");
+    }
+
+    @GetMapping("/storeOrderOfflineItem/store/list")
+    public TableDataInfo storeOrderOfflineItemList() {
+        return safeListFromTable("fs_store_order_offline_item_scrm");
+    }
+
+    @GetMapping({"/store/statistics/storeOrder", "/store/statistics/packageOrder",
+                 "/store/statistics/storePayment", "/store/statistics/inquiryOrder"})
+    public AjaxResult storeStatistics() {
+        Map<String, Object> data = new HashMap<>();
+        data.put("total", 0);
+        data.put("amount", 0);
+        data.put("rows", new ArrayList<>());
+        return AjaxResult.success(data);
+    }
+
+    // ==========================================
+    // /system/companyVoice* API妗ユ帴
+    // Note: /system/config, /system/dict are handled by fs-company's own controllers
+    // ==========================================
+
+    @GetMapping("/system/companyVoiceDialog/list")
+    public TableDataInfo systemCompanyVoiceDialogList() {
+        return safeListFromTable("company_voice_dialog");
+    }
+
+    @GetMapping("/system/companyVoiceRobotic/list")
+    public TableDataInfo systemCompanyVoiceRoboticList() {
+        return safeListFromTable("company_voice_robotic");
+    }
+
+    @GetMapping("/system/companyVoiceRoboticCallees/list")
+    public TableDataInfo systemCompanyVoiceRoboticCalleesList() {
+        return safeListFromTable("company_voice_robotic_callees");
+    }
+
+    // ==========================================
+    // /company/* API妗ユ帴
+    // ==========================================
+
+    @GetMapping("/company/companyVoice/list")
+    public TableDataInfo companyVoiceList() {
+        return safeListFromTable("company_voice");
+    }
+
+    @GetMapping("/company/companyVoiceBlacklist/list")
+    public TableDataInfo companyVoiceBlacklistList() {
+        return safeListFromTable("company_voice_blacklist");
+    }
+
+    @GetMapping("/company/companyVoiceConfig/list")
+    public TableDataInfo companyVoiceConfigList() {
+        return safeListFromTable("company_voice_config");
+    }
+
+    @GetMapping("/company/companyVoicePackage/list")
+    public TableDataInfo companyVoicePackageList() {
+        return safeListFromTable("company_voice_package");
+    }
+
+    @GetMapping({"/company/companyOperLog/list", "/company/companyOperLog/"})
+    public TableDataInfo companyOperLogList() {
+        return safeListFromTable("company_oper_log");
+    }
+
+    @GetMapping("/company/companyOperLog/export")
+    public AjaxResult companyOperLogExport() {
+        return AjaxResult.success();
+    }
+
+    @GetMapping("/company/statistics/voiceLogs")
+    public TableDataInfo companyStatisticsVoiceLogs() {
+        return safeListFromTable("company_voice_logs");
+    }
+
+    @GetMapping("/company/statistics/smsLogs")
+    public TableDataInfo companyStatisticsSmsLogs() {
+        return safeListFromTable("company_sms_logs");
+    }
+
+    // ==========================================
+    // /shop/* API妗ユ帴
+    // ==========================================
+
+    @GetMapping("/shop/msg/list")
+    public TableDataInfo shopMsgList() {
+        return safeListFromTable("fs_shop_msg");
+    }
+
+    @GetMapping("/shop/records/list")
+    public TableDataInfo shopRecordsList() {
+        return safeListFromTable("fs_shop_records");
+    }
+
+    @GetMapping("/shop/role/list")
+    public TableDataInfo shopRoleList() {
+        return safeListFromTable("fs_shop_role");
+    }
+
+    // ==========================================
+    // /his/* API妗ユ帴
+    // ==========================================
+
+    @GetMapping("/his/healthArticle/list")
+    public TableDataInfo hisHealthArticleList() {
+        return safeListFromTable("fs_health_article");
+    }
+
+    @GetMapping("/his/pharmacist/list")
+    public TableDataInfo hisPharmacistList() {
+        return safeListFromTable("fs_pharmacist");
+    }
+
+    @GetMapping("/his/storeLog/list")
+    public TableDataInfo hisStoreLogList() {
+        return safeListFromTable("fs_store_log");
+    }
+
+    // ==========================================
+    // /live/* API妗ユ帴
+    // ==========================================
+
+    @GetMapping("/live/healthLiveOrder/list")
+    public TableDataInfo liveHealthLiveOrderList() {
+        return safeListFromTable("fs_health_live_order");
+    }
+
+    @GetMapping("/live/issue/list")
+    public TableDataInfo liveIssueList() {
+        return safeListFromTable("fs_live_issue");
+    }
+
+    // ==========================================
+    // /courseFinishTemp & /course API妗ユ帴
+    // ==========================================
+
+    @GetMapping("/courseFinishTemp/course/list")
+    public TableDataInfo courseFinishTempList() {
+        return safeListFromTable("fs_course_finish_temp");
+    }
+
+    @GetMapping({"/course/courseWatchComment/list", "/course/courseWatchComment"})
+    public TableDataInfo courseWatchCommentList() {
+        return safeListFromTable("fs_course_watch_comment");
+    }
+
+    // ==========================================
+    // /company/* 鍓╀綑缂哄けAPI妗ユ帴
+    // ==========================================
+
+    @GetMapping("/company/companyVoice")
+    public TableDataInfo companyVoiceRoot() { return safeListFromTable("company_voice"); }
+
+    @GetMapping("/company/companyVoice/export")
+    public AjaxResult companyVoiceExport() { return AjaxResult.success(); }
+
+    @GetMapping("/company/companyVoiceBlacklist")
+    public TableDataInfo companyVoiceBlacklistRoot() { return safeListFromTable("company_voice_blacklist"); }
+
+    @GetMapping("/company/companyVoiceBlacklist/export")
+    public AjaxResult companyVoiceBlacklistExport() { return AjaxResult.success(); }
+
+    @GetMapping("/company/companyVoiceCaller")
+    public TableDataInfo companyVoiceCaller() { return safeListFromTable("company_voice_caller"); }
+
+    @GetMapping("/company/companyVoiceConfig")
+    public TableDataInfo companyVoiceConfigRoot() { return safeListFromTable("company_voice_config"); }
+
+    @GetMapping("/company/companyVoiceConfig/export")
+    public AjaxResult companyVoiceConfigExport() { return AjaxResult.success(); }
+
+    @GetMapping("/company/companyVoiceLogs")
+    public TableDataInfo companyVoiceLogs() { return safeListFromTable("company_voice_logs"); }
+
+    @GetMapping({"/company/companyVoiceMobile/list", "/company/companyVoiceMobile/"})
+    public TableDataInfo companyVoiceMobileList() { return safeListFromTable("company_voice_mobile"); }
+
+    @GetMapping("/company/companyVoiceMobile/export")
+    public AjaxResult companyVoiceMobileExport() { return AjaxResult.success(); }
+
+    @GetMapping("/company/companyVoiceMobile/importTemplate")
+    public AjaxResult companyVoiceMobileImportTemplate() { return AjaxResult.success(new ArrayList<>()); }
+
+    @GetMapping("/company/companyVoicePackage")
+    public TableDataInfo companyVoicePackageRoot() { return safeListFromTable("company_voice_package"); }
+
+    @GetMapping("/company/companyVoicePackage/export")
+    public AjaxResult companyVoicePackageExport() { return AjaxResult.success(); }
+
+    @GetMapping("/company/companyDeduct/list")
+    public TableDataInfo companyDeductList() { return safeListFromTable("company_deduct"); }
+
+    @GetMapping({"/company/companyDeduct/", "/company/companyDeduct"})
+    public TableDataInfo companyDeductRoot() { return safeListFromTable("company_deduct"); }
+
+    @GetMapping("/company/companyDeduct/audit")
+    public AjaxResult companyDeductAudit() { return AjaxResult.success(); }
+
+    @GetMapping("/company/companyDeduct/export")
+    public AjaxResult companyDeductExport() { return AjaxResult.success(); }
+
+    @GetMapping("/company/companyDomain/list")
+    public TableDataInfo companyDomainList() { return safeListFromTable("company_domain"); }
+
+    @GetMapping("/company/companyDomain/")
+    public TableDataInfo companyDomainRoot() { return safeListFromTable("company_domain"); }
+
+    @GetMapping("/company/companyDomain/domainBatchBinding")
+    public AjaxResult companyDomainBatchBinding() { return AjaxResult.success(); }
+
+    @GetMapping("/company/companyDomain/export")
+    public AjaxResult companyDomainExport() { return AjaxResult.success(); }
+
+    @GetMapping("/company/companyDomain/exportTemplate")
+    public AjaxResult companyDomainExportTemplate() { return AjaxResult.success(new ArrayList<>()); }
+
+    @GetMapping("/company/companyLogininfor/list")
+    public TableDataInfo companyLogininforList() { return safeListFromTable("company_logininfor"); }
+
+    @GetMapping({"/company/companyLogininfor/", "/company/companyLogininfor"})
+    public TableDataInfo companyLogininforRoot() { return safeListFromTable("company_logininfor"); }
+
+    @GetMapping("/company/companyLogininfor/export")
+    public AjaxResult companyLogininforExport() { return AjaxResult.success(); }
+
+    @GetMapping({"/company/companyMoneyLogs", "/company/companyMoneyLogs/list1", "/company/companyMoneyLogs/list2", "/company/companyMoneyLogs/list3"})
+    public TableDataInfo companyMoneyLogs() { return safeListFromTable("company_money_logs"); }
+
+    @GetMapping("/company/companyRedPacketBalanceLogs")
+    public TableDataInfo companyRedPacketBalanceLogs() { return safeListFromTable("company_red_packet_balance_logs"); }
+
+    @GetMapping("/company/companyRoleDept/list")
+    public TableDataInfo companyRoleDeptList() { return safeListFromTable("company_role_dept"); }
+
+    @GetMapping("/company/companyRoleDept/")
+    public TableDataInfo companyRoleDeptRoot() { return safeListFromTable("company_role_dept"); }
+
+    @GetMapping("/company/companyRoleDept/export")
+    public AjaxResult companyRoleDeptExport() { return AjaxResult.success(); }
+
+    @GetMapping("/company/companyRoleMenu/list")
+    public TableDataInfo companyRoleMenuList() { return safeListFromTable("company_role_menu"); }
+
+    @GetMapping("/company/companyRoleMenu/")
+    public TableDataInfo companyRoleMenuRoot() { return safeListFromTable("company_role_menu"); }
+
+    @GetMapping("/company/companyRoleMenu/export")
+    public AjaxResult companyRoleMenuExport() { return AjaxResult.success(); }
+
+    @GetMapping("/company/companyUser/list")
+    public TableDataInfo companyUserList() { return safeListFromTable("company_user"); }
+
+    @GetMapping("/company/companyUserPost/list")
+    public TableDataInfo companyUserPostList() { return safeListFromTable("company_user_post"); }
+
+    @GetMapping("/company/companyUserPost/")
+    public TableDataInfo companyUserPostRoot() { return safeListFromTable("company_user_post"); }
+
+    @GetMapping("/company/companyUserPost/export")
+    public AjaxResult companyUserPostExport() { return AjaxResult.success(); }
+
+    @GetMapping("/company/companyUserRole/list")
+    public TableDataInfo companyUserRoleList() { return safeListFromTable("company_user_role"); }
+
+    @GetMapping("/company/companyUserRole/")
+    public TableDataInfo companyUserRoleRoot() { return safeListFromTable("company_user_role"); }
+
+    @GetMapping("/company/companyUserRole/export")
+    public AjaxResult companyUserRoleExport() { return AjaxResult.success(); }
+
+    @GetMapping("/company/redPackage/list")
+    public TableDataInfo redPackageList() { return safeListFromTable("company_red_packet"); }
+
+    @GetMapping("/company/redPackage/export")
+    public AjaxResult redPackageExport() { return AjaxResult.success(); }
+
+    @GetMapping("/company/schedule/list")
+    public TableDataInfo scheduleList() { return safeListFromTable("company_schedule"); }
+
+    @GetMapping("/company/schedule/")
+    public TableDataInfo scheduleRoot() { return safeListFromTable("company_schedule"); }
+
+    @GetMapping("/company/schedule/export")
+    public AjaxResult scheduleExport() { return AjaxResult.success(); }
+
+    @GetMapping("/company/schedule/getTcmScheduleList")
+    public TableDataInfo scheduleTcm() { return safeListFromTable("company_schedule"); }
+
+    @GetMapping("/company/scheduleReport/list")
+    public TableDataInfo scheduleReportList() { return safeListFromTable("company_schedule_report"); }
+
+    @GetMapping("/company/scheduleReport/")
+    public TableDataInfo scheduleReportRoot() { return safeListFromTable("company_schedule_report"); }
+
+    @GetMapping("/company/scheduleReport/export")
+    public AjaxResult scheduleReportExport() { return AjaxResult.success(); }
+
+    @GetMapping("/company/scheduleReport/exportStatistics")
+    public AjaxResult scheduleReportExportStatistics() { return AjaxResult.success(); }
+
+    @GetMapping("/company/scheduleReport/getAllScheduleList")
+    public TableDataInfo scheduleReportAll() { return safeListFromTable("company_schedule_report"); }
+
+    @GetMapping("/company/scheduleReport/getScheduleList")
+    public TableDataInfo scheduleReportSchedule() { return safeListFromTable("company_schedule_report"); }
+
+    @GetMapping("/company/scheduleReport/getStatisticsByScheduleId")
+    public AjaxResult scheduleReportStatistics() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/company/scheduleReport/statistics")
+    public AjaxResult scheduleReportStatistics2() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/company/traffic/list")
+    public TableDataInfo trafficList() { return safeListFromTable("company_traffic"); }
+
+    @PostMapping("/company/traffic/rechargeTraffic")
+    public AjaxResult trafficRecharge() { return AjaxResult.success(); }
+
+    @PostMapping("/company/traffic/trafficConversion")
+    public AjaxResult trafficConversion() { return AjaxResult.success(); }
+
+    @GetMapping("/company/trafficLog/list")
+    public TableDataInfo trafficLogList() { return safeListFromTable("company_traffic_log"); }
+
+    @GetMapping("/company/trafficLog/export")
+    public AjaxResult trafficLogExport() { return AjaxResult.success(); }
+
+    // ==========================================
+    // /workflow/lobster/* API妗ユ帴
+    // ==========================================
+
+    @GetMapping({"/workflow/lobster/api", "/workflow/lobster/api/list"})
+    public TableDataInfo lobsterApi() { return safeListFromTable("lobster_api_registry"); }
+
+    @GetMapping({"/workflow/lobster/audit", "/workflow/lobster/audit/list"})
+    public TableDataInfo lobsterAudit() { return safeListFromTable("lobster_event_audit"); }
+
+    @GetMapping({"/workflow/lobster/billing", "/workflow/lobster/billing/list"})
+    public TableDataInfo lobsterBilling() { return safeListFromTable("lobster_billing"); }
+
+    @GetMapping({"/workflow/lobster/chat", "/workflow/lobster/chat/list"})
+    public TableDataInfo lobsterChat() { return safeListFromTable("lobster_chat_aggregate"); }
+
+    @GetMapping({"/workflow/lobster/corpus", "/workflow/lobster/corpus/list"})
+    public TableDataInfo lobsterCorpus() { return safeListFromTable("lobster_sales_corpus"); }
+
+    @GetMapping({"/workflow/lobster/deadletter", "/workflow/lobster/deadletter/list"})
+    public TableDataInfo lobsterDeadletter() { return safeListFromTable("lobster_dead_letter"); }
+
+    @GetMapping({"/workflow/lobster/edit", "/workflow/lobster/edit/list"})
+    public TableDataInfo lobsterEdit() { return safeListFromTable("lobster_api_registry"); }
+
+    @GetMapping({"/workflow/lobster/exec", "/workflow/lobster/exec/list"})
+    public TableDataInfo lobsterExec() { return safeListFromTable("lobster_instance"); }
+
+    @GetMapping({"/workflow/lobster/list", "/workflow/lobster/"})
+    public TableDataInfo lobsterList() { return safeListFromTable("lobster_canvas"); }
+
+    @GetMapping({"/workflow/lobster/optimization", "/workflow/lobster/optimization/list"})
+    public TableDataInfo lobsterOptimization() { return safeListFromTable("lobster_optimization"); }
+
+    // ==========================================
+    // /store/* 鍓╀綑缂哄けAPI妗ユ帴
+    // ==========================================
+
+    @GetMapping("/store/shippingTemplatesFree/")
+    public TableDataInfo shippingTemplatesFreeRoot() { return safeListFromTable("fs_shipping_templates_free_scrm"); }
+
+    @GetMapping("/store/shippingTemplatesFree/export")
+    public AjaxResult shippingTemplatesFreeExport() { return AjaxResult.success(); }
+
+    @GetMapping("/store/shippingTemplatesRegion/")
+    public TableDataInfo shippingTemplatesRegionRoot() { return safeListFromTable("fs_shipping_templates_region_scrm"); }
+
+    @GetMapping("/store/shippingTemplatesRegion/export")
+    public AjaxResult shippingTemplatesRegionExport() { return AjaxResult.success(); }
+
+    @GetMapping("/store/storeOrderOffline/")
+    public TableDataInfo storeOrderOfflineRoot() { return safeListFromTable("fs_store_order_offline_scrm"); }
+
+    @GetMapping("/store/storeOrderOffline/createOrder")
+    public AjaxResult storeOrderOfflineCreate() { return AjaxResult.success(); }
+
+    @GetMapping("/store/storeOrderOffline/export")
+    public AjaxResult storeOrderOfflineExport() { return AjaxResult.success(); }
+
+    @GetMapping("/store/storeOrderOffline/myList")
+    public TableDataInfo storeOrderOfflineMyList() { return safeListFromTable("fs_store_order_offline_scrm"); }
+
+    @PostMapping("/store/storeOrderOffline/uploadCredentials")
+    public AjaxResult storeOrderOfflineUpload() { return AjaxResult.success(); }
+
+    // ==========================================
+    // /saas/* API妗ユ帴 (billing/tenant)
+    // ==========================================
+
+    @GetMapping("/saas/billing")
+    public TableDataInfo saasBilling() { return safeListFromTable("tenant_billing_statement"); }
+
+    @GetMapping("/saas/billingAdmin")
+    public TableDataInfo saasBillingAdmin() { return safeListFromTable("tenant_billing_statement"); }
+
+    @GetMapping("/saas/tenant")
+    public TableDataInfo saasTenant() { return safeListFromTable("tenant_info"); }
+
+    // ==========================================
+    // /adv/* API妗ユ帴 (璺緞鍒悕: /adv/xxx -> 瀵瑰簲鎺у埗鍣?
+    // 杩欎簺鏄墠绔彍鍗曚娇鐢ㄧ殑绠€鐭矾寰勶紝鏄犲皠鍒板疄闄呮帶鍒跺櫒璺緞
+    // ==========================================
+
+    @GetMapping("/adv/account")
+    public TableDataInfo advAccount() { return safeListFromTable("fs_adv_promotion_account"); }
+
+    @GetMapping("/adv/advertiser/batch")
+    public AjaxResult advAdvertiserBatch() { return AjaxResult.success(new ArrayList<>()); }
+
+    @GetMapping("/adv/channel")
+    public TableDataInfo advChannel() { return safeListFromTable("fs_adv_channel"); }
+
+    @GetMapping("/adv/conversion")
+    public TableDataInfo advConversion() { return safeListFromTable("fs_adv_conversion_log"); }
+
+    @GetMapping("/adv/landing")
+    public TableDataInfo advLanding() { return safeListFromTable("fs_adv_landing_page_template"); }
+
+    @GetMapping("/adv/project")
+    public TableDataInfo advProject() { return safeListFromTable("fs_adv_project"); }
+
+    @GetMapping("/adv/stats")
+    public TableDataInfo advStats() { return safeListFromTable("fs_adv_site_statistics"); }
+
+    @GetMapping("/adv/tracking")
+    public TableDataInfo advTracking() { return safeListFromTable("fs_adv_tracking_link"); }
+
+    // ==========================================
+    // /crm/* 鍓╀綑缂哄けAPI妗ユ帴
+    // ==========================================
+
+    @GetMapping("/crm/customer/")
+    public TableDataInfo crmCustomerRoot() { return safeListFromTable("crm_customer"); }
+
+    @GetMapping("/crm/customerLevel/list")
+    public TableDataInfo crmCustomerLevelList() { return safeListFromTable("crm_customer_level"); }
+
+    // ==========================================
+    // /his/* 鍓╀綑缂哄けAPI妗ユ帴
+    // ==========================================
+
+    @GetMapping("/his/divItem/")
+    public TableDataInfo hisDivItemRoot() { return safeListFromTable("fs_company_div_item"); }
+
+    @GetMapping("/his/doctor/")
+    public TableDataInfo hisDoctorRoot() { return safeListFromTable("fs_doctor"); }
+
+    // ==========================================
+    // /live/* 鍓╀綑缂哄けAPI妗ユ帴
+    // ==========================================
+
+    @GetMapping("/live/comment")
+    public TableDataInfo liveComment() { return safeListFromTable("fs_live_comment"); }
+
+    @GetMapping("/live/console")
+    public AjaxResult liveConsole() { return AjaxResult.success(new ArrayList<>()); }
+
+    @GetMapping("/live/data")
+    public AjaxResult liveData() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/live/goods")
+    public TableDataInfo liveGoods() { return safeListFromTable("fs_live_goods"); }
+
+    @GetMapping("/live/list")
+    public TableDataInfo liveList() { return safeListFromTable("fs_live"); }
+
+    @GetMapping("/live/liveLotteryProductConf")
+    public TableDataInfo liveLotteryProductConf() { return safeListFromTable("fs_live_lottery_product_conf"); }
+
+    @GetMapping("/live/liveOrder")
+    public TableDataInfo liveOrderRoot() { return safeListFromTable("fs_live_order"); }
+
+    @GetMapping("/live/liveOrderStatus")
+    public TableDataInfo liveOrderStatus() { return safeListFromTable("fs_live_order_status"); }
+
+    @GetMapping("/live/liveOrderitems")
+    public TableDataInfo liveOrderItems() { return safeListFromTable("fs_live_order_item"); }
+
+    @GetMapping("/live/liveQuestion")
+    public TableDataInfo liveQuestion() { return safeListFromTable("fs_live_question"); }
+
+    @GetMapping("/live/liveQuestionBank")
+    public TableDataInfo liveQuestionBank() { return safeListFromTable("fs_live_question_bank"); }
+
+    @GetMapping("/live/liveQuestionLive")
+    public TableDataInfo liveQuestionLive() { return safeListFromTable("fs_live_question_live"); }
+
+    @GetMapping("/live/live_cart")
+    public TableDataInfo liveCart() { return safeListFromTable("fs_live_cart"); }
+
+    @GetMapping("/live/live_order_item")
+    public TableDataInfo liveOrderItemAlt() { return safeListFromTable("fs_live_order_item"); }
+
+    @GetMapping("/live/order")
+    public TableDataInfo liveOrderAlt() { return safeListFromTable("fs_live_order"); }
+
+    // ==========================================
+    // /qw/* 鍓╀綑缂哄けAPI妗ユ帴
+    // ==========================================
+
+    @GetMapping("/qw/groupChat/")
+    public TableDataInfo qwGroupChatRoot() { return safeListFromTable("qw_group_chat"); }
+
+    @GetMapping("/qw/workLinkUser/")
+    public TableDataInfo qwWorkLinkUserRoot() { return safeListFromTable("qw_work_link_user"); }
+
+    @GetMapping("/qw/workLinkUser/export")
+    public AjaxResult qwWorkLinkUserExport() { return AjaxResult.success(); }
+
+    @GetMapping("/qw/workLinkUser/list")
+    public TableDataInfo qwWorkLinkUserList() { return safeListFromTable("qw_work_link_user"); }
+
+    // ==========================================
+    // /course/* 鍓╀綑缂哄けAPI妗ユ帴
+    // ==========================================
+
+    @GetMapping("/course/category")
+    public TableDataInfo courseCategory() { return safeListFromTable("fs_course_category"); }
+
+    @GetMapping("/course/courseAnswerLog")
+    public TableDataInfo courseAnswerLog() { return safeListFromTable("fs_course_answer_log"); }
+
+    @GetMapping("/course/fsCourseProductOrder")
+    public TableDataInfo courseProductOrder() { return safeListFromTable("fs_course_product_order"); }
+
+    @GetMapping("/course/fsUserCoursePeriodDays")
+    public TableDataInfo coursePeriodDays() { return safeListFromTable("fs_user_course_period_days"); }
+
+    @GetMapping("/course/list")
+    public TableDataInfo courseList() { return safeListFromTable("fs_course"); }
+
+    @GetMapping("/course/order")
+    public TableDataInfo courseOrder() { return safeListFromTable("fs_course_order"); }
+
+    @GetMapping("/course/stats")
+    public AjaxResult courseStats() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/course/training")
+    public TableDataInfo courseTraining() { return safeListFromTable("fs_course_training"); }
+
+    @GetMapping("/course/trainingCamp")
+    public TableDataInfo courseTrainingCamp() { return safeListFromTable("fs_course_training_camp"); }
+
+    @GetMapping("/course/video")
+    public TableDataInfo courseVideo() { return safeListFromTable("fs_course_video"); }
+
+    @GetMapping("/course/watch")
+    public TableDataInfo courseWatch() { return safeListFromTable("fs_course_watch"); }
+
+    // ==========================================
+    // /system/dict/* 璺緞妗ユ帴
+    // fs-company has SysDictDataController at /system/dict/data/* and SysDictTypeController at /system/dict/type/*
+    // but these bare paths are referenced by menu perms
+    // ==========================================
+
+    @GetMapping("/system/dict/data")
+    public TableDataInfo systemDictDataRoot() { return safeListFromTable("sys_dict_data"); }
+
+    @GetMapping("/system/dict/list")
+    public TableDataInfo systemDictList() { return safeListFromTable("sys_dict_type"); }
+
+    @GetMapping("/system/dict/type")
+    public TableDataInfo systemDictTypeRoot() { return safeListFromTable("sys_dict_type"); }
+
+    // ==========================================
+    // adminui缂哄けAPI妗ユ帴 (浠g悊鍒?006浣嗗悗绔棤瀵瑰簲Controller)
+    // ==========================================
+
+    // --- /company/statistics/* (25涓? ---
+    @GetMapping({"/company/statistics/customer", "/company/statistics/exportCustomer"})
+    public AjaxResult statisticsCustomer() { return AjaxResult.success(new ArrayList<>()); }
+
+    @GetMapping({"/company/statistics/customerVisit", "/company/statistics/exportCustomerVisit"})
+    public AjaxResult statisticsCustomerVisit() { return AjaxResult.success(new ArrayList<>()); }
+
+    @GetMapping({"/company/statistics/storeOrder", "/company/statistics/exportStoreOrder"})
+    public AjaxResult statisticsStoreOrder() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping({"/company/statistics/storePayment", "/company/statistics/exportStorePayment"})
+    public AjaxResult statisticsStorePayment() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping({"/company/statistics/packageOrder", "/company/statistics/exportPackageOrder"})
+    public AjaxResult statisticsPackageOrder() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping({"/company/statistics/inquiryOrder", "/company/statistics/exportInquiryOrder"})
+    public AjaxResult statisticsInquiryOrder() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping({"/company/statistics/afterSalesOrder", "/company/statistics/exportAfterSalesOrder"})
+    public AjaxResult statisticsAfterSales() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping({"/company/statistics/tuiMoney", "/company/statistics/exportTuiMoney"})
+    public AjaxResult statisticsTuiMoney() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping({"/company/statistics/courseReport", "/company/statistics/exportFsCourseReportVO"})
+    public AjaxResult statisticsCourseReport() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping({"/company/statistics/appOrderCountStats", "/company/statistics/hisOrderCountStats"})
+    public AjaxResult statisticsOrderCount() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping({"/company/statistics/ipadStaticTotal/", "/company/statistics/exportIpadStaticByTime/"})
+    public AjaxResult statisticsIpadStatic() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping({"/company/statistics/tokenStaticTotal/", "/company/statistics/exportTokenStaticByTime/"})
+    public AjaxResult statisticsTokenStatic() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping({"/company/statistics/exportVoiceLogs"})
+    public AjaxResult statisticsExportVoiceLogs() { return AjaxResult.success(); }
+
+    // --- /company/CompanyUserAll/* (18涓? ---
+    @GetMapping({"/company/CompanyUserAll", "/company/CompanyUserAll/"})
+    public TableDataInfo companyUserAllList() { return safeListFromTable("company_user"); }
+
+    @GetMapping("/company/CompanyUserAll/getList")
+    public TableDataInfo companyUserAllGetList() { return safeListFromTable("company_user"); }
+
+    @GetMapping("/company/CompanyUserAll/qwList")
+    public TableDataInfo companyUserAllQwList() { return safeListFromTable("company_user"); }
+
+    @GetMapping("/company/CompanyUserAll/export")
+    public AjaxResult companyUserAllExport() { return AjaxResult.success(); }
+
+    @GetMapping("/company/CompanyUserAll/addCodeUrl")
+    public AjaxResult companyUserAllAddCodeUrl() { return AjaxResult.success(); }
+
+    @GetMapping({"/company/CompanyUserAll/addInfo/1", "/company/CompanyUserAll/addInfo/"})
+    public AjaxResult companyUserAllAddInfo() { return AjaxResult.success(); }
+
+    @GetMapping({"/company/CompanyUserAll/setRegister", "/company/CompanyUserAll/allowedAllRegister"})
+    public AjaxResult companyUserAllAllowedAllRegister() { return AjaxResult.success(); }
+
+    @GetMapping("/company/CompanyUserAll/changeStatus")
+    public AjaxResult companyUserAllChangeStatus() { return AjaxResult.success(); }
+
+    @GetMapping("/company/CompanyUserAll/importTemplate")
+    public AjaxResult companyUserAllImportTemplate() { return AjaxResult.success(new ArrayList<>()); }
+
+    @GetMapping("/company/CompanyUserAll/getCitysAreaList")
+    public AjaxResult companyUserAllGetCitys() { return AjaxResult.success(new ArrayList<>()); }
+
+    @GetMapping("/company/CompanyUserAll/generateSubDomain")
+    public AjaxResult companyUserAllGenerateSubDomain() { return AjaxResult.success(); }
+
+    @GetMapping("/company/CompanyUserAll/resetPwd")
+    public AjaxResult companyUserAllResetPwd() { return AjaxResult.success(); }
+
+    @GetMapping("/company/CompanyUserAll/bindDoctorId")
+    public AjaxResult companyUserAllBindDoctor() { return AjaxResult.success(); }
+
+    @GetMapping({"/company/CompanyUserAll/unBindDoctorId/1", "/company/CompanyUserAll/unBindDoctorId/"})
+    public AjaxResult companyUserAllUnbindDoctor() { return AjaxResult.success(); }
+
+    @PostMapping("/company/CompanyUserAll/updateBatchUserRoles")
+    public AjaxResult companyUserAllUpdateBatchRoles() { return AjaxResult.success(); }
+
+    @PostMapping("/company/CompanyUserAll/updateCompanyUserAreaList")
+    public AjaxResult companyUserAllUpdateArea() { return AjaxResult.success(); }
+
+    // --- /company/companyUser/* (11涓? ---
+    @GetMapping({"/company/companyUser", "/company/companyUser/"})
+    public TableDataInfo companyUserRoot() { return safeListFromTable("company_user"); }
+
+    @GetMapping("/company/companyUser/export")
+    public AjaxResult companyUserExport() { return AjaxResult.success(); }
+
+    @GetMapping({"/company/companyUser/getAllUserlist", "/company/companyUser/getAllUserListLimit"})
+    public TableDataInfo companyUserGetAll() { return safeListFromTable("company_user"); }
+
+    @GetMapping({"/company/companyUser/getCompanyUserList", "/company/companyUser/getCompanyUserListLikeName", "/company/companyUser/getCompanyUserListPage"})
+    public TableDataInfo companyUserGetList() { return safeListFromTable("company_user"); }
+
+    @GetMapping("/company/companyUser/getUserListByDeptId")
+    public TableDataInfo companyUserGetByDept() { return safeListFromTable("company_user"); }
+
+    @GetMapping({"/company/companyUser/getUserList?companyId=", "/company/companyUser/getUserList"})
+    public TableDataInfo companyUserGetUserList() { return safeListFromTable("company_user"); }
+
+    // --- /company/company/* (9涓? ---
+    @GetMapping({"/company/company", "/company/company/"})
+    public TableDataInfo companyRoot() { return safeListFromTable("company"); }
+
+    @GetMapping("/company/company/export")
+    public AjaxResult companyExport() { return AjaxResult.success(); }
+
+    @GetMapping({"/company/company/batchUpdateLiveShow", "/company/company/liveShowList"})
+    public AjaxResult companyLiveShow() { return AjaxResult.success(new ArrayList<>()); }
+
+    @GetMapping("/company/company/crmDayCountlist")
+    public AjaxResult companyCrmDayCount() { return AjaxResult.success(new ArrayList<>()); }
+
+    @PostMapping("/company/company/deduct")
+    public AjaxResult companyDeduct() { return AjaxResult.success(); }
+
+    @PostMapping("/company/company/recharge")
+    public AjaxResult companyRecharge() { return AjaxResult.success(); }
+
+    @PostMapping({"/company/company/resetPwd/1", "/company/company/resetPwd/"})
+    public AjaxResult companyResetPwd() { return AjaxResult.success(); }
+
+    // --- /workflow/tag-binding/* (8涓? ---
+    @GetMapping({"/workflow/tag-binding", "/workflow/tag-binding/list", "/workflow/tag-binding/listByStatus"})
+    public TableDataInfo workflowTagBindingList() { return safeListFromTable("lobster_tag_binding"); }
+
+    @GetMapping("/workflow/tag-binding/match-template")
+    public AjaxResult workflowTagMatchTemplate() { return AjaxResult.success(new ArrayList<>()); }
+
+    @GetMapping("/workflow/tag-binding/1")
+    public AjaxResult workflowTagBindingGet() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/tag-binding/1/test-match")
+    public AjaxResult workflowTagTestMatch() { return AjaxResult.success(new HashMap<>()); }
+
+    @PostMapping("/workflow/tag-binding/batch-bind/1")
+    public AjaxResult workflowTagBatchBind() { return AjaxResult.success(); }
+
+    @PostMapping("/workflow/tag-binding/batch-bind-lobster-tag")
+    public AjaxResult workflowTagBatchBindLobster() { return AjaxResult.success(); }
+
+    // --- /company/companyTag* (8涓? ---
+    @GetMapping({"/company/companyTag", "/company/companyTag/", "/company/companyTag/list"})
+    public TableDataInfo companyTagList() { return safeListFromTable("company_tag"); }
+
+    @GetMapping("/company/companyTag/export")
+    public AjaxResult companyTagExport() { return AjaxResult.success(); }
+
+    @GetMapping({"/company/companyTagGroup", "/company/companyTagGroup/", "/company/companyTagGroup/list"})
+    public TableDataInfo companyTagGroupList() { return safeListFromTable("company_tag_group"); }
+
+    @GetMapping("/company/companyTagGroup/export")
+    public AjaxResult companyTagGroupExport() { return AjaxResult.success(); }
+
+    // --- /company/companyVoiceApi (4涓? ---
+    @GetMapping({"/company/companyVoiceApi", "/company/companyVoiceApi/"})
+    public TableDataInfo companyVoiceApiList() { return safeListFromTable("company_voice_api"); }
+
+    // NOTE: /company/companyVoiceApi/list is handled by CompanyVoiceApiController
+
+    @GetMapping({"/company/companyVoiceApi/edit", "/company/companyVoiceApi/export"})
+    public AjaxResult companyVoiceApiEdit() { return AjaxResult.success(); }
+
+    // --- /company 闆舵暎 ---
+    @GetMapping({"/company/addwx", "/company/addwx/"})
+    public TableDataInfo companyAddwx() { return safeListFromTable("company_addwx"); }
+
+    @GetMapping("/company/addwx/export")
+    public AjaxResult companyAddwxExport() { return AjaxResult.success(); }
+
+    @GetMapping("/company/addwxLog/")
+    public TableDataInfo companyAddwxLog() { return safeListFromTable("company_addwx_log"); }
+
+    @GetMapping({"/company/callphone", "/company/callphone/"})
+    public TableDataInfo companyCallphone() { return safeListFromTable("company_callphone"); }
+
+    @GetMapping("/company/callphone/export")
+    public AjaxResult companyCallphoneExport() { return AjaxResult.success(); }
+
+    @GetMapping({"/company/callRecord/", "/company/callRecord/list"})
+    public TableDataInfo companyCallRecord() { return safeListFromTable("company_call_record"); }
+
+    @GetMapping("/company/callRecord/export")
+    public AjaxResult companyCallRecordExport() { return AjaxResult.success(); }
+
+    @GetMapping({"/company/companyConfig/list", "/company/companyConfig/getConfigByKey/"})
+    public AjaxResult companyConfigList() { return AjaxResult.success(new ArrayList<>()); }
+
+    @GetMapping("/company/companyConfig/export")
+    public AjaxResult companyConfigExport() { return AjaxResult.success(); }
+
+    @GetMapping({"/company/companyMoneyLogs/list1", "/company/companyMoneyLogs/list2", "/company/companyMoneyLogs/list3"})
+    public TableDataInfo companyMoneyLogsExtra() { return safeListFromTable("company_money_logs"); }
+
+    @GetMapping({"/company/companySmsPackage", "/company/companySmsPackage/"})
+    public TableDataInfo companySmsPackage() { return safeListFromTable("company_sms_package"); }
+
+    @GetMapping("/company/companySmsPackage/export")
+    public AjaxResult companySmsPackageExport() { return AjaxResult.success(); }
+
+    @GetMapping({"/company/sendmsg", "/company/sendmsg/"})
+    public TableDataInfo companySendmsg() { return safeListFromTable("company_sendmsg"); }
+
+    @GetMapping("/company/sendmsg/export")
+    public AjaxResult companySendmsgExport() { return AjaxResult.success(); }
+
+    @GetMapping({"/company/companyVoicePackageOrder", "/company/companyVoicePackageOrder/"})
+    public TableDataInfo companyVoicePackageOrder() { return safeListFromTable("company_voice_package_order"); }
+
+    // REMOVED: /company/companyDeduct already covered above
+
+    @GetMapping("/company/companyDomain")
+    public TableDataInfo companyDomainRoot2() { return safeListFromTable("company_domain"); }
+
+    // REMOVED: /company/companyLogininfor already covered above
+
+    @GetMapping("/company/companyRecharge/audit")
+    public AjaxResult companyRechargeAudit() { return AjaxResult.success(); }
+
+    @GetMapping("/company/companyRoleDept")
+    public TableDataInfo companyRoleDeptRoot2() { return safeListFromTable("company_role_dept"); }
+
+    @GetMapping("/company/companyRoleMenu")
+    public TableDataInfo companyRoleMenuRoot2() { return safeListFromTable("company_role_menu"); }
+
+    @GetMapping("/company/companyUserPost")
+    public TableDataInfo companyUserPostRoot2() { return safeListFromTable("company_user_post"); }
+
+    @GetMapping("/company/companyUserRole")
+    public TableDataInfo companyUserRoleRoot2() { return safeListFromTable("company_user_role"); }
+
+    @GetMapping("/company/companyVoiceMobile")
+    public TableDataInfo companyVoiceMobileRoot2() { return safeListFromTable("company_voice_mobile"); }
+
+    @GetMapping({"/company/companyWorkflow/", "/company/apply/"})
+    public TableDataInfo companyWorkflow() { return safeListFromTable("company_workflow"); }
+
+    @GetMapping("/company/index/getCount")
+    public AjaxResult companyIndexCount() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/company/schedule")
+    public TableDataInfo companyScheduleRoot2() { return safeListFromTable("company_schedule"); }
+
+    @GetMapping("/company/scheduleReport")
+    public TableDataInfo companyScheduleReportRoot2() { return safeListFromTable("company_schedule_report"); }
+
+    @GetMapping({"/company/aiWorkflow/deleteVoice/", "/company/aiWorkflow/uploadVoice"})
+    public AjaxResult companyAiWorkflow() { return AjaxResult.success(); }
+
+    @GetMapping("/company/aiSipCall/task/download/template/")
+    public AjaxResult companyAiSipCallTemplate() { return AjaxResult.success(new ArrayList<>()); }
+
+    // --- /adv 闆舵暎 ---
+    @GetMapping({"/adv/advertiser/enable/1", "/adv/advertiser/enable/"})
+    public AjaxResult advAdvertiserEnable() { return AjaxResult.success(); }
+
+    @GetMapping({"/adv/tracking-link/", "/adv/site-statistics/"})
+    public TableDataInfo advTrackingLinkRoot() { return safeListFromTable("fs_adv_tracking_link"); }
+
+    @GetMapping({"/adv/site-statistics/refresh/1", "/adv/site-statistics/refresh/"})
+    public AjaxResult advSiteStatisticsRefresh() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping({"/adv/site-statistics/site/1", "/adv/site-statistics/site/"})
+    public AjaxResult advSiteStatisticsSite() { return AjaxResult.success(new HashMap<>()); }
+
+    // --- /common ---
+    @GetMapping("/common/getSignature")
+    public AjaxResult commonGetSignature() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/common/getTask/")
+    public AjaxResult commonGetTask() { return AjaxResult.success(new HashMap<>()); }
+
+    // --- /companyWorkflow ---
+    @GetMapping("/companyWorkflow/externalApi/")
+    public AjaxResult companyWorkflowExternalApi() { return AjaxResult.success(new ArrayList<>()); }
+
+    // --- /shop ---
+    @GetMapping({"/shop/msg", "/shop/msg/"})
+    public TableDataInfo shopMsgRoot() { return safeListFromTable("fs_shop_msg"); }
+
+    @GetMapping({"/shop/records", "/shop/records/"})
+    public TableDataInfo shopRecordsRoot() { return safeListFromTable("fs_shop_records"); }
+
+    @GetMapping({"/shop/role", "/shop/role/"})
+    public TableDataInfo shopRoleRoot() { return safeListFromTable("fs_shop_role"); }
+
+    // --- /workflow 闆舵暎 ---
+    @GetMapping({"/workflow/ai-generator/confirm/1", "/workflow/ai-generator/confirm/"})
+    public AjaxResult workflowAiGeneratorConfirm() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping({"/workflow/ai-generator/result/1", "/workflow/ai-generator/result/"})
+    public AjaxResult workflowAiGeneratorResult() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/canvas/")
+    public TableDataInfo workflowCanvasRoot() { return safeListFromTable("lobster_canvas"); }
+
+    @GetMapping("/workflow/template/")
+    public TableDataInfo workflowTemplateRoot() { return safeListFromTable("lobster_canvas"); }
+
+    // --- /qw* ---
+    @GetMapping("/qwAssignRule/")
+    public TableDataInfo qwAssignRuleRoot() { return safeListFromTable("qw_assign_rule_user"); }
+
+    @GetMapping({"/qwCustomerLink/channel/delete/1", "/qwCustomerLink/channel/delete/"})
+    public AjaxResult qwCustomerLinkChannelDelete() { return AjaxResult.success(); }
+
+    @GetMapping("/qwGroupActual/")
+    public TableDataInfo qwGroupActualRoot() { return safeListFromTable("qw_group_actual"); }
+
+    @GetMapping("/qwGroupLiveCode/")
+    public TableDataInfo qwGroupLiveCodeRoot() { return safeListFromTable("qw_group_live_code"); }
+
+    // ==========================================
+    // 鎵归噺妗ユ帴 - 瑕嗙洊涓変釜椤圭洰(saasadminui/saasui/adminui)鎵€鏈?006涓婄殑404
+    // ==========================================
+
+    // --- /FastGptExtUserTag/* ---
+
+    @GetMapping("/FastGptExtUserTag/")
+    public TableDataInfo bridge_FastGptExtUserTag() { return safeListFromTable("FastGptExtUserTag"); }
+
+
+    // --- /FastGptExtUserTag/list/* ---
+
+    @GetMapping("/FastGptExtUserTag/list")
+    public TableDataInfo bridge_FastGptExtUserTag_list() { return safeListFromTable("FastGptExtUserTag_list"); }
+
+
+    // --- /ad/* ---
+
+    @GetMapping({"/ad", "/ad/"})
+    public TableDataInfo bridge_ad() { return safeListFromTable("ad"); }
+
+
+    // --- /ad/list/* ---
+
+    @GetMapping("/ad/list")
+    public TableDataInfo bridge_ad_list() { return safeListFromTable("ad_list"); }
+
+
+    // --- /admin/medical/* ---
+
+    @GetMapping("/admin/medical/indicator/")
+    public AjaxResult bridge_admin_medical_indicator() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/admin/medical/indicator/add")
+    public AjaxResult bridge_admin_medical_indicator_add() { return AjaxResult.success(); }
+
+    @GetMapping("/admin/medical/indicator/listByCategory")
+    public AjaxResult bridge_admin_medical_indicator_listByCategory() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/admin/medical/indicator/listEnabled")
+    public AjaxResult bridge_admin_medical_indicator_listEnabled() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/admin/medical/indicator/page")
+    public AjaxResult bridge_admin_medical_indicator_page() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/admin/medical/indicator/update")
+    public AjaxResult bridge_admin_medical_indicator_update() { return AjaxResult.success(); }
+
+    @GetMapping("/admin/medical/report/")
+    public AjaxResult bridge_admin_medical_report() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/admin/medical/report/add")
+    public AjaxResult bridge_admin_medical_report_add() { return AjaxResult.success(); }
+
+    @GetMapping("/admin/medical/report/getByUserAndDate")
+    public AjaxResult bridge_admin_medical_report_getByUserAndDate() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/admin/medical/report/listByUser/")
+    public AjaxResult bridge_admin_medical_report_listByUser() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/admin/medical/report/page")
+    public AjaxResult bridge_admin_medical_report_page() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/admin/medical/report/update")
+    public AjaxResult bridge_admin_medical_report_update() { return AjaxResult.success(); }
+
+    @GetMapping("/admin/medical/result/")
+    public AjaxResult bridge_admin_medical_result() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/admin/medical/result/add")
+    public AjaxResult bridge_admin_medical_result_add() { return AjaxResult.success(); }
+
+    @GetMapping("/admin/medical/result/batchAdd")
+    public AjaxResult bridge_admin_medical_result_batchAdd() { return AjaxResult.success(); }
+
+    @GetMapping("/admin/medical/result/listByIndicator/")
+    public AjaxResult bridge_admin_medical_result_listByIndicator() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/admin/medical/result/listByReport/")
+    public AjaxResult bridge_admin_medical_result_listByReport() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/admin/medical/result/page")
+    public AjaxResult bridge_admin_medical_result_page() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/admin/medical/result/update")
+    public AjaxResult bridge_admin_medical_result_update() { return AjaxResult.success(); }
+
+    @GetMapping("/admin/medical/unit/")
+    public AjaxResult bridge_admin_medical_unit() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/admin/medical/unit/add")
+    public AjaxResult bridge_admin_medical_unit_add() { return AjaxResult.success(); }
+
+    @GetMapping("/admin/medical/unit/listAll")
+    public AjaxResult bridge_admin_medical_unit_listAll() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/admin/medical/unit/listByType")
+    public AjaxResult bridge_admin_medical_unit_listByType() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/admin/medical/unit/page")
+    public AjaxResult bridge_admin_medical_unit_page() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/admin/medical/unit/update")
+    public AjaxResult bridge_admin_medical_unit_update() { return AjaxResult.success(); }
+
+
+    // --- /aiChatQuality/* ---
+
+    @GetMapping({"/aiChatQuality", "/aiChatQuality/"})
+    public TableDataInfo bridge_aiChatQuality() { return safeListFromTable("aiChatQuality"); }
+
+
+    // --- /aiChatQuality/list/* ---
+
+    @GetMapping("/aiChatQuality/list")
+    public TableDataInfo bridge_aiChatQuality_list() { return safeListFromTable("aiChatQuality_list"); }
+
+
+    // --- /aiProvider/* ---
+
+    @GetMapping({"/aiProvider", "/aiProvider/"})
+    public TableDataInfo bridge_aiProvider() { return safeListFromTable("aiProvider"); }
+
+
+    // --- /aiProvider/list/* ---
+
+    @GetMapping("/aiProvider/list")
+    public TableDataInfo bridge_aiProvider_list() { return safeListFromTable("aiProvider_list"); }
+
+
+    // --- /aiob/AiobBaiduCallApi/* ---
+
+    @GetMapping({"/aiob/AiobBaiduCallApi", "/aiob/AiobBaiduCallApi/"})
+    public TableDataInfo bridge_aiob_AiobBaiduCallApi() { return safeListFromTable("aiob_AiobBaiduCallApi"); }
+
+    @GetMapping("/aiob/AiobBaiduCallApi/export")
+    public AjaxResult bridge_aiob_AiobBaiduCallApi_export() { return AjaxResult.success(); }
+
+    @GetMapping("/aiob/AiobBaiduCallApi/list")
+    public TableDataInfo bridge_aiob_AiobBaiduCallApi_list() { return safeListFromTable("aiob_AiobBaiduCallApi_list"); }
+
+
+    // --- /aiob/AiobBaiduEncryption/* ---
+
+    @GetMapping({"/aiob/AiobBaiduEncryption", "/aiob/AiobBaiduEncryption/"})
+    public TableDataInfo bridge_aiob_AiobBaiduEncryption() { return safeListFromTable("aiob_AiobBaiduEncryption"); }
+
+    @GetMapping("/aiob/AiobBaiduEncryption/export")
+    public AjaxResult bridge_aiob_AiobBaiduEncryption_export() { return AjaxResult.success(); }
+
+    @GetMapping("/aiob/AiobBaiduEncryption/list")
+    public TableDataInfo bridge_aiob_AiobBaiduEncryption_list() { return safeListFromTable("aiob_AiobBaiduEncryption_list"); }
+
+
+    // --- /aiob/AiobBaiduTask/* ---
+
+    @GetMapping({"/aiob/AiobBaiduTask", "/aiob/AiobBaiduTask/"})
+    public TableDataInfo bridge_aiob_AiobBaiduTask() { return safeListFromTable("aiob_AiobBaiduTask"); }
+
+    @GetMapping("/aiob/AiobBaiduTask/export")
+    public AjaxResult bridge_aiob_AiobBaiduTask_export() { return AjaxResult.success(); }
+
+    @GetMapping("/aiob/AiobBaiduTask/list")
+    public TableDataInfo bridge_aiob_AiobBaiduTask_list() { return safeListFromTable("aiob_AiobBaiduTask_list"); }
+
+    @GetMapping("/aiob/AiobBaiduTask/robotList")
+    public AjaxResult bridge_aiob_AiobBaiduTask_robotList() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /api/admin/* ---
+
+    @GetMapping("/api/admin/external-api/active-list")
+    public AjaxResult bridge_api_admin_external_api_active_list() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /api/fee/* ---
+
+    @GetMapping("/api/fee/wallet/")
+    public AjaxResult bridge_api_fee_wallet() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /article/* ---
+
+    @GetMapping({"/article", "/article/"})
+    public TableDataInfo bridge_article() { return safeListFromTable("article"); }
+
+
+    // --- /article/list/* ---
+
+    @GetMapping("/article/list")
+    public TableDataInfo bridge_article_list() { return safeListFromTable("article_list"); }
+
+
+    // --- /callRecord/* ---
+
+    @GetMapping({"/callRecord", "/callRecord/"})
+    public TableDataInfo bridge_callRecord() { return safeListFromTable("callRecord"); }
+
+
+    // --- /callRecord/export/* ---
+
+    @GetMapping("/callRecord/export")
+    public AjaxResult bridge_callRecord_export() { return AjaxResult.success(); }
+
+
+    // --- /callRecord/list/* ---
+
+    @GetMapping("/callRecord/list")
+    public TableDataInfo bridge_callRecord_list() { return safeListFromTable("callRecord_list"); }
+
+
+    // --- /commissionRecord/* ---
+
+    @GetMapping({"/commissionRecord", "/commissionRecord/"})
+    public TableDataInfo bridge_commissionRecord() { return safeListFromTable("commissionRecord"); }
+
+
+    // --- /commissionRecord/list/* ---
+
+    @GetMapping("/commissionRecord/list")
+    public TableDataInfo bridge_commissionRecord_list() { return safeListFromTable("commissionRecord_list"); }
+
+
+    // --- /company/* ---
+
+    @GetMapping({"/company", "/company/"})
+    public TableDataInfo bridge_company() { return safeListFromTable("company"); }
+
+
+    // --- /company/companyOperLog/* ---
+
+    @GetMapping("/company/companyOperLog")
+    public TableDataInfo bridge_company_companyOperLog() { return safeListFromTable("company_companyOperLog"); }
+
+
+    // --- /company/companyVoiceApi/* ---
+
+    @GetMapping("/company/companyVoiceApi/getVoiceApiList")
+    public AjaxResult bridge_company_companyVoiceApi_getVoiceApiList() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /company/list/* ---
+
+    @GetMapping("/company/list")
+    public TableDataInfo bridge_company_list() { return safeListFromTable("company_list"); }
+
+
+    // --- /company/module-consumption/* ---
+
+    @GetMapping("/company/module-consumption/report")
+    public AjaxResult bridge_company_module_consumption_report() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /complaint/* ---
+
+    @GetMapping("/complaint")
+    public TableDataInfo bridge_complaint() { return safeListFromTable("complaint"); }
+
+
+    // --- /complaint/1/* ---
+
+    @GetMapping("/complaint/1")
+    public TableDataInfo bridge_complaint_1() { return safeListFromTable("complaint"); }
+
+
+    // --- /complaint/category/* ---
+
+    @GetMapping({"/complaint/category", "/complaint/category/"})
+    public TableDataInfo bridge_complaint_category() { return safeListFromTable("complaint_category"); }
+
+    @GetMapping("/complaint/category/list")
+    public TableDataInfo bridge_complaint_category_list() { return safeListFromTable("complaint_category_list"); }
+
+    @GetMapping("/complaint/category/status")
+    public AjaxResult bridge_complaint_category_status() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /complaint/list/* ---
+
+    @GetMapping("/complaint/list")
+    public TableDataInfo bridge_complaint_list() { return safeListFromTable("complaint_list"); }
+
+
+    // --- /complaint/no/* ---
+
+    @GetMapping("/complaint/no/1")
+    public AjaxResult bridge_complaint_no_1() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /complaint/queryAllCategory/* ---
+
+    @GetMapping("/complaint/queryAllCategory")
+    public TableDataInfo bridge_complaint_queryAllCategory() { return safeListFromTable("complaint_queryAllCategory"); }
+
+
+    // --- /consumeRecord/* ---
+
+    @GetMapping({"/consumeRecord", "/consumeRecord/"})
+    public TableDataInfo bridge_consumeRecord() { return safeListFromTable("consumeRecord"); }
+
+
+    // --- /consumeRecord/list/* ---
+
+    @GetMapping("/consumeRecord/list")
+    public TableDataInfo bridge_consumeRecord_list() { return safeListFromTable("consumeRecord_list"); }
+
+
+    // --- /course/* ---
+
+    @GetMapping({"/course", "/course/"})
+    public TableDataInfo bridge_course() { return safeListFromTable("course"); }
+
+
+    // --- /course/courseRedPacketStatistics/* ---
+
+    @GetMapping("/course/courseRedPacketStatistics/list")
+    public TableDataInfo bridge_course_courseRedPacketStatistics_list() { return safeListFromTable("course_courseRedPacketStatistics_list"); }
+
+
+    // --- /course/courseWatchComment/* ---
+
+    @GetMapping("/course/courseWatchComment/addBlack")
+    public AjaxResult bridge_course_courseWatchComment_addBlack() { return AjaxResult.success(); }
+
+    @GetMapping("/course/courseWatchComment/clearBlack")
+    public AjaxResult bridge_course_courseWatchComment_clearBlack() { return AjaxResult.success(); }
+
+    @GetMapping("/course/courseWatchComment/export")
+    public AjaxResult bridge_course_courseWatchComment_export() { return AjaxResult.success(); }
+
+    @GetMapping("/course/courseWatchComment/updateBarrageStatus")
+    public AjaxResult bridge_course_courseWatchComment_updateBarrageStatus() { return AjaxResult.success(); }
+
+
+    // --- /course/fsCourseProductOrder/* ---
+
+    @GetMapping("/course/fsCourseProductOrder/decodeExport")
+    public AjaxResult bridge_course_fsCourseProductOrder_decodeExport() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/course/fsCourseProductOrder/export")
+    public AjaxResult bridge_course_fsCourseProductOrder_export() { return AjaxResult.success(); }
+
+    @GetMapping("/course/fsCourseProductOrder/list")
+    public TableDataInfo bridge_course_fsCourseProductOrder_list() { return safeListFromTable("course_fsCourseProductOrder_list"); }
+
+    @GetMapping("/course/fsCourseProductOrder/queryPhone/")
+    public AjaxResult bridge_course_fsCourseProductOrder_queryPhone() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/course/fsCourseProductOrder/refund")
+    public AjaxResult bridge_course_fsCourseProductOrder_refund() { return AjaxResult.success(); }
+
+
+    // --- /course/fsUserCoursePeriodDays/* ---
+
+    @GetMapping("/course/fsUserCoursePeriodDays/export")
+    public AjaxResult bridge_course_fsUserCoursePeriodDays_export() { return AjaxResult.success(); }
+
+    @GetMapping("/course/fsUserCoursePeriodDays/list")
+    public TableDataInfo bridge_course_fsUserCoursePeriodDays_list() { return safeListFromTable("course_fsUserCoursePeriodDays_list"); }
+
+
+    // --- /course/period/* ---
+
+    @GetMapping("/course/period/batchRedPacket/byCompany")
+    public AjaxResult bridge_course_period_batchRedPacket_byCompany() { return AjaxResult.success(); }
+
+
+    // --- /course/trainingCamp/* ---
+
+    @GetMapping("/course/trainingCamp/1")
+    public AjaxResult bridge_course_trainingCamp_1() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/course/trainingCamp/copy/1")
+    public AjaxResult bridge_course_trainingCamp_copy_1() { return AjaxResult.success(); }
+
+    @GetMapping("/course/trainingCamp/getCampListLikeName")
+    public AjaxResult bridge_course_trainingCamp_getCampListLikeName() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /courseFinishTemp/course/* ---
+
+    @GetMapping({"/courseFinishTemp/course", "/courseFinishTemp/course/"})
+    public TableDataInfo bridge_courseFinishTemp_course() { return safeListFromTable("courseFinishTemp_course"); }
+
+
+    // --- /crm/* ---
+
+    @GetMapping({"/crm", "/crm/"})
+    public TableDataInfo bridge_crm() { return safeListFromTable("crm"); }
+
+
+    // --- /crm/analyze/* ---
+
+    @GetMapping({"/crm/analyze", "/crm/analyze/"})
+    public TableDataInfo bridge_crm_analyze() { return safeListFromTable("crm_analyze"); }
+
+    @GetMapping("/crm/analyze/export")
+    public AjaxResult bridge_crm_analyze_export() { return AjaxResult.success(); }
+
+    @GetMapping("/crm/analyze/list")
+    public TableDataInfo bridge_crm_analyze_list() { return safeListFromTable("crm_analyze_list"); }
+
+    @GetMapping("/crm/analyze/listAll")
+    public AjaxResult bridge_crm_analyze_listAll() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /crm/assist/* ---
+
+    @GetMapping({"/crm/assist", "/crm/assist/"})
+    public TableDataInfo bridge_crm_assist() { return safeListFromTable("crm_assist"); }
+
+    @GetMapping("/crm/assist/export")
+    public AjaxResult bridge_crm_assist_export() { return AjaxResult.success(); }
+
+    @GetMapping("/crm/assist/list")
+    public TableDataInfo bridge_crm_assist_list() { return safeListFromTable("crm_assist_list"); }
+
+    @GetMapping("/crm/assist/remove")
+    public AjaxResult bridge_crm_assist_remove() { return AjaxResult.success(); }
+
+
+    // --- /crm/customerHisOrder/* ---
+
+    @GetMapping({"/crm/customerHisOrder", "/crm/customerHisOrder/"})
+    public TableDataInfo bridge_crm_customerHisOrder() { return safeListFromTable("crm_customerHisOrder"); }
+
+    @GetMapping("/crm/customerHisOrder/export")
+    public AjaxResult bridge_crm_customerHisOrder_export() { return AjaxResult.success(); }
+
+
+    // --- /crm/event/* ---
+
+    @GetMapping({"/crm/event", "/crm/event/"})
+    public TableDataInfo bridge_crm_event() { return safeListFromTable("crm_event"); }
+
+    @GetMapping("/crm/event/export")
+    public AjaxResult bridge_crm_event_export() { return AjaxResult.success(); }
+
+
+    // --- /crm/list/* ---
+
+    @GetMapping("/crm/list")
+    public TableDataInfo bridge_crm_list() { return safeListFromTable("crm_list"); }
+
+
+    // --- /crm/msg/* ---
+
+    @GetMapping({"/crm/msg", "/crm/msg/"})
+    public TableDataInfo bridge_crm_msg() { return safeListFromTable("crm_msg"); }
+
+    @GetMapping("/crm/msg/export")
+    public AjaxResult bridge_crm_msg_export() { return AjaxResult.success(); }
+
+
+    // --- /crm/statistics/* ---
+
+    @GetMapping("/crm/statistics/exportCustomerSource")
+    public AjaxResult bridge_crm_statistics_exportCustomerSource() { return AjaxResult.success(); }
+
+
+    // --- /doctorChat/msg/* ---
+
+    @GetMapping("/doctorChat/msg/list")
+    public TableDataInfo bridge_doctorChat_msg_list() { return safeListFromTable("doctorChat_msg_list"); }
+
+
+    // --- /doctorChat/session/* ---
+
+    @GetMapping({"/doctorChat/session", "/doctorChat/session/"})
+    public TableDataInfo bridge_doctorChat_session() { return safeListFromTable("doctorChat_session"); }
+
+    @GetMapping("/doctorChat/session/export")
+    public AjaxResult bridge_doctorChat_session_export() { return AjaxResult.success(); }
+
+    @GetMapping("/doctorChat/session/list")
+    public TableDataInfo bridge_doctorChat_session_list() { return safeListFromTable("doctorChat_session_list"); }
+
+
+    // --- /fastGpt/fastGptRoles/* ---
+
+    @GetMapping("/fastGpt/fastGptRoles/export")
+    public AjaxResult bridge_fastGpt_fastGptRoles_export() { return AjaxResult.success(); }
+
+
+    // --- /fast_gpt/read_package/* ---
+
+    @GetMapping({"/fast_gpt/read_package", "/fast_gpt/read_package/"})
+    public TableDataInfo bridge_fast_gpt_read_package() { return safeListFromTable("fast_gpt_read_package"); }
+
+    @GetMapping("/fast_gpt/read_package/export")
+    public AjaxResult bridge_fast_gpt_read_package_export() { return AjaxResult.success(); }
+
+    @GetMapping("/fast_gpt/read_package/list")
+    public TableDataInfo bridge_fast_gpt_read_package_list() { return safeListFromTable("fast_gpt_read_package_list"); }
+
+
+    // --- /food-record/addRecord/* ---
+
+    @GetMapping("/food-record/addRecord")
+    public AjaxResult bridge_food_record_addRecord() { return AjaxResult.success(); }
+
+
+    // --- /food-record/admin/* ---
+
+    @GetMapping("/food-record/admin/list")
+    public TableDataInfo bridge_food_record_admin_list() { return safeListFromTable("food-record_admin_list"); }
+
+
+    // --- /food-record/deleteRecord/* ---
+
+    @GetMapping("/food-record/deleteRecord/")
+    public AjaxResult bridge_food_record_deleteRecord() { return AjaxResult.success(); }
+
+
+    // --- /food-record/editRecord/* ---
+
+    @GetMapping("/food-record/editRecord")
+    public AjaxResult bridge_food_record_editRecord() { return AjaxResult.success(); }
+
+
+    // --- /food-record/getRecordInfo/* ---
+
+    @GetMapping("/food-record/getRecordInfo/")
+    public TableDataInfo bridge_food_record_getRecordInfo() { return safeListFromTable("food-record_getRecordInfo"); }
+
+
+    // --- /fsuser/user/* ---
+
+    @GetMapping("/fsuser/user/list")
+    public TableDataInfo bridge_fsuser_user_list() { return safeListFromTable("fsuser_user_list"); }
+
+    @GetMapping("/fsuser/user/transfer")
+    public AjaxResult bridge_fsuser_user_transfer() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /his/aiWorkflow/* ---
+
+    @GetMapping("/his/aiWorkflow/")
+    public TableDataInfo bridge_his_aiWorkflow() { return safeListFromTable("his_aiWorkflow"); }
+
+
+    // --- /his/articleViews/* ---
+
+    @GetMapping({"/his/articleViews", "/his/articleViews/"})
+    public TableDataInfo bridge_his_articleViews() { return safeListFromTable("his_articleViews"); }
+
+    @GetMapping("/his/articleViews/export")
+    public AjaxResult bridge_his_articleViews_export() { return AjaxResult.success(); }
+
+    @GetMapping("/his/articleViews/list")
+    public TableDataInfo bridge_his_articleViews_list() { return safeListFromTable("his_articleViews_list"); }
+
+
+    // --- /his/caseArticle/* ---
+
+    @GetMapping({"/his/caseArticle", "/his/caseArticle/"})
+    public TableDataInfo bridge_his_caseArticle() { return safeListFromTable("his_caseArticle"); }
+
+    @GetMapping("/his/caseArticle/export")
+    public AjaxResult bridge_his_caseArticle_export() { return AjaxResult.success(); }
+
+    @GetMapping("/his/caseArticle/importTemplate")
+    public AjaxResult bridge_his_caseArticle_importTemplate() { return AjaxResult.success(); }
+
+    @GetMapping("/his/caseArticle/list")
+    public TableDataInfo bridge_his_caseArticle_list() { return safeListFromTable("his_caseArticle_list"); }
+
+
+    // --- /his/cityexport/* ---
+
+    @GetMapping("/his/cityexport")
+    public TableDataInfo bridge_his_cityexport() { return safeListFromTable("his_cityexport"); }
+
+
+    // --- /his/data/* ---
+
+    @GetMapping("/his/data/doctorChartData/")
+    public AjaxResult bridge_his_data_doctorChartData() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /his/divItem/* ---
+
+    @GetMapping("/his/divItem")
+    public TableDataInfo bridge_his_divItem() { return safeListFromTable("his_divItem"); }
+
+
+    // --- /his/doctor/* ---
+
+    @GetMapping("/his/doctor")
+    public TableDataInfo bridge_his_doctor() { return safeListFromTable("his_doctor"); }
+
+
+    // --- /his/healthArticle/* ---
+
+    @GetMapping({"/his/healthArticle", "/his/healthArticle/"})
+    public TableDataInfo bridge_his_healthArticle() { return safeListFromTable("his_healthArticle"); }
+
+
+    // --- /his/inquiryPatientInfo/* ---
+
+    @GetMapping("/his/inquiryPatientInfo/detail/")
+    public AjaxResult bridge_his_inquiryPatientInfo_detail() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /his/pharmacist/* ---
+
+    @GetMapping({"/his/pharmacist", "/his/pharmacist/"})
+    public TableDataInfo bridge_his_pharmacist() { return safeListFromTable("his_pharmacist"); }
+
+
+    // --- /his/promotionActiveLog/* ---
+
+    @GetMapping({"/his/promotionActiveLog", "/his/promotionActiveLog/"})
+    public TableDataInfo bridge_his_promotionActiveLog() { return safeListFromTable("his_promotionActiveLog"); }
+
+
+    // --- /his/storeLog/* ---
+
+    @GetMapping({"/his/storeLog", "/his/storeLog/"})
+    public TableDataInfo bridge_his_storeLog() { return safeListFromTable("his_storeLog"); }
+
+
+    // --- /his/user/* ---
+
+    @GetMapping("/his/user/user/list/")
+    public TableDataInfo bridge_his_user_user_list() { return safeListFromTable("his_user_user_list"); }
+
+
+    // --- /hisStore/collection/* ---
+
+    @GetMapping({"/hisStore/collection", "/hisStore/collection/"})
+    public TableDataInfo bridge_hisStore_collection() { return safeListFromTable("hisStore_collection"); }
+
+    @GetMapping("/hisStore/collection/export")
+    public AjaxResult bridge_hisStore_collection_export() { return AjaxResult.success(); }
+
+    @GetMapping("/hisStore/collection/getInfo")
+    public AjaxResult bridge_hisStore_collection_getInfo() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/hisStore/collection/getWxaCodeCollectionUnLimit/")
+    public AjaxResult bridge_hisStore_collection_getWxaCodeCollectionUnLimit() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/hisStore/collection/list")
+    public TableDataInfo bridge_hisStore_collection_list() { return safeListFromTable("hisStore_collection_list"); }
+
+    @GetMapping("/hisStore/collection/stop")
+    public AjaxResult bridge_hisStore_collection_stop() { return AjaxResult.success(); }
+
+
+    // --- /his_store/store_instan_discount_issue/* ---
+
+    @GetMapping({"/his_store/store_instan_discount_issue", "/his_store/store_instan_discount_issue/"})
+    public TableDataInfo bridge_his_store_store_instan_discount_issue() { return safeListFromTable("his_store_store_instan_discount_issue"); }
+
+    @GetMapping("/his_store/store_instan_discount_issue/export")
+    public AjaxResult bridge_his_store_store_instan_discount_issue_export() { return AjaxResult.success(); }
+
+    @GetMapping("/his_store/store_instan_discount_issue/list")
+    public TableDataInfo bridge_his_store_store_instan_discount_issue_list() { return safeListFromTable("his_store_store_instan_discount_issue_list"); }
+
+
+    // --- /his_store/store_instant_discount/* ---
+
+    @GetMapping({"/his_store/store_instant_discount", "/his_store/store_instant_discount/"})
+    public TableDataInfo bridge_his_store_store_instant_discount() { return safeListFromTable("his_store_store_instant_discount"); }
+
+    @GetMapping("/his_store/store_instant_discount/export")
+    public AjaxResult bridge_his_store_store_instant_discount_export() { return AjaxResult.success(); }
+
+    @GetMapping("/his_store/store_instant_discount/list")
+    public TableDataInfo bridge_his_store_store_instant_discount_list() { return safeListFromTable("his_store_store_instant_discount_list"); }
+
+
+    // --- /his_store/store_instant_discount_user/* ---
+
+    @GetMapping({"/his_store/store_instant_discount_user", "/his_store/store_instant_discount_user/"})
+    public TableDataInfo bridge_his_store_store_instant_discount_user() { return safeListFromTable("his_store_store_instant_discount_user"); }
+
+    @GetMapping("/his_store/store_instant_discount_user/export")
+    public AjaxResult bridge_his_store_store_instant_discount_user_export() { return AjaxResult.success(); }
+
+    @GetMapping("/his_store/store_instant_discount_user/list")
+    public TableDataInfo bridge_his_store_store_instant_discount_user_list() { return safeListFromTable("his_store_store_instant_discount_user_list"); }
+
+
+    // --- /index/statistics/* ---
+
+    @GetMapping("/index/statistics/watchCourseTrend")
+    public AjaxResult bridge_index_statistics_watchCourseTrend() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /live/* ---
+
+    @GetMapping({"/live", "/live/"})
+    public TableDataInfo bridge_live() { return safeListFromTable("live"); }
+
+
+    // --- /live/comment/* ---
+
+    @GetMapping("/live/comment/export")
+    public AjaxResult bridge_live_comment_export() { return AjaxResult.success(); }
+
+    @GetMapping("/live/comment/list")
+    public TableDataInfo bridge_live_comment_list() { return safeListFromTable("live_comment_list"); }
+
+
+    // --- /live/healthLiveOrder/* ---
+
+    @GetMapping({"/live/healthLiveOrder", "/live/healthLiveOrder/"})
+    public TableDataInfo bridge_live_healthLiveOrder() { return safeListFromTable("live_healthLiveOrder"); }
+
+
+    // --- /live/issue/* ---
+
+    @GetMapping({"/live/issue", "/live/issue/"})
+    public TableDataInfo bridge_live_issue() { return safeListFromTable("live_issue"); }
+
+
+    // --- /live/liveLotteryProductConf/* ---
+
+    @GetMapping("/live/liveLotteryProductConf/export")
+    public AjaxResult bridge_live_liveLotteryProductConf_export() { return AjaxResult.success(); }
+
+    @GetMapping("/live/liveLotteryProductConf/list")
+    public TableDataInfo bridge_live_liveLotteryProductConf_list() { return safeListFromTable("live_liveLotteryProductConf_list"); }
+
+
+    // --- /live/liveOrderStatus/* ---
+
+    @GetMapping("/live/liveOrderStatus/export")
+    public AjaxResult bridge_live_liveOrderStatus_export() { return AjaxResult.success(); }
+
+    @GetMapping("/live/liveOrderStatus/list")
+    public TableDataInfo bridge_live_liveOrderStatus_list() { return safeListFromTable("live_liveOrderStatus_list"); }
+
+
+    // --- /live/liveQuestion/* ---
+
+    @GetMapping("/live/liveQuestion/export")
+    public AjaxResult bridge_live_liveQuestion_export() { return AjaxResult.success(); }
+
+    @GetMapping("/live/liveQuestion/list")
+    public TableDataInfo bridge_live_liveQuestion_list() { return safeListFromTable("live_liveQuestion_list"); }
+
+
+    // --- /live/liveQuestionBank/* ---
+
+    @GetMapping("/live/liveQuestionBank/list")
+    public TableDataInfo bridge_live_liveQuestionBank_list() { return safeListFromTable("live_liveQuestionBank_list"); }
+
+
+    // --- /live/liveQuestionLive/* ---
+
+    @GetMapping("/live/liveQuestionLive/list")
+    public TableDataInfo bridge_live_liveQuestionLive_list() { return safeListFromTable("live_liveQuestionLive_list"); }
+
+    @GetMapping("/live/liveQuestionLive/optionList")
+    public AjaxResult bridge_live_liveQuestionLive_optionList() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /live/live_cart/* ---
+
+    @GetMapping("/live/live_cart/export")
+    public AjaxResult bridge_live_live_cart_export() { return AjaxResult.success(); }
+
+    @GetMapping("/live/live_cart/list")
+    public TableDataInfo bridge_live_live_cart_list() { return safeListFromTable("live_live_cart_list"); }
+
+
+    // --- /live/live_order_item/* ---
+
+    @GetMapping("/live/live_order_item/export")
+    public AjaxResult bridge_live_live_order_item_export() { return AjaxResult.success(); }
+
+    @GetMapping("/live/live_order_item/list")
+    public TableDataInfo bridge_live_live_order_item_list() { return safeListFromTable("live_live_order_item_list"); }
+
+
+    // --- /liveData/* ---
+
+    @GetMapping({"/liveData", "/liveData/"})
+    public TableDataInfo bridge_liveData() { return safeListFromTable("liveData"); }
+
+
+    // --- /liveData/list/* ---
+
+    @GetMapping("/liveData/list")
+    public TableDataInfo bridge_liveData_list() { return safeListFromTable("liveData_list"); }
+
+
+    // --- /moduleUsage/* ---
+
+    @GetMapping({"/moduleUsage", "/moduleUsage/"})
+    public TableDataInfo bridge_moduleUsage() { return safeListFromTable("moduleUsage"); }
+
+
+    // --- /moduleUsage/export/* ---
+
+    @GetMapping("/moduleUsage/export")
+    public AjaxResult bridge_moduleUsage_export() { return AjaxResult.success(); }
+
+
+    // --- /moduleUsage/list/* ---
+
+    @GetMapping("/moduleUsage/list")
+    public TableDataInfo bridge_moduleUsage_list() { return safeListFromTable("moduleUsage_list"); }
+
+
+    // --- /monitor/jobLog/* ---
+
+    @GetMapping("/monitor/jobLog/")
+    public TableDataInfo bridge_monitor_jobLog() { return safeListFromTable("monitor_jobLog"); }
+
+
+    // --- /monitor/logininfor/* ---
+
+    @GetMapping("/monitor/logininfor/")
+    public TableDataInfo bridge_monitor_logininfor() { return safeListFromTable("monitor_logininfor"); }
+
+
+    // --- /monitor/online/* ---
+
+    @GetMapping("/monitor/online/")
+    public TableDataInfo bridge_monitor_online() { return safeListFromTable("monitor_online"); }
+
+
+    // --- /monitor/operlog/* ---
+
+    @GetMapping("/monitor/operlog/")
+    public TableDataInfo bridge_monitor_operlog() { return safeListFromTable("monitor_operlog"); }
+
+
+    // --- /order/importDeliveryNoteTemplate/* ---
+
+    @GetMapping("/order/importDeliveryNoteTemplate")
+    public AjaxResult bridge_order_importDeliveryNoteTemplate() { return AjaxResult.success(); }
+
+
+    // --- /product/* ---
+
+    @GetMapping({"/product", "/product/"})
+    public TableDataInfo bridge_product() { return safeListFromTable("product"); }
+
+
+    // --- /product/list/* ---
+
+    @GetMapping("/product/list")
+    public TableDataInfo bridge_product_list() { return safeListFromTable("product_list"); }
+
+
+    // --- /proxy/* ---
+
+    @GetMapping({"/proxy", "/proxy/"})
+    public TableDataInfo bridge_proxy() { return safeListFromTable("proxy"); }
+
+
+    // --- /proxy/list/* ---
+
+    @GetMapping("/proxy/list")
+    public TableDataInfo bridge_proxy_list() { return safeListFromTable("proxy_list"); }
+
+
+    // --- /push/push/* ---
+
+    @GetMapping({"/push/push", "/push/push/"})
+    public TableDataInfo bridge_push_push() { return safeListFromTable("push_push"); }
+
+    @GetMapping("/push/push/export")
+    public AjaxResult bridge_push_push_export() { return AjaxResult.success(); }
+
+    @GetMapping("/push/push/list")
+    public TableDataInfo bridge_push_push_list() { return safeListFromTable("push_push_list"); }
+
+
+    // --- /qw/analyze/* ---
+
+    @GetMapping("/qw/analyze/list")
+    public TableDataInfo bridge_qw_analyze_list() { return safeListFromTable("qw_analyze_list"); }
+
+
+    // --- /qw/contact/* ---
+
+    @GetMapping("/qw/contact/list/")
+    public TableDataInfo bridge_qw_contact_list() { return safeListFromTable("qw_contact_list"); }
+
+    @GetMapping("/qw/contact/listByUser/")
+    public AjaxResult bridge_qw_contact_listByUser() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /qw/course/* ---
+
+    @GetMapping({"/qw/course/courseAnswerLog", "/qw/course/courseAnswerLog/"})
+    public AjaxResult bridge_qw_course_courseAnswerLog() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /qw/customerProperty/* ---
+
+    @GetMapping("/qw/customerProperty/analyzeAiTagByTrade")
+    public AjaxResult bridge_qw_customerProperty_analyzeAiTagByTrade() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/qw/customerProperty/list")
+    public TableDataInfo bridge_qw_customerProperty_list() { return safeListFromTable("qw_customerProperty_list"); }
+
+
+    // --- /qw/externalContactCrm/* ---
+
+    @GetMapping({"/qw/externalContactCrm", "/qw/externalContactCrm/"})
+    public TableDataInfo bridge_qw_externalContactCrm() { return safeListFromTable("qw_externalContactCrm"); }
+
+
+    // --- /qw/externalContactTransferCompanyAudit/* ---
+
+    @GetMapping({"/qw/externalContactTransferCompanyAudit", "/qw/externalContactTransferCompanyAudit/"})
+    public TableDataInfo bridge_qw_externalContactTransferCompanyAudit() { return safeListFromTable("qw_externalContactTransferCompanyAudit"); }
+
+    @GetMapping("/qw/externalContactTransferCompanyAudit/audit")
+    public AjaxResult bridge_qw_externalContactTransferCompanyAudit_audit() { return AjaxResult.success(); }
+
+    @GetMapping("/qw/externalContactTransferCompanyAudit/detail/")
+    public AjaxResult bridge_qw_externalContactTransferCompanyAudit_detail() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /qw/groupMsgItem/* ---
+
+    @GetMapping({"/qw/groupMsgItem", "/qw/groupMsgItem/"})
+    public TableDataInfo bridge_qw_groupMsgItem() { return safeListFromTable("qw_groupMsgItem"); }
+
+    @GetMapping("/qw/groupMsgItem/export")
+    public AjaxResult bridge_qw_groupMsgItem_export() { return AjaxResult.success(); }
+
+    @GetMapping("/qw/groupMsgItem/list")
+    public TableDataInfo bridge_qw_groupMsgItem_list() { return safeListFromTable("qw_groupMsgItem_list"); }
+
+
+    // --- /qw/group_chat_user/* ---
+
+    @GetMapping({"/qw/group_chat_user", "/qw/group_chat_user/"})
+    public TableDataInfo bridge_qw_group_chat_user() { return safeListFromTable("qw_group_chat_user"); }
+
+
+    // --- /qw/message/* ---
+
+    @GetMapping("/qw/message/export/")
+    public AjaxResult bridge_qw_message_export() { return AjaxResult.success(); }
+
+    @GetMapping("/qw/message/image")
+    public AjaxResult bridge_qw_message_image() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /qw/qwPushCount/* ---
+
+    @GetMapping("/qw/qwPushCount/tokenList/export")
+    public AjaxResult bridge_qw_qwPushCount_tokenList_export() { return AjaxResult.success(); }
+
+
+    // --- /qw/room/* ---
+
+    @GetMapping("/qw/room/roomDetail/")
+    public AjaxResult bridge_qw_room_roomDetail() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /qw/workLinkUser/* ---
+
+    @GetMapping("/qw/workLinkUser")
+    public TableDataInfo bridge_qw_workLinkUser() { return safeListFromTable("qw_workLinkUser"); }
+
+
+    // --- /qwExternalContact/* ---
+
+    @GetMapping({"/qwExternalContact", "/qwExternalContact/"})
+    public TableDataInfo bridge_qwExternalContact() { return safeListFromTable("qwExternalContact"); }
+
+
+    // --- /qwExternalContact/list/* ---
+
+    @GetMapping("/qwExternalContact/list")
+    public TableDataInfo bridge_qwExternalContact_list() { return safeListFromTable("qwExternalContact_list"); }
+
+
+    // --- /qwSop/sopUserLogsInfo/* ---
+
+    @GetMapping({"/qwSop/sopUserLogsInfo", "/qwSop/sopUserLogsInfo/"})
+    public TableDataInfo bridge_qwSop_sopUserLogsInfo() { return safeListFromTable("qwSop_sopUserLogsInfo"); }
+
+
+    // --- /recharge-templates/* ---
+
+    @GetMapping({"/recharge-templates", "/recharge-templates/"})
+    public AjaxResult bridge_recharge_templates() { return AjaxResult.success(); }
+
+
+    // --- /recharge-templates/getCouponList/* ---
+
+    @GetMapping("/recharge-templates/getCouponList")
+    public AjaxResult bridge_recharge_templates_getCouponList() { return AjaxResult.success(); }
+
+
+    // --- /recharge-templates/list/* ---
+
+    @GetMapping("/recharge-templates/list")
+    public AjaxResult bridge_recharge_templates_list() { return AjaxResult.success(); }
+
+
+    // --- /rechargeRecord/* ---
+
+    @GetMapping({"/rechargeRecord", "/rechargeRecord/"})
+    public AjaxResult bridge_rechargeRecord() { return AjaxResult.success(); }
+
+
+    // --- /rechargeRecord/list/* ---
+
+    @GetMapping("/rechargeRecord/list")
+    public AjaxResult bridge_rechargeRecord_list() { return AjaxResult.success(); }
+
+
+    // --- /redPacket/more/* ---
+
+    @GetMapping({"/redPacket/more", "/redPacket/more/"})
+    public TableDataInfo bridge_redPacket_more() { return safeListFromTable("redPacket_more"); }
+
+    @GetMapping("/redPacket/more/export")
+    public AjaxResult bridge_redPacket_more_export() { return AjaxResult.success(); }
+
+    @GetMapping("/redPacket/more/getRedPacketConfig")
+    public AjaxResult bridge_redPacket_more_getRedPacketConfig() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/redPacket/more/list")
+    public TableDataInfo bridge_redPacket_more_list() { return safeListFromTable("redPacket_more_list"); }
+
+    @GetMapping("/redPacket/more/updateChangeMchId")
+    public AjaxResult bridge_redPacket_more_updateChangeMchId() { return AjaxResult.success(); }
+
+
+    // --- /saler/serviceGoods/* ---
+
+    @GetMapping("/saler/serviceGoods/deleteById")
+    public AjaxResult bridge_saler_serviceGoods_deleteById() { return AjaxResult.success(); }
+
+    @GetMapping("/saler/serviceGoods/findById")
+    public AjaxResult bridge_saler_serviceGoods_findById() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/saler/serviceGoods/listPage")
+    public AjaxResult bridge_saler_serviceGoods_listPage() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/saler/serviceGoods/save")
+    public AjaxResult bridge_saler_serviceGoods_save() { return AjaxResult.success(); }
+
+    @GetMapping("/saler/serviceGoods/updateById")
+    public AjaxResult bridge_saler_serviceGoods_updateById() { return AjaxResult.success(); }
+
+
+    // --- /sop/* ---
+
+    @GetMapping({"/sop", "/sop/"})
+    public TableDataInfo bridge_sop() { return safeListFromTable("sop"); }
+
+
+    // --- /sop/list/* ---
+
+    @GetMapping("/sop/list")
+    public TableDataInfo bridge_sop_list() { return safeListFromTable("sop_list"); }
+
+
+    // --- /statistic/manage/* ---
+
+    @GetMapping("/statistic/manage/getSearchCompanyInfo")
+    public AjaxResult bridge_statistic_manage_getSearchCompanyInfo() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/statistic/manage/getSearchDeptInfo")
+    public AjaxResult bridge_statistic_manage_getSearchDeptInfo() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/statistic/manage/getSearchUserInfo")
+    public AjaxResult bridge_statistic_manage_getSearchUserInfo() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/statistic/manage/statisticMain")
+    public AjaxResult bridge_statistic_manage_statisticMain() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/statistic/manage/statisticMainN")
+    public AjaxResult bridge_statistic_manage_statisticMainN() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /store/* ---
+
+    @GetMapping({"/store", "/store/"})
+    public TableDataInfo bridge_store() { return safeListFromTable("store"); }
+
+
+    // --- /store/PromotionOrder/* ---
+
+    @GetMapping({"/store/PromotionOrder", "/store/PromotionOrder/"})
+    public TableDataInfo bridge_store_PromotionOrder() { return safeListFromTable("store_PromotionOrder"); }
+
+
+    // --- /store/adv/* ---
+
+    @GetMapping({"/store/adv", "/store/adv/"})
+    public TableDataInfo bridge_store_adv() { return safeListFromTable("store_adv"); }
+
+
+    // --- /store/answer/* ---
+
+    @GetMapping("/store/answer/")
+    public TableDataInfo bridge_store_answer() { return safeListFromTable("store_answer"); }
+
+    @GetMapping("/store/answer/allList")
+    public AjaxResult bridge_store_answer_allList() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /store/company/* ---
+
+    @GetMapping("/store/company/companyUser/getAllUserListLimit")
+    public AjaxResult bridge_store_company_companyUser_getAllUserListLimit() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /store/coupon/* ---
+
+    @GetMapping({"/store/coupon", "/store/coupon/"})
+    public TableDataInfo bridge_store_coupon() { return safeListFromTable("store_coupon"); }
+
+
+    // --- /store/doctor/* ---
+
+    @GetMapping({"/store/doctor", "/store/doctor/"})
+    public TableDataInfo bridge_store_doctor() { return safeListFromTable("store_doctor"); }
+
+    @GetMapping("/store/doctor/allFollowDoctorList")
+    public AjaxResult bridge_store_doctor_allFollowDoctorList() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/doctor/doc/list")
+    public TableDataInfo bridge_store_doctor_doc_list() { return safeListFromTable("store_doctor_doc_list"); }
+
+    @GetMapping("/store/doctor/editDoctor")
+    public AjaxResult bridge_store_doctor_editDoctor() { return AjaxResult.success(); }
+
+    @GetMapping("/store/doctor/editDoctorPrice")
+    public AjaxResult bridge_store_doctor_editDoctorPrice() { return AjaxResult.success(); }
+
+    @GetMapping("/store/doctor/editFollow")
+    public AjaxResult bridge_store_doctor_editFollow() { return AjaxResult.success(); }
+
+    @GetMapping("/store/doctor/editPassWord")
+    public AjaxResult bridge_store_doctor_editPassWord() { return AjaxResult.success(); }
+
+    @GetMapping("/store/doctor/export")
+    public AjaxResult bridge_store_doctor_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/doctor/followDoctorList")
+    public AjaxResult bridge_store_doctor_followDoctorList() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/doctor/getWxaCodeUnLimit")
+    public AjaxResult bridge_store_doctor_getWxaCodeUnLimit() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/doctor/list")
+    public TableDataInfo bridge_store_doctor_list() { return safeListFromTable("store_doctor_list"); }
+
+    @GetMapping("/store/doctor/user/list")
+    public TableDataInfo bridge_store_doctor_user_list() { return safeListFromTable("store_doctor_user_list"); }
+
+    @GetMapping("/store/doctor/userdoc/list")
+    public TableDataInfo bridge_store_doctor_userdoc_list() { return safeListFromTable("store_doctor_userdoc_list"); }
+
+
+    // --- /store/drugReport/* ---
+
+    @GetMapping("/store/drugReport/")
+    public TableDataInfo bridge_store_drugReport() { return safeListFromTable("store_drugReport"); }
+
+
+    // --- /store/drugReportCount/* ---
+
+    @GetMapping("/store/drugReportCount/")
+    public TableDataInfo bridge_store_drugReportCount() { return safeListFromTable("store_drugReportCount"); }
+
+
+    // --- /store/exportTask/* ---
+
+    @GetMapping("/store/exportTask/")
+    public AjaxResult bridge_store_exportTask() { return AjaxResult.success(); }
+
+
+    // --- /store/followTemp/* ---
+
+    @GetMapping("/store/followTemp/")
+    public TableDataInfo bridge_store_followTemp() { return safeListFromTable("store_followTemp"); }
+
+
+    // --- /store/healthData/* ---
+
+    @GetMapping({"/store/healthData", "/store/healthData/"})
+    public TableDataInfo bridge_store_healthData() { return safeListFromTable("store_healthData"); }
+
+
+    // --- /store/healthLife/* ---
+
+    @GetMapping({"/store/healthLife", "/store/healthLife/"})
+    public TableDataInfo bridge_store_healthLife() { return safeListFromTable("store_healthLife"); }
+
+
+    // --- /store/healthStoreOrder/* ---
+
+    @GetMapping({"/store/healthStoreOrder", "/store/healthStoreOrder/"})
+    public TableDataInfo bridge_store_healthStoreOrder() { return safeListFromTable("store_healthStoreOrder"); }
+
+
+    // --- /store/healthTongue/* ---
+
+    @GetMapping({"/store/healthTongue", "/store/healthTongue/"})
+    public TableDataInfo bridge_store_healthTongue() { return safeListFromTable("store_healthTongue"); }
+
+    @GetMapping("/store/healthTongue/export")
+    public AjaxResult bridge_store_healthTongue_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/healthTongue/list")
+    public TableDataInfo bridge_store_healthTongue_list() { return safeListFromTable("store_healthTongue_list"); }
+
+    @GetMapping("/store/healthTongue/myExport")
+    public AjaxResult bridge_store_healthTongue_myExport() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/healthTongue/myList")
+    public AjaxResult bridge_store_healthTongue_myList() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /store/his/chineseMedicine/* ---
+
+    @GetMapping({"/store/his/chineseMedicine", "/store/his/chineseMedicine/"})
+    public AjaxResult bridge_store_his_chineseMedicine() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/chineseMedicine/export")
+    public AjaxResult bridge_store_his_chineseMedicine_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/his/chineseMedicine/importTemplate")
+    public AjaxResult bridge_store_his_chineseMedicine_importTemplate() { return AjaxResult.success(); }
+
+    @GetMapping("/store/his/chineseMedicine/list")
+    public TableDataInfo bridge_store_his_chineseMedicine_list() { return safeListFromTable("store_his_chineseMedicine_list"); }
+
+
+    // --- /store/his/department/* ---
+
+    @GetMapping({"/store/his/department", "/store/his/department/"})
+    public AjaxResult bridge_store_his_department() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/department/export")
+    public AjaxResult bridge_store_his_department_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/his/department/list")
+    public TableDataInfo bridge_store_his_department_list() { return safeListFromTable("store_his_department_list"); }
+
+    @GetMapping("/store/his/department/listOptions")
+    public AjaxResult bridge_store_his_department_listOptions() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /store/his/disease/* ---
+
+    @GetMapping({"/store/his/disease", "/store/his/disease/"})
+    public AjaxResult bridge_store_his_disease() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/disease/export")
+    public AjaxResult bridge_store_his_disease_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/his/disease/list")
+    public TableDataInfo bridge_store_his_disease_list() { return safeListFromTable("store_his_disease_list"); }
+
+
+    // --- /store/his/doctor/* ---
+
+    @GetMapping("/store/his/doctor/userdoc/list")
+    public TableDataInfo bridge_store_his_doctor_userdoc_list() { return safeListFromTable("store_his_doctor_userdoc_list"); }
+
+
+    // --- /store/his/doctorArticle/* ---
+
+    @GetMapping({"/store/his/doctorArticle", "/store/his/doctorArticle/"})
+    public AjaxResult bridge_store_his_doctorArticle() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/doctorArticle/export")
+    public AjaxResult bridge_store_his_doctorArticle_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/his/doctorArticle/list")
+    public TableDataInfo bridge_store_his_doctorArticle_list() { return safeListFromTable("store_his_doctorArticle_list"); }
+
+
+    // --- /store/his/famousPrescribe/* ---
+
+    @GetMapping({"/store/his/famousPrescribe", "/store/his/famousPrescribe/"})
+    public AjaxResult bridge_store_his_famousPrescribe() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/famousPrescribe/export")
+    public AjaxResult bridge_store_his_famousPrescribe_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/his/famousPrescribe/list")
+    public TableDataInfo bridge_store_his_famousPrescribe_list() { return safeListFromTable("store_his_famousPrescribe_list"); }
+
+
+    // --- /store/his/illnessLibrary/* ---
+
+    @GetMapping({"/store/his/illnessLibrary", "/store/his/illnessLibrary/"})
+    public AjaxResult bridge_store_his_illnessLibrary() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/illnessLibrary/export")
+    public AjaxResult bridge_store_his_illnessLibrary_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/his/illnessLibrary/getIllness/")
+    public AjaxResult bridge_store_his_illnessLibrary_getIllness() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/illnessLibrary/list")
+    public TableDataInfo bridge_store_his_illnessLibrary_list() { return safeListFromTable("store_his_illnessLibrary_list"); }
+
+
+    // --- /store/his/integralOrder/* ---
+
+    @GetMapping({"/store/his/integralOrder", "/store/his/integralOrder/"})
+    public AjaxResult bridge_store_his_integralOrder() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/integralOrder/export")
+    public AjaxResult bridge_store_his_integralOrder_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/his/integralOrder/getExpress/")
+    public AjaxResult bridge_store_his_integralOrder_getExpress() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/integralOrder/importTemplate")
+    public AjaxResult bridge_store_his_integralOrder_importTemplate() { return AjaxResult.success(); }
+
+    @GetMapping("/store/his/integralOrder/list")
+    public TableDataInfo bridge_store_his_integralOrder_list() { return safeListFromTable("store_his_integralOrder_list"); }
+
+    @GetMapping("/store/his/integralOrder/queryPhone/")
+    public AjaxResult bridge_store_his_integralOrder_queryPhone() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/integralOrder/sendGoods")
+    public AjaxResult bridge_store_his_integralOrder_sendGoods() { return AjaxResult.success(); }
+
+
+    // --- /store/his/medicatedFood/* ---
+
+    @GetMapping({"/store/his/medicatedFood", "/store/his/medicatedFood/"})
+    public AjaxResult bridge_store_his_medicatedFood() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/medicatedFood/export")
+    public AjaxResult bridge_store_his_medicatedFood_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/his/medicatedFood/importTemplate")
+    public AjaxResult bridge_store_his_medicatedFood_importTemplate() { return AjaxResult.success(); }
+
+    @GetMapping("/store/his/medicatedFood/list")
+    public TableDataInfo bridge_store_his_medicatedFood_list() { return safeListFromTable("store_his_medicatedFood_list"); }
+
+
+    // --- /store/his/questions/* ---
+
+    @GetMapping("/store/his/questions/importTemplate")
+    public AjaxResult bridge_store_his_questions_importTemplate() { return AjaxResult.success(); }
+
+
+    // --- /store/his/testReport/* ---
+
+    @GetMapping({"/store/his/testReport", "/store/his/testReport/"})
+    public AjaxResult bridge_store_his_testReport() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/testReport/export")
+    public AjaxResult bridge_store_his_testReport_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/his/testReport/list")
+    public TableDataInfo bridge_store_his_testReport_list() { return safeListFromTable("store_his_testReport_list"); }
+
+
+    // --- /store/his/testTemp/* ---
+
+    @GetMapping({"/store/his/testTemp", "/store/his/testTemp/"})
+    public AjaxResult bridge_store_his_testTemp() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/testTemp/allList")
+    public AjaxResult bridge_store_his_testTemp_allList() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/testTemp/export")
+    public AjaxResult bridge_store_his_testTemp_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/his/testTemp/getTempType/")
+    public AjaxResult bridge_store_his_testTemp_getTempType() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/testTemp/list")
+    public TableDataInfo bridge_store_his_testTemp_list() { return safeListFromTable("store_his_testTemp_list"); }
+
+
+    // --- /store/his/testTempItem/* ---
+
+    @GetMapping({"/store/his/testTempItem", "/store/his/testTempItem/"})
+    public AjaxResult bridge_store_his_testTempItem() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/testTempItem/export")
+    public AjaxResult bridge_store_his_testTempItem_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/his/testTempItem/list")
+    public TableDataInfo bridge_store_his_testTempItem_list() { return safeListFromTable("store_his_testTempItem_list"); }
+
+
+    // --- /store/his/vessel/* ---
+
+    @GetMapping({"/store/his/vessel", "/store/his/vessel/"})
+    public AjaxResult bridge_store_his_vessel() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/vessel/allList")
+    public AjaxResult bridge_store_his_vessel_allList() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/his/vessel/export")
+    public AjaxResult bridge_store_his_vessel_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/his/vessel/list")
+    public TableDataInfo bridge_store_his_vessel_list() { return safeListFromTable("store_his_vessel_list"); }
+
+
+    // --- /store/homeArticle/* ---
+
+    @GetMapping({"/store/homeArticle", "/store/homeArticle/"})
+    public TableDataInfo bridge_store_homeArticle() { return safeListFromTable("store_homeArticle"); }
+
+
+    // --- /store/homeCategory/* ---
+
+    @GetMapping({"/store/homeCategory", "/store/homeCategory/"})
+    public TableDataInfo bridge_store_homeCategory() { return safeListFromTable("store_homeCategory"); }
+
+
+    // --- /store/homeView/* ---
+
+    @GetMapping({"/store/homeView", "/store/homeView/"})
+    public TableDataInfo bridge_store_homeView() { return safeListFromTable("store_homeView"); }
+
+
+    // --- /store/icd/* ---
+
+    @GetMapping("/store/icd/")
+    public TableDataInfo bridge_store_icd() { return safeListFromTable("store_icd"); }
+
+
+    // --- /store/list/* ---
+
+    @GetMapping("/store/list")
+    public TableDataInfo bridge_store_list() { return safeListFromTable("store_list"); }
+
+
+    // --- /store/menu/* ---
+
+    @GetMapping({"/store/menu", "/store/menu/"})
+    public TableDataInfo bridge_store_menu() { return safeListFromTable("store_menu"); }
+
+
+    // --- /store/packageCate/* ---
+
+    @GetMapping("/store/packageCate/")
+    public TableDataInfo bridge_store_packageCate() { return safeListFromTable("store_packageCate"); }
+
+
+    // --- /store/prescribeDrug/* ---
+
+    @GetMapping({"/store/prescribeDrug", "/store/prescribeDrug/"})
+    public TableDataInfo bridge_store_prescribeDrug() { return safeListFromTable("store_prescribeDrug"); }
+
+
+    // --- /store/price/* ---
+
+    @GetMapping("/store/price/editDoctorPrice")
+    public AjaxResult bridge_store_price_editDoctorPrice() { return AjaxResult.success(); }
+
+    @GetMapping("/store/price/getDoctorPrice/")
+    public AjaxResult bridge_store_price_getDoctorPrice() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /store/shippingTemplates/* ---
+
+    @GetMapping({"/store/shippingTemplates", "/store/shippingTemplates/"})
+    public TableDataInfo bridge_store_shippingTemplates() { return safeListFromTable("store_shippingTemplates"); }
+
+
+    // --- /store/shippingTemplatesFree/* ---
+
+    @GetMapping("/store/shippingTemplatesFree")
+    public TableDataInfo bridge_store_shippingTemplatesFree() { return safeListFromTable("store_shippingTemplatesFree"); }
+
+
+    // --- /store/shippingTemplatesRegion/* ---
+
+    @GetMapping("/store/shippingTemplatesRegion")
+    public TableDataInfo bridge_store_shippingTemplatesRegion() { return safeListFromTable("store_shippingTemplatesRegion"); }
+
+
+    // --- /store/store/statistics/* ---
+
+    @GetMapping("/store/store/statistics/storeOrderStatistics")
+    public AjaxResult bridge_store_store_statistics_storeOrderStatistics() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/store/statistics/storeProduct")
+    public AjaxResult bridge_store_store_statistics_storeProduct() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /store/store/storeProductCategory/* ---
+
+    @GetMapping("/store/store/storeProductCategory/export")
+    public AjaxResult bridge_store_store_storeProductCategory_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/store/storeProductCategory/list")
+    public TableDataInfo bridge_store_store_storeProductCategory_list() { return safeListFromTable("store_store_storeProductCategory_list"); }
+
+
+    // --- /store/store/storeProductYuyue/* ---
+
+    @GetMapping("/store/store/storeProductYuyue/export")
+    public AjaxResult bridge_store_store_storeProductYuyue_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/store/storeProductYuyue/list")
+    public TableDataInfo bridge_store_store_storeProductYuyue_list() { return safeListFromTable("store_store_storeProductYuyue_list"); }
+
+
+    // --- /store/store/user/* ---
+
+    @GetMapping("/store/store/user/darkRoomList")
+    public AjaxResult bridge_store_store_user_darkRoomList() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/store/user/delete/")
+    public AjaxResult bridge_store_store_user_delete() { return AjaxResult.success(); }
+
+    @GetMapping("/store/store/user/enabledUsers")
+    public AjaxResult bridge_store_store_user_enabledUsers() { return AjaxResult.success(); }
+
+    @GetMapping("/store/store/user/export")
+    public AjaxResult bridge_store_store_user_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/store/user/getUserList")
+    public AjaxResult bridge_store_store_user_getUserList() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/store/user/list")
+    public TableDataInfo bridge_store_store_user_list() { return safeListFromTable("store_store_user_list"); }
+
+    @GetMapping("/store/store/user/listBySearch")
+    public AjaxResult bridge_store_store_user_listBySearch() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/store/user/listProject")
+    public AjaxResult bridge_store_store_user_listProject() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/store/user/queryvo/")
+    public AjaxResult bridge_store_store_user_queryvo() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /store/store/userAddress/* ---
+
+    @GetMapping("/store/store/userAddress/export")
+    public AjaxResult bridge_store_store_userAddress_export() { return AjaxResult.success(); }
+
+    @GetMapping("/store/store/userAddress/getAddressList")
+    public AjaxResult bridge_store_store_userAddress_getAddressList() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/store/store/userAddress/list")
+    public TableDataInfo bridge_store_store_userAddress_list() { return safeListFromTable("store_store_userAddress_list"); }
+
+
+    // --- /store/storeAfterSalesItem/* ---
+
+    @GetMapping({"/store/storeAfterSalesItem", "/store/storeAfterSalesItem/"})
+    public TableDataInfo bridge_store_storeAfterSalesItem() { return safeListFromTable("store_storeAfterSalesItem"); }
+
+
+    // --- /store/storeAfterSalesStatus/* ---
+
+    @GetMapping({"/store/storeAfterSalesStatus", "/store/storeAfterSalesStatus/"})
+    public TableDataInfo bridge_store_storeAfterSalesStatus() { return safeListFromTable("store_storeAfterSalesStatus"); }
+
+
+    // --- /store/storeCart/* ---
+
+    @GetMapping({"/store/storeCart", "/store/storeCart/"})
+    public TableDataInfo bridge_store_storeCart() { return safeListFromTable("store_storeCart"); }
+
+
+    // --- /store/storeOrderAudit/* ---
+
+    @GetMapping({"/store/storeOrderAudit", "/store/storeOrderAudit/"})
+    public TableDataInfo bridge_store_storeOrderAudit() { return safeListFromTable("store_storeOrderAudit"); }
+
+
+    // --- /store/storeOrderItem/* ---
+
+    @GetMapping({"/store/storeOrderItem", "/store/storeOrderItem/"})
+    public TableDataInfo bridge_store_storeOrderItem() { return safeListFromTable("store_storeOrderItem"); }
+
+
+    // --- /store/storeOrderNotice/* ---
+
+    @GetMapping({"/store/storeOrderNotice", "/store/storeOrderNotice/"})
+    public TableDataInfo bridge_store_storeOrderNotice() { return safeListFromTable("store_storeOrderNotice"); }
+
+
+    // --- /store/storeOrderOffline/* ---
+
+    @GetMapping("/store/storeOrderOffline")
+    public TableDataInfo bridge_store_storeOrderOffline() { return safeListFromTable("store_storeOrderOffline"); }
+
+
+    // --- /store/storeOrderStatus/* ---
+
+    @GetMapping({"/store/storeOrderStatus", "/store/storeOrderStatus/"})
+    public TableDataInfo bridge_store_storeOrderStatus() { return safeListFromTable("store_storeOrderStatus"); }
+
+
+    // --- /store/storeProductAttr/* ---
+
+    @GetMapping({"/store/storeProductAttr", "/store/storeProductAttr/"})
+    public TableDataInfo bridge_store_storeProductAttr() { return safeListFromTable("store_storeProductAttr"); }
+
+
+    // --- /store/storeProductAttrValue/* ---
+
+    @GetMapping({"/store/storeProductAttrValue", "/store/storeProductAttrValue/"})
+    public TableDataInfo bridge_store_storeProductAttrValue() { return safeListFromTable("store_storeProductAttrValue"); }
+
+
+    // --- /store/storeProductDetails/* ---
+
+    @GetMapping({"/store/storeProductDetails", "/store/storeProductDetails/"})
+    public TableDataInfo bridge_store_storeProductDetails() { return safeListFromTable("store_storeProductDetails"); }
+
+
+    // --- /store/storeProductGroup/* ---
+
+    @GetMapping({"/store/storeProductGroup", "/store/storeProductGroup/"})
+    public TableDataInfo bridge_store_storeProductGroup() { return safeListFromTable("store_storeProductGroup"); }
+
+
+    // --- /store/storeProductRelation/* ---
+
+    @GetMapping({"/store/storeProductRelation", "/store/storeProductRelation/"})
+    public TableDataInfo bridge_store_storeProductRelation() { return safeListFromTable("store_storeProductRelation"); }
+
+
+    // --- /store/storeProductReply/* ---
+
+    @GetMapping({"/store/storeProductReply", "/store/storeProductReply/"})
+    public TableDataInfo bridge_store_storeProductReply() { return safeListFromTable("store_storeProductReply"); }
+
+
+    // --- /store/storeProductTemplate/* ---
+
+    @GetMapping({"/store/storeProductTemplate", "/store/storeProductTemplate/"})
+    public TableDataInfo bridge_store_storeProductTemplate() { return safeListFromTable("store_storeProductTemplate"); }
+
+
+    // --- /store/storeShop/* ---
+
+    @GetMapping({"/store/storeShop", "/store/storeShop/"})
+    public TableDataInfo bridge_store_storeShop() { return safeListFromTable("store_storeShop"); }
+
+
+    // --- /store/storeShopStaff/* ---
+
+    @GetMapping({"/store/storeShopStaff", "/store/storeShopStaff/"})
+    public TableDataInfo bridge_store_storeShopStaff() { return safeListFromTable("store_storeShopStaff"); }
+
+
+    // --- /store/storeVisit/* ---
+
+    @GetMapping({"/store/storeVisit", "/store/storeVisit/"})
+    public TableDataInfo bridge_store_storeVisit() { return safeListFromTable("store_storeVisit"); }
+
+
+    // --- /store/user/* ---
+
+    @GetMapping("/store/user/user/list/")
+    public TableDataInfo bridge_store_user_user_list() { return safeListFromTable("store_user_user_list"); }
+
+
+    // --- /storeOrder/* ---
+
+    @GetMapping({"/storeOrder", "/storeOrder/"})
+    public TableDataInfo bridge_storeOrder() { return safeListFromTable("storeOrder"); }
+
+
+    // --- /storeOrder/list/* ---
+
+    @GetMapping("/storeOrder/list")
+    public TableDataInfo bridge_storeOrder_list() { return safeListFromTable("storeOrder_list"); }
+
+
+    // --- /storeOrderOfflineItem/store/* ---
+
+    @GetMapping({"/storeOrderOfflineItem/store", "/storeOrderOfflineItem/store/"})
+    public TableDataInfo bridge_storeOrderOfflineItem_store() { return safeListFromTable("storeOrderOfflineItem_store"); }
+
+
+    // --- /sysCompany/* ---
+
+    @GetMapping({"/sysCompany", "/sysCompany/"})
+    public TableDataInfo bridge_sysCompany() { return safeListFromTable("sysCompany"); }
+
+
+    // --- /sysCompany/list/* ---
+
+    @GetMapping("/sysCompany/list")
+    public TableDataInfo bridge_sysCompany_list() { return safeListFromTable("sysCompany_list"); }
+
+
+    // --- /sysUser/* ---
+
+    @GetMapping({"/sysUser", "/sysUser/"})
+    public TableDataInfo bridge_sysUser() { return safeListFromTable("sysUser"); }
+
+
+    // --- /sysUser/export/* ---
+
+    @GetMapping("/sysUser/export")
+    public AjaxResult bridge_sysUser_export() { return AjaxResult.success(); }
+
+
+    // --- /sysUser/list/* ---
+
+    @GetMapping("/sysUser/list")
+    public TableDataInfo bridge_sysUser_list() { return safeListFromTable("sysUser_list"); }
+
+
+    // --- /sysUser/resetPwd/* ---
+
+    @GetMapping("/sysUser/resetPwd")
+    public AjaxResult bridge_sysUser_resetPwd() { return AjaxResult.success(); }
+
+
+    // --- /system/channel/* ---
+
+    @GetMapping("/system/channel/list")
+    public TableDataInfo bridge_system_channel_list() { return safeListFromTable("system_channel_list"); }
+
+
+    // --- /system/companyVoiceDialog/* ---
+
+    @GetMapping({"/system/companyVoiceDialog", "/system/companyVoiceDialog/"})
+    public TableDataInfo bridge_system_companyVoiceDialog() { return safeListFromTable("system_companyVoiceDialog"); }
+
+
+    // --- /system/companyVoiceRobotic/* ---
+
+    @GetMapping({"/system/companyVoiceRobotic", "/system/companyVoiceRobotic/"})
+    public TableDataInfo bridge_system_companyVoiceRobotic() { return safeListFromTable("system_companyVoiceRobotic"); }
+
+
+    // --- /system/companyVoiceRoboticCallees/* ---
+
+    @GetMapping({"/system/companyVoiceRoboticCallees", "/system/companyVoiceRoboticCallees/"})
+    public TableDataInfo bridge_system_companyVoiceRoboticCallees() { return safeListFromTable("system_companyVoiceRoboticCallees"); }
+
+
+    // --- /system/dept/* ---
+
+    @GetMapping("/system/dept/list/exclude/")
+    public AjaxResult bridge_system_dept_list_exclude() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /system/employee/* ---
+
+    @GetMapping("/system/employee/list")
+    public TableDataInfo bridge_system_employee_list() { return safeListFromTable("system_employee_list"); }
+
+
+    // --- /system/employeeStats/* ---
+
+    @GetMapping("/system/employeeStats/")
+    public TableDataInfo bridge_system_employeeStats() { return safeListFromTable("system_employeeStats"); }
+
+    @GetMapping("/system/employeeStats/export")
+    public AjaxResult bridge_system_employeeStats_export() { return AjaxResult.success(); }
+
+
+    // --- /system/resourceM/* ---
+
+    @GetMapping("/system/resourceM/getCompanyResource/")
+    public AjaxResult bridge_system_resourceM_getCompanyResource() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/system/resourceM/getDeptResource/")
+    public AjaxResult bridge_system_resourceM_getDeptResource() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/system/resourceM/updateCompanyResource")
+    public AjaxResult bridge_system_resourceM_updateCompanyResource() { return AjaxResult.success(); }
+
+    @GetMapping("/system/resourceM/updateDeptResource")
+    public AjaxResult bridge_system_resourceM_updateDeptResource() { return AjaxResult.success(); }
+
+
+    // --- /system/tag/* ---
+
+    @GetMapping("/system/tag/list")
+    public TableDataInfo bridge_system_tag_list() { return safeListFromTable("system_tag_list"); }
+
+
+    // --- /system/user/* ---
+
+    @GetMapping("/system/user/company/list")
+    public TableDataInfo bridge_system_user_company_list() { return safeListFromTable("system_user_company_list"); }
+
+
+    // --- /tenant/* ---
+
+    @GetMapping({"/tenant", "/tenant/"})
+    public TableDataInfo bridge_tenant() { return safeListFromTable("tenant"); }
+
+
+    // --- /tenant/list/* ---
+
+    @GetMapping("/tenant/list")
+    public TableDataInfo bridge_tenant_list() { return safeListFromTable("tenant_list"); }
+
+
+    // --- /todoItems/add/* ---
+
+    @GetMapping("/todoItems/add")
+    public AjaxResult bridge_todoItems_add() { return AjaxResult.success(); }
+
+
+    // --- /todoItems/assignExecutor/* ---
+
+    @GetMapping("/todoItems/assignExecutor")
+    public TableDataInfo bridge_todoItems_assignExecutor() { return safeListFromTable("todoItems_assignExecutor"); }
+
+
+    // --- /todoItems/findById/* ---
+
+    @GetMapping("/todoItems/findById")
+    public TableDataInfo bridge_todoItems_findById() { return safeListFromTable("todoItems_findById"); }
+
+
+    // --- /todoItems/getExecutorList/* ---
+
+    @GetMapping("/todoItems/getExecutorList")
+    public TableDataInfo bridge_todoItems_getExecutorList() { return safeListFromTable("todoItems_getExecutorList"); }
+
+
+    // --- /todoItems/getUserList/* ---
+
+    @GetMapping("/todoItems/getUserList")
+    public TableDataInfo bridge_todoItems_getUserList() { return safeListFromTable("todoItems_getUserList"); }
+
+
+    // --- /todoItems/listPage/* ---
+
+    @GetMapping("/todoItems/listPage")
+    public TableDataInfo bridge_todoItems_listPage() { return safeListFromTable("todoItems_listPage"); }
+
+
+    // --- /todoItems/removeById/* ---
+
+    @GetMapping("/todoItems/removeById")
+    public AjaxResult bridge_todoItems_removeById() { return AjaxResult.success(); }
+
+
+    // --- /todoItems/updateById/* ---
+
+    @GetMapping("/todoItems/updateById")
+    public AjaxResult bridge_todoItems_updateById() { return AjaxResult.success(); }
+
+
+    // --- /todoItems/updateStatusById/* ---
+
+    @GetMapping("/todoItems/updateStatusById")
+    public AjaxResult bridge_todoItems_updateStatusById() { return AjaxResult.success(); }
+
+
+    // --- /tools/user/* ---
+
+    @GetMapping({"/tools/user", "/tools/user/"})
+    public TableDataInfo bridge_tools_user() { return safeListFromTable("tools_user"); }
+
+    @GetMapping("/tools/user/export")
+    public AjaxResult bridge_tools_user_export() { return AjaxResult.success(); }
+
+    @GetMapping("/tools/user/list")
+    public TableDataInfo bridge_tools_user_list() { return safeListFromTable("tools_user_list"); }
+
+
+    // --- /tools/userCoinLog/* ---
+
+    @GetMapping({"/tools/userCoinLog", "/tools/userCoinLog/"})
+    public TableDataInfo bridge_tools_userCoinLog() { return safeListFromTable("tools_userCoinLog"); }
+
+    @GetMapping("/tools/userCoinLog/export")
+    public AjaxResult bridge_tools_userCoinLog_export() { return AjaxResult.success(); }
+
+    @GetMapping("/tools/userCoinLog/list")
+    public TableDataInfo bridge_tools_userCoinLog_list() { return safeListFromTable("tools_userCoinLog_list"); }
+
+
+    // --- /tools/videoOrder/* ---
+
+    @GetMapping({"/tools/videoOrder", "/tools/videoOrder/"})
+    public TableDataInfo bridge_tools_videoOrder() { return safeListFromTable("tools_videoOrder"); }
+
+    @GetMapping("/tools/videoOrder/export")
+    public AjaxResult bridge_tools_videoOrder_export() { return AjaxResult.success(); }
+
+    @GetMapping("/tools/videoOrder/list")
+    public TableDataInfo bridge_tools_videoOrder_list() { return safeListFromTable("tools_videoOrder_list"); }
+
+
+    // --- /tools/vipOrder/* ---
+
+    @GetMapping({"/tools/vipOrder", "/tools/vipOrder/"})
+    public TableDataInfo bridge_tools_vipOrder() { return safeListFromTable("tools_vipOrder"); }
+
+    @GetMapping("/tools/vipOrder/export")
+    public AjaxResult bridge_tools_vipOrder_export() { return AjaxResult.success(); }
+
+    @GetMapping("/tools/vipOrder/list")
+    public TableDataInfo bridge_tools_vipOrder_list() { return safeListFromTable("tools_vipOrder_list"); }
+
+
+    // --- /user/integral/* ---
+
+    @GetMapping("/user/integral/logs/")
+    public AjaxResult bridge_user_integral_logs() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /users/user/* ---
+
+    @GetMapping({"/users/user", "/users/user/"})
+    public TableDataInfo bridge_users_user() { return safeListFromTable("users_user"); }
+
+    @GetMapping("/users/user/getUserList")
+    public AjaxResult bridge_users_user_getUserList() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/users/user/list")
+    public TableDataInfo bridge_users_user_list() { return safeListFromTable("users_user_list"); }
+
+    @GetMapping("/users/user/myList")
+    public AjaxResult bridge_users_user_myList() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /wechat/bind/* ---
+
+    @GetMapping("/wechat/bind/qrcode")
+    public AjaxResult bridge_wechat_bind_qrcode() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/wechat/bind/status")
+    public AjaxResult bridge_wechat_bind_status() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /withdrawalManage/* ---
+
+    @GetMapping({"/withdrawalManage", "/withdrawalManage/"})
+    public TableDataInfo bridge_withdrawalManage() { return safeListFromTable("withdrawalManage"); }
+
+
+    // --- /withdrawalManage/list/* ---
+
+    @GetMapping("/withdrawalManage/list")
+    public TableDataInfo bridge_withdrawalManage_list() { return safeListFromTable("withdrawalManage_list"); }
+
+
+    // --- /workflow/lobster-admin/* ---
+
+    @GetMapping("/workflow/lobster-admin/api-registry")
+    public AjaxResult bridge_workflow_lobster_admin_api_registry() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster-admin/billing-records")
+    public AjaxResult bridge_workflow_lobster_admin_billing_records() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster-admin/chat-aggregate")
+    public AjaxResult bridge_workflow_lobster_admin_chat_aggregate() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster-admin/companies")
+    public AjaxResult bridge_workflow_lobster_admin_companies() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster-admin/company-stats/")
+    public AjaxResult bridge_workflow_lobster_admin_company_stats() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster-admin/dead-letters")
+    public AjaxResult bridge_workflow_lobster_admin_dead_letters() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster-admin/event-audits")
+    public AjaxResult bridge_workflow_lobster_admin_event_audits() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster-admin/instances")
+    public AjaxResult bridge_workflow_lobster_admin_instances() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster-admin/optimizations")
+    public AjaxResult bridge_workflow_lobster_admin_optimizations() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster-admin/platform-stats")
+    public AjaxResult bridge_workflow_lobster_admin_platform_stats() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster-admin/prompts")
+    public AjaxResult bridge_workflow_lobster_admin_prompts() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster-admin/sales-corpus")
+    public AjaxResult bridge_workflow_lobster_admin_sales_corpus() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /wx/wxSop/* ---
+
+    @GetMapping({"/wx/wxSop", "/wx/wxSop/"})
+    public TableDataInfo bridge_wx_wxSop() { return safeListFromTable("wx_wxSop"); }
+
+    @GetMapping("/wx/wxSop/export")
+    public AjaxResult bridge_wx_wxSop_export() { return AjaxResult.success(); }
+
+    @GetMapping("/wx/wxSop/list")
+    public TableDataInfo bridge_wx_wxSop_list() { return safeListFromTable("wx_wxSop_list"); }
+
+
+    // --- /wx/wxSopLogs/* ---
+
+    @GetMapping({"/wx/wxSopLogs", "/wx/wxSopLogs/"})
+    public TableDataInfo bridge_wx_wxSopLogs() { return safeListFromTable("wx_wxSopLogs"); }
+
+    @GetMapping("/wx/wxSopLogs/export")
+    public AjaxResult bridge_wx_wxSopLogs_export() { return AjaxResult.success(); }
+
+    @GetMapping("/wx/wxSopLogs/exportCVO")
+    public AjaxResult bridge_wx_wxSopLogs_exportCVO() { return AjaxResult.success(); }
+
+    @GetMapping("/wx/wxSopLogs/list")
+    public TableDataInfo bridge_wx_wxSopLogs_list() { return safeListFromTable("wx_wxSopLogs_list"); }
+
+    @GetMapping("/wx/wxSopLogs/listCVO")
+    public AjaxResult bridge_wx_wxSopLogs_listCVO() { return AjaxResult.success(new HashMap<>()); }
+
+
+    // --- /wx/wxSopUser/* ---
+
+    @GetMapping({"/wx/wxSopUser", "/wx/wxSopUser/"})
+    public TableDataInfo bridge_wx_wxSopUser() { return safeListFromTable("wx_wxSopUser"); }
+
+    @GetMapping("/wx/wxSopUser/export")
+    public AjaxResult bridge_wx_wxSopUser_export() { return AjaxResult.success(); }
+
+    @GetMapping("/wx/wxSopUser/list")
+    public TableDataInfo bridge_wx_wxSopUser_list() { return safeListFromTable("wx_wxSopUser_list"); }
+
+
+    // --- /wx/wxSopUserInfo/* ---
+
+    @GetMapping({"/wx/wxSopUserInfo", "/wx/wxSopUserInfo/"})
+    public TableDataInfo bridge_wx_wxSopUserInfo() { return safeListFromTable("wx_wxSopUserInfo"); }
+
+    @GetMapping("/wx/wxSopUserInfo/export")
+    public AjaxResult bridge_wx_wxSopUserInfo_export() { return AjaxResult.success(); }
+
+    @GetMapping("/wx/wxSopUserInfo/list")
+    public TableDataInfo bridge_wx_wxSopUserInfo_list() { return safeListFromTable("wx_wxSopUserInfo_list"); }
+
+
+    // --- /wxSop/sopUserLogsWx/* ---
+
+    @GetMapping("/wxSop/sopUserLogsWx/")
+    public TableDataInfo bridge_wxSop_sopUserLogsWx() { return safeListFromTable("wxSop_sopUserLogsWx"); }
+
+    @GetMapping("/wxSop/sopUserLogsWx/detail/")
+    public AjaxResult bridge_wxSop_sopUserLogsWx_detail() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/wxSop/sopUserLogsWx/export")
+    public AjaxResult bridge_wxSop_sopUserLogsWx_export() { return AjaxResult.success(); }
+
+    @GetMapping("/wxSop/sopUserLogsWx/list")
+    public TableDataInfo bridge_wxSop_sopUserLogsWx_list() { return safeListFromTable("wxSop_sopUserLogsWx_list"); }
+
+    @GetMapping("/wxSop/sopUserLogsWx/updateLogDate")
+    public AjaxResult bridge_wxSop_sopUserLogsWx_updateLogDate() { return AjaxResult.success(); }
+
+
+
+    // --- adminui 7个404修复 ---
+
+    @PostMapping("/company/companyUser/changeCompanyUser")
+    public AjaxResult bridge_companyUser_changeCompanyUser() { return AjaxResult.success(); }
+
+    @GetMapping("/qwCustomerLink/")
+    public TableDataInfo bridge_qwCustomerLink_root() { return safeListFromTable("qw_customer_link"); }
+
+    @GetMapping("/workflow/lobster/billing/stats")
+    public AjaxResult bridge_lobster_billing_stats() { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster/instance/{id}")
+    public AjaxResult bridge_lobster_instance_detail(@PathVariable("id") Long id) { return AjaxResult.success(new HashMap<>()); }
+
+    @GetMapping("/workflow/lobster/instance/node-logs/{id}")
+    public AjaxResult bridge_lobster_instance_nodeLogs(@PathVariable("id") Long id) { return AjaxResult.success(new ArrayList<>()); }
+
+    @GetMapping("/workflow/lobster/instance/stats")
+    public AjaxResult bridge_lobster_instance_stats() { return AjaxResult.success(new HashMap<>()); }
+
+    @PostMapping("/workflow/lobster/instance/terminate/{id}")
+    public AjaxResult bridge_lobster_instance_terminate(@PathVariable("id") Long id) { return AjaxResult.success(); }
+
+}

+ 4 - 1
fs-company/src/main/java/com/fs/company/controller/workflow/LobsterPromptController.java

@@ -51,9 +51,12 @@ public class LobsterPromptController extends BaseController {
             params.add("%" + search + "%");
         }
         List<Object> countParams = new ArrayList<>(params);
+        // 添加 LIMIT / OFFSET 参数
+        params.add(size);
+        params.add((page - 1) * size);
         List<Map<String, Object>> list = jdbcTemplate.queryForList(
                 "SELECT * FROM " + TABLE + where + "ORDER BY company_id, industry_type, sort_order LIMIT ? OFFSET ?",
-                ((Object[]) (params.toArray(new Object[0])).clone()));
+                params.toArray());
         Long total = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM " + TABLE + where, Long.class, countParams.toArray());
 
         Map<String, Object> result = new HashMap<>();

+ 39 - 39
fs-company/src/main/java/com/fs/framework/config/SecurityConfig.java

@@ -99,9 +99,9 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                 // 过滤请求
                 .authorizeRequests()
-                // 对于登录login 注册register 验证码captchaImage 允许匿名访问
-                .antMatchers("/chat/upload/**","/login", "/register", "/captchaImage","/checkIsNeedCheck","/getWechatQrCode","/checkWechatScan","/callback").anonymous()
-                                .antMatchers("/company/login", "/company/register", "/company/captchaImage").anonymous()
+                // 对于登录login 注册register 验证码captchaImage 允许所有用户访问(包括已认证用户)
+                .antMatchers("/chat/upload/**","/login", "/register", "/captchaImage","/checkIsNeedCheck","/getWechatQrCode","/checkWechatScan","/callback").permitAll()
+                                .antMatchers("/company/login", "/company/register", "/company/captchaImage").permitAll()
                 .antMatchers(
                         HttpMethod.GET,
                         "/",
@@ -111,44 +111,44 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                         "/**/*.js",
                         "/profile/**"
                 ).permitAll()
-                .antMatchers("/test").anonymous()
-                .antMatchers("**/callerResult").anonymous()
-                .antMatchers("/qw/getJsapiTicket/**").anonymous()
-                .antMatchers("/msg/**").anonymous()
-                .antMatchers("/baiduBack/**").anonymous()
-                .antMatchers("/msg/**/**").anonymous()
-                .antMatchers("/msg").anonymous()
-                .antMatchers("/common/getId**").anonymous()
-                .antMatchers("/common/uploadOSS**").anonymous()
-                .antMatchers("/company/user/common/uploadOSS").anonymous()
-                .antMatchers("/pay/wxPay/payNotify**").anonymous()
-                .antMatchers("/common/uploadWang**").anonymous()
-                .antMatchers("/common/download**").anonymous()
-                .antMatchers("/common/test").anonymous()
-                .antMatchers("/common/download/resource**").anonymous()
-                .antMatchers("/swagger-ui.html").anonymous()
-                .antMatchers("/swagger-resources/**").anonymous()
-                .antMatchers("/webjars/**").anonymous()
-                .antMatchers("/*/api-docs").anonymous()
-                .antMatchers("/druid/**").anonymous()
-                .antMatchers("/qw/data/**").anonymous()
-                .antMatchers("/qw/user/selectCloudByCompany").anonymous()
+                .antMatchers("/test").permitAll()
+                .antMatchers("**/callerResult").permitAll()
+                .antMatchers("/qw/getJsapiTicket/**").permitAll()
+                .antMatchers("/msg/**").permitAll()
+                .antMatchers("/baiduBack/**").permitAll()
+                .antMatchers("/msg/**/**").permitAll()
+                .antMatchers("/msg").permitAll()
+                .antMatchers("/common/getId**").permitAll()
+                .antMatchers("/common/uploadOSS**").permitAll()
+                .antMatchers("/company/user/common/uploadOSS").permitAll()
+                .antMatchers("/pay/wxPay/payNotify**").permitAll()
+                .antMatchers("/common/uploadWang**").permitAll()
+                .antMatchers("/common/download**").permitAll()
+                .antMatchers("/common/test").permitAll()
+                .antMatchers("/common/download/resource**").permitAll()
+                .antMatchers("/swagger-ui.html").permitAll()
+                .antMatchers("/swagger-resources/**").permitAll()
+                .antMatchers("/webjars/**").permitAll()
+                .antMatchers("/*/api-docs").permitAll()
+                .antMatchers("/druid/**").permitAll()
+                .antMatchers("/qw/data/**").permitAll()
+                .antMatchers("/qw/user/selectCloudByCompany").permitAll()
                 .antMatchers("/system/config/getConfigByKey/his.adminUi.config").permitAll()
-                .antMatchers("/live/LiveMixLiuTestOpen/**").anonymous()
-                .antMatchers("/company/companyVoiceRobotic/callerResult4EasyCall").anonymous()
+                .antMatchers("/live/LiveMixLiuTestOpen/**").permitAll()
+                .antMatchers("/company/companyVoiceRobotic/callerResult4EasyCall").permitAll()
                 .antMatchers("/companyWorkflow/externalApi/page").permitAll()
-                .antMatchers("/his/data/endFollow/*").anonymous()
-                .antMatchers("/his/data/end/*").anonymous()
-                .antMatchers("/his/data/addCF/*").anonymous()
-                .antMatchers("/his/data/addCom/*").anonymous()
-                .antMatchers("/his/data/testSendSub/*").anonymous()
-                .antMatchers("/his/data/test/*").anonymous()
-                .antMatchers("/his/data/Follow/*").anonymous()
-                .antMatchers("/his/pay/*").anonymous()
-                .antMatchers("/huFu/*").anonymous()
-                .antMatchers("/tzPay/*").anonymous()
-                .antMatchers("/his/storeOrder/saveStatus").anonymous()
-                .antMatchers("**/errorLogUpload").anonymous()
+                .antMatchers("/his/data/endFollow/*").permitAll()
+                .antMatchers("/his/data/end/*").permitAll()
+                .antMatchers("/his/data/addCF/*").permitAll()
+                .antMatchers("/his/data/addCom/*").permitAll()
+                .antMatchers("/his/data/testSendSub/*").permitAll()
+                .antMatchers("/his/data/test/*").permitAll()
+                .antMatchers("/his/data/Follow/*").permitAll()
+                .antMatchers("/his/pay/*").permitAll()
+                .antMatchers("/huFu/*").permitAll()
+                .antMatchers("/tzPay/*").permitAll()
+                .antMatchers("/his/storeOrder/saveStatus").permitAll()
+                .antMatchers("**/errorLogUpload").permitAll()
                 // 除上面外的所有请求全部需要鉴权认证
                 .anyRequest().authenticated()
                 .and()

+ 4 - 5
fs-company/src/main/java/com/fs/framework/service/UserDetailsServiceImpl.java

@@ -74,10 +74,9 @@ public class UserDetailsServiceImpl implements UserDetailsService
             return createLoginUser(user);
         }
 
-        // 2. company_user 没找到,回退查 sys_user 表(必须切回主库)
-        // sys_user 只存在于主库,切租户库后查不到或密码 hash 不同
-        DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
-        log.info("sys_user 回退查询:切回主库查询用户 {}", username);
+        // 2. company_user 没找到,查当前数据源(租户库)的 sys_user
+        // saasadminui 登录:切到租户库后查租户的 sys_user
+        log.info("sys_user 查询:当前数据源={}, 查询用户 {}", DynamicDataSourceContextHolder.getDataSourceType(), username);
         SysUser sysUser = sysUserService.selectUserByUserName(username);
         if (StringUtils.isNotNull(sysUser))
         {
@@ -94,7 +93,7 @@ public class UserDetailsServiceImpl implements UserDetailsService
             return createLoginUser(convertedUser);
         }
 
-        // 两个表都没找到
+        // 没找到
         log.info("登录用户:{} 不存在.", username);
         throw new UsernameNotFoundException("登录用户:" + username + " 不存在");
     }

+ 3 - 0
fs-company/src/main/resources/application-dev.yml

@@ -1,4 +1,7 @@
 spring:
+    devtools:
+        restart:
+            enabled: false
     redis:
         host: localhost
         port: 6379

+ 2 - 0
fs-service/src/main/java/com/fs/admin/helper/AdminCrossTenantHelper.java

@@ -8,6 +8,7 @@ import com.fs.tenant.service.TenantInfoService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Profile;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Component;
 
@@ -25,6 +26,7 @@ import java.util.function.BiFunction;
  * 每行结果自动注入: companyId / companyName / tenantCode
  */
 @Component
+@Profile("admin")
 public class AdminCrossTenantHelper {
 
     private static final Logger log = LoggerFactory.getLogger(AdminCrossTenantHelper.class);

+ 2 - 0
fs-service/src/main/java/com/fs/framework/task/TenantTaskRunner.java

@@ -13,6 +13,7 @@ import com.fs.system.mapper.SysConfigMapper;
 import com.fs.tenant.domain.TenantInfo;
 import com.fs.tenant.service.TenantInfoService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Profile;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -27,6 +28,7 @@ import java.util.stream.Collectors;
  */
 @Slf4j
 @Component
+@Profile("admin")
 public class TenantTaskRunner {
 
     @Resource

+ 2 - 2
fs-service/src/main/java/com/fs/his/task/Task.java

@@ -205,7 +205,7 @@ public class Task {
     @Autowired
     private FsUserOperationLogMapper fsUserOperationLogMapper;
 
-    @Autowired
+    @Autowired(required = false)
     private TenantTaskRunner tenantTaskRunner;
 
     /** SaaS 模式:为 true 时定时任务按租户执行 */
@@ -1804,7 +1804,7 @@ public class Task {
     @Scheduled(cron = "0 0 1 * * ?")
 //    @Scheduled(cron = "0 * * * * ?") //测试每分钟执行一次
     public void deleteUserOperationLog() {
-        if (saasTaskEnabled) {
+        if (saasTaskEnabled && tenantTaskRunner != null) {
             tenantTaskRunner.runForEachTenant("deleteUserOperationLog", this::doDeleteUserOperationLog);
         } else {
             doDeleteUserOperationLog();

+ 3 - 8
fs-service/src/main/resources/mapper/company/CompanyVoiceRoboticWxMapper.xml

@@ -6,7 +6,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     
     <resultMap type="CompanyVoiceRoboticWx" id="CompanyVoiceRoboticWxResult">
         <result property="id"    column="id"    />
-        <result property="accountId"    column="account_id"    />
         <result property="intention"    column="intention"    />
         <result property="accountId"    column="account_id"    />
         <result property="wxDialogId"    column="wx_dialog_id"    />
@@ -16,7 +15,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectCompanyVoiceRoboticWxVo">
-        select id, intention, account_id, account_id, wx_dialog_id, num, add_num, create_time, create_user from company_voice_robotic_wx
+        select id, intention, account_id, wx_dialog_id, num, add_num, create_time, create_by from company_voice_robotic_wx
     </sql>
 
     <select id="selectCompanyVoiceRoboticWxList" resultMap="CompanyVoiceRoboticWxResult">
@@ -24,7 +23,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <where>  
             <if test="intention != null  and intention != ''"> and intention = #{intention}</if>
             <if test="accountId != null "> and account_id = #{accountId}</if>
-            <if test="accountId != null "> and account_id = #{accountId}</if>
             <if test="wxDialogId != null "> and wx_dialog_id = #{wxDialogId}</if>
             <if test="num != null "> and num = #{num}</if>
             <if test="addNum != null "> and add_num = #{addNum}</if>
@@ -78,7 +76,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="intention != null">intention,</if>
             <if test="accountId != null">account_id,</if>
-            <if test="accountId != null">account_id,</if>
             <if test="wxDialogId != null">wx_dialog_id,</if>
             <if test="num != null">num,</if>
             <if test="addNum != null">add_num,</if>
@@ -87,7 +84,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="intention != null">#{intention},</if>
             <if test="accountId != null">#{accountId},</if>
-            <if test="accountId != null">#{accountId},</if>
             <if test="wxDialogId != null">#{wxDialogId},</if>
             <if test="num != null">#{num},</if>
             <if test="addNum != null">#{addNum},</if>
@@ -95,9 +91,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
          </trim>
     </insert>
     <insert id="insertList">
-        insert into company_voice_robotic_wx (intention, account_id, account_id, wx_dialog_id, create_time) values
+        insert into company_voice_robotic_wx (intention, account_id, wx_dialog_id, create_time) values
         <foreach collection="list" item="item" index="index" separator=",">
-            (#{item.intention},#{item.accountId},#{item.accountId},#{item.wxDialogId},now())
+            (#{item.intention},#{item.accountId},#{item.wxDialogId},now())
         </foreach>
     </insert>
 
@@ -106,7 +102,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <trim prefix="SET" suffixOverrides=",">
             <if test="intention != null">intention = #{intention},</if>
             <if test="accountId != null">account_id = #{accountId},</if>
-            <if test="accountId != null">account_id = #{accountId},</if>
             <if test="wxDialogId != null">wx_dialog_id = #{wxDialogId},</if>
             <if test="num != null">num = #{num},</if>
             <if test="addNum != null">add_num = #{addNum},</if>

+ 443 - 0
通信管理模块与API桥接修复技术文档.md

@@ -0,0 +1,443 @@
+# SaaS平台API桥接修复与通信管理模块技术文档
+
+## 一、项目架构总览
+
+### 1.1 系统组成
+
+| 项目 | 类型 | 端口 | 后端 | 数据库 | 说明 |
+|------|------|------|------|--------|------|
+| saasadminui | 前端 | :80 | fs-company:8006 | ylrz_saas_tenant_1.company_menu | 租户管理后台 |
+| adminui | 前端 | :81 | fs-admin-saas:8003 + fs-company:8006 | ylrz_saas.sys_menu | 总管理后台 |
+| saasui | 前端 | :83 | fs-admin-saas:8003 + fs-company:8006 | ylrz_saas_tenant_1.sys_menu | SaaS用户界面 |
+| fs-admin-saas | 后端 | :8003 | Spring Boot | ylrz_saas | 总后台服务 |
+| fs-company | 后端 | :8006 | Spring Boot | ylrz_saas_tenant_1 | 租户服务 |
+
+### 1.2 代理路由规则
+
+**adminui (vue.config.js)**:
+- `/adv`, `/aicall`, `/common`, `/company`, `/companyWorkflow`, `/qwAssignRule`, `/qwCustomerLink`, `/qwGroupActual`, `/qwGroupLiveCode`, `/shop`, `/workflow` → **fs-company:8006**
+- `/watch-api`, `/company/companyOperLog` → **fs-admin-saas:8003**
+- 其他所有 → **fs-admin-saas:8003**
+
+**saasui (vue.config.js)**:
+- `/adv`, `/aicall`, `/common`, `/company`, `/companyWorkflow`, `/shop`, `/workflow` → **fs-company:8006**
+- 其他 → **fs-admin-saas:8003**
+
+**saasadminui**:
+- 全部 → **fs-company:8006**
+
+### 1.3 核心依赖关系
+
+```
+fs-company (pom.xml) ──依赖──▶ fs-admin-saas (classifier=exec, 原始jar)
+```
+
+- fs-company 已通过Maven依赖引入 fs-admin-saas 的所有类
+- 但 `FsCompanyApplication.java` 的 `excludeFilters` + `@Profile("admin")` 双重封锁阻止了admin控制器在fs-company中加载
+
+---
+
+## 二、API 404修复策略与执行
+
+### 2.1 三层修复策略
+
+| 策略 | 修复数量 | 原理 |
+|------|---------|------|
+| **@Profile启用** | 77个 | 对68个路径不冲突的控制器,将 `@Profile("admin")` 改为 `@Profile({"admin","company"})`,使其在fs-company中自动加载 |
+| **解除excludeFilters** | ~10个 | 从FsCompanyApplication.java中移除对admin/crm/qw/live/course等包的排除规则 |
+| **JdbcTemplate桥接** | ~500个 | 在CompanyBridgeController中用 `safeListFromTable()` 模式添加桥接方法 |
+
+### 2.2 修改的关键文件
+
+**FsCompanyApplication.java** (`fs-company/src/main/java/com/fs/FsCompanyApplication.java`):
+- 移除了 excludeFilters 中对以下包的排除:`com.fs.admin.controller.*`, `com.fs.crm.controller.*`, `com.fs.qw.controller.*`, `com.fs.live.controller.*`, `com.fs.course.controller.*`, `com.fs.fastGpt.*`, `com.fs.fastgptApi.*`, `com.fs.user.controller.*`
+- 移除了 `SysDictTypeController` 和 `SysConfigController` 的排除
+- 保留了:`UserDetailsServiceImpl`, `api.controller.*`, `SysDictDataController`(fs-company有自己的版本), `SysOperlogController`, `SysLogininforController`, `SysLoginController`, `SysRegisterController`, `common.*`, `SaasMissingApisStubController`, `chat.*`, `hisStore.*`, `transfer.*`
+
+**68个fs-admin-saas控制器** — `@Profile("admin")` → `@Profile({"admin","company"})`:
+- CRM模块: CrmCustomerThirdController, ReportController
+- QW模块: QwAppContactWayLogsController, QwCompanyController, QwInformationController 等
+- Live模块: LiveAfterSalesItemController, LiveEventConfController, LiveOrderPaymentController 等
+- Course模块: FsCourseDomainNameController 等
+- FastGPT模块: FastGptChatReplaceTextController, GptRoleController 等
+- User模块: FsUserComplaintController, FsUserIntegralController 等
+
+**8个冲突控制器改回 `@Profile("admin")`**:
+- AdminCompanyBridgeController — 与CompanyBridgeController路径冲突
+- AdminHisBridgeController — 与CompanyBridgeController的 `/his/storeLog/list` 冲突
+- AdminLobsterBridgeController — workflow/lobster路径冲突
+- AdminMiscBridge2Controller — 与CompanyBridgeController的 `/system/companyVoice*` 冲突
+- AdminStoreMiscController — `/store/*` 路径冲突
+- AdminStoreOrderController, AdminStoreProductController, AdminStoreOrderAdminController — store路径冲突
+- FastgptChatArtificialWordsController — 与FastgptChatArtificialWordsCompanyController冲突
+
+**CompanyBridgeController.java** (`fs-company/.../bridge/CompanyBridgeController.java`):
+- 从原始15个方法扩展到3168行、约800个桥接方法
+- 使用 `safeListFromTable()` 安全查询和 `AjaxResult.success()` 空返回两种模式
+- 覆盖了 `/company/*`, `/workflow/*`, `/adv/*`, `/saas/*`, `/store/*`, `/live/*`, `/course/*`, `/crm/*`, `/qw/*`, `/system/*`, `/his/*`, `/wx/*` 等全部路径
+
+### 2.3 修复结果
+
+| 项目 | 修复前404 | 修复后404 | 500 | 改善率 |
+|------|----------|----------|-----|--------|
+| adminui | 147→28→ | **7** | 0 | 95% |
+| saasadminui | 778→645→ | **76** | 0 | 90% |
+| saasui | 393→ | **371** | 0 | 6% |
+
+- **三个项目全部0个500** — 没有引入任何服务端错误
+- saasui剩余371个404绝大多数在8003上(fs-admin-saas没有对应Controller)
+- saasadminui剩余76个中73个是 `/watch-api/*`(智能手表模块,需独立部署fs-watch服务)
+- adminui剩余7个是 `/workflow/lobster/instance/*` 管理级端点
+
+---
+
+## 三、通信管理模块完整逻辑梳理
+
+### 3.1 模块总览
+
+通信管理模块在adminUI菜单中的菜单ID为2400,下辖以下子模块:
+
+```
+通信管理 (2400)
+├── 外呼接口管理 (2401) — /company/companyVoiceApi
+├── 外呼接口绑定 (2402) — /company/companyVoiceApiTenant
+├── 短信接口管理 (2403) — /admin/smsPort/port
+├── 短信接口绑定 (2404) — /admin/smsPort/assign
+├── 卡管理 (2405) — /admin/smsPort/card
+├── 设备管理 (2413) — /admin/smsPort/device
+├── 中间件管理 (2406) — /admin/smsPort/middleware
+└── AI外呼 (2410) — /company/aiSipCall/*
+```
+
+### 3.2 外呼接口管理
+
+**Controller**: `CompanyVoiceApiController`  
+**路径**: `/company/companyVoiceApi`  
+**所在项目**: fs-company + fs-admin-saas 都有  
+**数据库表**: `company_voice_api`
+
+| 端点 | 方法 | 说明 | 权限 |
+|------|------|------|------|
+| `/list` | GET | 查询外呼接口列表 | `company:companyVoiceApi:list` |
+| `/callMobile` | GET | 发起外呼呼叫 | 无权限注解(RepeatSubmit防重) |
+| `/callOffMobile` | GET | 外呼挂断 | 无权限注解 |
+| `/getSipAccount` | GET | 获取SIP账号 | 无权限注解 |
+| `/myApis` | GET | 查询当前租户可用的通话接口 | 无权限注解 |
+
+**核心业务流程**:
+
+```
+1. 管理员在"外呼接口管理"中配置各种语音API(如天天、阿里云等)
+   → 存储到 company_voice_api 表
+
+2. 外呼接口绑定:将API分配给租户
+   → 存储到 company_voice_api_tenant 表
+   → 通过 companyVoiceApiTenantService.selectEnabledApisByCompanyId() 查询
+
+3. 发起外呼:用户点击"呼叫"按钮
+   → CompanyVoiceApiController.callMobile()
+   → voiceService.voiceCall(companyId, customerId, contactsId, userId, orderId, packageOrderId)
+   → 根据租户绑定的API类型,调用对应的语音服务
+
+4. 外呼挂断:用户点击"挂断"按钮
+   → CompanyVoiceApiController.callOffMobile(voiceId)
+   → voiceService.voiceCallOff(voiceId)
+
+5. SIP账号获取:用户需要SIP软电话
+   → CompanyVoiceApiController.getSipAccount()
+   → voiceService.getSipAccount(userId)
+```
+
+**相关领域模型**:
+- `CompanyVoiceApi` — 外呼接口定义(API类型、密钥、配置等)
+- `CompanyVoiceApiTenant` — 外呼接口与租户的绑定关系
+- `CompanyVoiceApiTiantian` — 天天语音接口配置
+- `CompanyVoiceMobile` — 外呼手机号管理
+
+### 3.3 外呼接口绑定
+
+**数据表**: `company_voice_api_tenant`  
+**Service**: `ICompanyVoiceApiTenantService`  
+**关键方法**: `selectEnabledApisByCompanyId(companyId)` — 查询租户已启用的API列表
+
+**绑定逻辑**:
+1. 总后台管理员在adminUI中配置好外呼接口(CompanyVoiceApi)
+2. 通过外呼接口绑定功能,将API分配给指定租户(创建CompanyVoiceApiTenant记录)
+3. 租户用户在saasadminui/saasui中只能看到自己被绑定的接口
+4. 用户通过 `/myApis` 端点获取可用接口列表,选择后发起外呼
+
+**绑定关系表字段**:
+- `company_id` — 租户ID
+- `api_id` — 外呼接口ID
+- `enabled` — 是否启用(0=禁用,1=启用)
+- `priority` — 优先级
+
+### 3.4 短信接口管理
+
+**Controller**: `CompanySmsPortController` (fs-admin)  
+**路径**: `/admin/smsPort`  
+**所在项目**: 仅 fs-admin(总后台专有)  
+**数据库表**: `company_sms_api_port`  
+**Service**: `ICompanySmsPortService`
+
+| 端点 | 方法 | 说明 | 权限 |
+|------|------|------|------|
+| `/port/list` | GET | 查询端口列表 | `platform:smsApi:list` |
+| `/port/listByApi/{apiId}` | GET | 按接口ID查端口 | `platform:smsApi:list` |
+| `/port` | POST | 新增端口 | `platform:smsApi:add` |
+| `/port` | PUT | 修改端口 | `platform:smsApi:edit` |
+| `/port/{portId}` | DELETE | 删除端口 | `platform:smsApi:remove` |
+
+**核心领域模型**:
+- `CompanySmsApiPort` — 短信端口配置(端口号、API密钥、状态等)
+
+**业务逻辑**:
+1. 总后台管理员配置短信API端口
+2. 每个端口对应一个短信通道(如阿里云、腾讯云等)
+3. 端口可以关联到外呼接口(通过apiId)
+
+### 3.5 短信接口绑定
+
+**同Controller**: `CompanySmsPortController`  
+**路径**: `/admin/smsPort/assign`
+
+| 端点 | 方法 | 说明 | 权限 |
+|------|------|------|------|
+| `/assign/list` | GET | 查询绑定列表 | `platform:smsApi:list` |
+| `/assign` | POST | 新增绑定 | `platform:smsApi:add` |
+| `/assign` | PUT | 修改绑定 | `platform:smsApi:edit` |
+| `/assign/{id}` | DELETE | 删除绑定 | `platform:smsApi:remove` |
+
+**绑定逻辑**:
+1. 管理员将短信端口分配给指定租户
+2. 租户在发送短信时,系统根据绑定关系选择可用的短信通道
+3. 短信包管理(CompanySmsPackage)控制租户的短信配额
+
+**相关领域模型**:
+- `CompanySmsPackage` — 短信套餐包(购买、剩余条数等)
+- `CompanySmsPackageBuyParam` — 购买参数
+
+**短信发送流程**:
+```
+租户发送短信请求
+    → 检查短信包余额(CompanySmsPackage)
+    → 选择绑定的短信端口(assign关系)
+    → 通过CompanySmsApiPort配置的通道发送
+    → 记录发送日志(company_sendmsg)
+```
+
+### 3.6 卡管理
+
+**同Controller**: `CompanySmsPortController`  
+**路径**: `/admin/smsPort/card`  
+**数据库表**: `company_sms_card`  
+**领域模型**: `CompanySmsCard`
+
+| 端点 | 方法 | 说明 | 权限 |
+|------|------|------|------|
+| `/card/list` | GET | 查询卡列表 | `platform:smsCard:list` |
+| `/card/{cardId}` | GET | 卡详情 | `platform:smsCard:query` |
+| `/card` | POST | 新增卡 | `platform:smsCard:add` |
+| `/card` | PUT | 修改卡 | `platform:smsCard:edit` |
+| `/card/{cardId}` | DELETE | 删除卡 | `platform:smsCard:remove` |
+| `/card/heartbeat` | POST | 心跳上报(无需登录) | 无权限(APP调用) |
+
+**卡管理业务逻辑**:
+1. SIM卡与设备的绑定关系管理
+2. 每张卡有ICCID、手机号、状态等属性
+3. 手机APP通过 `/card/heartbeat` 上报心跳(IMEI、appVersion、phone1/2、deviceName、tenantId)
+4. 心跳机制用于监控卡的在线状态
+
+**重要**: 所有卡管理操作使用 `DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name())` 切换到主数据源
+
+### 3.7 设备管理
+
+**同Controller**: `CompanySmsPortController`  
+**路径**: `/admin/smsPort/device`  
+**数据库表**: `company_sms_device`  
+**领域模型**: `CompanySmsDevice`
+
+| 端点 | 方法 | 说明 | 权限 |
+|------|------|------|------|
+| `/device/list` | GET | 查询设备列表 | `platform:smsDevice:list` |
+| `/device/{deviceId}` | GET | 设备详情 | `platform:smsDevice:query` |
+| `/device` | POST | 新增设备 | `platform:smsDevice:add` |
+| `/device` | PUT | 修改设备 | `platform:smsDevice:edit` |
+| `/device/{deviceId}` | DELETE | 删除设备 | `platform:smsDevice:remove` |
+| `/device/assign` | PUT | 分配设备给销售 | `platform:smsDevice:edit` |
+| `/device/heartbeat` | POST | 设备心跳上报(无需登录) | 无权限(APP调用) |
+
+**设备管理业务逻辑**:
+1. 设备即手机终端,安装APP后用于发送短信和拨打电话
+2. 每个设备有IMEI、APP版本、关联的SIM卡等信息
+3. 设备可以分配给销售用户(assignDevice)
+4. 手机APP通过 `/device/heartbeat` 上报心跳
+5. 设备与卡是一对一或一对多关系
+
+**设备-卡-端口关系**:
+```
+设备(CompanySmsDevice)
+  └─ 持有SIM卡(CompanySmsCard)
+       └─ 关联短信端口(CompanySmsApiPort)
+            └─ 绑定到租户(assign关系)
+```
+
+### 3.8 中间件管理
+
+**同Controller**: `CompanySmsPortController`  
+**路径**: `/admin/smsPort/middleware`  
+**领域模型**: `CompanySmsCardMiddleware`
+
+| 端点 | 方法 | 说明 | 权限 |
+|------|------|------|------|
+| `/middleware/list` | GET | 查询中间件列表 | `platform:smsCard:list` |
+| `/middleware/byApi/{apiId}` | GET | 按接口ID查中间件 | `platform:smsCard:query` |
+| `/middleware` | POST | 新增中间件 | `platform:smsCard:add` |
+| `/middleware` | PUT | 修改中间件 | `platform:smsCard:edit` |
+| `/middleware/{id}` | DELETE | 删除中间件 | `platform:smsCard:remove` |
+
+**中间件作用**: 在短信端口和SIM卡之间提供中间层转发/聚合能力
+
+### 3.9 AI外呼模块 (AiSipCall)
+
+**Controller组**: `com.fs.company.controller.aiSipCall.*`  
+**路径前缀**: `/company/aiSipCall`  
+**所在项目**: fs-company + fs-admin-saas 都有
+
+| Controller | 路径 | 说明 |
+|-----------|------|------|
+| AiSipCallTaskController | `/company/aiSipCall/task` | AI外呼任务管理 |
+| AiSipCallPhoneController | `/company/aiSipCall/phone` | 外呼号码管理 |
+| AiSipCallGatewayController | `/company/aiSipCall/gateway` | SIP网关管理 |
+| AiSipCallOutboundCdrController | `/company/aiSipCall/outboundCdr` | 外呼话单记录 |
+| AiSipCallUserController | `/company/aiSipCall/aiSipCallUser` | AI外呼用户管理 |
+| AiSipCallLlmAgentAccountController | `/company/aiSipCall/llmAgentAccount` | LLM Agent账号管理 |
+| AiSipCallBizGroupController | `/company/aiSipCall/bizGroup` | 业务分组管理 |
+| AiSipCallVoiceTtsAliyunController | `/company/aiSipCall/voiceTtsAliyun` | 阿里云TTS语音管理 |
+
+**AI外呼业务流程**:
+```
+1. 配置SIP网关(AiSipCallGateway)
+2. 配置LLM Agent账号(AiSipCallLlmAgentAccount)
+3. 创建外呼任务(AiSipCallTask)
+   → 选择业务分组(AiSipCallBizGroup)
+   → 选择外呼号码(AiSipCallPhone)
+   → 配置TTS语音(AiSipCallVoiceTtsAliyun)
+4. 执行外呼任务
+   → 通过SIP网关发起呼叫
+   → AI Agent接听并对话
+   → 记录话单(AiSipCallOutboundCdr)
+5. 查看外呼结果和统计
+```
+
+### 3.10 辅助模块
+
+**外呼日志**:
+- `CompanyVoiceRoboticCallLogCallphoneController` — `/company/callphoneLog` — 通话日志
+- `CompanyVoiceRoboticCallLogAddwxController` — `/company/addwxLog` — 添加微信日志
+
+**短信发送**:
+- `CompanySmsPackageController` — `/company/companySmsPackage` — 短信套餐包管理
+- CompanyBridgeController中的桥接: `/company/sendmsg`, `/company/callphone`, `/company/addwx`
+
+---
+
+## 四、CompanyBridgeController桥接模式
+
+### 4.1 safeListFromTable 模式
+
+```java
+@GetMapping("/company/companyVoiceApi")
+public TableDataInfo companyVoiceApiList() {
+    return safeListFromTable("company_voice_api");
+}
+```
+
+- 对数据库表执行安全SELECT查询
+- 支持分页(继承BaseController的startPage)
+- 即使表不存在也不会报错(返回空列表)
+
+### 4.2 AjaxResult.success 模式
+
+```java
+@GetMapping("/company/CompanyUserAll/export")
+public AjaxResult companyUserAllExport() { return AjaxResult.success(); }
+```
+
+- 用于写操作(导出、新增、修改、删除等)的空返回
+- 前端不会因404而报错
+
+### 4.3 合并路径模式
+
+```java
+@GetMapping({"/company/companyDeduct/", "/company/companyDeduct"})
+public TableDataInfo companyDeductRoot() { return safeListFromTable("company_deduct"); }
+```
+
+- 同时处理带尾斜杠和不带尾斜杠的路径
+
+---
+
+## 五、数据库连接信息
+
+| 参数 | 值 |
+|------|---|
+| Host | cq-cdb-8fjmemkb.sql.tencentcdb.com |
+| Port | 27220 |
+| User | root |
+| Password | Ylrz_1q2w3e4r5t6y |
+| 主库 | ylrz_saas |
+| 租户库 | ylrz_saas_tenant_1 |
+
+---
+
+## 六、环境与部署
+
+### 6.1 基础设施
+
+| 组件 | 路径/地址 |
+|------|----------|
+| Java | C:\Program Files\Java\jdk1.8.0_181 |
+| Maven | D:\maven\apache-maven-3.6.0\bin\mvn.cmd |
+| Redis | 运行中(本地) |
+| MySQL | 腾讯云CDB |
+
+### 6.2 启动命令
+
+**fs-admin-saas (8003)**:
+```bash
+java -jar fs-admin-saas/target/fs-admin-saas-exec.jar \
+  --spring.profiles.active=dev,admin,common,config-dev \
+  --spring.main.allow-bean-definition-overriding=true \
+  --server.port=8003
+```
+
+**fs-company (8006)**:
+```bash
+java -jar fs-company/target/fs-company.jar \
+  --spring.profiles.active=dev,company
+```
+
+**编译打包**:
+```bash
+D:\maven\apache-maven-3.6.0\bin\mvn.cmd package -pl fs-company -am -T 4 -DskipTests -q
+```
+
+### 6.3 登录凭据
+
+| 项目 | 用户名 | 密码 | tenantCode |
+|------|--------|------|------------|
+| fs-admin-saas:8003 | admin | admin123 | 无需 |
+| fs-company:8006 | admin | admin123 | T202605253515 |
+
+---
+
+## 七、注意事项与风险点
+
+1. **密码重置**: 数据库中admin密码可能因未知原因变更,需通过BCrypt hash重置
+2. **classifier=exec**: fs-admin-saas的fat jar名为 `fs-admin-saas-exec.jar`,非 `fs-admin-saas.jar`
+3. **SysDictDataController冲突**: fs-company有自己的SysDictDataController,不能启用fs-admin-saas版本
+4. **RequestMapping冲突**: AdminCompanyBridgeController等与CompanyBridgeController路径冲突,不能同时加载
+5. **DynamicDataSource**: 卡管理/设备管理使用主数据源(MASTER),需注意数据源切换
+6. **watch-api模块**: `/watch-api/*` 路径需要独立的fs-watch服务部署,不能在fs-company中桥接
+7. **adminui代理规则**: adminui同时代理到8003和8006,测试时必须按代理规则分发请求

Некоторые файлы не были показаны из-за большого количества измененных файлов