Files
apes-Authon-history/docs/saas-service深度分析报告.md
T
figmar 9cbb1f7695 init: apes-Authon-history — 剥离历史与源码分析归档
- docs/: 源码分析报告、代码深度解析、项目说明书、独立服务化方案
- backend/: 账权模块提取说明(提取原则、文件清单、耦合度验证)
- frontend/: 前端剥离方案、剥离历史与说明、框架修改详情
2026-08-09 13:04:04 +08:00

628 lines
32 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# saas-service 项目源代码深度分析报告
## 一、项目基本信息
| 项目属性 | 值 |
|---------|---|
| GroupId | `cn.apes` |
| ArtifactId | `saas-service` |
| 版本 | `1.0.0-SNAPSHOT` |
| 描述 | 账权用户服务 |
| Java 版本 | 11 |
| Spring Boot 版本 | 2.2.1.RELEASE |
| MyBatis Plus 版本 | 3.5.7 |
| 动态数据源版本 | dynamic-datasource-spring-boot-starter 3.6.1 |
| Redisson 版本 | 3.35.0 |
| 主启动类 | `cn.apes.CloudApplication` |
| 项目路径 | `/tmp/project-analysis/service-master` |
### 主启动类代码
**文件路径**: `src/main/java/cn/apes/CloudApplication.java`
```java
@EnableAsync
@SpringBootApplication
@EnableScheduling
public class CloudApplication {
public static void main(String[] args) {
SpringApplication.run(CloudApplication.class, args);
}
}
```
启动类启用了三个关键注解:`@EnableAsync`(异步任务)、`@SpringBootApplication`Spring Boot 自动配置)、`@EnableScheduling`(定时任务)。
---
## 二、完整包结构
项目根包为 `cn.apes.cloud`,目录结构如下:
```
cn.apes.cloud
|-- config/ # 配置类(12个文件)
|-- controller/ # REST 控制器(62个文件)
| |-- traceability/ # 溯源模块控制器(9个文件)
|-- domain/ # 数据模型层
| |-- entity/ # 核心实体类(43个文件)
| |-- dto/ # 数据传输对象(约35个文件)
| |-- vo/ # 视图对象(5个文件)
| |-- huoban/ # 伙伴云数据模型(11个文件)
| |-- traceability/ # 溯源数据模型(22个文件)
| |-- weight/ # 称重数据模型(13个文件)
|-- filter/ # 过滤器(1个文件)
|-- groovy/ # Groovy 脚本执行引擎(3个文件)
|-- mapper/ # MyBatis Mapper 接口(约85个文件)
| |-- traceability/ # 溯源 Mapper20个文件)
|-- service/ # 业务逻辑层
| |-- impl/ # 服务实现类(约90个文件)
| | |-- huoban/ # 伙伴云服务实现(6个文件)
|-- task/ # 定时任务(1个文件)
|-- util/ # 工具类(2个文件)
|-- websocket/ # WebSocket 处理器(1个文件)
```
---
## 三、主要模块和功能划分
项目是一个大型 SaaS 多租户后端服务,包含以下核心业务模块:
### 1. 用户与企业认证模块
- 用户注册/登录(密码登录、微信小程序登录)
- 企业认证(提交/审核/重新提交)
- 多企业切换
- SSO 单点登录配置
- AccessToken 外部 API 鉴权
### 2. 权限管理模块
- 菜单管理(多应用菜单树)
- 权限管理(按应用分组)
- 角色管理(角色 CRUD、角色权限分配)
- 成员角色管理(按企业维度)
- 套餐权限控制
### 3. LLM/AI 模块(核心特色)
- **LLM 厂商配置**`LlmProviderConfig`):支持多厂商 API Key、BaseUrl 配置
- **LLM 模型配置**`LlmModelConfig`):模型列表管理,支持 chat/embedding/image 类型
- **Agent 配置**`LlmAgentConfig`):System Prompt、User Prompt、输出类型(text/json/markdown
- **多轮对话**`LlmChatController`/`LlmChatServiceImpl`):支持 Function Calling 工具调用循环
- **Groovy 工具执行**`GroovyExecutorService`):动态编译执行 Groovy 脚本作为 LLM 工具
- **Skill 技能系统**`AiSkill`):将技能内容注入 System Prompt
- **对话管理**`LlmConversation`/`LlmConversationMessage`):会话持久化、消息历史
- **调用日志**`LlmCallLog`/`LlmToolLog`):完整的调用审计和统计
- **变量替换**:支持 `{{variable}}` 格式的提示词模板变量替换
- **多模态输入**:支持图片 URL 和视频 URL 输入
- **ASR 语音识别**`AsrWebSocketHandler`):WebSocket 代理阿里云实时语音转文字
### 4. 伙伴云(HuoBan)集成模块
- 伙伴云 API 代理(表结构同步、数据 CRUD、文件上传)
- 伙伴云 SSO 登录
- AMIS 低代码页面配置
- 伙伴云 V2 API 集成
### 5. 溯源(Traceability)模块
- 溯源码管理(生成任务、码列表、绑定/解绑/作废/启用)
- 码货绑定(批量导入、未绑定码查询)
- 父子码关联
- 赋码审计
- 废码异常处理
- 产品分类管理
- 土地管理
- 采收批次
- 加工记录
- 质量检测
- 资质管理
- 证书管理
- 仓库管理(入库/出库/库位平面图/库存)
- 物流追踪
- 反馈管理
- 召回管理
- 溯源追踪配置
### 6. 智慧农业(Fei)模块
- 园区信息管理(`FeiParkInfo`
- 地块信息管理(`PlotInfo`
- 作物信息管理(`FeiCrop`
- 作物物候期管理(`FeiCropPhenology`
- 农事计划管理(`FeiFarmPlan`
- 施肥配方管理(`FeiFertilizationFormula`
- 灌溉计划管理(`FeiIrrigationPlan`
- 灌溉计划执行记录(`FeiIrrigationPlanExec`
- 电磁阀管理(`FeiSolenoidValve`
- 电磁阀操作日志(`FeiSolenoidValveLog`
- 投入品管理(`FeiInputMaterial`
- 投入品库存日志(`FeiInputMaterialStockLog`
- 水肥一体机设备管理(`FeiFertigationDevice`
- 母液罐管理(`FeiMotherTank`
- 加药操作和日志(`FeiDosingLog`
- 市场设备管理(`FeiMarketDevice`
- 设备数据上报(`FeiDeviceDataReport`
- 摄像头管理(`CameraInfo`
- 摄像头抓图(萤石云集成)
### 7. 称重(Weight)模块
- 车辆记录管理
- 称重设备管理
- 司机管理
- IC 卡管理
- 北斗卡管理(借用/归还/追踪记录)
- 称重票据管理(一次称重/二次称重/编辑/打印)
- 票据日志
- 报警规则管理(报警条件、报警记录)
- 客户 UI 配置
### 8. 套餐与配额管理模块
- 套餐方案管理(`SysPackagePlan`
- 套餐权限配置(`SysPackagePlanPermission`
- 套餐配额配置(`SysPackagePlanQuota`
- 客户套餐管理(`CustomerPackage`
- 配额增减(`CustomerPackageController`
- 配额变更日志
- 套餐延期申请与审核
- 系统配额定义(`SysQuota`
### 9. 组织管理模块
- 组织树管理(`SysOrganization`
### 10. 开放平台模块
- `OpenController`:通过 open-key 鉴权的开放接口
- 溯源追踪配置查询
- 配额扣减
### 11. 其他模块
- 文件上传(阿里云 OSS
- 外链管理(`ExtLink`
- 操作日志(`SysOperationLog`
- 健康检查(`ActuatorController`
---
## 四、所有 Controller 及其 API 端点列表
### 用户与企业认证
| Controller | 路径前缀 | 主要端点 |
|-----------|---------|---------|
| `UserController` | `/user` | `POST /saveUserInfo`, `POST /pageUser`, `POST /loginPwd`, `POST /register`, `POST /resetPwd`, `GET /getCurrentUser`, `POST /editPwd`, `GET /getUserByPhone`, `GET /getCustomerUser`, `POST /selectCustomer`, `GET /getMyCustomers`, `POST /editProfile`, `POST /customer/editCurrent`, `GET /customer/getCurrent`, `POST /certifyEnterprise`, `GET /getPendingCustomer`, `POST /recertifyEnterprise` |
| `CustomerController` | `/customer` | `POST /pageCustomer`, `GET /getCustomerDetail`, `GET /addUser`, `GET /delUser`, `POST /employee/page`, `GET /employee/detail`, `POST /employee/update`, `POST /saveCustomer`, `POST /deleteCustomer`, `GET /getMyApps`, `GET /getCustomerApps`, `POST /addCustomerApp`, `POST /removeCustomerApp`, `GET /getAllApps`, `GET /getSSOConfig`, `POST /saveSSOConfig`, `POST /updateCustomerStatus`, `POST /auditCertification`, `POST /syncTenantsToHuoban` |
| `AccessTokenController` | `/sysAccessToken` | `POST /create`, `POST /page`, `POST /revoke`, `POST /enable`, `POST /regenerate`, `POST /delete` |
| `CommonController` | `/common` | `POST /upload`, `POST /upload1`, `POST /saveSsoConfig`, `GET /getSsoConfig`, `GET /code2Session`, `GET /huobanWebLogin`, `GET /uiConfig/getByCustomer` |
### 权限管理
| Controller | 路径前缀 | 主要端点 |
|-----------|---------|---------|
| `PermissionController` | `/permission` | `GET /currentMenus`, `GET /getAppMenus`, `GET /getMyPermissionCodes`, `GET /getPackageAppMenus`, `POST /saveMenu`, `GET /getAllMenu`, `POST /savePermission`, `GET /getAllPermission`, `GET /getPlanPermissionTree`, `POST /deletePermission`, `POST /deleteMenu`, `POST /getAllRole`, `POST /getAllRoleByAppName`, `POST /saveRole`, `POST /deleteRole`, `POST /setRolePermission`, `GET /getRolePermission`, `POST /setMemberRole`, `GET /getMemberAvailableRoles`, `GET /getMemberAssignedRoles`, `POST /setMemberRolesByCustomer`, `GET /getHuoBanUrl`, `GET /getHuobanToken`, `GET /getMenu`, `GET /getPaymentMenu`, `GET /changePaymentGroup` |
| `AppController` | `/app` | `POST /pageApp`, `POST /saveApp`, `POST /deleteApp`, `POST /getAppDetail` |
| `SysOrganizationController` | `/organization` | `POST /page`, `GET /tree`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete`, `GET /listAll` |
### LLM/AI 模块
| Controller | 路径前缀 | 主要端点 |
|-----------|---------|---------|
| `LlmChatController` | `/llmChat` | `POST /start`(开始新对话), `POST /continue`(继续多轮对话) |
| `LlmAgentConfigController` | `/llmAgent` | `POST /page`, `POST /add`, `POST /update`, `POST /delete`, `POST /toggleStatus`, `GET /detail/{id}`, `POST /debug`, `POST /call/{agentId}` |
| `LlmProviderConfigController` | `/llmProvider` | `POST /page`, `POST /add`, `POST /update`, `POST /delete`, `POST /toggleStatus`, `GET /list` |
| `LlmModelConfigController` | `/llmModel` | `POST /page`, `POST /add`, `POST /update`, `POST /delete`, `POST /toggleStatus`, `GET /list` |
| `LlmConversationController` | `/llmConversation` | `POST /add`, `GET /detail/{id}`, `GET /listByAgent`, `POST /close`, `POST /delete`, `POST /addMessage`, `GET /messages`, `POST /deleteMessage` |
| `LlmAgentToolController` | `/llmAgentTool` | `GET /listByAgent`, `GET /listByTool`, `POST /add`, `POST /delete`, `POST /deleteByAgent`, `POST /batchAdd` |
| `LlmAgentSkillController` | `/llmAgentSkill` | `GET /listByAgent`, `GET /listBySkill`, `POST /add`, `POST /delete`, `POST /deleteByAgent`, `POST /batchAdd` |
| `LlmToolController` | `/llmTool` | `GET /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete` |
| `GroovyToolExecuteController` | `/llmTool` | `POST /execute`(执行 Groovy 工具脚本), `POST /clearCache` |
| `LlmToolLogController` | `/llmToolLog` | `GET /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete` |
| `LlmCallLogController` | `/llmCallLog` | `POST /page`, `GET /detail/{id}`, `POST /delete`, `POST /batchDelete`, `POST /statistics` |
| `AiController` | `/ai` | `POST /Quotation`AI 报价单识别) |
| `AiSkillController` | `/aiSkill` | `GET /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete` |
### 伙伴云集成
| Controller | 路径前缀 | 主要端点 |
|-----------|---------|---------|
| `HuobanController` | `/huoban` | `GET /syncTables`, `GET /syncTableConfig`, `GET /syncAll`, `POST /huobanTableList`, `POST /huobanTableInfo`, `POST /huobanColumnList`, `POST /huobanColumnSave`, `GET /spaceList`, `POST /data`, `POST /create`, `POST /update`, `POST /upsert`, `GET /detail`, `POST /ids`, `POST /uploadFIle`, `POST /getFiles`, `GET /getSpaceUsers`, `POST /huobanDoc` |
| `Huoban2Controller` | `/huoban2` | `GET /syncTables`, `GET /syncTableConfig`, `GET /syncAll`, `POST /saveTableName`, `POST /huobanTableList`, `POST /huobanTableInfo`, `POST /huobanColumnList`, `POST /huobanColumnSave`, `GET /spaceList`, `POST /data`, `POST /dataOne`, `POST /upsetOne`, `POST /create`, `POST /update`, `POST /upsert`, `GET /detail`, `GET /webDetail`, `GET /del`, `POST /bulkDel`, `POST /ids`, `POST /uploadFIle`, `POST /getFiles`, `GET /getSpaceUsers`, `POST /webData`, `POST /webCreate`, `GET /webDel`, `POST /webCreateTable`, `GET /webLogin`, `GET /getAutomation`, `POST /automationButton`, `POST /automationCall`, `POST /searchUser`, `GET /batchInvite`, `POST /updateSpaceMemberGroup`, `GET /getSpaceMembers`, `GET /searchSpaceMember`, `GET /getSpaceGroups`, `POST /inviteAndAddToGroup` |
### 溯源模块
| Controller | 路径前缀 | 主要端点 |
|-----------|---------|---------|
| `TraceCodeController` | `/trace/code` | `POST /task/page`, `GET /task/detail`, `POST /task/add`, `POST /task/generateBatchCode`, `POST /task/update`, `POST /task/delete`, `POST /task/generate`, `POST /list/page`, `GET /list/detail`, `POST /list/bind`, `POST /list/unbind`, `POST /list/void`, `POST /list/enable`, `POST /bind/page`, `GET /bind/detail`, `POST /bind/add`, `POST /bind/batchImport`, `POST /bind/unboundList`, `POST /bind/unbind`, `POST /relation/page`, `GET /relation/detail`, `POST /relation/add`, `POST /relation/delete`, `POST /audit/page`, `GET /audit/detail`, `POST /exception/page`, `GET /exception/detail`, `POST /exception/add`, `POST /exception/handle`, `POST /exception/delete` |
| `TraceCategoryController` | `/trace/category` | 分类管理 CRUD |
| `TraceProcessController` | `/trace/process` | 加工记录 CRUD |
| `TraceQualityController` | `/trace/quality` | 质量检测 CRUD |
| `TraceWarehouseController` | `/trace/warehouse` | 仓库入出库 CRUD |
| `TraceCommonController` | `/trace/common` | 溯源公共接口 |
| `TraceHarvestController` | `/trace/harvest` | 采收批次 CRUD |
| `TraceLandController` | `/trace/land` | 土地管理 CRUD |
| `TraceWarehouseFloorPlanController` | `/trace/warehouseFloorPlan` | 库位平面图 CRUD |
### 智慧农业模块
| Controller | 路径前缀 | 主要端点 |
|-----------|---------|---------|
| `FeiParkInfoController` | `/park` | `GET /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete`, `GET /list` |
| `PlotInfoController` | `/fei/plot` | `POST /page`, `POST /detail`, `POST /add`, `POST /update`, `POST /delete` |
| `FeiCropController` | `/fei/crop` | `POST /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete`, `GET /list` |
| `FeiCropPhenologyController` | `/fei/cropPhenology` | 物候期 CRUD |
| `FeiFarmPlanController` | `/fei/farmPlan` | 农事计划 CRUD |
| `FeiFertilizationFormulaController` | `/fei/fertilizationFormula` | 施肥配方 CRUD |
| `FeiIrrigationPlanController` | `/irrigation/plan` | `GET /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete`, `POST /toggle`, `GET /listByPark` |
| `FeiIrrigationPlanExecController` | `/irrigation/planExec` | 灌溉执行记录 CRUD |
| `FeiSolenoidValveController` | `/fei/solenoidValve` | 电磁阀 CRUD |
| `FeiSolenoidValveLogController` | `/fei/solenoidValveLog` | 电磁阀日志 CRUD |
| `FeiInputMaterialController` | `/fei/inputMaterial` | 投入品 CRUD |
| `FeiInputMaterialStockLogController` | `/fei/inputMaterialStockLog` | 投入品库存日志 CRUD |
| `FeiFertigationDeviceController` | `/fertigation-device` | `GET /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete`, `POST /dosing`, `POST /save-layout`, `GET /dosing-log`, `GET /dosing-log/all`, `GET /today-logs` |
| `FeiMarketDeviceController` | `/fei/marketDevice` | 市场设备 CRUD |
| `FeiDeviceDataReportController` | `/fei/deviceDataReport` | 设备数据上报 CRUD |
| `CameraInfoController` | `/cameraInfo` | `GET /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete`, `POST /capture` |
| `CameraCaptureLogController` | `/cameraCaptureLog` | 抓图日志 CRUD |
### 称重模块
| Controller | 路径前缀 | 主要端点 |
|-----------|---------|---------|
| `WeightController` | `/weight` | 车辆记录(`/vehicle/*`)、设备管理(`/device/*`)、司机管理(`/driver/*`)、IC卡管理(`/card/*`)、北斗卡管理(`/beidou/*`,含借用/归还/追踪/报警)、称重票据(`/ticket/*`,含一次/二次称重/编辑/打印)、报警规则(`/alarmRule/*` |
### 套餐与配额管理
| Controller | 路径前缀 | 主要端点 |
|-----------|---------|---------|
| `SysPackagePlanController` | `/packagePlan` | `POST /page`, `POST /add`, `POST /update`, `POST /delete`, `POST /toggleStatus`, `GET /detail`, `GET /getPermissions`, `POST /savePermissions`, `GET /getQuotas`, `GET /getAllQuotas`, `GET /getPlanApps`, `GET+POST /saveQuotas` |
| `SysQuotaController` | `/quota` | `POST /page`, `POST /add`, `POST /update`, `POST /delete`, `GET /detail` |
| `CustomerPackageController` | `/customerPackage` | `GET /list`, `POST /add`, `POST /edit`, `POST /delete`, `POST /saveQuotas`, `GET /getQuotas`, `GET /myPackages`, `POST /overview`, `POST /submitExtendApply`, `POST /extendApplyList`, `POST /reviewExtendApply`, `POST /increaseQuota`, `POST /decreaseQuota`, `GET /quotaChangeLogs` |
### 其他
| Controller | 路径前缀 | 主要端点 |
|-----------|---------|---------|
| `OpenController` | `/open` | `GET /trackingConfig/getByCustomerId`, `POST /customerPackage/decreaseQuota` |
| `ExtLinkController` | `/extLink` | `GET /page`, `GET /detail`, `POST /add`, `POST /update`, `POST /delete` |
| `SysOperationLogController` | `/operationLog` | `POST /page`, `GET /listCustomers` |
| `TrackingConfigController` | `/trackingConfig` | `GET /list`, `GET /getByCustomerId`, `GET /current`, `POST /save`, `POST /delete`, `GET /customers` |
| `ActuatorController` | `/actuator` | `GET /health` |
| `WeiXin2Controller` | `/weixin2` | (空控制器,预留) |
---
## 五、核心业务实体
### LLM/AI 相关实体
| 实体类 | 说明 | 关键字段 |
|--------|------|---------|
| `LlmProviderConfig` | LLM 厂商配置 | vendorCode, vendorName, baseUrl, apiKey, iconUrl, status |
| `LlmModelConfig` | LLM 模型配置 | vendorCode, modelName, displayName, modelType(chat/embedding/image), supportVision, supportVideo, isEmbedding, maxTokens, maxContextTokens |
| `LlmAgentConfig` | Agent 配置 | title, userPrompt, systemPrompt, providerId, modelId, outputType(text/json/markdown), supportImage, supportVideo |
| `LlmConversation` | 对话会话 | agentId, title, status(1活跃/0关闭), messageCount, lastActiveTime |
| `LlmConversationMessage` | 对话消息 | conversationId, messageType(system/user_prompt/user/assistant/tool_call/tool_result), content, toolName, toolParams, toolResult, toolStatus, model, tokens, duration |
| `LlmCallLog` | LLM 调用日志 | agentId, agentTitle, modelName, systemPrompt, userPrompt, userInput, uploadedFiles, responseContent, promptTokens, completionTokens, totalTokens, durationMs, callStatus, errorMessage |
| `LlmToolLog` | 工具执行日志 | toolId, toolName, traceId, agentId, skillId, inputData, outputData, status, errorMsg, executorIp, duration |
| `LlmAgentTool` | Agent-工具关联 | agentId, toolId |
| `LlmAgentSkill` | Agent-技能关联 | agentId, skillId |
| `AiSkill` | AI 技能 | skillName, skillKey, description, content, category, status |
### 核心业务实体
| 实体类 | 说明 |
|--------|------|
| `CustomerInfo` | 企业/客户信息(企业名称、类型、法人、管理员、营业执照、行业、省市等) |
| `UserInfo` | 用户信息 |
| `CustomerUser` | 客户-用户关联 |
| `AppInfo` | 应用信息 |
| `CustomerPackage` | 客户套餐 |
| `SysPackagePlan` | 套餐方案 |
| `SysQuota` | 系统配额定义 |
| `SysMenu` | 菜单 |
| `SysRole` | 角色 |
| `SysMemberRole` | 成员角色关联 |
| `SysAccessToken` | AccessToken(外部 API 鉴权令牌) |
| `SysOperationLog` | 操作日志 |
| `SsoConfig` | SSO 单点登录配置 |
| `TrackingConfig` | 溯源追踪配置 |
| `SysOrganization` | 组织架构 |
### 溯源实体(22个)
`TraceCode`(溯源码)、`TraceCodeTask`(生成任务)、`TraceCodeBind`(码货绑定)、`TraceCodeRelation`(父子码关联)、`TraceCodeAudit`(赋码审计)、`TraceCodeException`(废码异常)、`TraceCategory`(产品分类)、`TraceProduct`(产品)、`TraceLand`(土地)、`TraceHarvestBatch`(采收批次)、`TraceProcessRecord`(加工记录)、`TraceQualityTest`(质量检测)、`TraceQualification`(资质)、`TraceCertificate`(证书)、`TraceWarehouseIn`/`TraceWarehouseInDetail`(入库)、`TraceWarehouseOut`/`TraceWarehouseOutDetail`(出库)、`TraceWarehouseFloorPlan`(库位平面图)、`TraceInventory`(库存)、`TraceLogistics`(物流)、`TraceFeedback`(反馈)、`TraceRecall`(召回)
### 称重实体(13个)
`WeightTicket`(称重票据)、`WeightTicketLog`(票据日志)、`WeightDevice`(称重设备)、`WeightDriver`(司机)、`WeightCard`IC卡)、`WeightVehicleRecord`(车辆记录)、`WeightBeidouCard`(北斗卡)、`WeightBeidouBorrowRecord`(借用记录)、`WeightBeidouTrackingRecord`(追踪记录)、`WeightBeidouAlarmRule`(报警规则)、`WeightBeidouAlarmRuleCondition`(报警条件)、`WeightBeidouAlarmRecord`(报警记录)、`CustomerUiConfig`(客户UI配置)
### 农业实体
`FeiParkInfo`(园区)、`PlotInfo`(地块)、`FeiCrop`(作物)、`FeiCropPhenology`(物候期)、`FeiFarmPlan`(农事计划)、`FeiFertilizationFormula`(施肥配方)、`FeiIrrigationPlan`(灌溉计划)、`FeiSolenoidValve`(电磁阀)、`FeiSolenoidValveLog`(电磁阀日志)、`FeiInputMaterial`(投入品)、`FeiInputMaterialStockLog`(投入品库存日志)、`FeiFertigationDevice`(水肥一体机)、`FeiMotherTank`(母液罐)、`FeiDosingLog`(加药日志)、`FeiMarketDevice`(市场设备)、`FeiDeviceDataReport`(设备数据上报)、`CameraInfo`(摄像头)、`CameraCaptureLog`(抓图日志)
---
## 六、技术架构特点
### 1. 多租户动态数据源
**核心机制**:基于 baomidou dynamic-datasource 实现多租户数据源隔离。
**关键文件**
- `src/main/java/cn/apes/cloud/config/TenantSource.java` — 自定义注解
- `src/main/java/cn/apes/cloud/config/DataSourceHeaderAspect.java` — AOP 切面
**工作原理**
1. `@TenantSource` 注解可标注在 Controller 类或方法上
2. `DataSourceHeaderAspect` 切面拦截带有 `@TenantSource` 的类/方法
3. 从 HTTP 请求头 `X-Tenant-ID` 读取租户标识
4. 支持的租户标识:`user``zx``plant`(默认为 `user`
5. 通过 `DynamicDataSourceContextHolder.push(head)` 切换数据源
6. 配置了两个数据源:`cloud`(主库)和 `huoban`(伙伴云库)
**配置文件中的多租户配置**
```yaml
tenant:
enabled: true
default-tenant: user
header-name: X-Tenant-ID
dynamic-create: true
```
### 2. LLM 集成架构
**架构层次**
```
Agent 配置 (LlmAgentConfig)
|-- 厂商配置 (LlmProviderConfig) → API Key, BaseUrl
|-- 模型配置 (LlmModelConfig) → 模型名称, 类型
|-- 关联工具 (LlmAgentTool → LlmTool) → Groovy 脚本
|-- 关联技能 (LlmAgentSkill → AiSkill) → 注入 System Prompt
|
v
LLM 调用 (DashScope OpenAI 兼容 API)
|
|-- 单次调用: LlmCallServiceImpl.callModel()
|-- 多轮对话: LlmChatServiceImpl.startChat()/continueChat()
| |-- Function Calling 循环(最多 10 轮)
| |-- Groovy 工具执行: GroovyExecutorService.executeTool()
| |-- 消息持久化: LlmConversationMessage
|
v
日志审计: LlmCallLog (调用日志) + LlmToolLog (工具日志)
```
**关键特点**
- 使用阿里云 DashScope APIOpenAI 兼容格式),endpoint: `https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions`
- 支持多厂商配置,可通过 `providerId` 灵活切换
- 提示词变量替换:`{{variable}}` 格式,通过 `userParams` 传入
- 多模态支持:图片 URL`image_url` 类型)和视频 URL`video_url` 类型)
- Function Calling:自动检测 `tool_calls`,执行 Groovy 工具脚本,将结果回传给 LLM
- 最大工具调用轮次限制:10 轮(防止死循环)
- 输出类型控制:text / json / markdown,支持 `response_format` 设置
### 3. Groovy 动态脚本引擎
**关键文件**
- `src/main/java/cn/apes/cloud/groovy/GroovyExecutorService.java`
- `src/main/java/cn/apes/cloud/groovy/GroovyToolExecutor.java`(接口)
- `src/main/java/cn/apes/cloud/groovy/JsonSchemaValidator.java`
**特点**
- 使用 `GroovyClassLoader` 动态编译 Groovy 脚本
- 编译结果缓存(`ConcurrentHashMap`),避免重复编译导致 Metaspace 泄漏
- 脚本必须实现 `GroovyToolExecutor` 接口
- 入参 JSON Schema 校验
- 完整的执行日志记录(IP、耗时、输入/输出、错误信息)
- 支持缓存清除和重新编译
### 4. WebSocket ASR 语音识别代理
**关键文件**`src/main/java/cn/apes/cloud/websocket/AsrWebSocketHandler.java`
**特点**
- WebSocket 端点:`/asr/ws`
- 代理前端与阿里云 ASR 服务的 WebSocket 通信
- 使用模型:`fun-asr-realtime`(实时语音转文字)
- 音频格式:PCM, 16000Hz 采样率
- 缓冲机制:在 ASR 服务返回 `task-started` 之前缓存音频数据
- 每个前端会话独立维护阿里云 WebSocket 连接
### 5. AccessToken 外部 API 鉴权
**关键文件**
- `src/main/java/cn/apes/cloud/filter/AccessTokenFilter.java`
- `src/main/java/cn/apes/cloud/config/AccessTokenFilterConfig.java`
**鉴权流程**
1. 过滤器以最高优先级(order=1)拦截所有请求
2. 提取 Token:优先 `X-Access-Token` 请求头,其次 `Authorization: Bearer <token>`
3. 校验 Token:通过 `SysAccessTokenService.validate()` 校验(含 IP 白名单检查)
4. 校验通过:将用户/企业信息写入 Redis,包装 Request 注入 token header,使 `@Login` AOP 能正常工作
5. 校验失败:返回 401
6. 无 Token:放行,交给后续 `@Login` AOP 处理
7. 记录外部系统调用日志
### 6. 伙伴云(HuoBan)深度集成
项目与伙伴云低代码平台深度集成:
- 两套 API 控制器(`HuobanController` 使用 `@DS("huoban")` 直连伙伴云数据库,`Huoban2Controller` 通过伙伴云 OpenAPI
- 伙伴云 SSO 单点登录
- 表结构同步、数据 CRUD、文件上传
- AMIS 低代码页面配置
- 自动化按钮调用
- 空间成员管理
### 7. Redis 双数据库架构
**关键文件**`src/main/java/cn/apes/cloud/config/RedissonConfiguration.java`
- `redissonClient()`:使用 database 7(主业务缓存)
- `redissonClient9()`:使用 database 9(辅助用途)
- 编解码器:`JsonJacksonCodec`
### 8. 定时任务
**关键文件**`src/main/java/cn/apes/cloud/task/CameraCaptureTask.java`
- 摄像头定时抓图任务:每小时执行一次(`@Scheduled(fixedRate = 1000 * 60 * 60)`
- 遍历所有摄像头,调用萤石云 API 进行抓图
- 记录成功/失败统计
### 9. 文件存储
- 阿里云 OSS 对象存储(`OssConfiguration`
- 桶名:`zq-cloud`,区域:`oss-cn-beijing`
- 伙伴云文件上传代理
---
## 七、配置文件中的关键配置
### application.yml(主配置)
**文件路径**: `src/main/resources/application.yml`
```yaml
spring:
profiles:
active: local # 默认激活 local 环境
jackson:
time-zone: GMT+8 # 东八区时区
date-format: yyyy-MM-dd HH:mm:ss
# 多租户配置
tenant:
enabled: true # 启用多租户
default-tenant: user # 默认租户
header-name: X-Tenant-ID # 租户请求头名称
dynamic-create: true # 允许动态创建数据源
mybatis-plus:
global-config:
db-config:
logic-delete-field: isDel # 全局逻辑删除字段
logic-delete-value: 1 # 逻辑已删除值
logic-not-delete-value: 0 # 逻辑未删除值
```
### application-prod.yml(生产环境)
**文件路径**: `src/main/resources/application-prod.yml`
| 配置项 | 值 |
|--------|---|
| 服务端口 | 7777 |
| Python 路径 | `/usr/bin/python3` |
| 工作路径 | `/data/services/saas-service/data` |
| 主数据源 (cloud) | MySQL `192.168.1.161:3306/cloud` |
| 伙伴云数据源 (huoban) | MySQL `192.168.1.161:3306/user` |
| Redis | `192.168.1.165:6403`, database 7 |
| 文件上传限制 | max-file-size: 20MB, max-request-size: 200MB |
| OSS | `oss-cn-beijing.aliyuncs.com`, bucket: `zq-cloud` |
| 伙伴云 API | `https://hb.zhangquyun.com/server/api` |
| 伙伴云 V2 | app-id: 1000001 |
| 支付域名 | `https://payment.yilise.com/` |
### application-local.yml(本地开发环境)
**文件路径**: `src/main/resources/application-local.yml`
| 配置项 | 值 |
|--------|---|
| 服务端口 | 8202 |
| 主数据源 | MySQL `192.168.31.201:3389/cloud` |
| 伙伴云数据源 | MySQL `192.168.31.201:3389/user` |
| Redis | `192.168.31.201:7890`, database 7 |
| MyBatis 日志 | `StdOutImpl`(控制台输出 SQL |
| 调试日志 | `TenantInterceptor=debug`, `dynamic.datasource=debug` |
---
## 八、docs 目录下的 API 文档
项目在 `docs/` 目录下包含 15 个 Markdown 文档:
| 文档文件 | 内容 |
|---------|------|
| `llmAgentTool-api.md` | LLM Agent 工具关联 API 文档 |
| `llmAgentSkill接口文档.md` | LLM Agent 技能关联 API 文档 |
| `llmConversation-api.md` | LLM 对话会话管理 API 文档 |
| `llmTool接口文档.md` | LLM 工具管理 API 文档 |
| `api-access-token.md` | AccessToken 外部 API 鉴权文档 |
| `api-login.md` | 登录 API 文档 |
| `多租户使用说明.md` | 多租户动态数据源使用说明 |
| `账权平台对接.md` | 账权 SaaS 云对接文档 |
| `账权开放平台对接.md` | 开放平台对接文档 |
| `伙伴云低代码对接文档.md` | 伙伴云低代码平台对接文档 |
| `irrigation_plan_api.md` | 灌溉计划 API 文档 |
| `cameraInfo-api.md` | 摄像头信息管理 API 文档 |
| `input-material-stock-log-api-doc.md` | 投入品库存日志 API 文档 |
| `input-material-stock-log-test-report.md` | 投入品库存日志测试报告 |
| `Groovy工具脚本生成提示词.md` | Groovy 工具脚本生成的 LLM 提示词 |
---
## 九、技术栈总结
| 类别 | 技术 |
|------|------|
| 基础框架 | Spring Boot 2.2.1.RELEASE, Java 11 |
| ORM | MyBatis Plus 3.5.7 |
| 动态数据源 | baomidou dynamic-datasource 3.6.1 |
| 缓存 | Redis + Redisson 3.35.0 |
| 对象存储 | 阿里云 OSS SDK 3.17.4 |
| LLM/AI | 阿里云 DashScopeOpenAI 兼容格式) |
| 动态脚本 | Groovy 3.0.19 |
| WebSocket | Spring WebSocket + Java-WebSocket 1.5.3 |
| 工具库 | Hutool 5.8.16, Fastjson, Lombok 1.18.36 |
| 飞书集成 | oapi-sdk 2.4.6 |
| Excel | Apache POI 4.1.2 |
| 验证 | Hibernate Validator 6.1.0.Final |
| 公共库 | apes-commons 0.0.7-SNAPSHOT(自研公共库) |
---
## 十、架构亮点总结
1. **多租户 SaaS 架构**:通过自定义 `@TenantSource` 注解 + AOP 切面 + 动态数据源实现透明多租户隔离,支持 user、zx、plant 三个租户数据库。
2. **LLM Agent 平台**:完整的 LLM Agent 管理平台,支持厂商/模型/Agent 三级配置,多轮对话 + Function Calling + Groovy 工具执行 + Skill 技能注入,形成了完整的 AI Agent 工作流。
3. **Groovy 动态工具引擎**:通过 Groovy 脚本实现 LLM 工具的动态扩展,无需重启服务即可添加新工具,支持 JSON Schema 入参校验和编译缓存。
4. **伙伴云深度集成**:既是数据源(直连伙伴云 MySQL),也是 API 代理(通过伙伴云 OpenAPI),还支持 SSO 和 AMIS 低代码页面。
5. **多模态 AI 输入**:LLM 调用支持图片 URL 和视频 URL 的多模态输入,支持视觉理解模型。
6. **实时语音识别**WebSocket 代理阿里云 ASR 服务,实现前端实时语音转文字功能。
7. **全链路审计**:LLM 调用日志、工具执行日志、操作日志三层审计体系,支持调用统计和错误追踪。
8. **开放平台**:通过 AccessToken 机制支持外部系统安全调用,含 IP 白名单、过期时间、配额扣减等能力。
---
## 前端应用补充说明
说明书还包含以下 10 个章节的前端部分:
1. **项目概述** — 平台定位、核心业务域、项目组成(62 个 Controller、85+ 前端页面、10+ 业务模块)
2. **系统架构** — 整体架构图、技术栈总览(前后端对照表)
3. **后端服务** — 包结构、多数据源配置(cloud/user/huoban)、核心配置类、定时任务
4. **前端应用** — 目录结构、布局架构、动态路由系统(4 种 menuType)、Vuex 状态管理、第三方库
5. **核心功能模块** — 智慧农业、产品溯源、自助过磅、套餐配额、伙伴云集成等 6 大模块详解
6. **LLM / AI Agent 平台** — 架构层次图、10 项核心能力(Function Calling、Groovy 动态工具、多轮对话、ASR 等)、前端 AI 页面
7. **多租户与权限体系** — 多租户切换原理、权限层级图、AccessToken 开放平台
8. **API 接口概览** — 全部 Controller 路径前缀和核心端点、前端代理配置
9. **部署与配置** — 生产/开发环境配置对照、环境依赖
10. **项目目录结构** — 前后端完整目录树