Explorar o código

feat(admin): 新增总后台相关管理和数据桥接功能

- 添加 fs-admin pom.xml 中验证码依赖 kaptcha
- 重构 AdminAdController,使用 AdminCrossTenantHelper 跨租户查询广告账户
- 新增 AdminCommissionRecordController,实现代理返佣记录管理和详情接口
- 新增 AdminCompanyBridgeController,实现公司管理相关服务层桥接,覆盖 adminui 404 端点
- 新增 AdminConsumeRecordController,查询和查看租户消费扣款记录详情
- 新增 AdminCourseBridgeController,实现课程模块桥接,解决 adminui 8004 端课程接口缺失问题
boss hai 2 semanas
pai
achega
fe408c6fea
Modificáronse 100 ficheiros con 613 adicións e 535 borrados
  1. 12 0
      fs-admin/pom.xml
  2. 19 47
      fs-admin/src/main/java/com/fs/admin/controller/AdminAdController.java
  3. 0 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminCommissionRecordController.java
  4. 0 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminCompanyBridgeController.java
  5. 0 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminConsumeRecordController.java
  6. 0 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminCourseBridgeController.java
  7. 18 50
      fs-admin/src/main/java/com/fs/admin/controller/AdminCrmController.java
  8. 0 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminHisBridgeController.java
  9. 0 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminLiveBridgeController.java
  10. 0 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminLiveVideoController.java
  11. 0 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminLobsterBridgeController.java
  12. 0 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminMiscBridge2Controller.java
  13. 0 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminMissingStubsController.java
  14. 12 1
      fs-admin/src/main/java/com/fs/admin/controller/AdminModuleUsageController.java
  15. 0 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminRechargeRecordController.java
  16. 0 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminServiceCostController.java
  17. 32 81
      fs-admin/src/main/java/com/fs/admin/controller/AdminSopController.java
  18. 135 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminStatisticsController.java
  19. 0 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminStoreMiscController.java
  20. 0 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminStoreOrderAdminController.java
  21. 166 55
      fs-admin/src/main/java/com/fs/admin/controller/AdminStoreOrderController.java
  22. 0 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminStoreProductController.java
  23. 0 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminVideoResourceController.java
  24. 0 0
      fs-admin/src/main/java/com/fs/admin/controller/AdminWithdrawalController.java
  25. 1 1
      fs-admin/src/main/java/com/fs/admin/controller/AiChatQualityController.java
  26. 1 1
      fs-admin/src/main/java/com/fs/admin/controller/AiProviderAdminController.java
  27. 44 63
      fs-admin/src/main/java/com/fs/admin/controller/ArticleAdminController.java
  28. 37 57
      fs-admin/src/main/java/com/fs/admin/controller/CourseAdminController.java
  29. 32 57
      fs-admin/src/main/java/com/fs/admin/controller/LiveAdminController.java
  30. 23 56
      fs-admin/src/main/java/com/fs/admin/controller/LobsterAdminController.java
  31. 44 62
      fs-admin/src/main/java/com/fs/admin/controller/ProductAdminController.java
  32. 0 0
      fs-admin/src/main/java/com/fs/aiSoundReplication/VoiceCloneController.java
  33. 15 0
      fs-admin/src/main/java/com/fs/billing/controller/WalletController.java
  34. 2 0
      fs-admin/src/main/java/com/fs/chat/controller/ChatDatasetController.java
  35. 2 0
      fs-admin/src/main/java/com/fs/chat/controller/ChatDatasetFileController.java
  36. 2 0
      fs-admin/src/main/java/com/fs/chat/controller/ChatKeywordController.java
  37. 6 4
      fs-admin/src/main/java/com/fs/chat/controller/ChatMsgController.java
  38. 2 0
      fs-admin/src/main/java/com/fs/chat/controller/ChatMsgLogsController.java
  39. 2 0
      fs-admin/src/main/java/com/fs/chat/controller/ChatRoleController.java
  40. 2 0
      fs-admin/src/main/java/com/fs/chat/controller/ChatSessionController.java
  41. 2 0
      fs-admin/src/main/java/com/fs/chat/controller/ChatUploadController.java
  42. 2 0
      fs-admin/src/main/java/com/fs/chat/controller/ChatUserController.java
  43. 0 0
      fs-admin/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallBizGroupController.java
  44. 0 0
      fs-admin/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallGatewayController.java
  45. 0 0
      fs-admin/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallLlmAgentAccountController.java
  46. 0 0
      fs-admin/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallOutboundCdrController.java
  47. 0 0
      fs-admin/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallPhoneController.java
  48. 0 0
      fs-admin/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallTaskController.java
  49. 0 0
      fs-admin/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallUserController.java
  50. 0 0
      fs-admin/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallVoiceTtsAliyunController.java
  51. 0 0
      fs-admin/src/main/java/com/fs/company/controller/aicall/CcLlmAgentAccountController.java
  52. 0 0
      fs-admin/src/main/java/com/fs/company/controller/aicall/CcLlmAgentProviderController.java
  53. 0 0
      fs-admin/src/main/java/com/fs/company/controller/aicall/CcLlmKbCatController.java
  54. 0 0
      fs-admin/src/main/java/com/fs/company/controller/baidu/Conversion.java
  55. 0 0
      fs-admin/src/main/java/com/fs/company/controller/chat/ChatDatasetController.java
  56. 0 0
      fs-admin/src/main/java/com/fs/company/controller/chat/ChatDatasetFileController.java
  57. 0 0
      fs-admin/src/main/java/com/fs/company/controller/chat/ChatKeywordController.java
  58. 0 0
      fs-admin/src/main/java/com/fs/company/controller/chat/ChatMsgController.java
  59. 0 0
      fs-admin/src/main/java/com/fs/company/controller/chat/ChatMsgLogsController.java
  60. 0 0
      fs-admin/src/main/java/com/fs/company/controller/chat/ChatRoleController.java
  61. 0 0
      fs-admin/src/main/java/com/fs/company/controller/chat/ChatSessionController.java
  62. 0 0
      fs-admin/src/main/java/com/fs/company/controller/chat/ChatUploadController.java
  63. 0 0
      fs-admin/src/main/java/com/fs/company/controller/chat/ChatUserController.java
  64. 0 0
      fs-admin/src/main/java/com/fs/company/controller/common/CaptchaController.java
  65. 0 0
      fs-admin/src/main/java/com/fs/company/controller/common/CommonController.java
  66. 0 0
      fs-admin/src/main/java/com/fs/company/controller/common/IndexController.java
  67. 0 0
      fs-admin/src/main/java/com/fs/company/controller/common/Test.java
  68. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyAiWorkflowController.java
  69. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyBalanceController.java
  70. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyConfigController.java
  71. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyConsumeRecordController.java
  72. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyController.java
  73. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyDeptController.java
  74. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyDomainBindController.java
  75. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyDomainBindUserController.java
  76. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyInboundCallManageController.java
  77. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyIntegralController.java
  78. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyLoginController.java
  79. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyLogininforController.java
  80. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyMenuController.java
  81. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyMoneyLogsController.java
  82. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyOperlogController.java
  83. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyPostController.java
  84. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyProfileController.java
  85. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyProfitController.java
  86. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyRechargeController.java
  87. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyRedPacketBalanceLogsController.java
  88. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyRoleController.java
  89. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanySmsController.java
  90. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanySmsLogsController.java
  91. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanySmsOrderController.java
  92. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanySmsPackageController.java
  93. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanySmsTempController.java
  94. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyStatisticsController.java
  95. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyTcmConsumeController.java
  96. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyTcmReportController.java
  97. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyUserCardController.java
  98. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyUserChangeApplyController.java
  99. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  100. 0 0
      fs-admin/src/main/java/com/fs/company/controller/company/CompanyUserDelayTimeController.java

+ 12 - 0
fs-admin/pom.xml

@@ -16,6 +16,18 @@
     </description>
 
     <dependencies>
+        <!-- 验证码 -->
+        <dependency>
+            <groupId>com.github.penggle</groupId>
+            <artifactId>kaptcha</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>javax.servlet-api</artifactId>
+                    <groupId>javax.servlet</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
         <dependency>
             <groupId>com.github.javen205</groupId>
             <artifactId>IJPay-All</artifactId>

+ 19 - 47
fs-admin/src/main/java/com/fs/admin/controller/AdminAdController.java

@@ -2,70 +2,42 @@ package com.fs.admin.controller;
 
 import java.util.*;
 
+import com.fs.admin.helper.AdminCrossTenantHelper;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.page.TableDataInfo;
-import com.fs.common.enums.DataSourceType;
-import com.fs.framework.datasource.DynamicDataSourceContextHolder;
-import com.fs.framework.datasource.TenantDataSourceManager;
-import com.fs.tenant.domain.TenantInfo;
-import com.fs.tenant.service.TenantInfoService;
 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.*;
 
+/**
+ * 总后台视频资源(广告账户)管理控制器
+ * 遍历所有租户库查询 ad_account 数据
+ */
 @RestController
 @RequestMapping("/admin/ad")
 public class AdminAdController extends BaseController {
 
     @Autowired
-    private TenantDataSourceManager tenantDataSourceManager;
-
-    @Autowired
-    private TenantInfoService tenantInfoService;
-
-    @Autowired
-    private JdbcTemplate jdbcTemplate;
+    private AdminCrossTenantHelper crossTenantHelper;
 
     @PreAuthorize("@ss.hasPermi('admin:ad:list')")
     @GetMapping("/list")
     public TableDataInfo list(@RequestParam(required = false) String accountName,
-                              @RequestParam(required = false) String tenantCode) {
-        List<Map<String, Object>> allList = new ArrayList<>();
-
-        try {
-            DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
-            List<TenantInfo> tenants = tenantInfoService.selectTenantInfoList(new TenantInfo());
-            if (tenantCode != null && !tenantCode.isEmpty()) {
-                tenants.removeIf(t -> !t.getTenantCode().equals(tenantCode));
-            }
-
-            for (TenantInfo tenant : tenants) {
-                if (tenant.getStatus() == null || tenant.getStatus() != 1) continue;
-                try {
-                    tenantDataSourceManager.switchTenant(tenant);
-                    String tenantLabel = tenant.getTenantCode() + "|" + tenant.getTenantName();
-                    String sql = "SELECT *, ? AS tenant_label FROM ad_account WHERE 1=1";
-                    if (accountName != null && !accountName.isEmpty()) {
-                        sql += " AND account_name LIKE ?";
-                    }
-                    sql += " ORDER BY create_time DESC LIMIT 50";
+                              @RequestParam(required = false) Long companyId,
+                              @RequestParam(required = false) String companyName) {
+        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
+                companyId, companyName, (tenant, jdbc) -> {
+                    StringBuilder sql = new StringBuilder("SELECT * FROM ad_account WHERE 1=1");
+                    List<Object> params = new ArrayList<>();
                     if (accountName != null && !accountName.isEmpty()) {
-                        allList.addAll(jdbcTemplate.queryForList(sql, tenantLabel, "%" + accountName + "%"));
-                    } else {
-                        allList.addAll(jdbcTemplate.queryForList(sql, tenantLabel));
+                        sql.append(" AND account_name LIKE ?");
+                        params.add("%" + accountName + "%");
                     }
-                } catch (Exception e) {
-                    // skip tenant
-                } finally {
-                    tenantDataSourceManager.clear();
-                    DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
-                }
-            }
-        } catch (Exception e) {
-            // ignore
-        }
-
+                    sql.append(" ORDER BY create_time DESC LIMIT 200");
+                    return params.isEmpty()
+                            ? jdbc.queryForList(sql.toString())
+                            : jdbc.queryForList(sql.toString(), params.toArray());
+                });
         return getDataTable(allList);
     }
 }

