瀏覽代碼

初始化工程

andyliu 1 月之前
當前提交
35d92be5cb

+ 0 - 0
.claude/settings.json


+ 15 - 0
.claude/skills/dao-crud/SKILL.md

@@ -0,0 +1,15 @@
+---
+name: dao-crud
+description: >-
+  创建对象或功能项的CRUD全链路脚手架。当用户需要为某个实体创建完整的数据库持久层、业务层和控制器层时使用本技能,包括:Table接口、SqlProvider、Mapper、DBService接口/实现类、BizFilter、BizHelper和Controller。触发场景如:"帮我创建一个XXX的CRUD"、"生成XXX的全套代码"、"生成XXX的增删查改"。
+---
+
+<!--
+  本文件引用自 .cursor/skills/dao-crud/SKILL.mdc
+  请勿直接修改此文件,所有修改请在 .cursor/skills/dao-crud/SKILL.mdc 中进行
+-->
+
+当触发本技能时,请先用 Read 工具读取以下文件:
+`.cursor/skills/dao-crud/SKILL.mdc`
+
+读取完成后,根据该文件中的内容执行技能。

+ 11 - 0
.claudeignore

@@ -0,0 +1,11 @@
+# Claude Code:减少自动纳入上下文的文件与目录(语法同 .gitignore)
+trilog/
+target/
+codeProject/
+download/
+temp-resource/
+videoFrame/
+upload/
+.cursorignore
+HELP.md
+

+ 78 - 0
.cursor/rules/architecture.mdc

@@ -0,0 +1,78 @@
+---
+description: 项目架构描述,技术栈,功能项描述。
+alwaysApply: true
+---
+
+# 项目架构描述
+
+## 技术栈
+
+- 语言:Java 8
+- 框架:Spring Boot 2.1.3.RELEASE
+- 数据库:PostgreSQL 15
+- 构建工具:Maven 3.8.9
+- 认证方式:JWT 认证
+- 生产环境:linux
+- 文件存储:FastDFS、MinIO 
+- 缓存服务:Caffeine 本地缓存、Redis
+
+## 功能模块
+
+主要包括:
+- 联合预警计划、联合预警事件、联合预警工单管理
+- 调度预案、调度事件、调度工单管理
+- 调度排班指令管理
+- 故障单管理
+- 查漏计划、查漏点、查漏项、查漏对象、查漏任务管理
+- 巡检计划、巡检片区、巡检项、巡检点、巡检对象、巡检任务管理
+- 抢修工单、抢修班组管理
+- 保养工单管理
+- 清洗工单管理
+
+## 项目层次约束
+
+**该项目层次清晰,划分严格,指定功能模块必须严格按如下层次进行归类,不可随意归类或放置。**
+
+- `src/main/java/com/shkpr/service/alamdmaordertask/`
+    - `busihandler/` — 实际业务逻辑处理类
+    - `commtools/` — 通用工具类
+    - `components/` — 组件(如自定义验证器)封装类
+    - `configuration/` — 各种配置类
+    - `constants/` — 全局常量定义
+    - `controllerapi/` — API 控制器层(接收外部请求)
+    - `controllercheck/` — 校验控制器层(对外部请求进行校验)
+    - `controllerfilter/` — 过滤器控制器层(对外部请求进行前置过滤处理)
+    - `dbdao/mapper/` — 主业务数据库访问的 Mapper 定义类
+    - `dbdao/services/` — 数据库访问的 DAO 服务实现
+    - `dbdao/services/intef/` — DAO 服务接口定义
+    - `dbdao/providers/` — Mapper 动态 SQL 提供者
+    - `dbdao/pgtype/` — PostgreSQL 自定义类型处理
+    - `dbdao/tables/` — 表结构/字段常量说明
+    - `dto/` — 数据库或业务层模型对象
+    - `exception/` — 全局异常处理
+    - `factorys/` — 工厂类
+    - `globalcache/` — 全局缓存控制类
+    - `globalmgr/` — 全局管理器
+    - `jsonbean/` — 请求参数定义类
+    - `queues/` — 自定义队列管理类
+    - `services/` — 本项目调用第三方服务(或其他服务)的封装类
+    - `subtask/` — 自定义子任务管理类
+
+- `src/main/resources/`
+    - `application.properties` — 主配置
+    - `logback.xml` — 日志配置
+
+- `sql.properties` — 数据库参数配置(常与 `global.sql.config.path` 配合)
+- `pom.xml` — 构建配置
+- `libs/` — 第三方本地 JAR(含 gbase 等)
+- `config/` — 外部业务参数配置
+
+## 关键设计模式
+
+**该项目需要严格遵守该设计模式。**
+
+1. JWT 相关认证、请求头相关验证均在 `controllerfilter/` 下的过滤器中处理,按业务模块细分。
+2. 所有 API 控制器(如 `ThirdAlarmTaskController`)只接收 API 请求,实际业务处理必须调用 `com.shkpr.service.alamdmaordertask.busihandler` 下的业务处理类。
+3. 业务处理层(如 `PatrolPlanHelper`)必须通过 **`DBMgrProxy`** 调用数据库的 DAO 服务层。
+4. **`DBMgrProxy`** 为数据库访问单例代理,管理多个数据源连接。
+5. **`LogPrintMgr`** 为统一日志管理类。

+ 35 - 0
.cursor/rules/build-and-run.mdc

@@ -0,0 +1,35 @@
+---
+description: Maven构建、编译、运行和配置约定
+globs: pom.xml,src/**/application.properties
+alwaysApply: false
+---
+
+# 构建与运行
+
+## Maven
+
+- `pom.xml`:`spring-boot-maven-plugin` 打可执行 JAR,`finalName` 与 `libs/` 资源拷贝需一并考虑;`gbase` 为 **system** 作用域,路径 `${project.basedir}/libs/gbase.*.jar`。
+- 依赖 libs 目录下的本地 jar 包进行构建。
+
+## 依赖版本
+
+- Jackson 版本由 `pom.xml` 中 `dependencyManagement` 锁定;新增传递依赖时注意不要冲掉该约束。
+
+## 编译运行
+
+```bash
+# 清理
+mvn clean
+
+# 静默编译
+mvn -q -DskipTests compile
+
+# 运行
+mvn spring-boot:run
+
+# 清理并构建打包
+mvn clean package -DskipTests
+
+# 测试
+mvn test
+```

+ 29 - 0
.cursor/rules/coding-standards.mdc

@@ -0,0 +1,29 @@
+---
+description: 编码规范约定
+globs: src/**/*.java
+alwaysApply: false
+---
+
+# 编码规范
+
+## 命名规范
+
+- 类名:UpperCamelCase(如 `BaseDBService`)
+- 方法名/变量名:lowerCamelCase(如 `getUserById`)
+- 常量:UPPER_SNAKE_CASE(如 `ORDER_STATUS_PENDING`)
+- 包名:全小写(如 `com.example.project`)
+
+## RESTful API 接口规范
+
+- 不带参数的查询请求用 `GET` 方法,带参数的查询请求用 `POST` 方法
+- 非查询请求全部使用 `POST` 方法
+- 所有 HTTP 请求的响应数据都用 `JSON` 格式返回
+- 统一响应格式 `ResponseRes<T>`:
+
+```json
+{"rescode":"","resmsg":"","resdata":"","timestamp":0}
+```
+
+## 其他注意事项
+
+1. **参数校验**:使用 Hibernate Validator + 自定义 `IntInitOrRange` / `StrNullOrSize` 等注解

+ 87 - 0
.cursor/rules/database-persistence.mdc

@@ -0,0 +1,87 @@
+---
+description: 数据库持久层架构规范(MyBatis)
+globs: src/**/dbdao/**/*.java
+alwaysApply: false
+---
+
+# 数据库持久层架构规范
+
+## 一、目录结构
+
+```
+src/main/java/com/shkpr/service/alamdmaordertask/dbdao/
+├── DBMgrProxy.java              # Service单例代理入口
+├── mapper/                      # 主数据库访问的 Mapper 定义类
+├── mapper2th/                   # 从数据库访问的 Mapper 定义类
+├── mapperLSTM/                  # LSTM数据库访问的 Mapper 定义类
+├── providers/                   # Mapper 动态 SQL 提供者
+├── tables/                      # 表结构/字段定义说明
+├── services/                    # DAO Service实现类
+│   └── intef/                   # DAO Service接口定义类
+├── pgtype/                      # PostgreSQL 自定义类型处理
+
+```
+
+## 二、核心调用链路
+
+```
+业务层 (XxxHandler/其他)
+    ↓
+DBMgrProxy.getInstance().applyXxxApi(XxxDBService.class)
+    ↓
+XxxDBService 继承 BaseDBFuncTemplate
+    ↓
+XxxServiceImpl 继承并实现对应的 XxxDBService (@Autowired XxxMapper)
+    ↓
+XxxMapper 继承 BaseDBMapper (并通过方法上的注入指定对应的XxxSqlProvider)
+    ↓
+XxxSqlProvider 继承 BaseSqlProvider
+    ↓
+pgtype (特殊类型处理)
+    ↓
+PostgreSQL
+```
+
+## 三、Table接口规范
+
+- XxxTable接口**必须**定义 `R_INFO` 和 `W_INFO` 两个内部接口
+  - `R_INFO.TABLE` 用于查询操作(可指向视图或表)
+  - `W_INFO.TABLE` 用于写入操作(必须是物理表)
+- XxxSqlProvider**必须**继承对应的XxxTable接口
+
+## 四、Mapper规范
+
+### 4.1 规则
+
+- `BaseDBMapper`接口中定义了数据库可访问的基本方法
+- XxxMapper不声明和使用任何实体对象,查询返回记录和插入请求记录只能是`List<Map<String,Object>>`、`Map<String,Object>`等结构
+- XxxMapper必须继承`BaseDBMapper`,并实现对应的方法,同时在方法上指定对应的XxxSqlProvider
+- XxxMapper可以根据需求扩展`BaseDBMapper`中没有的方法,同时在方法上指定对应的XxxSqlProvider
+- XxxSqlProvider必须继承`BaseSqlProvider`
+- 复杂动态SQL可在XxxSqlProvider中拼接,**禁止**字符串拼接直接嵌入不可信输入
+- 批量操作默认每批200条
+
+### 4.2 BaseDBMapper中基本方法
+
+| 方法                  | 用途               |
+|:--------------------|:-----------------|
+| `totalCounts()`     | 查询统计             |
+| `listAllWiths()`    | 分页列表查询(支持JOIN优化) |
+| `batchQueryWiths()` | 多条件复合查询          |
+| `batchQueryIn()`    | 多条件IN查询          |
+| `getOne()`          | 单条查询             |
+| `existLine()`       | 存在性判断            |
+| `insertsWheres()`   | 带条件的单条插入         |
+| `inserts()`         | 单条插入             |
+| `batchInserts()`    | 多条插入             |
+| `updateWiths()`     | 条件更新             |
+| `insertOrUpdate()`  | 插入或更新            |
+
+## 五、注意事项
+
+1. 整个dbdao持久层**与实体对象解耦**,不在dbdao持久层的任何地方声明或使用实体对象
+2. **禁止**修改`BaseSqlProvider`中的任意方法
+3. **禁止**在XxxSqlProvider中直接字符串拼接嵌入不可信输入
+4. **禁止**业务层直接`new Mapper`实例
+5. **禁止**业务层直接`@Autowired`注入`Mapper`
+6. **禁止**在Table接口中写业务逻辑

+ 29 - 0
.cursor/rules/project-context.mdc