+ 0 - 0
fs-service/src/main/java/com/fs/admin/controller/AdminCommissionRecordController.java → fs-admin/src/main/java/com/fs/admin/controller/AdminCommissionRecordController.java


+ 0 - 0
fs-service/src/main/java/com/fs/admin/controller/AdminCompanyBridgeController.java → fs-admin/src/main/java/com/fs/admin/controller/AdminCompanyBridgeController.java


+ 0 - 0
fs-service/src/main/java/com/fs/admin/controller/AdminConsumeRecordController.java → fs-admin/src/main/java/com/fs/admin/controller/AdminConsumeRecordController.java


+ 0 - 0
fs-service/src/main/java/com/fs/admin/controller/AdminCourseBridgeController.java → fs-admin/src/main/java/com/fs/admin/controller/AdminCourseBridgeController.java


+ 18 - 50
fs-admin/src/main/java/com/fs/admin/controller/AdminCrmController.java

@@ -2,74 +2,42 @@ package com.fs.admin.controller;
 
 import java.util.*;
 
+import com.fs.admin.helper.AdminCrossTenantHelper;
 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.DataSourceType;
-import com.fs.framework.datasource.DynamicDataSourceContextHolder;
-import com.fs.framework.datasource.TenantDataSourceManager;
-import com.fs.tenant.domain.TenantInfo;
-import com.fs.tenant.service.TenantInfoService;
 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.*;
 
+/**
+ * 总后台CRM销冠语料管理控制器
+ * 遍历所有租户库查询 crm_customer 数据
+ */
 @RestController
 @RequestMapping("/admin/crm")
 public class AdminCrmController extends BaseController {
 
     @Autowired
-    private TenantDataSourceManager tenantDataSourceManager;
-
-    @Autowired
-    private TenantInfoService tenantInfoService;
-
-    @Autowired
-    private JdbcTemplate jdbcTemplate;
+    private AdminCrossTenantHelper crossTenantHelper;
 
     @PreAuthorize("@ss.hasPermi('admin:crm:list')")
     @GetMapping("/list")
     public TableDataInfo list(@RequestParam(required = false) String customerName,
-                              @RequestParam(required = false) String tenantCode) {
-        List<Map<String, Object>> allList = new ArrayList<>();
-
-        try {
-            DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
-            List<TenantInfo> tenants = tenantInfoService.selectTenantInfoList(new TenantInfo());
-            if (tenantCode != null && !tenantCode.isEmpty()) {
-                tenants.removeIf(t -> !t.getTenantCode().equals(tenantCode));
-            }
-
-            for (TenantInfo tenant : tenants) {
-                if (tenant.getStatus() == null || tenant.getStatus() != 1) continue;
-                try {
-                    tenantDataSourceManager.switchTenant(tenant);
-                    StringBuilder sql = new StringBuilder(
-                        "SELECT c.*, t.tenant_code, t.tenant_name FROM crm_customer c " +
-                        "CROSS JOIN (SELECT ? AS tenant_code, ? AS tenant_name) t WHERE 1=1");
+                              @RequestParam(required = false) Long companyId,
+                              @RequestParam(required = false) String companyName) {
+        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
+                companyId, companyName, (tenant, jdbc) -> {
+                    StringBuilder sql = new StringBuilder("SELECT c.* FROM crm_customer c WHERE 1=1");
+                    List<Object> params = new ArrayList<>();
                     if (customerName != null && !customerName.isEmpty()) {
                         sql.append(" AND c.customer_name LIKE ?");
+                        params.add("%" + customerName + "%");
                     }
-                    sql.append(" LIMIT 100");
-                    if (customerName != null && !customerName.isEmpty()) {
-                        allList.addAll(jdbcTemplate.queryForList(sql.toString(),
-                            tenant.getTenantCode(), tenant.getTenantName(), "%" + customerName + "%"));
-                    } else {
-                        allList.addAll(jdbcTemplate.queryForList(sql.toString(),
-                            tenant.getTenantCode(), tenant.getTenantName()));
-                    }
-                } catch (Exception e) {
-                    // skip tenant
-                } finally {
-                    tenantDataSourceManager.clear();
-                    DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
-                }
-            }
-        } catch (Exception e) {
-            // ignore
-        }
-
+                    sql.append(" LIMIT 200");
+                    return params.isEmpty()
+                            ? jdbc.queryForList(sql.toString())
+                            : jdbc.queryForList(sql.toString(), params.toArray());
+                });
         return getDataTable(allList);
     }
 }

+ 0 - 0
fs-service/src/main/java/com/fs/admin/controller/AdminHisBridgeController.java → fs-admin/src/main/java/com/fs/admin/controller/AdminHisBridgeController.java


+ 0 - 0
fs-service/src/main/java/com/fs/admin/controller/AdminLiveBridgeController.java → fs-admin/src/main/java/com/fs/admin/controller/AdminLiveBridgeController.java


+ 0 - 0
fs-service/src/main/java/com/fs/admin/controller/AdminLiveVideoController.java → fs-admin/src/main/java/com/fs/admin/controller/AdminLiveVideoController.java


+ 0 - 0
fs-service/src/main/java/com/fs/admin/controller/AdminLobsterBridgeController.java → fs-admin/src/main/java/com/fs/admin/controller/AdminLobsterBridgeController.java


+ 0 - 0
fs-service/src/main/java/com/fs/admin/controller/AdminMiscBridge2Controller.java → fs-admin/src/main/java/com/fs/admin/controller/AdminMiscBridge2Controller.java


+ 0 - 0
fs-service/src/main/java/com/fs/admin/controller/AdminMissingStubsController.java → fs-admin/src/main/java/com/fs/admin/controller/AdminMissingStubsController.java


+ 12 - 1
fs-admin/src/main/java/com/fs/admin/controller/AdminModuleUsageController.java

@@ -20,7 +20,7 @@ import org.springframework.web.bind.annotation.*;
  * 支持按代理维度、租户维度筛选
  */
 @RestController