@@ -0,0 +1,29 @@
+---
+description: 全局上下文约定
+alwaysApply: true
+---
+
+# 全局上下文约定
+
+## 注意事项
+
+1. **修改 `.properties` 或 `.xml` 文件前必须征得用户同意**
+2. **删除任意文件前必须征得用户同意**
+
+## JSON使用规则
+
+- 项目同时存在 **Fastjson、Gson、Jackson**;新代码优先与**当前修改文件**已用的库保持一致,避免在同一流程混用三种序列化。
+
+## 异常与响应
+
+- 业务错误:抛 `SelfException`(可带错误码、扩展数据、`SysLogEvent`);由 `GlobalSelfExceptionHandler` 统一转 JSON。
+- 静态工厂方法优先复用 `GlobalSelfExceptionHandler.createResParam(...)` 等同项目既有写法。
+
+## 依赖与副作用
+
+- 使用 `com.global.base.*`(gbase JAR)时,不假设本地有可替换实现;改动需考虑 **无该 JAR 时无法编译** 的环境。
+- 线程与后台任务:参考 `ThreadTaskMgr`、`AsyncTaskQueueMgr` 等现有模式,避免自建无界线程池。
+
+## Git使用规范
+
+- 禁止自动提交,不得主动或自动执行 `git commit` 或 `git push`

+ 389 - 0
.cursor/skills/dao-crud/SKILL.mdc

@@ -0,0 +1,389 @@
+---
+name: dao-crud
+description: >-
+  创建对象或功能项的CRUD全链路脚手架。当用户需要为某个实体创建完整的数据库持久层、业务层和控制器层时使用本技能,包括:Table接口、SqlProvider、Mapper、DBService接口/实现类、BizFilter、BizHelper和Controller。触发场景如:"帮我创建一个XXX的CRUD"、"生成XXX的全套代码"、"生成XXX的增删查改"。
+---
+
+# DAO CRUD 全链路脚手架生成
+
+本技能用于快速生成一个对象或功能项的完整 CRUD 链路代码,包括数据库持久层、业务处理层和 API 控制器层。
+
+## 工作流程
+
+### 第一步:确认对象名称
+
+**必须先询问用户**要创建的对象/功能项名称(如:`DevEntity`、`PatrolTask` 等)。
+
+### 第二步:生成代码骨架
+
+按照以下顺序创建 **8** 个文件,**扩展函数和具体实现均可留空或抛出 `UnsupportedOperationException`,由用户自行补全**。
+
+#### 2.1 Table 接口
+
+**文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/dbdao/tables/{EntityName}Table.java`
+
+**模板**:
+```java
+package com.shkpr.service.alamdmaordertask.dbdao.tables;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public interface {EntityName}Table {
+    interface R_INFO{
+        String TABLE = "";  // TODO: 填写查询表/视图名
+        String PRIMARY_KEY = "";  // TODO: 填写主键字段
+        String ALL_FILED = "*";
+        String UNIQUE_ID = "";
+        String DEFAULT_ORDER = "";
+        Set<String> LIKE_SUPPORT_FILTER = new HashSet<String>(){{}};
+    }
+
+    interface W_INFO{
+        String TABLE = "";  // TODO: 填写写入表名
+        String PRIMARY_KEY = "";  // TODO: 填写主键字段
+        String UNIQUE_ID = "";
+    }
+}
+```
+
+#### 2.2 SqlProvider
+
+**文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/dbdao/providers/{EntityName}SqlProvider.java`
+
+**模板**:
+```java
+package com.shkpr.service.alamdmaordertask.dbdao.providers;
+
+import com.shkpr.service.alamdmaordertask.dbdao.tables.{EntityName}Table;
+
+public class {EntityName}SqlProvider extends BaseSqlProvider implements {EntityName}Table {
+    @Override
+    public String getRTableName() {
+        return R_INFO.TABLE;
+    }
+
+    @Override
+    public String getWTableName() {
+        return W_INFO.TABLE;
+    }
+
+    @Override
+    public String getRUniqueId() {
+        return R_INFO.UNIQUE_ID;
+    }
+
+    @Override
+    public String getWUniqueId() {
+        return W_INFO.UNIQUE_ID;
+    }
+
+    @Override
+    public String getSAllFiled() {
+        return R_INFO.ALL_FILED;
+    }
+
+    @Override
+    public String getRPrimaryKey() {
+        return R_INFO.PRIMARY_KEY;
+    }
+
+    @Override
+    public String getWPrimaryKey() {
+        return W_INFO.PRIMARY_KEY;
+    }
+
+    @Override
+    public boolean isWJsonForFiled(String filedName) {
+        return false;
+    }
+
+    // TODO: 根据业务需求扩展 SQL 方法
+}
+```
+
+#### 2.3 Mapper 接口
+
+**文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/dbdao/mapper/{EntityName}Mapper.java`
+
+**模板**:
+```java
+package com.shkpr.service.alamdmaordertask.dbdao.mapper;
+
+import com.shkpr.service.alamdmaordertask.dbdao.BaseDBMapper;
+import com.shkpr.service.alamdmaordertask.dbdao.providers.{EntityName}SqlProvider;
+import org.apache.ibatis.annotations.InsertProvider;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.SelectProvider;
+import org.apache.ibatis.annotations.UpdateProvider;
+
+import java.util.List;
+import java.util.Map;
+
+public interface {EntityName}Mapper extends BaseDBMapper{
+    @Override
+    @SelectProvider(type = {EntityName}SqlProvider.class, method = "totalCounts")
+    int totalCounts(@Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("group2Power") Map<String, List<Map<String, Object>>> group2Power
+            , @Param("extend") String extend);
+    
+    @Override
+    @SelectProvider(type = {EntityName}SqlProvider.class, method = "listAllWiths")
+    List<Map<String, Object>> listAllWiths(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("limit") int limit
+            , @Param("offset") int offset
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("group2Power") Map<String, List<Map<String, Object>>> group2Power
+            , @Param("extend") String extend
+            , @Param("order") String order);
+    
+    @Override
+    @SelectProvider(type = {EntityName}SqlProvider.class, method = "batchQueryWiths")
+    List<Map<String, Object>> batchQueryWiths(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("group2Power") Map<String, List<Map<String, Object>>> group2Power
+            , @Param("extend") String extend
+            , @Param("order") String order);
+    
+    @Override
+    @SelectProvider(type = {EntityName}SqlProvider.class, method = "batchQueryIn")
+    List<Map<String, Object>> batchQueryIn(@Param("table") String table
+            , @Param("filed") String filed
+            , @Param("ids") List<? extends Object> ids
+            , @Param("group2Power") Map<String, List<Map<String, Object>>> group2Power
+            , @Param("extend") String extend
+            , @Param("order") String order);
+    
+    @Override
+    @SelectProvider(type = {EntityName}SqlProvider.class, method = "getOne")
+    Map<String, Object> getOne(@Param("table") String table, @Param("filed") String filed, @Param("id") Object id);
+
+    @Override
+    @SelectProvider(type = {EntityName}SqlProvider.class, method = "existLine")
+    boolean existLine(@Param("table") String table
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("group2Power") Map<String, List<Map<String, Object>>> group2Power
+            , @Param("extend") String extend);
+
+    @Override
+    @UpdateProvider(type = {EntityName}SqlProvider.class, method = "updateWiths")
+    int updateWiths(@Param("datas") Map<String, Object> datas
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("extend") String extend);
+    
+    @Override
+    @InsertProvider(type = {EntityName}SqlProvider.class, method = "inserts")
+    int inserts(@Param("inserts") Map<String, Object> inserts);
+
+    @Override
+    @InsertProvider(type = {EntityName}SqlProvider.class, method = "batchInserts")
+    int batchInserts(@Param("inserts") List<Map<String, Object>> inserts);
+
+    @Override
+    @InsertProvider(type = {EntityName}SqlProvider.class, method = "insertOrUpdate")
+    int insertOrUpdate(@Param("inserts") Map<String, Object> inserts
+            , @Param("uniques") List<Object> uniques
+            , @Param("updates") List<Object> updates);
+    
+    // TODO: 根据业务需求扩展 Mapper 方法
+}
+```
+
+#### 2.4 DBService 接口
+
+**文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/dbdao/services/intef/{EntityName}DBService.java`
+
+**模板**:
+```java
+package com.shkpr.service.alamdmaordertask.dbdao.services.intef;
+
+import com.shkpr.service.alamdmaordertask.dbdao.BaseDBFuncTemplate;
+import com.shkpr.service.alamdmaordertask.dbdao.mapper.{EntityName}Mapper;
+
+public abstract class {EntityName}DBService extends BaseDBFuncTemplate<{EntityName}Mapper> {
+    // TODO: 根据业务需求扩展接口方法
+}
+```
+
+#### 2.5 DBServiceImpl 实现类
+
+**文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/dbdao/services/{EntityName}DBServiceImpl.java`
+
+**模板**:
+```java
+package com.shkpr.service.alamdmaordertask.dbdao.services;
+
+import com.shkpr.service.alamdmaordertask.dbdao.mapper.{EntityName}Mapper;
+import com.shkpr.service.alamdmaordertask.dbdao.services.intef.{EntityName}DBService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+
+@Service
+public class {EntityName}DBServiceImpl extends {EntityName}DBService {
+    private String mStrClassName = "";
+    private String mBusinessType = "";
+    private String logTag = "";
+
+    public {EntityName}DBServiceImpl() {
+        mStrClassName = this.getClass().getSimpleName();
+        mBusinessType = "";
+        logTag = "{EntityName}";
+    }
+
+    @SuppressWarnings("all")
+    @Autowired
+    {EntityName}Mapper {entityName}Mapper;
+
+    @PostConstruct
+    public void postConstruct(){
+        init({entityName}Mapper, mBusinessType, logTag);
+    }
+
+    // TODO: 根据业务需求扩展接口方法
+}
+```
+
+#### 2.6 BizFilter 过滤器
+
+**文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/controllerfilter/third/ThirdJWT{EntityName}BizFilter.java`
+
+**模板**:
+```java
+package com.shkpr.service.alamdmaordertask.controllerfilter.third;
+
+import com.shkpr.service.alamdmaordertask.controllercheck.ThirdCommTaskControllerCheck;
+import com.shkpr.service.alamdmaordertask.controllerfilter.JWTAuthenticationFilter;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.web.util.matcher.RequestMatcher;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ThirdJWT{EntityName}BizFilter extends JWTAuthenticationFilter {
+    private RequestMatcher mRequestMatcher = null;
+    private ThirdCommTaskControllerCheck mControllerCheck = null;
+    private static final Map<String, String> msMapURI2Method;
+    static {
+        msMapURI2Method = new HashMap<String, String>();
+        // TODO: 配置 API 路由映射,例如:
+        // msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_XXX_H, ApiURI.URI_XXX_LIST), "POST");
+    }
+
+    public ThirdJWT{EntityName}BizFilter(AuthenticationManager authenticationManager) {
+        super(authenticationManager);
+        this.mStrThisSampleName = this.getClass().getSimpleName();
+        this.mControllerCheck = new ThirdCommTaskControllerCheck(msMapURI2Method);
+        setControllerCheck(this.mControllerCheck);
+    }
+
+    public ThirdJWT{EntityName}BizFilter(String url, AuthenticationManager authenticationManager) {
+        super(url, authenticationManager);
+        this.mStrThisSampleName = this.getClass().getSimpleName();
+        this.mControllerCheck = new ThirdCommTaskControllerCheck(msMapURI2Method);
+        setControllerCheck(this.mControllerCheck);
+    }
+
+    @Override
+    public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
+        super.doFilterInternal(request, response, chain);
+    }
+}
+```
+
+#### 2.7 BizHelper 业务处理类
+
+**文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/busihandler/{EntityName}BizHelper.java`
+
+**模板**:
+```java
+package com.shkpr.service.alamdmaordertask.busihandler;
+
+import com.shkpr.service.alamdmaordertask.dbdao.DBMgrProxy;
+import com.shkpr.service.alamdmaordertask.dbdao.services.intef.{EntityName}DBService;
+
+import java.util.*;
+
+public class {EntityName}BizHelper {
+    private final static String mStrClassName = "{EntityName}BizHelper";
+
+    private static {EntityName}DBService getThisDBService(){
+        return DBMgrProxy.getInstance().applyXXXApi({EntityName}DBService.class);
+    }
+
+    // TODO: 根据业务需求实现业务方法
+}
+```
+
+#### 2.8 Controller 控制器
+
+**文件路径**: `src/main/java/com/shkpr/service/alamdmaordertask/controllerapi/Third{EntityName}Controller.java`
+
+**模板**:
+```java
+package com.shkpr.service.alamdmaordertask.controllerapi;
+
+import com.shkpr.service.alamdmaordertask.constants.ApiURI;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+@RequestMapping(ApiURI.URI_XXX_H)  // TODO: 替换为实际的 API 路径
+@RestController
+public class Third{EntityName}Controller extends ThirdBaseController {
+    final static String MSG_SUCCESS = "success.";
+    final static String MSG_FAILED = "failed.";
+    final static String mBusinessType = "";
+    final static String mLogTag = "{EntityName}";
+    private String mStrClassName = "";
+    private AtomicInteger mSeqReq = null;
+
+    public Third{EntityName}Controller() {
+        super(mBusinessType, mLogTag);
+        mStrClassName = this.getClass().getSimpleName();
+    }
+
+    // TODO: 实现具体的 API 处理方法
+}
+```
+
+### 第三步:输出总结
+
+创建完成后,输出以下总结信息:
+
+```
+✓ CRUD 全链路脚手架已生成!
+
+已创建以下文件:
+1. Table 接口: {EntityName}Table.java
+2. SqlProvider: {EntityName}SqlProvider.java
+3. Mapper: {EntityName}Mapper.java
+4. DBService 接口: {EntityName}DBService.java
+5. DBServiceImpl: {EntityName}DBServiceImpl.java
+6. BizFilter: ThirdJWT{EntityName}BizFilter.java
+7. BizHelper: {EntityName}BizHelper.java
+8. Controller: Third{EntityName}Controller.java
+
+请注意:
+- 文件中的 TODO 项需要您自行补充完整
+```
+
+## 注意事项
+
+1. **始终先询问对象名称**,不要在用户未提供名称时自行推断
+2. **保持代码风格与现有项目一致**,使用项目已有的包结构和命名规范
+3. **扩展方法均可留空**,框架代码只保证编译通过
+4. **Mapper 中不使用实体对象**,只使用 `Map<String, Object>` 或 `List<Map<String, Object>>` 进行数据交互(遵循数据库持久层规范)

+ 10 - 0
.cursorignore

@@ -0,0 +1,10 @@
+# Cursor:不参与索引/上下文的文件与目录(语法类似 .gitignore)
+trilog/
+target/
+.claudeignore
+.claude/
+download/
+temp-resource/
+videoFrame/
+upload/
+HELP.md

+ 34 - 0
.gitignore

@@ -0,0 +1,34 @@
+target/
+trilog/
+upload/
+download/
+.idea/
+.idea/inspectionProfiles/
+.idea/libraries/
+*.bak
+### !.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+### *.iml
+*.ipr
+
+### NetBeans ###
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
+.vscode/
+.externalToolBuilders/
+maven-eclipse.xml

+ 39 - 0
CLAUDE.md

@@ -0,0 +1,39 @@
+# 智慧水务通工单服务
+
+> 这个是智慧水务平台的工单微服务
+
+## AI 协作规则
+
+### 单一事实来源
+
+规则正文**唯一**存放在 **`.cursor/rules/*.mdc`**。修改约定时**只编辑这些文件**,勿在别处维护重复副本。
+
+### 与 Cursor 的差异(重要)
+
+- **Cursor** 会按每个 `.mdc` 顶部的 YAML(如 `alwaysApply`、`globs`)自动决定是否注入上下文。
+- **Claude Code 不会**根据上述 YAML 自动做同等筛选;须在任务中**主动读取**相关文件(例如用 Read 工具,或在对话里 `@` 对应路径),否则容易漏掉仅带 `globs` 的规则。
+
+### 必读与按需读取
+
+开展**实质性**工作(改代码、改配置、做方案/评审)前:
+
+1. **必读**:`project-context.mdc`、`architecture.mdc`(全局上下文与项目架构)。
+2. **按当前任务路径选读**(与各文件 `globs` 对齐,避免漏规):
+   - 涉及 `pom.xml` 或 `src/**/application.properties` 读取 `build-and-run.mdc`
+   - 涉及 `src/**/*.java` 读取 `coding-standards.mdc`
+   - 涉及 `src/**/dbdao/**/*.java` 读取 `database-persistence.mdc`
+
+当前目录下对应文件为:
+
+- `.cursor/rules/project-context.mdc`
+- `.cursor/rules/architecture.mdc`
+- `.cursor/rules/build-and-run.mdc`
+- `.cursor/rules/coding-standards.mdc`
+- `.cursor/rules/database-persistence.mdc`
+
+若新增其他 `.mdc`,同样视为规则的一部分,**在相关工作时主动阅读**。
+
+### 仓库维护约定
+
+- **勿**将 `.cursor/rules/` 或其中文件加入 **`.claudeignore`**(或等价忽略配置),否则 Claude 侧无法可靠读到规则。
+- 若本文件与任一 `.mdc` 冲突,**以 `.cursor/rules/*.mdc` 为准**。

二進制
libs/gbase.1.0.6.jar


+ 370 - 0
pom.xml

@@ -0,0 +1,370 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>3.5.12</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.shkpr.service</groupId>
+    <artifactId>kpr-mcp-center-service</artifactId>
+    <version>1.0.0</version>
+    <name>KprMcpCenterService</name>
+    <description>Kpr Mcp Center Service</description>
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>21</java.version>
+        <maven.compiler.source>21</maven.compiler.source>
+        <maven.compiler.target>21</maven.compiler.target>
+        <fasterxml.version>2.15.3</fasterxml.version>
+        <fastercore.version>2.15.3</fastercore.version>
+        <fasterannot.version>2.15.3</fasterannot.version>
+        <spring-ai.version>1.1.4</spring-ai.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-databind</artifactId>
+                <version>${fasterxml.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-core</artifactId>
+                <version>${fastercore.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-annotations</artifactId>
+                <version>${fasterannot.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.springframework.ai</groupId>
+                <artifactId>spring-ai-bom</artifactId>
+                <version>${spring-ai.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.ai</groupId>
+            <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>ch.qos.logback</groupId>
+                    <artifactId>logback-classic</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>ch.qos.logback</groupId>
+                    <artifactId>logback-core</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!--<dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>3.0.2</version>
+        </dependency>-->
+
+
+        <!--<dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jdbc</artifactId>
+        </dependency>-->
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <version>42.6.0</version>
+            <!--<scope>runtime</scope>-->
+        </dependency>
+
+        <!--<dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>-->
+
+        <dependency>
+            <groupId>org.hibernate.validator</groupId>
+            <artifactId>hibernate-validator</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>jakarta.validation</groupId>
+            <artifactId>jakarta.validation-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>20180813</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.83</version>
+        </dependency>
+
+        <!--Gson-->
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.10.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>2.0.17</version>
+        </dependency>
+
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>1.5.32</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>ch.qos.logback</groupId>
+                    <artifactId>logback-core</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <version>1.5.32</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.14</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.httpcomponents</groupId>
+                    <artifactId>httpcore</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpcore</artifactId>
+            <version>4.4.16</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpmime</artifactId>
+            <version>4.5.14</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpasyncclient</artifactId>
+            <version>4.1.5</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.httpcomponents</groupId>
+                    <artifactId>httpclient</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-cache</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.ben-manes.caffeine</groupId>
+            <artifactId>caffeine</artifactId>
+            <version>2.6.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.12.0</version>
+        </dependency>
+
+        <!-- Apache Commons Collections -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>4.4</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>32.1.2-jre</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk18on</artifactId>
+            <version>1.77</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.retry</groupId>
+            <artifactId>spring-retry</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.17</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>3.17</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.opencsv</groupId>
+            <artifactId>opencsv</artifactId>
+            <version>4.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.tobato</groupId>
+            <artifactId>fastdfs-client</artifactId>
+            <version>1.27.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>net.postgis</groupId>
+            <artifactId>postgis-jdbc</artifactId>
+            <version>2.5.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.global</groupId>
+            <artifactId>gbase</artifactId>
+            <version>1.0.6</version>
+            <classifier>jar-with-dependencies</classifier>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/libs/gbase.1.0.6.jar</systemPath>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <!-- 打成jar包的名称 -->
+        <finalName>v1-kpr-mcp-center-service-1.0.0</finalName>
+        <plugins>
+            <!--运用SpringBoot 插件  使用spring-boot-devtools模块的应用,当classpath中的文件有改变时,会自动重启! -->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <executable>true</executable>
+                    <requiresUnpack>
+                        <dependency>
+                            <groupId>com.global</groupId>
+                            <artifactId>gbase</artifactId>
+                        </dependency>
+                    </requiresUnpack>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>build-info</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                    <!-- 过滤后缀为pem、pfx的证书文件 -->
+                    <nonFilteredFileExtensions>
+                        <nonFilteredFileExtension>pem</nonFilteredFileExtension>
+                        <nonFilteredFileExtension>pfx</nonFilteredFileExtension>
+                        <nonFilteredFileExtension>p12</nonFilteredFileExtension>
+                    </nonFilteredFileExtensions>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>21</source>
+                    <target>21</target>
+                    <encoding>UTF-8</encoding>
+                    <compilerArguments>
+                        <extdirs>${project.basedir}/libs</extdirs>
+                    </compilerArguments>
+                </configuration>
+            </plugin>
+
+        </plugins>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/libs</directory>
+                <targetPath>BOOT-INF/lib/</targetPath>
+                <includes>
+                    <include>**/*.jar</include>
+                </includes>
+            </resource>
+            <!--very important!!! 打包时将 src/main/resources 下的所有配置文件一并打包-->
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/**</include>
+                </includes>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+    </build>
+
+</project>

+ 26 - 0
src/main/java/com/shkpr/service/mcpcenterservice/KprMcpCenterServiceApplication.java

@@ -0,0 +1,26 @@
+package com.shkpr.service.mcpcenterservice;
+
+import com.shkpr.service.mcpcenterservice.mcptool.MathMcpTool;
+import org.springframework.ai.tool.ToolCallbackProvider;
+import org.springframework.ai.tool.method.MethodToolCallbackProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+
+@SpringBootApplication
+public class KprMcpCenterServiceApplication {
+    @Autowired
+    private MathMcpTool mathMcpTool;
+    public static void main(String[] args) {
+        SpringApplication.run(KprMcpCenterServiceApplication.class, args);
+    }
+
+    @Bean
+    public ToolCallbackProvider mathMcpTools() {
+        return MethodToolCallbackProvider.builder()
+                .toolObjects(mathMcpTool)
+                //.toolObjects(new MathMcpTool())
+                .build();
+    }
+}

+ 69 - 0
src/main/java/com/shkpr/service/mcpcenterservice/mcptool/DateMcpTool.java

@@ -0,0 +1,69 @@
+package com.shkpr.service.mcpcenterservice.mcptool;
+
+import io.modelcontextprotocol.spec.McpSchema.CallToolResult;
+import io.modelcontextprotocol.spec.McpSchema.TextContent;
+import org.springaicommunity.mcp.annotation.McpTool;
+import org.springaicommunity.mcp.annotation.McpToolParam;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 注:1) 使用@McpTool的工具方法,会被自动扫描注册,前提是所在类型添加了@Service或@Component注解
+ *    2) 当@McpTool的工具方法返回的是CallToolResult结构时,服务不会在进行封装,而是直接返回
+ *    3) 当@McpTool的工具方法返回的是非CallToolResult结构时,服务会自动封装成CallToolResult结构后再返回
+ */
+@Service
+public class DateMcpTool {
+    /**
+     *
+     * @param days
+     * @return
+     */
+    @McpTool(name = "addDays", description = "Adds days to the current date")
+    public CallToolResult addDays(@McpToolParam(description = "The number of days to add", required = true) Integer days) {
+        if (days == null){
+            return new CallToolResult(
+                    List.of(new TextContent("缺少必要参数days,无法完成存储操作。")),
+                    true
+            );
+        }
+        if (days < 0){
+            return new CallToolResult(
+                    List.of(new TextContent("参数days不能小于0,请重新输入。")),
+                    true
+            );
+        }
+        return new CallToolResult(
+                List.of(new TextContent(LocalDate.now().plusDays(days).toString())),
+                false
+        );
+    }
+
+    @McpTool(name = "subtractDays", description = "Subtracts days from the current date")
+    public CallToolResult subtractDays(@McpToolParam(description = "The number of days to subtract", required = true) Integer days) {
+        if (days == null){
+            return new CallToolResult(
+                    List.of(new TextContent("缺少必要参数days,无法完成存储操作。")),
+                    true
+            );
+        }
+        if (days < 0){
+            return new CallToolResult(
+                    List.of(new TextContent("参数days不能小于0,请重新输入。")),
+                    true
+            );
+        }
+        return new CallToolResult(
+                List.of(new TextContent(LocalDate.now().minusDays(days).toString())),
+                false
+        );
+    }
+
+    //服务会自动将string封装成CallToolResult后再返回给前端
+    @McpTool(name = "today", description = "Return current date")
+    public String today() {
+        return LocalDate.now().toString();
+    }
+}