-@RequestMapping("/admin/module-usage")
+@RequestMapping({"/admin/moduleUsage", "/admin/module-usage"})
 public class AdminModuleUsageController extends BaseController {
 
     @Autowired
@@ -38,6 +38,17 @@ public class AdminModuleUsageController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 查询租户模块使用统计汇总列表(每个租户一行,不按天展示)
+     */
+    @PreAuthorize("@ss.hasPermi('admin:moduleUsage:list')")
+    @GetMapping("/summary")
+    public TableDataInfo summary(TenantModuleUsage query) {
+        startPage();
+        List<TenantModuleUsage> list = tenantModuleUsageService.selectTenantModuleUsageSummary(query);
+        return getDataTable(list);
+    }
+
     /**
      * 按代理维度查看模块使用详情
      * 返回:指定代理下所有租户的模块使用情况

+ 0 - 0
fs-service/src/main/java/com/fs/admin/controller/AdminRechargeRecordController.java → fs-admin/src/main/java/com/fs/admin/controller/AdminRechargeRecordController.java


+ 0 - 0
fs-service/src/main/java/com/fs/admin/controller/AdminServiceCostController.java → fs-admin/src/main/java/com/fs/admin/controller/AdminServiceCostController.java


+ 32 - 81
fs-admin/src/main/java/com/fs/admin/controller/AdminSopController.java

@@ -2,112 +2,63 @@ package com.fs.admin.controller;
 
 import java.util.*;
 
+import com.fs.admin.helper.AdminCrossTenantHelper;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.page.TableDataInfo;
-import com.fs.common.enums.DataSourceType;
-import com.fs.framework.datasource.DynamicDataSourceContextHolder;
-import com.fs.framework.datasource.TenantDataSourceManager;
-import com.fs.tenant.domain.TenantInfo;
-import com.fs.tenant.service.TenantInfoService;
 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.*;
 
+/**
+ * 总后台SOP工作流管理控制器
+ * 遍历所有租户库查询 qw_sop / qw_sop_temp 数据
+ */
 @RestController
 @RequestMapping("/admin/sop")
 public class AdminSopController extends BaseController {
 
     @Autowired
-    private TenantDataSourceManager tenantDataSourceManager;
-
-    @Autowired
-    private TenantInfoService tenantInfoService;
-
-    @Autowired
-    private JdbcTemplate jdbcTemplate;
+    private AdminCrossTenantHelper crossTenantHelper;
 
     @PreAuthorize("@ss.hasPermi('admin:sop:list')")
     @GetMapping("/list")
     public TableDataInfo list(@RequestParam(required = false) String sopName,
-                              @RequestParam(required = false) String tenantCode) {
-        List<Map<String, Object>> allList = new ArrayList<>();
-
-        try {
-            DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
-            List<TenantInfo> tenants = tenantInfoService.selectTenantInfoList(new TenantInfo());
-            if (tenantCode != null && !tenantCode.isEmpty()) {
-                tenants.removeIf(t -> !t.getTenantCode().equals(tenantCode));
-            }
-
-            for (TenantInfo tenant : tenants) {
-                if (tenant.getStatus() == null || tenant.getStatus() != 1) continue;
-                try {
-                    tenantDataSourceManager.switchTenant(tenant);
-                    String tenantLabel = tenant.getTenantCode() + "|" + tenant.getTenantName();
-                    String sql = "SELECT qs.*, ? AS tenant_label FROM qw_sop qs WHERE 1=1";
-                    if (sopName != null && !sopName.isEmpty()) {
-                        sql += " AND qs.name LIKE ?";
-                    }
-                    sql += " ORDER BY qs.create_time DESC LIMIT 50";
+                              @RequestParam(required = false) Long companyId,
+                              @RequestParam(required = false) String companyName) {
+        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
+                companyId, companyName, (tenant, jdbc) -> {
+                    StringBuilder sql = new StringBuilder("SELECT qs.* FROM qw_sop qs WHERE 1=1");
+                    List<Object> params = new ArrayList<>();
                     if (sopName != null && !sopName.isEmpty()) {
-                        allList.addAll(jdbcTemplate.queryForList(sql, tenantLabel, "%" + sopName + "%"));
-                    } else {
-                        allList.addAll(jdbcTemplate.queryForList(sql, tenantLabel));
+                        sql.append(" AND qs.name LIKE ?");
+                        params.add("%" + sopName + "%");
                     }
-                } catch (Exception e) {
-                    // skip tenant
-                } finally {
-                    tenantDataSourceManager.clear();
-                    DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
-                }
-            }
-        } catch (Exception e) {
-            // ignore
-        }
-
+                    sql.append(" ORDER BY qs.create_time DESC LIMIT 200");
+                    return params.isEmpty()
+                            ? jdbc.queryForList(sql.toString())
+                            : jdbc.queryForList(sql.toString(), params.toArray());
+                });
         return getDataTable(allList);
     }
 
     @PreAuthorize("@ss.hasPermi('admin:sop:list')")
     @GetMapping("/temp/list")
     public TableDataInfo tempList(@RequestParam(required = false) String tempName,
-                                   @RequestParam(required = false) String tenantCode) {
-        List<Map<String, Object>> allList = new ArrayList<>();
-
-        try {
-            DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
-            List<TenantInfo> tenants = tenantInfoService.selectTenantInfoList(new TenantInfo());
-            if (tenantCode != null && !tenantCode.isEmpty()) {
-                tenants.removeIf(t -> !t.getTenantCode().equals(tenantCode));
-            }
-
-            for (TenantInfo tenant : tenants) {
-                if (tenant.getStatus() == null || tenant.getStatus() != 1) continue;
-                try {
-                    tenantDataSourceManager.switchTenant(tenant);
-                    String tenantLabel = tenant.getTenantCode() + "|" + tenant.getTenantName();
-                    String sql = "SELECT *, ? AS tenant_label FROM qw_sop_temp WHERE 1=1";
+                                  @RequestParam(required = false) Long companyId,
+                                  @RequestParam(required = false) String companyName) {
+        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
+                companyId, companyName, (tenant, jdbc) -> {
+                    StringBuilder sql = new StringBuilder("SELECT * FROM qw_sop_temp WHERE 1=1");
+                    List<Object> params = new ArrayList<>();
                     if (tempName != null && !tempName.isEmpty()) {
-                        sql += " AND name LIKE ?";
+                        sql.append(" AND name LIKE ?");
+                        params.add("%" + tempName + "%");
                     }
-                    sql += " ORDER BY create_time DESC LIMIT 50";
-                    if (tempName != null && !tempName.isEmpty()) {
-                        allList.addAll(jdbcTemplate.queryForList(sql, tenantLabel, "%" + tempName + "%"));
-                    } else {
-                        allList.addAll(jdbcTemplate.queryForList(sql, tenantLabel));
-                    }
-                } catch (Exception e) {
-                    // skip tenant
-                } finally {
-                    tenantDataSourceManager.clear();
-                    DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
-                }
-            }
-        } catch (Exception e) {
-            // ignore
-        }
-
+                    sql.append(" ORDER BY create_time DESC LIMIT 200");
+                    return params.isEmpty()
+                            ? jdbc.queryForList(sql.toString())
+                            : jdbc.queryForList(sql.toString(), params.toArray());
+                });
         return getDataTable(allList);
     }
 }

+ 135 - 0
fs-admin/src/main/java/com/fs/admin/controller/AdminStatisticsController.java

@@ -1,6 +1,7 @@
 package com.fs.admin.controller;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -10,6 +11,7 @@ import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.proxy.domain.PlatformStatistics;
+import com.fs.proxy.domain.Proxy;
 import com.fs.proxy.domain.ProxyServicePrice;
 import com.fs.proxy.domain.ProxyTenantRel;
 import com.fs.proxy.domain.TenantConsumeRecord;
@@ -40,6 +42,9 @@ public class AdminStatisticsController extends BaseController
     @Autowired
     private PlatformStatisticsService platformStatisticsService;
 
+    @Autowired
+    private ProxyService proxyService;
+
     /**
      * 获取平台总览统计
      */
@@ -259,4 +264,134 @@ public class AdminStatisticsController extends BaseController
             return AjaxResult.success("小时统计执行成功");
         }
     }
+
+    // ==================== 每日统计(代理维度) ====================
+
+    /**
+     * 每日统计 - 代理下租户消费明细
+     * 按天统计指定代理下每个租户的消费金额、成本、利润
+     */
+    @PreAuthorize("@ss.hasPermi('admin:statistics:daily')")
+    @GetMapping("/daily/agentTenants")
+    public AjaxResult getDailyAgentTenants(
+            @RequestParam(required = false) Long proxyId,
+            @RequestParam(required = false) String statDate) {
+        Date date = statDate != null ? java.sql.Date.valueOf(statDate)
+                : new java.sql.Date(System.currentTimeMillis());
+
+        // 获取该代理下的所有租户
+        List<ProxyTenantRel> tenantRels = proxyTenantRelService.selectProxyTenantRelByProxyId(proxyId);
+        List<Long> tenantIds = new java.util.ArrayList<>();
+        for (ProxyTenantRel rel : tenantRels) {
+            tenantIds.add(rel.getTenantId());
+        }
+
+        // 查询这些租户的日统计
+        List<PlatformStatistics> stats = platformStatisticsService.getTenantDailyByProxy(proxyId, tenantIds, date);
+
+        // 补充租户名称
+        Map<Long, String> tenantNameMap = new java.util.HashMap<>();
+        for (ProxyTenantRel rel : tenantRels) {
+            tenantNameMap.put(rel.getTenantId(), rel.getTenantName());
+        }
+        for (PlatformStatistics s : stats) {
+            if (s.getTenantId() != null && tenantNameMap.containsKey(s.getTenantId())) {
+                s.setRemark(tenantNameMap.get(s.getTenantId()));
+            }
+        }
+
+        // 计算汇总
+        BigDecimal totalConsume = stats.stream()
+                .map(s -> s.getConsumeAmount() != null ? s.getConsumeAmount() : BigDecimal.ZERO)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal totalCost = stats.stream()
+                .map(s -> s.getPlatformCost() != null ? s.getPlatformCost() : BigDecimal.ZERO)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal totalProfit = stats.stream()
+                .map(s -> s.getTenantPrice() != null ? s.getTenantPrice() : BigDecimal.ZERO)
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .subtract(totalCost);
+        BigDecimal totalAgentProfit = stats.stream()
+                .map(s -> s.getProxyProfit() != null ? s.getProxyProfit() : BigDecimal.ZERO)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("statDate", statDate);
+        result.put("proxyId", proxyId);
+        result.put("tenantCount", tenantRels.size());
+        result.put("totalConsume", totalConsume);
+        result.put("totalCost", totalCost);
+        result.put("totalProfit", totalProfit);
+        result.put("totalAgentProfit", totalAgentProfit);
+        result.put("items", stats);
+        result.put("tenantNames", tenantNameMap);
+        return AjaxResult.success(result);
+    }
+
+    /**
+     * 每日统计 - 各服务类型利润
+     * 按天统计指定代理下各服务类型的消费、成本、利润
+     */
+    @PreAuthorize("@ss.hasPermi('admin:statistics:daily')")
+    @GetMapping("/daily/serviceTypeProfit")
+    public AjaxResult getDailyServiceTypeProfit(
+            @RequestParam(required = false) Long proxyId,
+            @RequestParam(required = false) String statDate) {
+        Date date = statDate != null ? java.sql.Date.valueOf(statDate)
+                : new java.sql.Date(System.currentTimeMillis());
+
+        List<Long> tenantIds = null;
+        if (proxyId != null) {
+            List<ProxyTenantRel> tenantRels = proxyTenantRelService.selectProxyTenantRelByProxyId(proxyId);
+            tenantIds = new java.util.ArrayList<>();
+            for (ProxyTenantRel rel : tenantRels) {
+                tenantIds.add(rel.getTenantId());
+            }
+        }
+
+        List<PlatformStatistics> stats = platformStatisticsService.getTypeDailyByProxyTenants(tenantIds, date);
+
+        BigDecimal totalProfit = stats.stream()
+                .map(s -> {
+                    BigDecimal ca = s.getConsumeAmount() != null ? s.getConsumeAmount() : BigDecimal.ZERO;
+                    BigDecimal pc = s.getPlatformCost() != null ? s.getPlatformCost() : BigDecimal.ZERO;
+                    return ca.subtract(pc);
+                })
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("statDate", statDate);
+        result.put("proxyId", proxyId);
+        result.put("totalProfit", totalProfit);
+        result.put("items", stats);
+        return AjaxResult.success(result);
+    }
+
+    /**
+     * 每日统计 - 代理汇总
+     * 按天汇总所有代理的消费、成本、利润
+     */
+    @PreAuthorize("@ss.hasPermi('admin:statistics:daily')")
+    @GetMapping("/daily/agentSummary")
+    public AjaxResult getDailyAgentSummary(
+            @RequestParam(required = false) String statDate) {
+        Date date = statDate != null ? java.sql.Date.valueOf(statDate)
+                : new java.sql.Date(System.currentTimeMillis());
+
+        List<PlatformStatistics> stats = platformStatisticsService.getAgentDailySummary(date);
+
+        // 补充代理名称
+        List<Proxy> allProxies = proxyService.selectProxyList(null);
+        Map<Long, String> proxyNameMap = new java.util.HashMap<>();
+        for (Proxy p : allProxies) {
+            proxyNameMap.put(p.getProxyId(), p.getProxyName());
+        }
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("statDate", statDate);
+        result.put("proxyCount", stats.size());
+        result.put("items", stats);
+        result.put("proxyNames", proxyNameMap);
+        return AjaxResult.success(result);
+    }
 }