+ 40 - 0
src/main/java/com/shkpr/service/mcpcenterservice/mcptool/MathMcpTool.java

@@ -0,0 +1,40 @@
+package com.shkpr.service.mcpcenterservice.mcptool;
+
+import org.springframework.ai.tool.annotation.Tool;
+import org.springframework.ai.tool.annotation.ToolParam;
+import org.springframework.stereotype.Service;
+
+/**
+ * 注:1) 使用@Tool的工具方法,不会被自动扫描注册,需要显示调用MethodToolCallbackProvider.builder()进行注册
+ *       [!!!]哪怕是所在类型添加了@Service或@Component注解[!!!]
+ *    2) 使用@Tool的工具方法,其返回参数不管是什么类型,都会被自动封装成CallToolResult结构后再返回
+ */
+@Service
+public class MathMcpTool {
+    @Tool(name = "add", description = "Adds two numbers")
+    public int add(@ToolParam(description = "The first number to add", required = true) int a,
+                   @ToolParam(description = "The second number to add", required = true) int b) {
+        return a + b;
+    }
+
+    @Tool(name = "subtract", description = "Subtracts two numbers")
+    public int subtract(@ToolParam (description = "The first number to subtract", required = true) int a,
+                        @ToolParam (description = "The second number to subtract", required = true) int b) {
+        return a - b;
+    }
+
+    @Tool(name = "multiply", description = "Multiplies two numbers")
+    public int multiply(@ToolParam (description = "The first number to multiply", required = true) int a,
+                        @ToolParam (description = "The second number to multiply", required = true) int b) {
+        return a * b;
+    }
+
+    @Tool(name = "divide", description = "Divides two numbers")
+    public double divide(@ToolParam (description = "The first number to divide", required = true) int a,
+                         @ToolParam (description = "The second number to divide", required = true) int b) {
+        if (b == 0) {
+            throw new IllegalArgumentException("Division by zero is not allowed.");
+        }
+        return (double) a / b;
+    }
+}

二進制
src/main/resources/alam_server.pfx


+ 39 - 0
src/main/resources/application.properties

@@ -0,0 +1,39 @@
+#\u9879\u76EE\u7684\u5168\u5C40\u914D\u7F6E==============>
+spring.application.name=kpr-mcp-center-service
+server.servlet.context-path=/
+server.error.path= /
+# \u670D\u52A1\u7AEF\u53E3
+server.port=9100
+server.tomcat.max-http-post-size=-1
+spring.servlet.multipart.max-file-size=200MB
+spring.servlet.multipart.max-request-size=200MB
+
+server.servlet.session.timeout=60s
+server.connection-timeout=60s
+
+#Tomcat\u914D\u7F6E================>
+server.tomcat.uri-encoding=UTF-8
+server.tomcat.basedir=./trilog/tomcattmp
+server.tomcat.access-log-enabled=false
+server.tomcat.access-log-pattern=common
+
+global.sql.config.path=./sql.properties
+
+spring.ai.mcp.server.enabled=true
+spring.ai.mcp.server.stdio=false
+spring.ai.mcp.server.name=kpr-mcp-center-service
+spring.ai.mcp.server.version=1.0.0
+spring.ai.mcp.server.description=Kpr MCP Center Server For Business
+spring.ai.mcp.server.resourceChangeNotification=true
+spring.ai.mcp.server.toolChangeNotification=true
+spring.ai.mcp.server.promptChangeNotification=true
+spring.ai.mcp.server.sseEndpoint=/kpr-mcp-center/sse
+spring.ai.mcp.server.sseMessageEndpoint=/kpr-mcp-center/sse/message
+spring.ai.mcp.server.type=sync
+spring.ai.mcp.server.capabilities.completion=true
+spring.ai.mcp.server.capabilities.prompt=true
+spring.ai.mcp.server.capabilities.tool=true
+spring.ai.mcp.server.capabilities.resource=true
+
+#logging.level.io.modelcontextprotocol=DEBUG
+#logging.level.org.springframework.ai.mcp=DEBUG

+ 127 - 0
src/main/resources/logback.xml

@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--日志级别高低TRACE < DEBUG < INFO < WARN < ERROR < FATAL-->
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!--引用外部配置文件中的变量属性-->
+    <!--<property scope="context" resource="application.properties" />
+    <springProperty scope="context" name="log.dir" source="hgas.log.dir"/>
+    <springProperty scope="context" name="log.appname" source="hgas.log.appname"/>-->
+    <contextName>TriCP</contextName>
+    <!-- 自定义内部变量属性-->
+    <property name="log.dir" value="./trilog/log"/>
+    <property name="log.appname" value="tri"/>
+
+
+    <!--输出到控制台-->
+    <appender name="consoleOutput" class="ch.qos.logback.core.ConsoleAppender">
+        <!-- 如果要过滤掉ERROR级别以下的日志请启用该行
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>ERROR</level>
+        </filter>
+        -->
+
+        <!--对日志格式进行编码-->
+        <!--%d{HH: mm:ss.SSS}——日志输出时间-->
+        <!--%thread——输出日志的进程名字-->
+        <!--%-5level——日志级别,并且使用5个字符靠左对齐-->
+        <!--%logger{36}——日志输出者的名字-->
+        <!--%msg——日志消息-->
+        <!--%n——平台的换行符-->
+        <encoder>
+            <!--<pattern>%d{HH: mm:ss.SSS} %contextName {%thread} %-5level %logger{36} - %msg%n</pattern>-->
+            <pattern>%d{HH: mm:ss.SSS} %contextName %-5level %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <!--输出到文件-->
+    <appender name="fileInfoOutput" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
+        如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
+        的日志改名为今天的日期。即,<File> 的日志都是当天的。
+        -->
+        <File>${log.dir}/info.${log.appname}.log</File>
+
+        <!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Warn 日志,因为 Warn 的级别高,
+        所以我们使用下面的策略,可以避免输出 Warn 的日志-->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>Info</level>               <!--过滤Warn-->
+            <onMatch>ACCEPT</onMatch>         <!--匹配到就运行-->
+            <onMismatch>DENY</onMismatch>    <!--没有匹配到就拒绝-->
+        </filter>
+
+        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
+            <FileNamePattern>${log.dir}/info.${log.appname}.%d{yyyy-MM-dd}.log</FileNamePattern>
+            <!--只保留最近180天的日志-->
+            <maxHistory>180</maxHistory>
+            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
+            <totalSizeCap>10GB</totalSizeCap>
+        </rollingPolicy>
+
+        <!--日志输出编码格式化-->
+        <encoder>
+            <charset>UTF-8</charset>
+            <!--<pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>-->
+            <pattern>%d %-5level %msg%n</pattern>
+        </encoder>
+    </appender>
+
+
+    <appender name="fileWarnOutput" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>${log.dir}/warn.${log.appname}.log</File>
+
+        <!--过滤出Warn以及以上的级别(Warn、Error)
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>Warn</level>
+        </filter>-->
+
+        <!--再对Error进行过滤-->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>Warn</level>              <!--过滤Error-->
+            <onMatch>ACCEPT</onMatch>       <!--匹配到就允许-->
+            <onMismatch>DENY</onMismatch>  <!--没有匹配到就拒绝-->
+        </filter>
+
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <FileNamePattern>${log.dir}/warn.${log.appname}.%d{yyyy-MM-dd}.log</FileNamePattern>
+            <maxHistory>180</maxHistory>
+            <totalSizeCap>1GB</totalSizeCap>
+        </rollingPolicy>
+
+        <encoder>
+            <charset>UTF-8</charset>
+            <!--<pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>-->
+            <pattern>%d %-5level %msg%n</pattern>
+        </encoder>
+    </appender>
+
+
+    <appender name="fileErrorOutput" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>${log.dir}/error.${log.appname}.log</File>
+
+        <!--过滤出Error以及以上的级别-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>Error</level>
+        </filter>
+
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <FileNamePattern>${log.dir}/error.${log.appname}.%d{yyyy-MM-dd}.log</FileNamePattern>
+            <maxHistory>180</maxHistory>
+            <totalSizeCap>1GB</totalSizeCap>
+        </rollingPolicy>
+
+        <encoder>
+            <charset>UTF-8</charset>
+            <!--<pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>-->
+            <pattern>%d %-5level %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <!--指定最基础的日志输出级别,低于Info级别的信息都不会输出-->
+    <root level="Info">
+        <appender-ref ref="consoleOutput" />
+        <appender-ref ref="fileInfoOutput" />
+        <appender-ref ref="fileWarnOutput" />
+        <appender-ref ref="fileErrorOutput" />
+    </root>
+</configuration>

+ 10 - 0
src/main/resources/templates/index.html

@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8" />
+    <title>Title</title>
+</head>
+<body>
+<h2>This is home page!</h2>
+</body>
+</html>

+ 13 - 0
src/test/java/com/shkpr/service/mcpcenterservice/KprMcpCenterServiceApplicationTests.java

@@ -0,0 +1,13 @@
+package com.shkpr.service.mcpcenterservice;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class KprMcpCenterServiceApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}