+ 0 - 0
fs-service/src/main/java/com/fs/admin/controller/AdminStoreMiscController.java → fs-admin/src/main/java/com/fs/admin/controller/AdminStoreMiscController.java


+ 0 - 0
fs-service/src/main/java/com/fs/admin/controller/AdminStoreOrderAdminController.java → fs-admin/src/main/java/com/fs/admin/controller/AdminStoreOrderAdminController.java


+ 166 - 55
fs-admin/src/main/java/com/fs/admin/controller/AdminStoreOrderController.java

@@ -1,71 +1,182 @@
 package com.fs.admin.controller;
 
-import java.util.*;
-
+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.DataSourceType;
-import com.fs.framework.datasource.DynamicDataSourceContextHolder;
-import com.fs.framework.datasource.TenantDataSourceManager;
-import com.fs.tenant.domain.TenantInfo;
-import com.fs.tenant.service.TenantInfoService;
+import com.fs.common.enums.BusinessType;
+import com.fs.hisStore.domain.*;
+import com.fs.hisStore.param.FsStoreOrderAuditParam;
+import com.fs.hisStore.service.*;
+import com.fs.hisStore.vo.FsStoreOrderAuditVO;
 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 java.util.List;
+
+/**
+ * 商城订单/支付/售后管理 - adminui端Controller(fs-admin 8004)
+ * 桥接 hisStore 服务层,提供 /store/* 订单相关路径的完整CRUD
+ */
 @RestController
-@RequestMapping("/admin/storeOrder")
 public class AdminStoreOrderController extends BaseController {
 
     @Autowired
-    private TenantDataSourceManager tenantDataSourceManager;
-
+    private IFsStoreOrderScrmService storeOrderService;
     @Autowired
-    private TenantInfoService tenantInfoService;
-
+    private IFsStorePaymentScrmService storePaymentService;
+    @Autowired
+    private IFsStoreAfterSalesScrmService storeAfterSalesService;
+    @Autowired
+    private IFsStoreAfterSalesItemScrmService storeAfterSalesItemService;
+    @Autowired
+    private IFsStoreAfterSalesStatusScrmService storeAfterSalesStatusService;
+    @Autowired
+    private IFsStoreOrderAuditScrmService storeOrderAuditService;
+    @Autowired
+    private IFsStoreOrderItemScrmService storeOrderItemService;
+    @Autowired
+    private IFsStoreOrderNoticeScrmService storeOrderNoticeService;
+    @Autowired
+    private IFsStoreOrderOfflineScrmService storeOrderOfflineService;
     @Autowired
-    private JdbcTemplate jdbcTemplate;
-
-    @PreAuthorize("@ss.hasPermi('admin:storeOrder:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(@RequestParam(required = false) String orderNo,
-                              @RequestParam(required = false) String tenantCode) {
-        List<Map<String, Object>> allList = new ArrayList<>();
-
-        try {
-            DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
-            List<TenantInfo> tenants = tenantInfoService.selectTenantInfoList(new TenantInfo());
-            if (tenantCode != null && !tenantCode.isEmpty()) {
-                tenants.removeIf(t -> !t.getTenantCode().equals(tenantCode));
-            }
-
-            for (TenantInfo tenant : tenants) {
-                if (tenant.getStatus() == null || tenant.getStatus() != 1) continue;
-                try {
-                    tenantDataSourceManager.switchTenant(tenant);
-                    String tenantLabel = tenant.getTenantCode() + "|" + tenant.getTenantName();
-                    String sql = "SELECT *, ? AS tenant_label FROM fs_store_order WHERE 1=1";
-                    if (orderNo != null && !orderNo.isEmpty()) {
-                        sql += " AND order_no LIKE ?";
-                    }
-                    sql += " ORDER BY create_time DESC LIMIT 50";
-                    if (orderNo != null && !orderNo.isEmpty()) {
-                        allList.addAll(jdbcTemplate.queryForList(sql, tenantLabel, "%" + orderNo + "%"));
-                    } else {
-                        allList.addAll(jdbcTemplate.queryForList(sql, tenantLabel));
-                    }
-                } catch (Exception e) {
-                    // skip tenant
-                } finally {
-                    tenantDataSourceManager.clear();
-                    DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
-                }
-            }
-        } catch (Exception e) {
-            // ignore
-        }
-
-        return getDataTable(allList);
+    private IFsStoreOrderOfflineItemScrmService storeOrderOfflineItemService;
+    @Autowired
+    private IFsStoreOrderStatusScrmService storeOrderStatusService;
+
+    // ========== 商城订单 /store/storeOrder ==========
+    @PreAuthorize("@ss.hasPermi('store:storeOrder:list')")
+    @GetMapping("/store/storeOrder/list")
+    public TableDataInfo storeOrderList(FsStoreOrderScrm param) {
+        startPage();
+        List<FsStoreOrderScrm> list = storeOrderService.selectFsStoreOrderList(param);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('store:storeOrder:query')")
+    @GetMapping("/store/storeOrder/{orderId}")
+    public AjaxResult storeOrderInfo(@PathVariable("orderId") Long orderId) {
+        return AjaxResult.success(storeOrderService.selectFsStoreOrderById(orderId));
+    }
+
+    // ========== 支付管理 /store/storePayment ==========
+    @PreAuthorize("@ss.hasPermi('store:storePayment:list')")
+    @GetMapping("/store/storePayment/list")
+    public TableDataInfo storePaymentList(FsStorePaymentScrm param) {
+        startPage();
+        List<FsStorePaymentScrm> list = storePaymentService.selectFsStorePaymentList(param);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('store:storePayment:query')")
+    @GetMapping("/store/storePayment/{paymentId}")
+    public AjaxResult storePaymentInfo(@PathVariable("paymentId") Long paymentId) {
+        return AjaxResult.success(storePaymentService.selectFsStorePaymentById(paymentId));
+    }
+
+    // ========== 售后管理 /store/storeAfterSales ==========
+    @PreAuthorize("@ss.hasPermi('store:storeAfterSales:list')")
+    @GetMapping("/store/storeAfterSales/list")
+    public TableDataInfo storeAfterSalesList(FsStoreAfterSalesScrm param) {
+        startPage();
+        List<FsStoreAfterSalesScrm> list = storeAfterSalesService.selectFsStoreAfterSalesList(param);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('store:storeAfterSales:query')")
+    @GetMapping("/store/storeAfterSales/{afterSalesId}")
+    public AjaxResult storeAfterSalesInfo(@PathVariable("afterSalesId") Long afterSalesId) {
+        return AjaxResult.success(storeAfterSalesService.selectFsStoreAfterSalesById(afterSalesId));
+    }
+
+    // ========== 售后明细 /store/storeAfterSalesItem ==========
+    @PreAuthorize("@ss.hasPermi('store:storeAfterSalesItem:list')")
+    @GetMapping("/store/storeAfterSalesItem/list")
+    public TableDataInfo storeAfterSalesItemList(FsStoreAfterSalesItemScrm param) {
+        startPage();
+        List<FsStoreAfterSalesItemScrm> list = storeAfterSalesItemService.selectFsStoreAfterSalesItemList(param);
+        return getDataTable(list);
+    }
+
+    // ========== 售后状态 /store/storeAfterSalesStatus ==========
+    @PreAuthorize("@ss.hasPermi('store:storeAfterSalesStatus:list')")
+    @GetMapping("/store/storeAfterSalesStatus/list")
+    public TableDataInfo storeAfterSalesStatusList(FsStoreAfterSalesStatusScrm param) {
+        startPage();
+        List<FsStoreAfterSalesStatusScrm> list = storeAfterSalesStatusService.selectFsStoreAfterSalesStatusList(param);
+        return getDataTable(list);
+    }
+
+    // ========== 订单审核 /store/storeOrderAudit ==========
+    @PreAuthorize("@ss.hasPermi('store:storeOrderAudit:list')")
+    @GetMapping("/store/storeOrderAudit/list")
+    public TableDataInfo storeOrderAuditList(FsStoreOrderAuditParam param) {
+        startPage();
+        List<FsStoreOrderAuditVO> list = storeOrderAuditService.selectStoreOrderAuditVOList(param);
+        return getDataTable(list);
+    }
+
+    // ========== 订单明细 /store/storeOrderItem ==========
+    @PreAuthorize("@ss.hasPermi('store:storeOrderItem:list')")
+    @GetMapping("/store/storeOrderItem/list")
+    public TableDataInfo storeOrderItemList(FsStoreOrderItemScrm param) {
+        startPage();
+        List<FsStoreOrderItemScrm> list = storeOrderItemService.selectFsStoreOrderItemList(param);
+        return getDataTable(list);
+    }
+
+    // ========== 订单通知 /store/storeOrderNotice ==========
+    @PreAuthorize("@ss.hasPermi('store:storeOrderNotice:list')")
+    @GetMapping("/store/storeOrderNotice/list")
+    public TableDataInfo storeOrderNoticeList(FsStoreOrderNoticeScrm param) {
+        startPage();
+        List<FsStoreOrderNoticeScrm> list = storeOrderNoticeService.selectFsStoreOrderNoticeList(param);
+        return getDataTable(list);
+    }
+
+    // ========== 线下订单 /store/storeOrderOffline ==========
+    @PreAuthorize("@ss.hasPermi('store:storeOrderOffline:list')")
+    @GetMapping("/store/storeOrderOffline/list")
+    public TableDataInfo storeOrderOfflineList(FsStoreOrderOfflineScrm param) {
+        startPage();
+        List<FsStoreOrderOfflineScrm> list = storeOrderOfflineService.selectFsStoreOrderOfflineList(param);
+        return getDataTable(list);
+    }
+
+    // ========== 线下订单明细 /storeOrderOfflineItem/store ==========
+    @PreAuthorize("@ss.hasPermi('storeOrderOfflineItem:store:list')")
+    @GetMapping("/storeOrderOfflineItem/store/list")
+    public TableDataInfo storeOrderOfflineItemList(FsStoreOrderOfflineItemScrm param) {
+        startPage();
+        List<FsStoreOrderOfflineItemScrm> list = storeOrderOfflineItemService.selectFsStoreOrderOfflineItemList(param);
+        return getDataTable(list);
+    }
+
+    // ========== 订单状态 /store/storeOrderStatus ==========
+    @PreAuthorize("@ss.hasPermi('store:storeOrderStatus:list')")
+    @GetMapping("/store/storeOrderStatus/list")
+    public TableDataInfo storeOrderStatusList(FsStoreOrderStatusScrm param) {
+        startPage();
+        List<FsStoreOrderStatusScrm> list = storeOrderStatusService.selectFsStoreOrderStatusList(param);
+        return getDataTable(list);
+    }
+
+    // ========== 健康商城订单 /store/healthStoreOrder (别名) ==========
+    @PreAuthorize("@ss.hasPermi('store:healthStoreOrder:list')")
+    @GetMapping("/store/healthStoreOrder/list")
+    public TableDataInfo healthStoreOrderList(FsStoreOrderScrm param) {
+        startPage();
+        List<FsStoreOrderScrm> list = storeOrderService.selectFsStoreOrderList(param);
+        return getDataTable(list);
+    }
+
+    // ========== 推广订单 /store/PromotionOrder ==========
+    @PreAuthorize("@ss.hasPermi('store:PromotionOrder:list')")
+    @GetMapping("/store/PromotionOrder/list")
+    public TableDataInfo promotionOrderList(FsStoreOrderScrm param) {
+        startPage();
+        List<FsStoreOrderScrm> list = storeOrderService.selectFsStoreOrderList(param);
+        return getDataTable(list);
     }
 }

+ 0 - 0
fs-service/src/main/java/com/fs/admin/controller/AdminStoreProductController.java → fs-admin/src/main/java/com/fs/admin/controller/AdminStoreProductController.java


+ 0 - 0
fs-service/src/main/java/com/fs/admin/controller/AdminVideoResourceController.java → fs-admin/src/main/java/com/fs/admin/controller/AdminVideoResourceController.java


+ 0 - 0
fs-service/src/main/java/com/fs/admin/controller/AdminWithdrawalController.java → fs-admin/src/main/java/com/fs/admin/controller/AdminWithdrawalController.java


+ 1 - 1
fs-admin/src/main/java/com/fs/admin/controller/AiChatQualityController.java

@@ -29,7 +29,7 @@ public class AiChatQualityController extends BaseController {
     private AiChatQualityService aiChatQualityService;
 
     @PreAuthorize("@ss.hasPermi('admin:aiChatQuality:list')")
-    @GetMapping("/sessions")
+    @GetMapping({"/list", "/sessions"})
     public TableDataInfo listSessions(FastGptChatSession session) {
         startPage();
         List<FastGptChatSession> list = fastGptChatSessionService.selectFastGptChatSessionList(session);

+ 1 - 1
fs-admin/src/main/java/com/fs/admin/controller/AiProviderAdminController.java

@@ -13,7 +13,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 @RestController
-@RequestMapping("/knowledge/ai-provider")
+@RequestMapping({"/admin/aiProvider", "/knowledge/ai-provider"})
 public class AiProviderAdminController extends BaseController
 {
     @Autowired

+ 44 - 63
fs-admin/src/main/java/com/fs/admin/controller/ArticleAdminController.java

@@ -1,70 +1,51 @@
 package com.fs.admin.controller;
 
+import java.util.*;
+
+import com.fs.admin.helper.AdminCrossTenantHelper;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.page.TableDataInfo;
-import com.fs.his.domain.FsArticle;
-import com.fs.his.service.IFsArticleService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.List;
-
 /**
  * 总后台文章内容审计控制器
- * 审计所有租户的文章内容
+ * 遍历所有租户库查询 fs_article 数据
  */
 @RestController
 @RequestMapping("/admin/article")
 public class ArticleAdminController extends BaseController {
 
     @Autowired
-    private IFsArticleService fsArticleService;
+    private AdminCrossTenantHelper crossTenantHelper;
 
     /**
      * 查询所有租户的文章列表
      */
     @PreAuthorize("@ss.hasPermi('admin:article:list')")
     @GetMapping("/list")
-    public TableDataInfo list(FsArticle article) {
-        startPage();
-        List<FsArticle> list = fsArticleService.selectFsArticleList(article);
-        return getDataTable(list);
-    }
-
-    /**
-     * 获取文章详细信息
-     */
-    @PreAuthorize("@ss.hasPermi('admin:article:query')")
-    @GetMapping(value = "/{articleId}")
-    public AjaxResult getInfo(@PathVariable("articleId") Long articleId) {
-        return AjaxResult.success(fsArticleService.selectFsArticleByArticleId(articleId));
-    }
-
-    /**
-     * 根据租户ID查询文章列表
-     */
-    @PreAuthorize("@ss.hasPermi('admin:article:query')")
-    @GetMapping("/byCompany/{companyId}")
-    public TableDataInfo getByCompanyId(@PathVariable Long companyId) {
-        startPage();
-        FsArticle article = new FsArticle();
-        List<FsArticle> list = fsArticleService.selectFsArticleList(article);
-        return getDataTable(list);
-    }
-
-    /**
-     * 审计文章(通过/拒绝)
-     */
-    @PreAuthorize("@ss.hasPermi('admin:article:audit')")
-    @PutMapping("/audit/{articleId}")
-    public AjaxResult audit(@PathVariable Long articleId,
-                           @RequestParam Integer status,
-                           @RequestParam(required = false) String auditRemark) {
-        FsArticle article = new FsArticle();
-        article.setArticleId(articleId);
-        return toAjax(fsArticleService.updateFsArticle(article));
+    public TableDataInfo list(@RequestParam(required = false) String articleTitle,
+                              @RequestParam(required = false) Long companyId,
+                              @RequestParam(required = false) String companyName) {
+        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
+                companyId, companyName, (tenant, jdbc) -> {
+                    StringBuilder sql = new StringBuilder(
+                            "SELECT a.article_id, a.article_title, a.category_name, a.author, " +
+                            "a.create_time, a.status " +
+                            "FROM fs_article a WHERE 1=1");
+                    List<Object> params = new ArrayList<>();
+                    if (articleTitle != null && !articleTitle.isEmpty()) {
+                        sql.append(" AND a.article_title LIKE ?");
+                        params.add("%" + articleTitle + "%");
+                    }
+                    sql.append(" ORDER BY a.create_time DESC LIMIT 200");
+                    return params.isEmpty()
+                            ? jdbc.queryForList(sql.toString())
+                            : jdbc.queryForList(sql.toString(), params.toArray());
+                });
+        return getDataTable(allList);
     }
 
     /**
@@ -72,20 +53,15 @@ public class ArticleAdminController extends BaseController {
      */
     @PreAuthorize("@ss.hasPermi('admin:article:list')")
     @GetMapping("/pending")
-    public TableDataInfo pendingList() {
-        startPage();
-        FsArticle article = new FsArticle();
-        List<FsArticle> list = fsArticleService.selectFsArticleList(article);
-        return getDataTable(list);
-    }
-
-    /**
-     * 删除文章
-     */
-    @PreAuthorize("@ss.hasPermi('admin:article:remove')")
-    @DeleteMapping("/{articleIds}")
-    public AjaxResult remove(@PathVariable Long[] articleIds) {
-        return toAjax(fsArticleService.deleteFsArticleByArticleIds(articleIds));
+    public TableDataInfo pendingList(@RequestParam(required = false) Long companyId,
+                                     @RequestParam(required = false) String companyName) {
+        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
+                companyId, companyName, (tenant, jdbc) ->
+                        jdbc.queryForList(
+                                "SELECT a.article_id, a.article_title, a.category_name, a.author, " +
+                                "a.create_time, a.status " +
+                                "FROM fs_article a WHERE a.status = 0 ORDER BY a.create_time DESC LIMIT 200"));
+        return getDataTable(allList);
     }
 
     /**
@@ -93,11 +69,16 @@ public class ArticleAdminController extends BaseController {
      */
     @PreAuthorize("@ss.hasPermi('admin:article:query')")
     @GetMapping("/statistics")
-    public AjaxResult statistics() {
-        FsArticle query = new FsArticle();
-        List<FsArticle> all = fsArticleService.selectFsArticleList(query);
-        java.util.Map<String, Object> result = new java.util.HashMap<>();
-        result.put("totalCount", all.size());
+    public AjaxResult statistics(@RequestParam(required = false) Long companyId,
+                                 @RequestParam(required = false) String companyName) {
+        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
+                companyId, companyName, (tenant, jdbc) ->
+                        jdbc.queryForList("SELECT article_id, status FROM fs_article"));
+        Map<String, Object> result = new HashMap<>();
+        result.put("totalCount", allList.size());
+        result.put("pendingCount", allList.stream().filter(r -> "0".equals(String.valueOf(r.get("status")))).count());
+        result.put("approvedCount", allList.stream().filter(r -> "1".equals(String.valueOf(r.get("status")))).count());
+        result.put("rejectedCount", allList.stream().filter(r -> "2".equals(String.valueOf(r.get("status")))).count());
         return AjaxResult.success(result);
     }
 }

+ 37 - 57
fs-admin/src/main/java/com/fs/admin/controller/CourseAdminController.java

@@ -1,79 +1,51 @@
 package com.fs.admin.controller;
 
+import java.util.*;
+
+import com.fs.admin.helper.AdminCrossTenantHelper;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.page.TableDataInfo;
-import com.fs.course.domain.FsUserCourseVideo;
-import com.fs.course.service.IFsUserCourseVideoService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.List;
-
 /**
  * 总后台课程内容管理控制器
- * 查看所有租户的课程内容
+ * 遍历所有租户库查询课程数据
  */
 @RestController
 @RequestMapping("/admin/course")
 public class CourseAdminController extends BaseController {
 
     @Autowired
-    private IFsUserCourseVideoService fsUserCourseVideoService;
+    private AdminCrossTenantHelper crossTenantHelper;
 
     /**
      * 查询所有租户的课程列表
      */
     @PreAuthorize("@ss.hasPermi('admin:course:list')")
     @GetMapping("/list")
-    public TableDataInfo list(FsUserCourseVideo course) {
-        startPage();
-        List<FsUserCourseVideo> list = fsUserCourseVideoService.selectFsUserCourseVideoList(course);
-        return getDataTable(list);
-    }
-
-    /**
-     * 获取课程详细信息
-     */
-    @PreAuthorize("@ss.hasPermi('admin:course:query')")
-    @GetMapping(value = "/{courseId}")
-    public AjaxResult getInfo(@PathVariable("courseId") Long courseId) {
-        return AjaxResult.success(fsUserCourseVideoService.selectFsUserCourseVideoByVideoId(courseId));
-    }
-
-    /**
-     * 根据租户ID查询课程列表
-     */
-    @PreAuthorize("@ss.hasPermi('admin:course:query')")
-    @GetMapping("/byCompany/{companyId}")
-    public TableDataInfo getByCompanyId(@PathVariable Long companyId) {
-        startPage();
-        FsUserCourseVideo course = new FsUserCourseVideo();
-        List<FsUserCourseVideo> list = fsUserCourseVideoService.selectFsUserCourseVideoList(course);
-        return getDataTable(list);
-    }
-
-    /**
-     * 审核课程(上架/下架)
-     */
-    @PreAuthorize("@ss.hasPermi('admin:course:audit')")
-    @PutMapping("/audit/{courseId}")
-    public AjaxResult audit(@PathVariable Long courseId, @RequestParam Integer status) {
-        FsUserCourseVideo course = new FsUserCourseVideo();
-        course.setCourseId(courseId);
-        return toAjax(fsUserCourseVideoService.updateFsUserCourseVideo(course));
-    }
-
-    /**
-     * 删除课程
-     */
-    @PreAuthorize("@ss.hasPermi('admin:course:remove')")
-    @DeleteMapping("/{courseIds}")
-    public AjaxResult remove(@PathVariable Long[] courseIds) {
-        String[] ids = new String[courseIds.length];
-        for (int i = 0; i < courseIds.length; i++) ids[i] = String.valueOf(courseIds[i]);
-        return toAjax(fsUserCourseVideoService.deleteFsUserCourseVideoByVideoIds(ids));
+    public TableDataInfo list(@RequestParam(required = false) String courseName,
+                              @RequestParam(required = false) Long companyId,
+                              @RequestParam(required = false) String companyName) {
+        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
+                companyId, companyName, (tenant, jdbc) -> {
+                    StringBuilder sql = new StringBuilder(
+                            "SELECT v.video_id, v.course_id, v.course_name, v.cover_url, " +
+                            "v.duration, v.play_count, v.create_time, v.status " +
+                            "FROM fs_user_course_video v WHERE 1=1");
+                    List<Object> params = new ArrayList<>();
+                    if (courseName != null && !courseName.isEmpty()) {
+                        sql.append(" AND v.course_name LIKE ?");
+                        params.add("%" + courseName + "%");
+                    }
+                    sql.append(" ORDER BY v.create_time DESC LIMIT 200");
+                    return params.isEmpty()
+                            ? jdbc.queryForList(sql.toString())
+                            : jdbc.queryForList(sql.toString(), params.toArray());
+                });
+        return getDataTable(allList);
     }
 
     /**
@@ -81,10 +53,18 @@ public class CourseAdminController extends BaseController {
      */
     @PreAuthorize("@ss.hasPermi('admin:course:query')")
     @GetMapping("/statistics")
-    public AjaxResult statistics() {
-        long total = fsUserCourseVideoService.count();
-        java.util.Map<String, Object> result = new java.util.HashMap<>();
-        result.put("totalCount", total);
+    public AjaxResult statistics(@RequestParam(required = false) Long companyId,
+                                 @RequestParam(required = false) String companyName) {
+        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
+                companyId, companyName, (tenant, jdbc) ->
+                        jdbc.queryForList("SELECT video_id, status FROM fs_user_course_video"));
+        Map<String, Object> result = new HashMap<>();
+        result.put("totalCount", allList.size());
+        result.put("onlineCount", allList.stream().filter(r -> "0".equals(String.valueOf(r.get("status")))).count());
+        result.put("offlineCount", allList.stream().filter(r -> "1".equals(String.valueOf(r.get("status")))).count());
+        result.put("totalPlayCount", allList.stream()
+                .mapToLong(r -> r.get("play_count") != null ? ((Number) r.get("play_count")).longValue() : 0L)
+                .sum());
         return AjaxResult.success(result);
     }
 }

+ 32 - 57
fs-admin/src/main/java/com/fs/admin/controller/LiveAdminController.java

@@ -1,78 +1,51 @@
 package com.fs.admin.controller;
 
+import java.util.*;
+
+import com.fs.admin.helper.AdminCrossTenantHelper;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.page.TableDataInfo;
-import com.fs.live.domain.LiveVideo;
-import com.fs.live.service.ILiveVideoService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.List;
-
 /**
  * 总后台直播内容管理控制器
- * 查看所有租户的直播内容
+ * 遍历所有租户库查询 live_video 数据
  */
 @RestController
 @RequestMapping("/admin/live")
 public class LiveAdminController extends BaseController {
 
     @Autowired
-    private ILiveVideoService liveVideoService;
+    private AdminCrossTenantHelper crossTenantHelper;
 
     /**
      * 查询所有租户的直播列表
      */
     @PreAuthorize("@ss.hasPermi('admin:live:list')")
     @GetMapping("/list")
-    public TableDataInfo list(LiveVideo liveVideo) {
-        startPage();
-        List<LiveVideo> list = liveVideoService.selectLiveVideoList(liveVideo);
-        return getDataTable(list);
-    }
-
-    /**
-     * 获取直播详细信息
-     */
-    @PreAuthorize("@ss.hasPermi('admin:live:query')")
-    @GetMapping(value = "/{liveId}")
-    public AjaxResult getInfo(@PathVariable("liveId") Long liveId) {
-        return AjaxResult.success(liveVideoService.selectLiveVideoByVideoId(liveId));
-    }
-
-    /**
-     * 根据租户ID查询直播列表
-     */
-    @PreAuthorize("@ss.hasPermi('admin:live:query')")
-    @GetMapping("/byCompany/{companyId}")
-    public TableDataInfo getByCompanyId(@PathVariable Long companyId) {
-        startPage();
-        LiveVideo liveVideo = new LiveVideo();
-        // 不设置companyId过滤,查询所有
-        List<LiveVideo> list = liveVideoService.selectLiveVideoList(liveVideo);
-        return getDataTable(list);
-    }
-
-    /**
-     * 审核直播(上架/下架)
-     */
-    @PreAuthorize("@ss.hasPermi('admin:live:audit')")
-    @PutMapping("/audit/{liveId}")
-    public AjaxResult audit(@PathVariable Long liveId, @RequestParam Integer status) {
-        LiveVideo liveVideo = new LiveVideo();
-        liveVideo.setVideoId(liveId);
-        return toAjax(liveVideoService.updateLiveVideo(liveVideo));
-    }
-
-    /**
-     * 删除直播
-     */
-    @PreAuthorize("@ss.hasPermi('admin:live:remove')")
-    @DeleteMapping("/{liveIds}")
-    public AjaxResult remove(@PathVariable Long[] liveIds) {
-        return toAjax(liveVideoService.deleteLiveVideoByVideoIds(liveIds));
+    public TableDataInfo list(@RequestParam(required = false) String liveName,
+                              @RequestParam(required = false) Long companyId,
+                              @RequestParam(required = false) String companyName) {
+        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
+                companyId, companyName, (tenant, jdbc) -> {
+                    StringBuilder sql = new StringBuilder(
+                            "SELECT v.video_id, v.title, v.cover_url, v.live_status, " +
+                            "v.start_time, v.end_time, v.create_time " +
+                            "FROM live_video v WHERE 1=1");
+                    List<Object> params = new ArrayList<>();
+                    if (liveName != null && !liveName.isEmpty()) {
+                        sql.append(" AND v.title LIKE ?");
+                        params.add("%" + liveName + "%");
+                    }
+                    sql.append(" ORDER BY v.create_time DESC LIMIT 200");
+                    return params.isEmpty()
+                            ? jdbc.queryForList(sql.toString())
+                            : jdbc.queryForList(sql.toString(), params.toArray());
+                });
+        return getDataTable(allList);
     }
 
     /**
@@ -80,11 +53,13 @@ public class LiveAdminController extends BaseController {
      */
     @PreAuthorize("@ss.hasPermi('admin:live:query')")
     @GetMapping("/statistics")
-    public AjaxResult statistics() {
-        LiveVideo query = new LiveVideo();
-        List<LiveVideo> all = liveVideoService.selectLiveVideoList(query);
-        java.util.Map<String, Object> result = new java.util.HashMap<>();
-        result.put("totalCount", all.size());
+    public AjaxResult statistics(@RequestParam(required = false) Long companyId,
+                                 @RequestParam(required = false) String companyName) {
+        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
+                companyId, companyName, (tenant, jdbc) ->
+                        jdbc.queryForList("SELECT video_id, live_status FROM live_video"));
+        Map<String, Object> result = new HashMap<>();
+        result.put("totalCount", allList.size());
         return AjaxResult.success(result);
     }
 }

+ 23 - 56
fs-admin/src/main/java/com/fs/admin/controller/LobsterAdminController.java

@@ -1,76 +1,40 @@
 package com.fs.admin.controller;
 
+import java.util.*;
+
+import com.fs.admin.helper.AdminCrossTenantHelper;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.page.TableDataInfo;
-import com.fs.company.domain.LobsterWorkflowInstance;
-import com.fs.company.mapper.LobsterWorkflowInstanceMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 /**
  * 总后台龙虾引擎管理控制器
- * 查看所有租户的工作流实例、运行统计
+ * 遍历所有租户库查询工作流实例数据
  */
 @RestController
 @RequestMapping("/admin/lobster")
 public class LobsterAdminController extends BaseController {
 
     @Autowired
-    private LobsterWorkflowInstanceMapper instanceMapper;
+    private AdminCrossTenantHelper crossTenantHelper;
 
     /**
      * 查询所有租户的工作流实例列表
      */
     @PreAuthorize("@ss.hasPermi('admin:lobster:list')")
     @GetMapping("/instance/list")
-    public TableDataInfo instanceList(LobsterWorkflowInstance query) {
-        startPage();
-        // 查询所有租户的实例(不限制companyId)
-        List<LobsterWorkflowInstance> list = instanceMapper.selectByCompanyId(null);
-        return getDataTable(list);
-    }
-
-    /**
-     * 查询指定实例详情
-     */
-    @PreAuthorize("@ss.hasPermi('admin:lobster:list')")
-    @GetMapping("/instance/{instanceId}")
-    public AjaxResult instanceDetail(@PathVariable Long instanceId) {
-        LobsterWorkflowInstance instance = instanceMapper.selectById(instanceId);
-        if (instance == null) {
-            return AjaxResult.error("实例不存在");
-        }
-        return AjaxResult.success(instance);
-    }
-
-    /**
-     * 查询指定实例的节点执行日志
-     */
-    @PreAuthorize("@ss.hasPermi('admin:lobster:list')")
-    @GetMapping("/instance/node-logs/{instanceId}")
-    public AjaxResult instanceNodeLogs(@PathVariable Long instanceId) {
-        // 节点日志通过instanceId查询,由LobsterNodeExecutionLogMapper处理
-        return AjaxResult.success();
-    }
-
-    /**
-     * 强制终止指定实例
-     */
-    @PreAuthorize("@ss.hasPermi('admin:lobster:list')")
-    @PostMapping("/instance/terminate/{instanceId}")
-    public AjaxResult terminateInstance(@PathVariable Long instanceId, @RequestParam(required = false) String reason) {
-        LobsterWorkflowInstance instance = instanceMapper.selectById(instanceId);
-        if (instance == null) {
-            return AjaxResult.error("实例不存在");
-        }
-        instanceMapper.updateStatus(instanceId, instance.getCompanyId(), "TERMINATED");
-        return AjaxResult.success("实例已终止");
+    public TableDataInfo instanceList(@RequestParam(required = false) Long companyId,
+                                      @RequestParam(required = false) String companyName) {
+        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
+                companyId, companyName, (tenant, jdbc) ->
+                        jdbc.queryForList(
+                                "SELECT i.id, i.instance_name, i.workflow_id, i.status, " +
+                                "i.company_id, i.create_time, i.update_time " +
+                                "FROM lobster_workflow_instance i ORDER BY i.create_time DESC LIMIT 200"));
+        return getDataTable(allList);
     }
 
     /**
@@ -78,13 +42,16 @@ public class LobsterAdminController extends BaseController {
      */
     @PreAuthorize("@ss.hasPermi('admin:lobster:list')")
     @GetMapping("/instance/stats")
-    public AjaxResult instanceStats() {
-        List<LobsterWorkflowInstance> allInstances = instanceMapper.selectByCompanyId(null);
+    public AjaxResult instanceStats(@RequestParam(required = false) Long companyId,
+                                    @RequestParam(required = false) String companyName) {
+        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
+                companyId, companyName, (tenant, jdbc) ->
+                        jdbc.queryForList("SELECT id, status FROM lobster_workflow_instance"));
         Map<String, Object> stats = new HashMap<>();
-        stats.put("totalInstances", allInstances.size());
-        stats.put("runningInstances", allInstances.stream().filter(i -> "RUNNING".equals(i.getStatus())).count());
-        stats.put("completedInstances", allInstances.stream().filter(i -> "COMPLETED".equals(i.getStatus())).count());
-        stats.put("failedInstances", allInstances.stream().filter(i -> "FAILED".equals(i.getStatus())).count());
+        stats.put("totalInstances", allList.size());
+        stats.put("runningInstances", allList.stream().filter(i -> "RUNNING".equals(String.valueOf(i.get("status")))).count());
+        stats.put("completedInstances", allList.stream().filter(i -> "COMPLETED".equals(String.valueOf(i.get("status")))).count());
+        stats.put("failedInstances", allList.stream().filter(i -> "FAILED".equals(String.valueOf(i.get("status")))).count());
         return AjaxResult.success(stats);
     }
 }

+ 44 - 62
fs-admin/src/main/java/com/fs/admin/controller/ProductAdminController.java

@@ -1,70 +1,51 @@
 package com.fs.admin.controller;
 
+import java.util.*;
+
+import com.fs.admin.helper.AdminCrossTenantHelper;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.page.TableDataInfo;
-import com.fs.his.domain.FsStoreProduct;
-import com.fs.his.service.IFsStoreProductService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.List;
-
 /**
  * 总后台商品审核控制器
- * 审核所有租户的商品上架申请
+ * 遍历所有租户库查询 fs_store_product 数据
  */
 @RestController
 @RequestMapping("/admin/product")
 public class ProductAdminController extends BaseController {
 
     @Autowired
-    private IFsStoreProductService fsStoreProductService;
+    private AdminCrossTenantHelper crossTenantHelper;
 
     /**
      * 查询所有租户的商品列表
      */
     @PreAuthorize("@ss.hasPermi('admin:product:list')")
     @GetMapping("/list")
-    public TableDataInfo list(FsStoreProduct product) {
-        startPage();
-        List<FsStoreProduct> list = fsStoreProductService.selectFsStoreProductList(product);
-        return getDataTable(list);
-    }
-
-    /**
-     * 获取商品详细信息
-     */
-    @PreAuthorize("@ss.hasPermi('admin:product:query')")
-    @GetMapping(value = "/{productId}")
-    public AjaxResult getInfo(@PathVariable("productId") Long productId) {
-        return AjaxResult.success(fsStoreProductService.selectFsStoreProductById(productId));
-    }
-
-    /**
-     * 根据租户ID查询商品列表
-     */
-    @PreAuthorize("@ss.hasPermi('admin:product:query')")
-    @GetMapping("/byCompany/{companyId}")
-    public TableDataInfo getByCompanyId(@PathVariable Long companyId) {
-        startPage();
-        FsStoreProduct product = new FsStoreProduct();
-        List<FsStoreProduct> list = fsStoreProductService.selectFsStoreProductList(product);
-        return getDataTable(list);
-    }
-
-    /**
-     * 审核商品(上架/拒绝)
-     */
-    @PreAuthorize("@ss.hasPermi('admin:product:audit')")
-    @PutMapping("/audit/{productId}")
-    public AjaxResult audit(@PathVariable Long productId,
-                           @RequestParam Integer status,
-                           @RequestParam(required = false) String auditRemark) {
-        FsStoreProduct product = new FsStoreProduct();
-        product.setProductId(productId);
-        return toAjax(fsStoreProductService.updateFsStoreProduct(product));
+    public TableDataInfo list(@RequestParam(required = false) String productName,
+                              @RequestParam(required = false) Long companyId,
+                              @RequestParam(required = false) String companyName) {
+        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
+                companyId, companyName, (tenant, jdbc) -> {
+                    StringBuilder sql = new StringBuilder(
+                            "SELECT p.product_id, p.product_name, p.product_image, p.category_name, " +
+                            "p.price, p.stock, p.create_time, p.status " +
+                            "FROM fs_store_product p WHERE 1=1");
+                    List<Object> params = new ArrayList<>();
+                    if (productName != null && !productName.isEmpty()) {
+                        sql.append(" AND p.product_name LIKE ?");
+                        params.add("%" + productName + "%");
+                    }
+                    sql.append(" ORDER BY p.create_time DESC LIMIT 200");
+                    return params.isEmpty()
+                            ? jdbc.queryForList(sql.toString())
+                            : jdbc.queryForList(sql.toString(), params.toArray());
+                });
+        return getDataTable(allList);
     }
 
     /**
@@ -72,20 +53,15 @@ public class ProductAdminController extends BaseController {
      */
     @PreAuthorize("@ss.hasPermi('admin:product:list')")
     @GetMapping("/pending")
-    public TableDataInfo pendingList() {
-        startPage();
-        FsStoreProduct product = new FsStoreProduct();
-        List<FsStoreProduct> list = fsStoreProductService.selectFsStoreProductList(product);
-        return getDataTable(list);
-    }
-
-    /**
-     * 删除商品
-     */
-    @PreAuthorize("@ss.hasPermi('admin:product:remove')")
-    @DeleteMapping("/{productIds}")
-    public AjaxResult remove(@PathVariable Long[] productIds) {
-        return toAjax(fsStoreProductService.deleteFsStoreProductByProductIds(productIds));
+    public TableDataInfo pendingList(@RequestParam(required = false) Long companyId,
+                                     @RequestParam(required = false) String companyName) {
+        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
+                companyId, companyName, (tenant, jdbc) ->
+                        jdbc.queryForList(
+                                "SELECT p.product_id, p.product_name, p.product_image, p.category_name, " +
+                                "p.price, p.stock, p.create_time, p.status " +
+                                "FROM fs_store_product p WHERE p.status = 0 ORDER BY p.create_time DESC LIMIT 200"));
+        return getDataTable(allList);
     }
 
     /**
@@ -93,10 +69,16 @@ public class ProductAdminController extends BaseController {
      */
     @PreAuthorize("@ss.hasPermi('admin:product:query')")
     @GetMapping("/statistics")
-    public AjaxResult statistics() {
-        long total = fsStoreProductService.selectFsStoreProductCount(0);
-        java.util.Map<String, Object> result = new java.util.HashMap<>();
-        result.put("totalCount", total);
+    public AjaxResult statistics(@RequestParam(required = false) Long companyId,
+                                 @RequestParam(required = false) String companyName) {
+        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
+                companyId, companyName, (tenant, jdbc) ->
+                        jdbc.queryForList("SELECT product_id, status FROM fs_store_product"));
+        Map<String, Object> result = new HashMap<>();
+        result.put("totalCount", allList.size());
+        result.put("pendingCount", allList.stream().filter(r -> "0".equals(String.valueOf(r.get("status")))).count());
+        result.put("onlineCount", allList.stream().filter(r -> "1".equals(String.valueOf(r.get("status")))).count());
+        result.put("rejectedCount", allList.stream().filter(r -> "2".equals(String.valueOf(r.get("status")))).count());
         return AjaxResult.success(result);
     }
 }

+ 0 - 0
fs-service/src/main/java/com/fs/aiSoundReplication/VoiceCloneController.java → fs-admin/src/main/java/com/fs/aiSoundReplication/VoiceCloneController.java


+ 15 - 0
fs-admin/src/main/java/com/fs/billing/controller/WalletController.java

@@ -3,6 +3,8 @@ package com.fs.billing.controller;
 import com.fs.billing.dto.TenantBillingRequests;
 import com.fs.billing.service.BillingServices;
 import com.fs.common.core.domain.R;
+import com.fs.common.utils.SecurityUtils;
+import com.fs.framework.security.LoginUser;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -16,6 +18,19 @@ public class WalletController {
     @Resource
     private BillingServices.WalletService walletService;
 
+    /**
+     * 查询当前用户所属租户的钱包余额与累计金额(兼容 admin/company 双端)。
+     */
+    @GetMapping("/me")
+    public R myWallet() {
+        Long tenantId = SecurityUtils.getTenantId();
+        if (tenantId == null) {
+            // admin 端用户没有租户上下文时返回空钱包
+            return R.ok("当前用户无租户关联");
+        }
+        return R.ok().put("data", walletService.getWallet(tenantId));
+    }
+
     /**
      * 查询租户钱包余额与累计金额。
      */

+ 2 - 0
fs-admin/src/main/java/com/fs/chat/controller/ChatDatasetController.java

@@ -15,6 +15,7 @@ import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Profile;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
@@ -26,6 +27,7 @@ import java.util.List;
  * @author fs
  * @date 2024-04-21
  */
+@Profile("admin")
 @RestController
 @RequestMapping("/chat/chatDataset")
 public class ChatDatasetController extends BaseController

+ 2 - 0
fs-admin/src/main/java/com/fs/chat/controller/ChatDatasetFileController.java

@@ -17,6 +17,7 @@ import com.fs.common.exception.file.OssException;
 import com.fs.common.utils.file.FileUploadUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Profile;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -31,6 +32,7 @@ import java.util.List;
  * @author fs
  * @date 2024-04-21
  */
+@Profile("admin")
 @RestController
 @RequestMapping("/chat/chatDatasetFile")
 public class ChatDatasetFileController extends BaseController

+ 2 - 0
fs-admin/src/main/java/com/fs/chat/controller/ChatKeywordController.java

@@ -9,6 +9,7 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Profile;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
@@ -20,6 +21,7 @@ import java.util.List;
  * @author fs
  * @date 2024-04-19
  */
+@Profile("admin")
 @RestController
 @RequestMapping("/chat/chatKeyword")
 public class ChatKeywordController extends BaseController

+ 6 - 4
fs-admin/src/main/java/com/fs/chat/controller/ChatMsgController.java

@@ -9,13 +9,14 @@ import com.fs.chat.vo.ChatMsgListCVO;
 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.domain.model.LoginUser;
+import com.fs.framework.security.LoginUser;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
-import com.fs.framework.web.service.TokenService;
+import com.fs.framework.service.TokenService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Profile;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
@@ -27,6 +28,7 @@ import java.util.List;
  * @author fs
  * @date 2024-04-19
  */
+@Profile("admin")
 @RestController
 @RequestMapping("/chat/chatMsg")
 public class ChatMsgController extends BaseController
@@ -99,7 +101,7 @@ public class ChatMsgController extends BaseController
         if (chatMsg.getStatus()!=null){
             return toAjax(chatMsgService.updateChatMsg(chatMsg));
         }
-        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        com.fs.framework.security.LoginUser loginUser = (com.fs.framework.security.LoginUser) tokenService.getLoginUser(ServletUtils.getRequest());
         ChatMsg map = chatMsgService.selectChatMsgByMsgId(chatMsg.getMsgId());
         ChatMsgLogs logs = new ChatMsgLogs();
         logs.setMsgId(chatMsg.getMsgId());
@@ -110,7 +112,7 @@ public class ChatMsgController extends BaseController
         String userContent = chatMsgService.selectUserContent(map.getMsgId(), map.getUserId(),map.getRoleId());
         logs.setSContent(map.getContent());
         logs.setUserContent(userContent);
-        logs.setCreateBy(loginUser.getUser().getNickName());
+        logs.setCreateBy(loginUser.getCompanyUser().getNickName());
         logs.setCompanyId(0L);
         chatMsgLogsService.insertChatMsgLogs(logs);
 

+ 2 - 0
fs-admin/src/main/java/com/fs/chat/controller/ChatMsgLogsController.java

@@ -16,6 +16,7 @@ import com.fs.common.utils.poi.ExcelUtil;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Profile;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
@@ -27,6 +28,7 @@ import java.util.List;
  * @author fs
  * @date 2024-05-10
  */
+@Profile("admin")
 @RestController
 @RequestMapping("/chat/chatMsgLogs")
 public class ChatMsgLogsController extends BaseController

+ 2 - 0
fs-admin/src/main/java/com/fs/chat/controller/ChatRoleController.java

@@ -28,6 +28,7 @@ import com.fs.wx.kf.vo.WeixinKfAddEditAccountVO;
 import com.fs.wx.kf.vo.WeixinKfDelAccountVO;
 import com.fs.wx.kf.vo.WeixinKfGetAccountUrlVO;
 import org.springframework.beans.BeanUtils;
+import org.springframework.context.annotation.Profile;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -40,6 +41,7 @@ import java.util.List;
  * @author fs
  * @date 2024-04-19
  */
+@Profile("admin")
 @RestController
 @RequestMapping("/chat/chatRole")
 public class ChatRoleController extends BaseController

+ 2 - 0
fs-admin/src/main/java/com/fs/chat/controller/ChatSessionController.java

@@ -16,6 +16,7 @@ import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Profile;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
@@ -27,6 +28,7 @@ import java.util.List;
  * @author fs
  * @date 2024-05-11
  */
+@Profile("admin")
 @RestController
 @RequestMapping("/chat/chatSession")
 public class ChatSessionController extends BaseController

+ 2 - 0
fs-admin/src/main/java/com/fs/chat/controller/ChatUploadController.java

@@ -18,10 +18,12 @@ import com.fs.wx.kf.dto.WeixinKfUploadDTO;
 import com.fs.wx.kf.service.IWeixinKfService;
 import com.fs.wx.kf.vo.WeixinKfUploadVO;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Profile;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 
+@Profile("admin")
 @RestController
 @RequestMapping("/chat/upload")
 public class ChatUploadController extends BaseController

+ 2 - 0
fs-admin/src/main/java/com/fs/chat/controller/ChatUserController.java

@@ -9,6 +9,7 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.poi.ExcelUtil;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Profile;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
@@ -20,6 +21,7 @@ import java.util.List;
  * @author fs
  * @date 2024-05-11
  */
+@Profile("admin")
 @RestController
 @RequestMapping("/chat/chatUser")
 public class ChatUserController extends BaseController

+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallBizGroupController.java → fs-admin/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallBizGroupController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallGatewayController.java → fs-admin/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallGatewayController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallLlmAgentAccountController.java → fs-admin/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallLlmAgentAccountController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallOutboundCdrController.java → fs-admin/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallOutboundCdrController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallPhoneController.java → fs-admin/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallPhoneController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallTaskController.java → fs-admin/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallTaskController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallUserController.java → fs-admin/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallUserController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallVoiceTtsAliyunController.java → fs-admin/src/main/java/com/fs/company/controller/aiSipCall/AiSipCallVoiceTtsAliyunController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/aicall/CcLlmAgentAccountController.java → fs-admin/src/main/java/com/fs/company/controller/aicall/CcLlmAgentAccountController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/aicall/CcLlmAgentProviderController.java → fs-admin/src/main/java/com/fs/company/controller/aicall/CcLlmAgentProviderController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/aicall/CcLlmKbCatController.java → fs-admin/src/main/java/com/fs/company/controller/aicall/CcLlmKbCatController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/baidu/Conversion.java → fs-admin/src/main/java/com/fs/company/controller/baidu/Conversion.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/chat/ChatDatasetController.java → fs-admin/src/main/java/com/fs/company/controller/chat/ChatDatasetController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/chat/ChatDatasetFileController.java → fs-admin/src/main/java/com/fs/company/controller/chat/ChatDatasetFileController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/chat/ChatKeywordController.java → fs-admin/src/main/java/com/fs/company/controller/chat/ChatKeywordController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/chat/ChatMsgController.java → fs-admin/src/main/java/com/fs/company/controller/chat/ChatMsgController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/chat/ChatMsgLogsController.java → fs-admin/src/main/java/com/fs/company/controller/chat/ChatMsgLogsController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/chat/ChatRoleController.java → fs-admin/src/main/java/com/fs/company/controller/chat/ChatRoleController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/chat/ChatSessionController.java → fs-admin/src/main/java/com/fs/company/controller/chat/ChatSessionController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/chat/ChatUploadController.java → fs-admin/src/main/java/com/fs/company/controller/chat/ChatUploadController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/chat/ChatUserController.java → fs-admin/src/main/java/com/fs/company/controller/chat/ChatUserController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/common/CaptchaController.java → fs-admin/src/main/java/com/fs/company/controller/common/CaptchaController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/common/CommonController.java → fs-admin/src/main/java/com/fs/company/controller/common/CommonController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/common/IndexController.java → fs-admin/src/main/java/com/fs/company/controller/common/IndexController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/common/Test.java → fs-admin/src/main/java/com/fs/company/controller/common/Test.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyAiWorkflowController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyAiWorkflowController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyBalanceController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyBalanceController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyConfigController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyConfigController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyConsumeRecordController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyConsumeRecordController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyDeptController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyDeptController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyDomainBindController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyDomainBindController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyDomainBindUserController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyDomainBindUserController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyInboundCallManageController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyInboundCallManageController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyIntegralController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyIntegralController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyLoginController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyLoginController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyLogininforController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyLogininforController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyMenuController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyMenuController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyMoneyLogsController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyMoneyLogsController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyOperlogController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyOperlogController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyPostController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyPostController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyProfileController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyProfileController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyProfitController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyProfitController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyRechargeController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyRechargeController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyRedPacketBalanceLogsController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyRedPacketBalanceLogsController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyRoleController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyRoleController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanySmsController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanySmsController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanySmsLogsController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanySmsLogsController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanySmsOrderController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanySmsOrderController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanySmsPackageController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanySmsPackageController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanySmsTempController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanySmsTempController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyStatisticsController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyStatisticsController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyTcmConsumeController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyTcmConsumeController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyTcmReportController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyTcmReportController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyUserCardController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyUserCardController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyUserChangeApplyController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyUserChangeApplyController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyUserController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyUserController.java


+ 0 - 0
fs-service/src/main/java/com/fs/company/controller/company/CompanyUserDelayTimeController.java → fs-admin/src/main/java/com/fs/company/controller/company/CompanyUserDelayTimeController.java


Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio