[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M77YYQVPA4EWZPQ8J88BYVYA":3,"skill-same:01M77YYQVPA4EWZPQ8J88BYVYA":167},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":21,"frontMatter":22,"refName":62,"commitSha":63,"skillDirectory":64,"forksCount":65,"repositoryHtmlUrl":66,"repositoryHomepageUrl":6,"ownerHtmlUrl":67,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":68,"install":69,"resources":82},"01M77YYQVPA4EWZPQ8J88BYVYA","xfg-ddd-skills",null,"DDD 六边形架构设计与部署技能包。提供 Domain\u002FCase\u002FInfrastructure 层设计模式与代码模板，以及 Docker 环境部署脚本。当用户询问 DDD 架构、设计模式或需要部署项目时调用。","Jinhong270\u002FAI-Agent","Jinhong270","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F193703602?v=4","01M77SB4J7ATDYATSD7AW4B8XP","01M77SB4JWRQWNGTTR291BHMQP",3,"MIT","https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: \"xfg-ddd-skills\"\ndescription: \"DDD 六边形架构设计与部署技能包。提供 Domain\u002FCase\u002FInfrastructure 层设计模式与代码模板，以及 Docker 环境部署脚本。当用户询问 DDD 架构、设计模式或需要部署项目时调用。\"\nversion: 2.2.3\nauthor: xiaofuge\nlicense: MIT\ntriggers:\n  # DDD 架构设计\n  - \"DDD\"\n  - \"六边形架构\"\n  - \"domain-driven design\"\n  - \"领域驱动设计\"\n  - \"ports and adapters\"\n  - \"创建 Entity\"\n  - \"创建聚合根\"\n  - \"创建 DDD 项目\"\n  - \"新建项目\"\n  - \"Aggregate\"\n  - \"ValueObject\"\n  - \"值对象\"\n  - \"聚合根\"\n  # DevOps 部署相关\n  - \"部署\"\n  - \"deploy\"\n  - \"Docker\"\n  - \"docker-compose\"\n  - \"容器化\"\n  - \"发布\"\n  - \"上线\"\n  - \"打包\"\n  - \"build\"\n  - \"运维部署\"\n  - \"启动服务\"\n  - \"停止服务\"\n  - \"重启服务\"\n  - \"环境配置\"\n  - \"生产环境\"\n  - \"测试环境\"\n  - \"数据库部署\"\n  - \"MySQL\"\n  - \"Redis\"\n  - \"RabbitMQ\"\nmetadata:\n  openclaw:\n    emoji: \"🏗️\"\n---\n\n# DDD Hexagonal Architecture\n\nDesign and implement software using Domain-Driven Design with Hexagonal Architecture. This skill provides patterns, templates, and best practices for building maintainable domain-centric applications.\n\n## Scripts\n\n### 创建 DDD 项目\n\n当用户说\"创建 DDD 项目\"、\"新建项目\"、\"创建项目\"、\"创建ddd项目\"时，**必须使用 `scripts\u002Fcreate-ddd-project.sh` 脚本**。\n\n**脚本支持系统**: Windows (Git Bash\u002FMSYS2)、Mac (macOS)、Linux，自动检测并适配。\n\n**⚠️ 环境提醒**: 建议提前安装 JDK 17+ 和 Maven 3.8.*，脚本启动时会自动检测并给出各平台安装指引，未安装也可继续但可能导致生成失败。\n\n**⚠️ 重要提醒：必须询问用户项目创建地址**\n\n**在创建项目前，如果用户没有明确给出工程创建地址，必须询问用户在哪里创建项目。** 不能随意创建到默认目录，必须获得用户确认。\n\n示例对话：\n```\n用户：帮我创建一个 DDD 项目\nAI：好的，我来帮您创建 DDD 项目。请问您希望将项目创建在哪个目录？\n     例如：\n     1) \u002FUsers\u002Fxxx\u002Fprojects\n     2) \u002FUsers\u002Fxxx\u002FDocuments\n     3) \u002Fhome\u002Fxxx\u002Fworkspace\n     4) 其他路径（请直接输入）\n\n用户：创建在 \u002FUsers\u002Fxxx\u002Fprojects 下\nAI：确认在 \u002FUsers\u002Fxxx\u002Fprojects 下创建项目，开始执行...\n```\n\n**流程:**\n\n1. **第一步：确认项目创建目录**\n\n   **必须询问用户**，如果用户未指定，列出可选项供用户选择。\n\n   示例：\n   ```\n   📂 选择项目生成目录\n   ──────────────────────────────\n   1) \u002FUsers\u002Fxxx\u002Fprojects\n   2) \u002FUsers\u002Fxxx\u002FDocuments\n   3) \u002Fhome\u002Fxxx\u002Fworkspace\n   4) 自定义路径（直接输入路径）\n\n   直接回车 = 选择 [1]\n   ```\n\n2. **第二步：填写项目配置**（逐一询问，直接回车使用默认值）\n\n   | 参数 | 说明 | 默认值 | 示例 |\n   |------|------|--------|------|\n   | GroupId | Maven 坐标 groupId，标识组织或公司 | `com.yourcompany` | `cn.bugstack` |\n   | ArtifactId | 项目模块唯一标识名称 | `your-project-name` | `order-system` |\n   | Version | 项目版本号 | `1.0.0-SNAPSHOT` | `1.0.0-RELEASE` |\n   | Package | Java 代码根包名 | 自动从 GroupId + ArtifactId 推导 | `cn.bugstack.order` |\n   | Archetype 版本 | 脚手架模板版本 | `1.8` | - |\n\n3. **第三步：确认并生成**\n\n   显示所有配置，确认后执行 Maven Archetype 生成项目。\n\n**脚本执行方式**（在 `xfg-ddd-skills` 项目根目录下运行）:\n```bash\nbash scripts\u002Fcreate-ddd-project.sh\n```\n\n> ⚠️ **必须先 cd 到 `xfg-ddd-skills` 项目目录下再执行**，脚本会自动定位自身路径。\n> AI 负责引导用户选择目录、填写参数，无需手动拼凑 Maven 命令。\n> **⚠️ 再次强调：创建项目前必须询问用户项目创建地址，不能随意创建！**\n\n---\n\n## Quick Reference\n\n| Task | Reference |\n|------|-----------|\n| Architecture overview | [references\u002Farchitecture.md](references\u002Farchitecture.md) |\n| Entity design | [references\u002Fentity.md](references\u002Fentity.md) |\n| Aggregate design | [references\u002Faggregate.md](references\u002Faggregate.md) |\n| Value Object design | [references\u002Fvalue-object.md](references\u002Fvalue-object.md) |\n| Repository pattern | [references\u002Frepository.md](references\u002Frepository.md) |\n| Port & Adapter | [references\u002Fport-adapter.md](references\u002Fport-adapter.md) |\n| Domain Service | [references\u002Fdomain-service.md](references\u002Fdomain-service.md) |\n| Case layer orchestration | [references\u002Fcase-layer.md](references\u002Fcase-layer.md) |\n| Trigger layer | [references\u002Ftrigger-layer.md](references\u002Ftrigger-layer.md) |\n| Infrastructure layer | [references\u002Finfrastructure-layer.md](references\u002Finfrastructure-layer.md) |\n| **Domain 层设计指南（避免常见错误）** | **[references\u002Fdomain-design-guide.md](references\u002Fdomain-design-guide.md)** |\n| **Domain 层核心模式** | **[references\u002Fdomain-patterns.md](references\u002Fdomain-patterns.md)** |\n| **Infrastructure 层核心模式** | **[references\u002Finfrastructure-patterns.md](references\u002Finfrastructure-patterns.md)** |\n| **DevOps 部署** | **[references\u002Fdevops-deployment.md](references\u002Fdevops-deployment.md)** |\n| Project structure | [references\u002Fproject-structure.md](references\u002Fproject-structure.md) |\n| Naming conventions | [references\u002Fnaming.md](references\u002Fnaming.md) |\n| Docker Images | [references\u002Fdocker-images.md](references\u002Fdocker-images.md) |\n\n## Architecture Layers\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│                     Trigger Layer                            │\n│         (HTTP Controller \u002F MQ Listener \u002F Job)               │\n└─────────────────────────┬───────────────────────────────────┘\n                          ▼\n┌─────────────────────────────────────────────────────────────┐\n│                       API Layer                              │\n│              (DTO \u002F Request \u002F Response)                     │\n└─────────────────────────┬───────────────────────────────────┘\n                          ▼\n┌─────────────────────────────────────────────────────────────┐\n│                      Case Layer                              │\n│            (Orchestration \u002F Business Flow)                   │\n└─────────────────────────┬───────────────────────────────────┘\n                          ▼\n┌─────────────────────────────────────────────────────────────┐\n│                     Domain Layer                             │\n│        (Entity \u002F Aggregate \u002F VO \u002F Domain Service)           │\n└─────────────────────────┬───────────────────────────────────┘\n                          ▲\n┌─────────────────────────────────────────────────────────────┐\n│                  Infrastructure Layer                        │\n│      (Repository Impl \u002F Port Adapter \u002F DAO \u002F PO)            │\n└─────────────────────────────────────────────────────────────┘\n```\n\n**Dependency Rule**: `Trigger → API → Case → Domain ← Infrastructure`\n\n## ⚠️ Domain 层设计自检清单\n\n在生成 Domain 层代码前，必须逐项检查：\n\n**1. 是否有多种处理方式（if-else 判断类型）？**\n→ 是：使用**策略模式**（`IXxxStrategy` 接口 + 实现类 + `Map\u003CString, IXxxStrategy>` 注入）\n\n**2. 是否有多个独立的校验\u002F过滤步骤（3步以上）？**\n→ 是：使用**责任链模式**（`IXxxFilter` 接口 + Factory 组装链）\n\n**3. Service 方法是否超过 60 行？**\n→ 是：拆分为过滤器（校验）+ 策略（执行）+ 私有方法（保存）\n\n**4. Infrastructure 层是否包含业务判断逻辑？**\n→ 是：将业务校验移到 Domain 层的过滤器中，Infrastructure 只做数据读写\n\n**5. 是否跨域直接依赖另一个 Domain 的 Repository？**\n→ 是：通过 Case 层编排，或在本域 Repository 接口中聚合所需数据\n\n**6. Infrastructure 包名是否正确？**\n→ Repository 实现：`adapter\u002Frepository\u002F`（❌ 不是 `persistent\u002Frepository\u002F`）\n→ DAO 操作：`dao\u002F`（❌ 不是 `scenario\u002Fdao\u002F` 或其他包）\n→ Redis 操作：`redis\u002F`（❌ 不是 `config\u002F`）\n\n## Domain Layer 目录结构\n\n```\nmodel\u002F\n├── aggregate\u002F              # 聚合对象\n│   └── XxxAggregate.java\n├── entity\u002F               # 实体对象\n│   ├── XxxEntity.java          # 普通实体\n│   └── XxxCommandEntity.java  # 命令实体\n└── valobj\u002F               # 值对象\n    ├── XxxVO.java             # 普通值对象\n    └── XxxEnumVO.java         # 枚举值对象\n```\n\n**⚠️ 注意**：`model\u002F` 下没有单独的 `command\u002F` 包，命令实体统一放在 `entity\u002F` 包下。\n\n---\n\n## 🔄 新功能开发完整流程\n\n当用户需要实现一个新功能时，必须按照以下分层调用流程进行开发：\n\n### 调用链路图\n\n```\n┌─────────────────────────────────────────────────────────────────────────┐\n│                           新功能开发流程                                 │\n└─────────────────────────────────────────────────────────────────────────┘\n\n  外部请求\n      │\n      ▼\n┌─────────────────────────────────────────────────────────────────────────┐\n│ 1. Trigger 层（触发层）                                                  │\n│    职责：接收外部请求，路由转发，参数校验，不含业务逻辑                     │\n│                                                                         │\n│    • HTTP Controller  →  接收 HTTP 请求                                  │\n│    • MQ Listener      →  监听消息队列                                    │\n│    • Job\u002FTask         →  定时任务\u002F异步任务                               │\n│                                                                         │\n│    输出：调用 Case 层接口，或轻量场景直接调用 Domain 层                    │\n└─────────────────────────┬───────────────────────────────────────────────┘\n                          │\n                          ▼\n┌─────────────────────────────────────────────────────────────────────────┐\n│ 2. Case 层（编排层）- 可选，复杂业务需要                                  │\n│    职责：跨领域业务编排，流程串联，事务管理                                │\n│                                                                         │\n│    • 接收 Trigger 调用                                                   │\n│    • 编排多个 Domain Service 调用顺序                                     │\n│    • 处理跨领域数据转换                                                   │\n│    • 管理分布式事务（如需要）                                             │\n│                                                                         │\n│    输出：调用 Domain 层 Service 接口                                      │\n└─────────────────────────┬───────────────────────────────────────────────┘\n                          │\n                          ▼\n┌─────────────────────────────────────────────────────────────────────────┐\n│ 3. Domain 层（领域层）                                                   │\n│    职责：核心业务逻辑，业务规则校验，领域模型操作                           │\n│                                                                         │\n│    • Service 服务实现业务逻辑                                             │\n│    • Entity\u002FAggregate 封装业务行为                                       │\n│    • 通过 Adapter 接口（Port\u002FRepository）与外部交互                        │\n│                                                                         │\n│    注意：Domain 层不直接依赖 Infrastructure，只依赖接口                    │\n│                                                                         │\n│    输出：调用 Adapter 接口（定义在 domain\u002Fadapter\u002F 下）                    │\n└─────────────────────────┬───────────────────────────────────────────────┘\n                          │ 依赖倒置：Domain 定义接口，Infrastructure 实现\n                          ▼\n┌─────────────────────────────────────────────────────────────────────────┐\n│ 4. Infrastructure 层（基础设施层）                                        │\n│    职责：技术实现，数据持久化，外部服务调用                                │\n│                                                                         │\n│    • adapter\u002Frepository\u002F  →  实现 Repository 接口，操作数据库              │\n│    • adapter\u002Fport\u002F        →  实现 Port 接口，调用外部 HTTP\u002FRPC 服务        │\n│    • dao\u002F                 →  MyBatis DAO 接口和 PO 对象                   │\n│    • gateway\u002F             →  HTTP\u002FRPC 客户端，远程服务调用                 │\n│    • redis\u002F               →  Redis 操作                                  │\n│                                                                         │\n│    输出：返回数据给 Domain 层，或执行外部调用                              │\n└─────────────────────────────────────────────────────────────────────────┘\n```\n\n### 分层职责速查表\n\n| 层级 | 职责 | 禁止做的事 | 依赖方向 |\n|------|------|-----------|----------|\n| **Trigger** | 接收请求、参数校验、路由转发 | 业务逻辑、直接操作数据库 | → API\u002FCase\u002FDomain |\n| **Case** | 跨域编排、流程串联、事务管理 | 直接操作数据库、外部 HTTP 调用 | → Domain |\n| **Domain** | 业务规则、领域模型、逻辑编排 | 直接依赖 MyBatis\u002FRedis\u002FHTTP | → 只依赖接口 |\n| **Infrastructure** | 数据持久化、外部调用、技术实现 | 业务判断、业务规则 | 实现 Domain 接口 |\n\n### 开发流程检查清单\n\n当用户说\"帮我实现一个 XXX 功能\"时，按以下顺序检查：\n\n#### Step 1: 确定入口方式（Trigger）\n\n询问用户或根据需求判断：\n\n```\n□ HTTP API 接口？  →  创建 Controller\n□ MQ 消息监听？    →  创建 MQ Listener\n□ 定时任务？       →  创建 Job\n□ 异步任务？       →  创建 Task\u002FWorker\n```\n\n#### Step 2: 判断是否需要 Case 层\n\n```\n□ 涉及多个领域协作？     →  需要 Case 层\n□ 业务流程超过 3 步？    →  需要 Case 层\n□ 需要分布式事务？       →  需要 Case 层\n□ 单领域、简单业务？     →  Trigger 直接调用 Domain\n```\n\n#### Step 3: Domain 层设计\n\n```\n□ 定义 Entity\u002FAggregate\u002FVO\n□ 定义 Service 接口和实现\n□ 定义 Repository 接口（数据访问）\n□ 定义 Port 接口（外部调用，如需要）\n```\n\n#### Step 4: Infrastructure 层实现\n\n```\n□ 实现 Repository 接口（adapter\u002Frepository\u002F）\n□ 创建 DAO 接口和 PO 对象（dao\u002F）\n□ 实现 Port 接口（adapter\u002Fport\u002F，如需要）\n□ 创建 Gateway 客户端（gateway\u002F，如需要）\n□ 配置 Redis 操作（redis\u002F，如需要）\n```\n\n### 代码示例：完整调用链\n\n以\"订单支付\"功能为例，展示完整分层调用：\n\n#### 1. Trigger 层（HTTP Controller）\n\n```java\n@RestController\n@RequestMapping(\"\u002Fapi\u002Forder\")\npublic class OrderController {\n    \n    @Resource\n    private IOrderPayCase orderPayCase;  \u002F\u002F 复杂业务，调用 Case 层\n    \n    @PostMapping(\"\u002Fpay\")\n    public Response\u003COrderPayResponse> pay(@RequestBody OrderPayRequest request) {\n        \u002F\u002F 1. 参数校验\n        if (request.getOrderId() == null || request.getPayAmount() == null) {\n            return Response.fail(\"参数不完整\");\n        }\n        \n        \u002F\u002F 2. 调用 Case 层（复杂业务）\n        \u002F\u002F 如果是简单业务，可直接调用 Domain Service\n        try {\n            OrderPayResult result = orderPayCase.execute(request);\n            return Response.success(convertToResponse(result));\n        } catch (Exception e) {\n            return Response.fail(e.getMessage());\n        }\n    }\n}\n```\n\n#### 2. Case 层（业务编排）\n\n```java\npublic interface IOrderPayCase {\n    OrderPayResult execute(OrderPayRequest request) throws Exception;\n}\n\n@Service\npublic class OrderPayCaseImpl implements IOrderPayCase {\n    \n    @Resource\n    private IOrderService orderService;      \u002F\u002F 订单领域服务\n    @Resource\n    private IPaymentService paymentService;  \u002F\u002F 支付领域服务\n    @Resource\n    private IInventoryService inventoryService; \u002F\u002F 库存领域服务\n    \n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public OrderPayResult execute(OrderPayRequest request) throws Exception {\n        log.info(\"执行订单支付流程，订单号：{}\", request.getOrderId());\n        \n        \u002F\u002F 1. 查询订单\n        OrderEntity order = orderService.queryOrder(request.getOrderId());\n        \n        \u002F\u002F 2. 扣减库存（调用库存领域服务）\n        inventoryService.deduct(order.getProductId(), order.getQuantity());\n        \n        \u002F\u002F 3. 执行支付（调用支付领域服务）\n        PaymentResult payment = paymentService.pay(order, request.getPayAmount());\n        \n        \u002F\u002F 4. 更新订单状态（调用订单领域服务）\n        orderService.markPaid(order.getOrderId(), payment.getTransactionId());\n        \n        \u002F\u002F 5. 返回结果\n        return OrderPayResult.builder()\n            .orderId(order.getOrderId())\n            .status(\"PAID\")\n            .transactionId(payment.getTransactionId())\n            .build();\n    }\n}\n```\n\n#### 3. Domain 层（领域服务）\n\n```java\n\u002F\u002F 订单领域服务接口\npublic interface IOrderService {\n    OrderEntity queryOrder(String orderId);\n    void markPaid(String orderId, String transactionId);\n}\n\n\u002F\u002F 订单领域服务实现\n@Service\npublic class OrderServiceImpl implements IOrderService {\n    \n    @Resource\n    private IOrderRepository orderRepository;  \u002F\u002F 依赖 Repository 接口，非实现\n    \n    @Override\n    public OrderEntity queryOrder(String orderId) {\n        return orderRepository.queryById(orderId);\n    }\n    \n    @Override\n    public void markPaid(String orderId, String transactionId) {\n        OrderEntity order = orderRepository.queryById(orderId);\n        \u002F\u002F 业务规则校验\n        if (order.getStatus() != OrderStatus.PENDING_PAY) {\n            throw new BusinessException(\"订单状态不正确，无法支付\");\n        }\n        \u002F\u002F 执行业务逻辑\n        order.pay(transactionId);  \u002F\u002F Entity 封装业务行为\n        orderRepository.save(order);\n    }\n}\n\n\u002F\u002F 支付领域服务\npublic interface IPaymentService {\n    PaymentResult pay(OrderEntity order, BigDecimal amount);\n}\n\n@Service\npublic class PaymentServiceImpl implements IPaymentService {\n    \n    @Resource\n    private IPaymentPort paymentPort;  \u002F\u002F 依赖 Port 接口，调用外部支付网关\n    \n    @Override\n    public PaymentResult pay(OrderEntity order, BigDecimal amount) {\n        \u002F\u002F 构建支付请求\n        PaymentRequest request = PaymentRequest.builder()\n            .orderId(order.getOrderId())\n            .amount(amount)\n            .build();\n        \n        \u002F\u002F 调用外部支付服务（通过 Port 接口）\n        return paymentPort.executePayment(request);\n    }\n}\n```\n\n#### 4. Infrastructure 层（技术实现）\n\n```java\n\u002F\u002F Repository 实现 - 订单数据访问\n@Repository\npublic class OrderRepositoryImpl implements IOrderRepository {\n    \n    @Resource\n    private IOrderDao orderDao;  \u002F\u002F MyBatis DAO\n    @Resource\n    private StringRedisTemplate redisTemplate;\n    \n    @Override\n    public OrderEntity queryById(String orderId) {\n        \u002F\u002F 先查缓存\n        String cacheKey = \"order:\" + orderId;\n        String cached = redisTemplate.opsForValue().get(cacheKey);\n        if (cached != null) {\n            return JSON.parseObject(cached, OrderEntity.class);\n        }\n        \n        \u002F\u002F 再查数据库\n        OrderPO po = orderDao.queryById(orderId);\n        OrderEntity entity = convertToEntity(po);\n        \n        \u002F\u002F 写入缓存\n        redisTemplate.opsForValue().set(cacheKey, JSON.toJSONString(entity), 30, TimeUnit.MINUTES);\n        \n        return entity;\n    }\n    \n    @Override\n    public void save(OrderEntity entity) {\n        OrderPO po = convertToPO(entity);\n        orderDao.update(po);\n        \n        \u002F\u002F 更新缓存\n        redisTemplate.opsForValue().set(\"order:\" + entity.getOrderId(), \n            JSON.toJSONString(entity), 30, TimeUnit.MINUTES);\n    }\n}\n\n\u002F\u002F Port 实现 - 外部支付网关调用\n@Component\npublic class PaymentPortImpl implements IPaymentPort {\n    \n    @Resource\n    private PaymentGateway paymentGateway;  \u002F\u002F HTTP 客户端\n    \n    @Override\n    public PaymentResult executePayment(PaymentRequest request) {\n        \u002F\u002F 调用外部支付服务\n        PaymentGatewayRequest gatewayRequest = convertToGatewayRequest(request);\n        PaymentGatewayResponse response = paymentGateway.pay(gatewayRequest);\n        \n        if (!response.isSuccess()) {\n            throw new PaymentException(\"支付失败：\" + response.getErrorMsg());\n        }\n        \n        return PaymentResult.builder()\n            .transactionId(response.getTransactionId())\n            .status(\"SUCCESS\")\n            .build();\n    }\n}\n```\n\n### 常见问题与纠正\n\n#### ❌ 错误1：Trigger 层直接调用 Repository\n\n```java\n\u002F\u002F 错误示例\n@RestController\npublic class OrderController {\n    @Resource\n    private IOrderRepository orderRepository;  \u002F\u002F ❌ 直接依赖 Repository\n    \n    @PostMapping(\"\u002Forder\")\n    public Response create(@RequestBody OrderRequest request) {\n        \u002F\u002F 业务逻辑散落在 Controller\n        OrderEntity order = new OrderEntity();\n        order.setStatus(\"CREATED\");\n        orderRepository.save(order);  \u002F\u002F ❌ 直接操作数据库\n        return Response.success();\n    }\n}\n```\n\n**纠正**：Trigger 层只负责接收请求和路由，业务逻辑应下沉到 Domain 层。\n\n#### ❌ 错误2：Domain Service 直接依赖 DAO\n\n```java\n\u002F\u002F 错误示例\n@Service\npublic class OrderServiceImpl implements IOrderService {\n    @Resource\n    private IOrderDao orderDao;  \u002F\u002F ❌ 直接依赖 DAO，违反分层\n    \n    public OrderEntity queryOrder(String orderId) {\n        OrderPO po = orderDao.queryById(orderId);  \u002F\u002F ❌ 直接操作数据库\n        return convert(po);\n    }\n}\n```\n\n**纠正**：Domain 层应依赖 Repository 接口，由 Infrastructure 层实现。\n\n#### ❌ 错误3：Infrastructure 层包含业务逻辑\n\n```java\n\u002F\u002F 错误示例\n@Repository\npublic class OrderRepositoryImpl implements IOrderRepository {\n    \n    public void save(OrderEntity entity) {\n        \u002F\u002F ❌ 在 Repository 中做业务判断\n        if (entity.getAmount().compareTo(BigDecimal.ZERO) \u003C= 0) {\n            throw new BusinessException(\"金额必须大于0\");  \u002F\u002F 业务异常不应在这里抛\n        }\n        orderDao.update(convertToPO(entity));\n    }\n}\n```\n\n**纠正**：业务判断应在 Domain 层完成，Infrastructure 层只负责数据读写。\n\n#### ❌ 错误4：跨域直接调用 Repository\n\n```java\n\u002F\u002F 错误示例\n@Service\npublic class OrderServiceImpl implements IOrderService {\n    @Resource\n    private IInventoryRepository inventoryRepository;  \u002F\u002F ❌ 跨域依赖 Repository\n    \n    public void createOrder(OrderEntity order) {\n        \u002F\u002F 直接操作库存领域的数据\n        InventoryPO inventory = inventoryRepository.queryByProductId(order.getProductId());\n        \u002F\u002F ...\n    }\n}\n```\n\n**纠正**：跨域操作应通过 Case 层编排，或调用目标领域的 Service 接口。\n\n### 总结口诀\n\n```\nTrigger 只路由，Case 做编排\nDomain 管业务，Infra 做实现\n接口定义在 Domain，实现放在 Infra 层\n依赖永远向内指，Domain 是核心\n```\n\n---\n\n## 📦 新功能开发规范\n\n当用户需要增加新功能时，按照以下决策流程进行开发：\n\n### 决策流程图\n\n```\n用户需要新功能\n        │\n        ▼\n┌───────────────────┐\n│ 检查现有领域服务   │ ──是──→ 扩展现有 Service\n│ domain\u002Fxxx\u002Fservice│\n│ 是否有支持？      │\n└─────────┬─────────┘\n          │否\n          ▼\n┌───────────────────┐\n│ 创建新的领域？     │ ──是──→ 创建新领域（完整结构）\n│ domain\u002Fxxx\u002F       │\n│                   │\n└─────────┬─────────┘\n          │\n          ▼\n┌───────────────────┐\n│ Case 层是否需要？  │ ──是──→ 创建 Case 层编排\n│ 业务复杂？多领域？  │\n└─────────┬─────────┘\n          │否（轻量工程）\n          ▼\n┌───────────────────┐\n│ Trigger 直接调用   │ ←── Trigger → Domain\n│ Domain 领域层     │\n└───────────────────┘\n```\n\n### 决策指南\n\n| 问题 | 答案 | 处理方式 |\n|------|------|----------|\n| 现有领域能否支持新功能？ | ✅ 是 | 在现有 Service 中添加方法 |\n| 是否需要跨多个领域？ | ✅ 是 | 创建 Case 层编排 |\n| 业务逻辑是否复杂？ | ✅ 是 | 创建 Case 层编排 |\n| 是否是轻量工程？ | ✅ 是 | Trigger 直接调用 Domain |\n| Trigger 是否越来越复杂？ | ✅ 是 | 询问用户是否创建 Case 层 |\n\n---\n\n### 场景一：扩展现有领域服务\n\n**判断条件**：新功能属于现有领域的业务范围。\n\n**开发步骤**：\n\n1. **检查现有领域服务**\n   - 查看 `domain\u002F{domain}\u002Fservice\u002F` 目录\n   - 确认是否有相关的 Service 接口\n\n2. **扩展现有 Service**\n   - 在现有接口中添加新方法\n   - 在实现类中实现新方法\n\n**示例**：在交易域添加一个\"查询订单列表\"功能\n\n```java\n\u002F\u002F 1. 在现有接口中添加方法\npublic interface ITradeRepository {\n    \u002F\u002F 现有方法...\n    \n    \u002F\u002F 新增：查询订单列表\n    List\u003CMarketPayOrderEntity> queryOrderList(QueryOrderRequest request);\n}\n\n\u002F\u002F 2. 在实现类中实现\n@Repository\npublic class TradeRepository implements ITradeRepository {\n    \n    @Resource\n    private IMcpGatewayDao mcpGatewayDao;\n    \n    @Override\n    public List\u003CMarketPayOrderEntity> queryOrderList(QueryOrderRequest request) {\n        \u002F\u002F 实现查询逻辑\n    }\n}\n```\n\n---\n\n### 场景二：创建新的领域\n\n**判断条件**：新功能涉及全新的业务领域，与现有领域无关。\n\n**开发步骤**：\n\n1. **创建完整的领域结构**\n   ```\n   domain\u002F\n   └── {new-domain}\u002F                    # 新领域\n       ├── adapter\u002F                    # 适配器接口\n       │   ├── port\u002F                  # 端口接口\n       │   │   └── I{Xxx}Port.java\n       │   └── repository\u002F            # 仓储接口\n       │       └── I{Xxx}Repository.java\n       ├── model\u002F                     # 领域模型\n       │   ├── aggregate\u002F            # 聚合根\n       │   ├── entity\u002F               # 实体\n       │   └── valobj\u002F               # 值对象\n       └── service\u002F                   # 领域服务\n           ├── I{Xxx}Service.java     # 服务接口\n           └── {能力}\u002F\n               └── {Xxx}ServiceImpl.java\n   ```\n\n2. **定义 Adapter 接口**\n   ```java\n   \u002F\u002F Repository 接口\n   public interface I{Xxx}Repository {\n       XxxEntity queryById(Long id);\n       void save(XxxEntity entity);\n   }\n   \n   \u002F\u002F Port 接口\n   public interface I{Xxx}Port {\n       void notify(XxxEntity entity) throws Exception;\n   }\n   ```\n\n3. **定义 Model**\n   ```java\n   \u002F\u002F 实体\n   @Data\n   public class XxxEntity {\n       private Long id;\n       private String name;\n   }\n   \n   \u002F\u002F 值对象\n   @Getter\n   public enum XxxStatusEnumVO {\n       CREATED(\"created\", \"已创建\"),\n       PROCESSING(\"processing\", \"处理中\"),\n       COMPLETED(\"completed\", \"已完成\");\n       private String code;\n       private String info;\n   }\n   ```\n\n4. **实现 Service**\n   ```java\n   public interface I{Xxx}Service {\n       void process(XxxEntity entity) throws Exception;\n   }\n   \n   @Slf4j\n   @Service\n   public class XxxServiceImpl implements I{Xxx}Service {\n       \n       @Resource\n       private I{Xxx}Repository repository;\n       \n       @Resource\n       private I{Xxx}Port port;\n       \n       @Override\n       public void process(XxxEntity entity) throws Exception {\n           log.info(\"处理业务:{}\", entity.getId());\n           \u002F\u002F 业务逻辑\n           repository.save(entity);\n           port.notify(entity);\n       }\n   }\n   ```\n\n---\n\n### 场景三：创建 Case 层\n\n**判断条件**：业务涉及多个领域协作，或需要编排多个领域服务。\n\n**开发步骤**：\n\n1. **创建 Case 模块结构**\n   ```\n   case\u002F\n   └── {domain}\u002F\n       └── {capability}\u002F\n           ├── I{Xxx}Case.java           # Case 接口\n           └── impl\u002F\n               └── {Xxx}CaseImpl.java    # Case 实现\n   ```\n\n2. **定义 Case 接口**\n   ```java\n   \u002F**\n    * XXX 业务编排接口\n    * \n    * 职责：编排多个领域服务，完成复杂业务场景\n    *\u002F\n   public interface I{Xxx}Case {\n       \n       \u002F**\n        * 执行 XXX 业务\n        *\u002F\n       void execute(XxxRequest request) throws Exception;\n   }\n   ```\n\n3. **实现 Case 编排**\n   ```java\n   \u002F**\n    * XXX 业务编排实现\n    * \n    * @author xiaofuge\n    *\u002F\n   @Slf4j\n   @Service\n   public class XxxCaseImpl implements I{Xxx}Case {\n       \n       @Resource\n       private IDomain1Service domain1Service;\n       \n       @Resource\n       private IDomain2Service domain2Service;\n       \n       @Override\n       public void execute(XxxRequest request) throws Exception {\n           log.info(\"执行 XXX 业务\");\n           \n           \u002F\u002F 1. 调用领域服务1\n           Domain1Result r1 = domain1Service.method1(request.getParam1());\n           \n           \u002F\u002F 2. 调用领域服务2\n           domain2Service.method2(r1.getData());\n           \n           \u002F\u002F 3. 组装结果\n           \u002F\u002F ...\n       }\n   }\n   ```\n\n**Case 层命名规范**：\n- 接口命名：`I{Xxx}Case`\n- 实现类命名：`{Xxx}CaseImpl`\n\n---\n\n### 场景四：Trigger 直接调用 Domain\n\n**判断条件**：轻量工程，业务简单，不需要 Case 层编排。\n\n**开发步骤**：\n\n1. **在 Trigger 层直接调用 Domain**\n   ```java\n   @RestController\n   @RequestMapping(\"\u002Fapi\u002Fxxx\")\n   public class XxxController {\n       \n       @Resource\n       private I{Xxx}Service xxxService;\n       \n       @PostMapping(\"\u002Fprocess\")\n       public Response\u003CXxxResponse> process(@RequestBody XxxRequest request) {\n           try {\n               xxxService.process(request.toEntity());\n               return Response.success();\n           } catch (Exception e) {\n               return Response.fail(e.getMessage());\n           }\n       }\n   }\n   ```\n\n2. **Trigger 层职责**\n   - 接收请求参数\n   - 参数校验\n   - 调用 Domain 层\n   - 处理异常\n   - 返回响应\n\n---\n\n### 场景五：Trigger 复杂化后重构为 Case 层\n\n**判断条件**：Trigger 层代码越来越复杂，包含大量业务逻辑。\n\n**警告信号**：\n- Controller 代码超过 100 行\n- Controller 中有大量 if-else 判断\n- Controller 依赖多个 Domain Service\n- 业务逻辑难以测试\n\n**重构步骤**：\n\n1. **询问用户**\n   ```\n   AI：检测到 Trigger 层代码比较复杂，是否需要创建 Case 层来分摊业务逻辑？\n       这样可以：\n       1. 将业务逻辑从 Controller 移到 Case 层\n       2. 提高代码可测试性\n       3. 更好的职责分离\n   ```\n\n2. **创建 Case 层**\n   - 按照场景三的方式创建 Case 模块\n   - 将 Controller 中的业务逻辑移到 Case 层\n\n3. **简化 Trigger 层**\n   ```java\n   \u002F\u002F 重构前\n   @RestController\n   public class XxxController {\n       @Resource private IDomain1Service d1;\n       @Resource private IDomain2Service d2;\n       @Resource private IDomain3Service d3;\n       \n       public Response process(Request req) {\n           \u002F\u002F 100+ 行业务逻辑...\n       }\n   }\n   \n   \u002F\u002F 重构后\n   @RestController\n   public class XxxController {\n       @Resource private I{Xxx}Case xxxCase;\n       \n       public Response process(Request req) {\n           xxxCase.execute(req);\n           return Response.success();\n       }\n   }\n   ```\n\n---\n\n### 完整开发流程示例\n\n**需求**：在拼团系统中添加\"订单超时取消\"功能\n\n**步骤 1：检查现有领域**\n```\ntrade\u002F\n├── adapter\u002Frepository\u002FITradeRepository.java  ← 可以复用\n├── model\u002Fentity\u002FTradeLockRuleCommandEntity.java\n└── service\u002F\n    ├── lock\u002FTradeLockOrderService.java     ← 部分相关\n    └── refund\u002FTradeRefundOrderService.java  ← 退单逻辑可参考\n```\n\n**步骤 2：决策**\n- 现有领域（trade）已有相关服务\n- 需要扩展现有 Service\n- 不需要创建新领域\n\n**步骤 3：实现**\n\n```java\n\u002F\u002F 1. 扩展 ITradeRepository\npublic interface ITradeRepository {\n    \u002F\u002F 现有方法...\n    \n    \u002F\u002F 新增：查询超时未支付订单\n    List\u003CMarketPayOrderEntity> queryTimeoutUnpaidOrders();\n    \n    \u002F\u002F 新增：取消订单\n    void cancelOrder(String orderId);\n}\n\n\u002F\u002F 2. 扩展 TradeLockOrderService\npublic interface ITradeLockOrderService {\n    \u002F\u002F 现有方法...\n    \n    \u002F\u002F 新增：处理超时订单\n    void handleTimeoutOrders();\n}\n\n@Slf4j\n@Service\npublic class TradeLockOrderService implements ITradeLockOrderService {\n    \n    @Resource\n    private ITradeRepository repository;\n    \n    @Override\n    public void handleTimeoutOrders() {\n        log.info(\"处理超时未支付订单\");\n        \n        \u002F\u002F 1. 查询超时订单\n        List\u003CMarketPayOrderEntity> orders = repository.queryTimeoutUnpaidOrders();\n        \n        \u002F\u002F 2. 遍历取消\n        for (MarketPayOrderEntity order : orders) {\n            repository.cancelOrder(order.getOrderId());\n        }\n    }\n}\n```\n\n**步骤 4：添加 Trigger**\n```java\n@Component\npublic class OrderTimeoutJob {\n    \n    @Resource\n    private ITradeLockOrderService tradeLockOrderService;\n    \n    @Scheduled(cron = \"0 *\u002F5 * * * ?\")  \u002F\u002F 每5分钟执行\n    public void execute() {\n        try {\n            tradeLockOrderService.handleTimeoutOrders();\n        } catch (Exception e) {\n            log.error(\"订单超时处理异常\", e);\n        }\n    }\n}\n```\n\n---\n\n### 规范速查表\n\n| 场景 | 判断条件 | 实现位置 |\n|------|---------|----------|\n| 扩展现有服务 | 功能属于现有领域 | `domain\u002F{domain}\u002Fservice\u002F` |\n| 创建新领域 | 全新业务领域 | 创建完整的 `domain\u002F{new}\u002F` 结构 |\n| 创建 Case 层 | 多领域协作、复杂业务 | `case\u002F{domain}\u002F{capability}\u002F` |\n| Trigger 调用 | 轻量工程、简单业务 | `trigger\u002F{domain}\u002Fcontroller\u002F` |\n| 重构为 Case | Trigger 越来越复杂 | 询问用户后重构 |\n\n**核心原则**：\n1. **优先复用**：先检查现有领域是否能支持\n2. **单一职责**：新功能归到对应领域，不随意扩张\n3. **适度分层**：简单场景直接调用，复杂场景创建 Case\n4. **持续演进**：Trigger 复杂化时，询问用户是否重构\n\n---\n\n## Quick Templates\n\n### Aggregate 聚合对象\n\n```java\n@Data @Builder @AllArgsConstructor @NoArgsConstructor\npublic class GroupBuyOrderAggregate {\n    \u002F** 用户实体对象 *\u002F\n    private UserEntity userEntity;\n    \u002F** 支付活动实体对象 *\u002F\n    private PayActivityEntity payActivityEntity;\n    \u002F** 支付优惠实体对象 *\u002F\n    private PayDiscountEntity payDiscountEntity;\n    \u002F** 已参与拼团量 *\u002F\n    private Integer userTakeOrderCount;\n}\n```\n\n### Entity 普通实体\n\n```java\n@Data @Builder @AllArgsConstructor @NoArgsConstructor\npublic class MarketPayOrderEntity {\n    private String teamId;\n    private String orderId;\n    private BigDecimal originalPrice;\n    private BigDecimal deductionPrice;\n    private BigDecimal payPrice;\n    private TradeOrderStatusEnumVO tradeOrderStatusEnumVO;\n}\n```\n\n### Entity 命令实体（放在 entity 包）\n\n```java\n\u002F** 命令实体放在 entity 包，使用 CommandEntity 后缀 *\u002F\n@Data @Builder @AllArgsConstructor @NoArgsConstructor\npublic class TradeLockRuleCommandEntity {\n    private String userId;\n    private Long activityId;\n    private String teamId;\n}\n```\n\n### Value Object 值对象\n\n```java\n@Getter @Builder @AllArgsConstructor @NoArgsConstructor\npublic class NotifyConfigVO {\n    private NotifyTypeEnumVO notifyType;\n    private String notifyMQ;\n    private String notifyUrl;\n}\n```\n\n### EnumVO 枚举值对象（可包含策略逻辑）\n\n```java\n@Getter @AllArgsConstructor\npublic enum RefundTypeEnumVO {\n\n    UNPAID_UNLOCK(\"unpaid_unlock\", \"Unpaid2RefundStrategy\", \"未支付，未成团\") {\n        @Override\n        public boolean matches(GroupBuyOrderEnumVO groupBuyOrderEnumVO, TradeOrderStatusEnumVO tradeOrderStatusEnumVO) {\n            return GroupBuyOrderEnumVO.PROGRESS.equals(groupBuyOrderEnumVO) \n                && TradeOrderStatusEnumVO.CREATE.equals(tradeOrderStatusEnumVO);\n        }\n    },\n    \n    PAID_UNFORMED(\"paid_unformed\", \"Paid2RefundStrategy\", \"已支付，未成团\") {\n        @Override\n        public boolean matches(GroupBuyOrderEnumVO groupBuyOrderEnumVO, TradeOrderStatusEnumVO tradeOrderStatusEnumVO) {\n            return GroupBuyOrderEnumVO.PROGRESS.equals(groupBuyOrderEnumVO) \n                && TradeOrderStatusEnumVO.COMPLETE.equals(tradeOrderStatusEnumVO);\n        }\n    };\n\n    private String code;\n    private String strategy;\n    private String info;\n\n    public abstract boolean matches(GroupBuyOrderEnumVO groupBuyOrderEnumVO, TradeOrderStatusEnumVO tradeOrderStatusEnumVO);\n\n    public static RefundTypeEnumVO getRefundStrategy(GroupBuyOrderEnumVO g, TradeOrderStatusEnumVO t) {\n        return Arrays.stream(values()).filter(v -> v.matches(g, t)).findFirst()\n                .orElseThrow(() -> new RuntimeException(\"不支持的退款状态组合\"));\n    }\n}\n```\n\n### Domain Service 完整编码\n\n```java\n\u002F** 1. 定义服务接口 *\u002F\npublic interface ITradeLockOrderService {\n    MarketPayOrderEntity lockMarketPayOrder(UserEntity user, PayActivityEntity activity, PayDiscountEntity discount) throws Exception;\n}\n\n\u002F** 2. 实现服务（放在子包中） *\u002F\n@Slf4j @Service\npublic class TradeLockOrderService implements ITradeLockOrderService {\n\n    @Resource private ITradeRepository repository;\n    @Resource private BusinessLinkedList\u003CTradeLockRuleCommandEntity, TradeLockRuleFilterFactory.DynamicContext, TradeLockRuleFilterBackEntity> tradeRuleFilter;\n\n    @Override\n    public MarketPayOrderEntity lockMarketPayOrder(UserEntity userEntity, PayActivityEntity payActivityEntity, PayDiscountEntity payDiscountEntity) throws Exception {\n        log.info(\"锁定营销优惠支付订单:{} activityId:{}\", userEntity.getUserId(), payActivityEntity.getActivityId());\n\n        \u002F\u002F 1. 交易规则过滤（责任链）\n        TradeLockRuleFilterBackEntity back = tradeRuleFilter.apply(TradeLockRuleCommandEntity.builder()\n                .activityId(payActivityEntity.getActivityId())\n                .userId(userEntity.getUserId())\n                .teamId(payActivityEntity.getTeamId()).build(),\n                new TradeLockRuleFilterFactory.DynamicContext());\n\n        \u002F\u002F 2. 构建聚合对象\n        GroupBuyOrderAggregate aggregate = GroupBuyOrderAggregate.builder()\n                .userEntity(userEntity)\n                .payActivityEntity(payActivityEntity)\n                .payDiscountEntity(payDiscountEntity)\n                .userTakeOrderCount(back.getUserTakeOrderCount())\n                .build();\n\n        \u002F\u002F 3. 锁定聚合订单\n        return repository.lockMarketPayOrder(aggregate);\n    }\n}\n```\n\n### 策略模式实现\n\n```java\n\u002F** 1. 策略接口 *\u002F\npublic interface IRefundOrderStrategy {\n    void refundOrder(TradeRefundOrderEntity entity) throws Exception;\n    void reverseStock(TeamRefundSuccess success) throws Exception;\n}\n\n\u002F** 2. 抽象基类（模板方法） *\u002F\n@Slf4j\npublic abstract class AbstractRefundOrderStrategy implements IRefundOrderStrategy {\n    @Resource protected ITradeRepository repository;\n    @Resource protected ThreadPoolExecutor threadPoolExecutor;\n\n    protected void doReverseStock(TeamRefundSuccess s, String type) throws Exception {\n        log.info(\"退单恢复锁单量 - {}\", type);\n        repository.refund2AddRecovery(s.getActivityId() + \":\" + s.getTeamId(), s.getOrderId());\n    }\n}\n\n\u002F** 3. 具体策略 *\u002F\n@Slf4j @Service(\"paid2RefundStrategy\")\npublic class Paid2RefundStrategy extends AbstractRefundOrderStrategy {\n    @Override\n    public void refundOrder(TradeRefundOrderEntity e) throws Exception {\n        log.info(\"退单-已支付，未成团 userId:{}\", e.getUserId());\n        NotifyTaskEntity n = repository.paid2Refund(GroupBuyRefundAggregate.buildPaid2RefundAggregate(e, -1, -1));\n        if (n != null) threadPoolExecutor.execute(() -> tradeTaskService.execNotifyJob(n));\n    }\n    @Override\n    public void reverseStock(TeamRefundSuccess s) throws Exception {\n        doReverseStock(s, \"已支付，但有锁单记录，恢复锁单库存\");\n    }\n}\n```\n\n## Core Principles\n\n| Principle | Description |\n|-----------|-------------|\n| **Dependency Inversion** | Domain defines interfaces, Infrastructure implements |\n| **Rich Domain Model** | Entity contains both data and behavior |\n| **Aggregate Boundary** | Transaction consistency inside, eventual consistency outside |\n| **Anti-Corruption Layer** | Use Port to isolate external systems |\n| **Lightweight Trigger** | Trigger layer only routes requests, no business logic |\n\n## When to Use DDD\n\n**Use DDD when:**\n- Complex business domain with rich rules\n- Need to capture domain knowledge in code\n- Long-lived project with evolving requirements\n- Team needs shared domain language\n\n**Don't use DDD when:**\n- Simple CRUD operations\n- Prototype or throwaway code\n- Domain logic is trivial\n- Team unfamiliar with DDD concepts\n\n## Example Projects\n\n- [group-buy-market](file:\u002F\u002F\u002FUsers\u002Ffuzhengwei\u002FDocuments\u002Fproject\u002Fddd-demo\u002Fgroup-buy-market) - E-commerce domain\n- [ai-mcp-gateway](file:\u002F\u002F\u002FUsers\u002Ffuzhengwei\u002FDocuments\u002Fproject\u002Fddd-demo\u002Fai-mcp-gateway) - API gateway domain\n\n---\n\n# 🚀 DevOps 部署完整流程\n\n## 📋 部署检查清单\n\n当用户需要部署 DDD 项目时，按照以下流程执行：\n\n### 1. 确认项目信息\n- [ ] 项目名称（artifactId）\n- [ ] 项目路径（代码根目录）\n- [ ] 部署环境（开发\u002F测试\u002F生产）\n- [ ] 基础依赖（MySQL\u002FRedis\u002FRabbitMQ）\n\n### 2. 打包构建\n```bash\ncd \u002Fpath\u002Fto\u002Fproject\nmvn clean package -Dmaven.test.skip=true\n```\n\n### 3. 基础镜像拉取（加速）\n```bash\n# 使用阿里云加速镜像\ndocker pull registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fopenjdk:17-jdk-slim\ndocker pull registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fmysql:8.0.32\ndocker pull registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fredis:6.2\n```\n\n### 4. 数据库部署\n```bash\ncd docs\u002Fdev-ops\ndocker-compose -f docker-compose-environment-aliyun.yml up -d mysql\n\n# 等待 MySQL 就绪后初始化数据库\ndocker exec -it mysql mysql -uroot -p123456 -e \"source \u002Fdocker-entrypoint-initdb.d\u002Fxxx.sql\"\n```\n\n### 5. 应用容器构建\n```bash\ncd ai-mcp-gateway-app\ndocker build -t system\u002F{artifactId}:1.0.0 .\n```\n\n### 6. 应用启动\n```bash\ncd docs\u002Fdev-ops\ndocker-compose -f docker-compose-app.yml up -d\n```\n\n### 7. 验证部署\n```bash\n# 查看容器状态\ndocker ps -a | grep {artifactId}\n\n# 查看应用日志\ndocker logs -f {artifactId}\n\n# 健康检查\ncurl http:\u002F\u002Flocalhost:{port}\u002Factuator\u002Fhealth\n```\n\n---\n\n## 📁 标准部署目录结构\n\n```\n{project}\u002F\n├── docs\u002F\n│   └── dev-ops\u002F\n│       ├── docker-compose-environment-aliyun.yml  # 基础环境（MySQL\u002FRedis\u002FRabbitMQ）\n│       ├── docker-compose-app.yml                  # 应用服务\n│       ├── mysql\u002F\n│       │   ├── my.cnf                              # MySQL 配置\n│       │   └── sql\u002F\n│       │       └── {project}.sql                  # 数据库初始化脚本\n│       ├── redis\u002F\n│       │   └── redis.conf                          # Redis 配置\n│       ├── app\u002F\n│       │   ├── start.sh                            # 启动脚本\n│       │   └── stop.sh                             # 停止脚本\n│       └── README.md                               # 部署说明\n├── {project}-app\u002F\n│   ├── Dockerfile                                   # 应用 Dockerfile\n│   ├── pom.xml\n│   └── src\u002Fmain\u002Fresources\u002F\n│       ├── application.yml\n│       ├── application-dev.yml\n│       ├── application-test.yml\n│       ├── application-prod.yml\n│       └── logback-spring.xml\n```\n\n---\n\n## 🐳 Dockerfile 标准模板\n\n```dockerfile\n# 基础镜像\nFROM registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fopenjdk:17-jdk-slim\n\n# 作者\nMAINTAINER xiaofuge\n\n# 时区配置\nENV TZ=PRC\nRUN ln -snf \u002Fusr\u002Fshare\u002Fzoneinfo\u002F$TZ \u002Fetc\u002Flocaltime && echo $TZ > \u002Fetc\u002Ftimezone\n\n# 添加应用 JAR\nADD target\u002F{artifactId}.jar \u002F{artifactId}.jar\n\n# 暴露端口\nEXPOSE {port}\n\n# 启动命令\nENTRYPOINT [\"sh\",\"-c\",\"java -jar $JAVA_OPTS \u002F{artifactId}.jar $PARAMS\"]\n```\n\n---\n\n## 📦 docker-compose-app.yml 标准模板\n\n```yaml\nversion: '3.8'\n\nservices:\n  {artifactId}:\n    image: system\u002F{artifactId}:1.0.0\n    container_name: {artifactId}\n    restart: on-failure\n    ports:\n      - \"{port}:{port}\"\n    environment:\n      - TZ=PRC\n      - SERVER_PORT={port}\n      - SPRING_PROFILES_ACTIVE=prod\n    volumes:\n      - .\u002Flogs:\u002Fdata\u002Flog\n    logging:\n      driver: \"json-file\"\n      options:\n        max-size: \"10m\"\n        max-file: \"3\"\n    networks:\n      - my-network\n    depends_on:\n      - mysql\n      - redis\n\nnetworks:\n  my-network:\n    driver: bridge\n```\n\n---\n\n## 🗄️ docker-compose-environment-aliyun.yml 标准模板\n\n```yaml\nversion: '3.9'\n\nservices:\n  # MySQL 8.0\n  mysql:\n    image: registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fmysql:8.0.32\n    container_name: mysql\n    command: --default-authentication-plugin=mysql_native_password\n    restart: always\n    environment:\n      TZ: Asia\u002FShanghai\n      MYSQL_ROOT_PASSWORD: 123456\n    ports:\n      - \"13306:3306\"\n    volumes:\n      - .\u002Fmysql\u002Fmy.cnf:\u002Fetc\u002Fmysql\u002Fconf.d\u002Fmysql.cnf:ro\n      - .\u002Fmysql\u002Fsql:\u002Fdocker-entrypoint-initdb.d\n    healthcheck:\n      test: [\"CMD\", \"mysqladmin\", \"ping\", \"-h\", \"localhost\"]\n      interval: 5s\n      timeout: 10s\n      retries: 10\n      start_period: 15s\n    networks:\n      - my-network\n\n  # phpMyAdmin（可选）\n  phpmyadmin:\n    image: registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fphpmyadmin:5.2.1\n    container_name: phpmyadmin\n    ports:\n      - \"8899:80\"\n    environment:\n      - PMA_HOST=mysql\n      - PMA_PORT=3306\n      - MYSQL_ROOT_PASSWORD=123456\n    depends_on:\n      mysql:\n        condition: service_healthy\n    networks:\n      - my-network\n\n  # Redis 6.2\n  redis:\n    image: registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fredis:6.2\n    container_name: redis\n    restart: always\n    ports:\n      - \"16379:6379\"\n    networks:\n      - my-network\n    healthcheck:\n      test: [\"CMD\", \"redis-cli\", \"ping\"]\n      interval: 10s\n      timeout: 5s\n      retries: 3\n\n  # Redis Commander（可选）\n  redis-admin:\n    image: registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fredis-commander:0.8.0\n    container_name: redis-admin\n    ports:\n      - \"8081:8081\"\n    environment:\n      - REDIS_HOSTS=local:redis:6379\n      - HTTP_USER=admin\n      - HTTP_PASSWORD=admin\n    depends_on:\n      redis:\n        condition: service_healthy\n    networks:\n      - my-network\n\nnetworks:\n  my-network:\n    driver: bridge\n```\n\n---\n\n## 🚀 快速启动\u002F停止脚本\n\n### start.sh\n```bash\n#!\u002Fbin\u002Fbash\n\nCONTAINER_NAME={artifactId}\nIMAGE_NAME=system\u002F{artifactId}:1.0.0\nPORT={port}\n\necho \"容器部署开始 ${CONTAINER_NAME}\"\n\n# 停止容器\ndocker stop ${CONTAINER_NAME}\n\n# 删除容器\ndocker rm ${CONTAINER_NAME}\n\n# 启动容器\ndocker run --name ${CONTAINER_NAME} \\\n  --network my-network \\\n  -p ${PORT}:${PORT} \\\n  -e SPRING_PROFILES_ACTIVE=prod \\\n  -v $(pwd)\u002Flogs:\u002Fdata\u002Flog \\\n  -d ${IMAGE_NAME}\n\necho \"容器部署成功 ${CONTAINER_NAME}\"\n\n# 查看日志\ndocker logs -f ${CONTAINER_NAME}\n```\n\n### stop.sh\n```bash\n#!\u002Fbin\u002Fbash\n\nCONTAINER_NAME={artifactId}\n\necho \"停止容器 ${CONTAINER_NAME}\"\ndocker stop ${CONTAINER_NAME}\ndocker rm ${CONTAINER_NAME}\n\necho \"容器已停止\"\n```\n\n---\n\n## 🔧 application-prod.yml 标准配置\n\n```yaml\nserver:\n  port: {port}\n\nspring:\n  application:\n    name: {artifactId}\n  datasource:\n    driver-class-name: com.mysql.cj.jdbc.Driver\n    url: jdbc:mysql:\u002F\u002F${MYSQL_HOST:mysql}:${MYSQL_PORT:3306}\u002F${MYSQL_DATABASE:{database}}?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia\u002FShanghai&useSSL=false\n    username: ${MYSQL_USER:root}\n    password: ${MYSQL_PASSWORD:123456}\n    hikari:\n      pool-name: {artifactId}-hikari\n      minimum-idle: 10\n      maximum-pool-size: 50\n      idle-timeout: 300000\n      connection-timeout: 30000\n      max-lifetime: 1800000\n  redis:\n    host: ${REDIS_HOST:redis}\n    port: ${REDIS_PORT:6379}\n  rabbitmq:\n    host: ${RABBITMQ_HOST:rabbitmq}\n    port: ${RABBITMQ_PORT:5672}\n    username: ${RABBITMQ_USER:admin}\n    password: ${RABBITMQ_PASSWORD:admin123}\n\nlogging:\n  level:\n    root: INFO\n    cn.bugstack: INFO\n  file:\n    name: \u002Fdata\u002Flog\u002F{artifactId}.log\n```\n\n---\n\n## 📊 阿里云镜像加速仓库\n\n所有镜像已同步到阿里云，使用前缀 `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002F`\n\n> 📦 镜像来源：[docker-image-pusher](https:\u002F\u002Fgithub.com\u002Ffuzhengwei\u002Fdocker-image-pusher)\n> 添加新镜像：在 images.txt 添加镜像名，等待1分钟同步\n\n### 常用镜像速查表\n\n| 原始镜像 | 阿里云加速地址 | 用途 |\n|---------|--------------|------|\n| **JDK\u002FJava** | | |\n| openjdk:8-jre-slim | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fopenjdk:8-jre-slim` | Java 8 运行环境 |\n| openjdk:8-jdk | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fopenjdk:8-jdk` | Java 8 开发镜像 |\n| openjdk:17-jdk-slim | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fopenjdk:17-jdk-slim` | Java 17 运行环境 |\n| openjdk:17-ea-17-jdk-slim-buster | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fopenjdk:17-ea-17-jdk-slim-buster` | Java 17 EA 版本 |\n| **数据库** | | |\n| mysql:8.0.32 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fmysql:8.0.32` | MySQL 8.0 |\n| mysql:8.4.4 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fmysql:8.4.4` | MySQL 8.4 |\n| postgres:14.18 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fpostgres:14.18` | PostgreSQL 14 |\n| pgvector\u002Fpgvector:pg17 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fpgvector:pg17` | PostgreSQL 向量库 |\n| **缓存** | | |\n| redis:6.2 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fredis:6.2` | Redis 6.2 |\n| redis:7.2 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fredis:7.2` | Redis 7.2 |\n| redis:7.4.13 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fredis:7.2\u002F7.4.13` | Redis 7.4 |\n| **数据库管理** | | |\n| phpmyadmin:5.2.1 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fphpmyadmin:5.2.1` | MySQL Web 管理 |\n| redis-commander:0.8.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fredis-commander:0.8.0` | Redis Web 管理 |\n| dpage\u002Fpgadmin4:9.1.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fpgadmin4:9.1.0` | PostgreSQL Web 管理 |\n| **消息队列** | | |\n| rabbitmq:3.12.9 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Frabbitmq:3.12.9` | RabbitMQ |\n| rocketmq:5.1.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Frocketmq:5.1.0` | RocketMQ |\n| kafka:3.7.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fkafka:3.7.0` | Kafka |\n| kafka-eagle:3.0.2 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fkafka-eagle:3.0.2` | Kafka Eagle |\n| **注册中心\u002F配置中心** | | |\n| nacos-server:v2.2.3-slim | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fnacos-server:v2.2.3-slim` | Nacos 2.2.3 |\n| nacos-server:v3.1.1 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fnacos-server:v3.1.1` | Nacos 3.1.1 |\n| **Web 服务器** | | |\n| nginx:1.25.1 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fnginx:1.25.1` | Nginx 1.25 |\n| nginx:1.28.0-alpine | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fnginx:1.28.0-alpine` | Nginx 1.28 Alpine |\n| **任务调度** | | |\n| xxl-job-admin:2.4.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fxxl-job-admin:2.4.0` | XXL-Job 管理端 |\n| xxl-job-aarch64:2.4.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fxxl-job-aarch64:2.4.0` | XXL-Job ARM 版本 |\n| **监控** | | |\n| prometheus:2.47.2 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fprometheus:2.47.2` | Prometheus |\n| grafana:10.2.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fgrafana:10.2.0` | Grafana |\n| skywalking-oap-server:9.3.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fskywalking-oap-server:9.3.0` | SkyWalking OAP |\n| skywalking-ui:9.3.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fskywalking-ui:9.3.0` | SkyWalking UI |\n| **搜索引擎** | | |\n| elasticsearch:7.17.14 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Felasticsearch:7.17.14` | Elasticsearch |\n| kibana:7.17.14 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fkibana:7.17.14` | Kibana |\n| **Node** | | |\n| node:18-alpine | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fnode:18-alpine` | Node 18 |\n| node:20-alpine | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fnode:20-alpine` | Node 20 |\n| **AI\u002F工具** | | |\n| ollama\u002Follama:0.5.10 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Follama:0.5.10` | Ollama |\n| n8nio\u002Fn8n:1.88.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fn8n:1.88.0` | N8N 工作流 |\n| **其他** | | |\n| alpine:3.20.1 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Falpine:3.20.1` | Alpine Linux |\n| portainer:latest | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fportainer:latest` | Docker 可视化管理 |\n| jenkins:2.439 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fjenkins:2.439` | Jenkins |\n| sentinel-dashboard:1.8.7 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fsentinel-dashboard:1.8.7` | Sentinel 流量控制 |\n| canal-server:v1.1.6 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fcanal-server:v1.1.6` | Canal |\n| zookeeper:3.9.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fzookeeper:3.9.0` | Zookeeper |\n\n### 拉取镜像示例\n\n```bash\n# 拉取 MySQL\ndocker pull registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fmysql:8.0.32\n\n# 拉取 Redis\ndocker pull registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fredis:6.2\n\n# 拉取 Java 17\ndocker pull registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fopenjdk:17-jdk-slim\n```\n\n---\n\n## ⚠️ 常见问题处理\n\n### 1. MySQL 8.0 认证问题\n```bash\ndocker exec mysql mysql -uroot -p123456 -e \"ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; FLUSH PRIVILEGES;\"\n```\n\n### 2. 容器网络不通\n确保所有容器在同一个网络：\n```yaml\nnetworks:\n  - my-network\n```\n\n### 3. 端口冲突\n修改 docker-compose.yml 中的端口映射：\n```yaml\nports:\n  - \"13306:3306\"  # 改为非标准端口\n```\n\n### 4. 应用无法连接数据库\n检查环境变量配置和健康检查依赖：\n```yaml\ndepends_on:\n  mysql:\n    condition: service_healthy\n```\n\n---\n\n## 📝 部署操作流程示例\n\n当用户说\"帮我部署 ai-mcp-gateway\"时，执行：\n\n1. **确认项目信息**\n   - 项目路径：`\u002FUsers\u002Ffuzhengwei\u002FDocuments\u002Fproject\u002Fddd-demo\u002Fai-mcp-gateway`\n   - 端口：`8091`\n   - 镜像：`system\u002Fai-mcp-gateway:1.0.0`\n\n2. **执行部署**\n```bash\n# 进入项目目录\ncd \u002FUsers\u002Ffuzhengwei\u002FDocuments\u002Fproject\u002Fddd-demo\u002Fai-mcp-gateway\n\n# 打包\nmvn clean package -Dmaven.test.skip=true\n\n# 构建 Docker 镜像\ncd ai-mcp-gateway-app\ndocker build -t system\u002Fai-mcp-gateway:1.0.0 .\n\n# 部署基础环境\ncd ..\u002Fdocs\u002Fdev-ops\ndocker-compose -f docker-compose-environment-aliyun.yml up -d\n\n# 等待 MySQL 就绪\nsleep 30\n\n# 初始化数据库\ndocker exec -i mysql mysql -uroot -p123456 \u003C mysql\u002Fsql\u002Fai_mcp_gateway_v2.sql\n\n# 启动应用\ndocker-compose -f docker-compose-app.yml up -d\n\n# 验证\ndocker ps | grep ai-mcp-gateway\ncurl http:\u002F\u002Flocalhost:8091\u002Fapi\u002Fgateway\u002Flist\n```\n\n3. **部署完成检查**\n   - 容器状态正常\n   - 日志无报错\n   - 健康检查通过\n","# DDD Hexagonal Architecture\n\nDesign and implement software using Domain-Driven Design with Hexagonal Architecture. This skill provides patterns, templates, and best practices for building maintainable domain-centric applications.\n\n## Scripts\n\n### 创建 DDD 项目\n\n当用户说\"创建 DDD 项目\"、\"新建项目\"、\"创建项目\"、\"创建ddd项目\"时，**必须使用 `scripts\u002Fcreate-ddd-project.sh` 脚本**。\n\n**脚本支持系统**: Windows (Git Bash\u002FMSYS2)、Mac (macOS)、Linux，自动检测并适配。\n\n**⚠️ 环境提醒**: 建议提前安装 JDK 17+ 和 Maven 3.8.*，脚本启动时会自动检测并给出各平台安装指引，未安装也可继续但可能导致生成失败。\n\n**⚠️ 重要提醒：必须询问用户项目创建地址**\n\n**在创建项目前，如果用户没有明确给出工程创建地址，必须询问用户在哪里创建项目。** 不能随意创建到默认目录，必须获得用户确认。\n\n示例对话：\n```\n用户：帮我创建一个 DDD 项目\nAI：好的，我来帮您创建 DDD 项目。请问您希望将项目创建在哪个目录？\n     例如：\n     1) \u002FUsers\u002Fxxx\u002Fprojects\n     2) \u002FUsers\u002Fxxx\u002FDocuments\n     3) \u002Fhome\u002Fxxx\u002Fworkspace\n     4) 其他路径（请直接输入）\n\n用户：创建在 \u002FUsers\u002Fxxx\u002Fprojects 下\nAI：确认在 \u002FUsers\u002Fxxx\u002Fprojects 下创建项目，开始执行...\n```\n\n**流程:**\n\n1. **第一步：确认项目创建目录**\n\n   **必须询问用户**，如果用户未指定，列出可选项供用户选择。\n\n   示例：\n   ```\n   📂 选择项目生成目录\n   ──────────────────────────────\n   1) \u002FUsers\u002Fxxx\u002Fprojects\n   2) \u002FUsers\u002Fxxx\u002FDocuments\n   3) \u002Fhome\u002Fxxx\u002Fworkspace\n   4) 自定义路径（直接输入路径）\n\n   直接回车 = 选择 [1]\n   ```\n\n2. **第二步：填写项目配置**（逐一询问，直接回车使用默认值）\n\n   | 参数 | 说明 | 默认值 | 示例 |\n   |------|------|--------|------|\n   | GroupId | Maven 坐标 groupId，标识组织或公司 | `com.yourcompany` | `cn.bugstack` |\n   | ArtifactId | 项目模块唯一标识名称 | `your-project-name` | `order-system` |\n   | Version | 项目版本号 | `1.0.0-SNAPSHOT` | `1.0.0-RELEASE` |\n   | Package | Java 代码根包名 | 自动从 GroupId + ArtifactId 推导 | `cn.bugstack.order` |\n   | Archetype 版本 | 脚手架模板版本 | `1.8` | - |\n\n3. **第三步：确认并生成**\n\n   显示所有配置，确认后执行 Maven Archetype 生成项目。\n\n**脚本执行方式**（在 `xfg-ddd-skills` 项目根目录下运行）:\n```bash\nbash scripts\u002Fcreate-ddd-project.sh\n```\n\n> ⚠️ **必须先 cd 到 `xfg-ddd-skills` 项目目录下再执行**，脚本会自动定位自身路径。\n> AI 负责引导用户选择目录、填写参数，无需手动拼凑 Maven 命令。\n> **⚠️ 再次强调：创建项目前必须询问用户项目创建地址，不能随意创建！**\n\n---\n\n## Quick Reference\n\n| Task | Reference |\n|------|-----------|\n| Architecture overview | [references\u002Farchitecture.md](references\u002Farchitecture.md) |\n| Entity design | [references\u002Fentity.md](references\u002Fentity.md) |\n| Aggregate design | [references\u002Faggregate.md](references\u002Faggregate.md) |\n| Value Object design | [references\u002Fvalue-object.md](references\u002Fvalue-object.md) |\n| Repository pattern | [references\u002Frepository.md](references\u002Frepository.md) |\n| Port & Adapter | [references\u002Fport-adapter.md](references\u002Fport-adapter.md) |\n| Domain Service | [references\u002Fdomain-service.md](references\u002Fdomain-service.md) |\n| Case layer orchestration | [references\u002Fcase-layer.md](references\u002Fcase-layer.md) |\n| Trigger layer | [references\u002Ftrigger-layer.md](references\u002Ftrigger-layer.md) |\n| Infrastructure layer | [references\u002Finfrastructure-layer.md](references\u002Finfrastructure-layer.md) |\n| **Domain 层设计指南（避免常见错误）** | **[references\u002Fdomain-design-guide.md](references\u002Fdomain-design-guide.md)** |\n| **Domain 层核心模式** | **[references\u002Fdomain-patterns.md](references\u002Fdomain-patterns.md)** |\n| **Infrastructure 层核心模式** | **[references\u002Finfrastructure-patterns.md](references\u002Finfrastructure-patterns.md)** |\n| **DevOps 部署** | **[references\u002Fdevops-deployment.md](references\u002Fdevops-deployment.md)** |\n| Project structure | [references\u002Fproject-structure.md](references\u002Fproject-structure.md) |\n| Naming conventions | [references\u002Fnaming.md](references\u002Fnaming.md) |\n| Docker Images | [references\u002Fdocker-images.md](references\u002Fdocker-images.md) |\n\n## Architecture Layers\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│                     Trigger Layer                            │\n│         (HTTP Controller \u002F MQ Listener \u002F Job)               │\n└─────────────────────────┬───────────────────────────────────┘\n                          ▼\n┌─────────────────────────────────────────────────────────────┐\n│                       API Layer                              │\n│              (DTO \u002F Request \u002F Response)                     │\n└─────────────────────────┬───────────────────────────────────┘\n                          ▼\n┌─────────────────────────────────────────────────────────────┐\n│                      Case Layer                              │\n│            (Orchestration \u002F Business Flow)                   │\n└─────────────────────────┬───────────────────────────────────┘\n                          ▼\n┌─────────────────────────────────────────────────────────────┐\n│                     Domain Layer                             │\n│        (Entity \u002F Aggregate \u002F VO \u002F Domain Service)           │\n└─────────────────────────┬───────────────────────────────────┘\n                          ▲\n┌─────────────────────────────────────────────────────────────┐\n│                  Infrastructure Layer                        │\n│      (Repository Impl \u002F Port Adapter \u002F DAO \u002F PO)            │\n└─────────────────────────────────────────────────────────────┘\n```\n\n**Dependency Rule**: `Trigger → API → Case → Domain ← Infrastructure`\n\n## ⚠️ Domain 层设计自检清单\n\n在生成 Domain 层代码前，必须逐项检查：\n\n**1. 是否有多种处理方式（if-else 判断类型）？**\n→ 是：使用**策略模式**（`IXxxStrategy` 接口 + 实现类 + `Map\u003CString, IXxxStrategy>` 注入）\n\n**2. 是否有多个独立的校验\u002F过滤步骤（3步以上）？**\n→ 是：使用**责任链模式**（`IXxxFilter` 接口 + Factory 组装链）\n\n**3. Service 方法是否超过 60 行？**\n→ 是：拆分为过滤器（校验）+ 策略（执行）+ 私有方法（保存）\n\n**4. Infrastructure 层是否包含业务判断逻辑？**\n→ 是：将业务校验移到 Domain 层的过滤器中，Infrastructure 只做数据读写\n\n**5. 是否跨域直接依赖另一个 Domain 的 Repository？**\n→ 是：通过 Case 层编排，或在本域 Repository 接口中聚合所需数据\n\n**6. Infrastructure 包名是否正确？**\n→ Repository 实现：`adapter\u002Frepository\u002F`（❌ 不是 `persistent\u002Frepository\u002F`）\n→ DAO 操作：`dao\u002F`（❌ 不是 `scenario\u002Fdao\u002F` 或其他包）\n→ Redis 操作：`redis\u002F`（❌ 不是 `config\u002F`）\n\n## Domain Layer 目录结构\n\n```\nmodel\u002F\n├── aggregate\u002F              # 聚合对象\n│   └── XxxAggregate.java\n├── entity\u002F               # 实体对象\n│   ├── XxxEntity.java          # 普通实体\n│   └── XxxCommandEntity.java  # 命令实体\n└── valobj\u002F               # 值对象\n    ├── XxxVO.java             # 普通值对象\n    └── XxxEnumVO.java         # 枚举值对象\n```\n\n**⚠️ 注意**：`model\u002F` 下没有单独的 `command\u002F` 包，命令实体统一放在 `entity\u002F` 包下。\n\n---\n\n## 🔄 新功能开发完整流程\n\n当用户需要实现一个新功能时，必须按照以下分层调用流程进行开发：\n\n### 调用链路图\n\n```\n┌─────────────────────────────────────────────────────────────────────────┐\n│                           新功能开发流程                                 │\n└─────────────────────────────────────────────────────────────────────────┘\n\n  外部请求\n      │\n      ▼\n┌─────────────────────────────────────────────────────────────────────────┐\n│ 1. Trigger 层（触发层）                                                  │\n│    职责：接收外部请求，路由转发，参数校验，不含业务逻辑                     │\n│                                                                         │\n│    • HTTP Controller  →  接收 HTTP 请求                                  │\n│    • MQ Listener      →  监听消息队列                                    │\n│    • Job\u002FTask         →  定时任务\u002F异步任务                               │\n│                                                                         │\n│    输出：调用 Case 层接口，或轻量场景直接调用 Domain 层                    │\n└─────────────────────────┬───────────────────────────────────────────────┘\n                          │\n                          ▼\n┌─────────────────────────────────────────────────────────────────────────┐\n│ 2. Case 层（编排层）- 可选，复杂业务需要                                  │\n│    职责：跨领域业务编排，流程串联，事务管理                                │\n│                                                                         │\n│    • 接收 Trigger 调用                                                   │\n│    • 编排多个 Domain Service 调用顺序                                     │\n│    • 处理跨领域数据转换                                                   │\n│    • 管理分布式事务（如需要）                                             │\n│                                                                         │\n│    输出：调用 Domain 层 Service 接口                                      │\n└─────────────────────────┬───────────────────────────────────────────────┘\n                          │\n                          ▼\n┌─────────────────────────────────────────────────────────────────────────┐\n│ 3. Domain 层（领域层）                                                   │\n│    职责：核心业务逻辑，业务规则校验，领域模型操作                           │\n│                                                                         │\n│    • Service 服务实现业务逻辑                                             │\n│    • Entity\u002FAggregate 封装业务行为                                       │\n│    • 通过 Adapter 接口（Port\u002FRepository）与外部交互                        │\n│                                                                         │\n│    注意：Domain 层不直接依赖 Infrastructure，只依赖接口                    │\n│                                                                         │\n│    输出：调用 Adapter 接口（定义在 domain\u002Fadapter\u002F 下）                    │\n└─────────────────────────┬───────────────────────────────────────────────┘\n                          │ 依赖倒置：Domain 定义接口，Infrastructure 实现\n                          ▼\n┌─────────────────────────────────────────────────────────────────────────┐\n│ 4. Infrastructure 层（基础设施层）                                        │\n│    职责：技术实现，数据持久化，外部服务调用                                │\n│                                                                         │\n│    • adapter\u002Frepository\u002F  →  实现 Repository 接口，操作数据库              │\n│    • adapter\u002Fport\u002F        →  实现 Port 接口，调用外部 HTTP\u002FRPC 服务        │\n│    • dao\u002F                 →  MyBatis DAO 接口和 PO 对象                   │\n│    • gateway\u002F             →  HTTP\u002FRPC 客户端，远程服务调用                 │\n│    • redis\u002F               →  Redis 操作                                  │\n│                                                                         │\n│    输出：返回数据给 Domain 层，或执行外部调用                              │\n└─────────────────────────────────────────────────────────────────────────┘\n```\n\n### 分层职责速查表\n\n| 层级 | 职责 | 禁止做的事 | 依赖方向 |\n|------|------|-----------|----------|\n| **Trigger** | 接收请求、参数校验、路由转发 | 业务逻辑、直接操作数据库 | → API\u002FCase\u002FDomain |\n| **Case** | 跨域编排、流程串联、事务管理 | 直接操作数据库、外部 HTTP 调用 | → Domain |\n| **Domain** | 业务规则、领域模型、逻辑编排 | 直接依赖 MyBatis\u002FRedis\u002FHTTP | → 只依赖接口 |\n| **Infrastructure** | 数据持久化、外部调用、技术实现 | 业务判断、业务规则 | 实现 Domain 接口 |\n\n### 开发流程检查清单\n\n当用户说\"帮我实现一个 XXX 功能\"时，按以下顺序检查：\n\n#### Step 1: 确定入口方式（Trigger）\n\n询问用户或根据需求判断：\n\n```\n□ HTTP API 接口？  →  创建 Controller\n□ MQ 消息监听？    →  创建 MQ Listener\n□ 定时任务？       →  创建 Job\n□ 异步任务？       →  创建 Task\u002FWorker\n```\n\n#### Step 2: 判断是否需要 Case 层\n\n```\n□ 涉及多个领域协作？     →  需要 Case 层\n□ 业务流程超过 3 步？    →  需要 Case 层\n□ 需要分布式事务？       →  需要 Case 层\n□ 单领域、简单业务？     →  Trigger 直接调用 Domain\n```\n\n#### Step 3: Domain 层设计\n\n```\n□ 定义 Entity\u002FAggregate\u002FVO\n□ 定义 Service 接口和实现\n□ 定义 Repository 接口（数据访问）\n□ 定义 Port 接口（外部调用，如需要）\n```\n\n#### Step 4: Infrastructure 层实现\n\n```\n□ 实现 Repository 接口（adapter\u002Frepository\u002F）\n□ 创建 DAO 接口和 PO 对象（dao\u002F）\n□ 实现 Port 接口（adapter\u002Fport\u002F，如需要）\n□ 创建 Gateway 客户端（gateway\u002F，如需要）\n□ 配置 Redis 操作（redis\u002F，如需要）\n```\n\n### 代码示例：完整调用链\n\n以\"订单支付\"功能为例，展示完整分层调用：\n\n#### 1. Trigger 层（HTTP Controller）\n\n```java\n@RestController\n@RequestMapping(\"\u002Fapi\u002Forder\")\npublic class OrderController {\n    \n    @Resource\n    private IOrderPayCase orderPayCase;  \u002F\u002F 复杂业务，调用 Case 层\n    \n    @PostMapping(\"\u002Fpay\")\n    public Response\u003COrderPayResponse> pay(@RequestBody OrderPayRequest request) {\n        \u002F\u002F 1. 参数校验\n        if (request.getOrderId() == null || request.getPayAmount() == null) {\n            return Response.fail(\"参数不完整\");\n        }\n        \n        \u002F\u002F 2. 调用 Case 层（复杂业务）\n        \u002F\u002F 如果是简单业务，可直接调用 Domain Service\n        try {\n            OrderPayResult result = orderPayCase.execute(request);\n            return Response.success(convertToResponse(result));\n        } catch (Exception e) {\n            return Response.fail(e.getMessage());\n        }\n    }\n}\n```\n\n#### 2. Case 层（业务编排）\n\n```java\npublic interface IOrderPayCase {\n    OrderPayResult execute(OrderPayRequest request) throws Exception;\n}\n\n@Service\npublic class OrderPayCaseImpl implements IOrderPayCase {\n    \n    @Resource\n    private IOrderService orderService;      \u002F\u002F 订单领域服务\n    @Resource\n    private IPaymentService paymentService;  \u002F\u002F 支付领域服务\n    @Resource\n    private IInventoryService inventoryService; \u002F\u002F 库存领域服务\n    \n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public OrderPayResult execute(OrderPayRequest request) throws Exception {\n        log.info(\"执行订单支付流程，订单号：{}\", request.getOrderId());\n        \n        \u002F\u002F 1. 查询订单\n        OrderEntity order = orderService.queryOrder(request.getOrderId());\n        \n        \u002F\u002F 2. 扣减库存（调用库存领域服务）\n        inventoryService.deduct(order.getProductId(), order.getQuantity());\n        \n        \u002F\u002F 3. 执行支付（调用支付领域服务）\n        PaymentResult payment = paymentService.pay(order, request.getPayAmount());\n        \n        \u002F\u002F 4. 更新订单状态（调用订单领域服务）\n        orderService.markPaid(order.getOrderId(), payment.getTransactionId());\n        \n        \u002F\u002F 5. 返回结果\n        return OrderPayResult.builder()\n            .orderId(order.getOrderId())\n            .status(\"PAID\")\n            .transactionId(payment.getTransactionId())\n            .build();\n    }\n}\n```\n\n#### 3. Domain 层（领域服务）\n\n```java\n\u002F\u002F 订单领域服务接口\npublic interface IOrderService {\n    OrderEntity queryOrder(String orderId);\n    void markPaid(String orderId, String transactionId);\n}\n\n\u002F\u002F 订单领域服务实现\n@Service\npublic class OrderServiceImpl implements IOrderService {\n    \n    @Resource\n    private IOrderRepository orderRepository;  \u002F\u002F 依赖 Repository 接口，非实现\n    \n    @Override\n    public OrderEntity queryOrder(String orderId) {\n        return orderRepository.queryById(orderId);\n    }\n    \n    @Override\n    public void markPaid(String orderId, String transactionId) {\n        OrderEntity order = orderRepository.queryById(orderId);\n        \u002F\u002F 业务规则校验\n        if (order.getStatus() != OrderStatus.PENDING_PAY) {\n            throw new BusinessException(\"订单状态不正确，无法支付\");\n        }\n        \u002F\u002F 执行业务逻辑\n        order.pay(transactionId);  \u002F\u002F Entity 封装业务行为\n        orderRepository.save(order);\n    }\n}\n\n\u002F\u002F 支付领域服务\npublic interface IPaymentService {\n    PaymentResult pay(OrderEntity order, BigDecimal amount);\n}\n\n@Service\npublic class PaymentServiceImpl implements IPaymentService {\n    \n    @Resource\n    private IPaymentPort paymentPort;  \u002F\u002F 依赖 Port 接口，调用外部支付网关\n    \n    @Override\n    public PaymentResult pay(OrderEntity order, BigDecimal amount) {\n        \u002F\u002F 构建支付请求\n        PaymentRequest request = PaymentRequest.builder()\n            .orderId(order.getOrderId())\n            .amount(amount)\n            .build();\n        \n        \u002F\u002F 调用外部支付服务（通过 Port 接口）\n        return paymentPort.executePayment(request);\n    }\n}\n```\n\n#### 4. Infrastructure 层（技术实现）\n\n```java\n\u002F\u002F Repository 实现 - 订单数据访问\n@Repository\npublic class OrderRepositoryImpl implements IOrderRepository {\n    \n    @Resource\n    private IOrderDao orderDao;  \u002F\u002F MyBatis DAO\n    @Resource\n    private StringRedisTemplate redisTemplate;\n    \n    @Override\n    public OrderEntity queryById(String orderId) {\n        \u002F\u002F 先查缓存\n        String cacheKey = \"order:\" + orderId;\n        String cached = redisTemplate.opsForValue().get(cacheKey);\n        if (cached != null) {\n            return JSON.parseObject(cached, OrderEntity.class);\n        }\n        \n        \u002F\u002F 再查数据库\n        OrderPO po = orderDao.queryById(orderId);\n        OrderEntity entity = convertToEntity(po);\n        \n        \u002F\u002F 写入缓存\n        redisTemplate.opsForValue().set(cacheKey, JSON.toJSONString(entity), 30, TimeUnit.MINUTES);\n        \n        return entity;\n    }\n    \n    @Override\n    public void save(OrderEntity entity) {\n        OrderPO po = convertToPO(entity);\n        orderDao.update(po);\n        \n        \u002F\u002F 更新缓存\n        redisTemplate.opsForValue().set(\"order:\" + entity.getOrderId(), \n            JSON.toJSONString(entity), 30, TimeUnit.MINUTES);\n    }\n}\n\n\u002F\u002F Port 实现 - 外部支付网关调用\n@Component\npublic class PaymentPortImpl implements IPaymentPort {\n    \n    @Resource\n    private PaymentGateway paymentGateway;  \u002F\u002F HTTP 客户端\n    \n    @Override\n    public PaymentResult executePayment(PaymentRequest request) {\n        \u002F\u002F 调用外部支付服务\n        PaymentGatewayRequest gatewayRequest = convertToGatewayRequest(request);\n        PaymentGatewayResponse response = paymentGateway.pay(gatewayRequest);\n        \n        if (!response.isSuccess()) {\n            throw new PaymentException(\"支付失败：\" + response.getErrorMsg());\n        }\n        \n        return PaymentResult.builder()\n            .transactionId(response.getTransactionId())\n            .status(\"SUCCESS\")\n            .build();\n    }\n}\n```\n\n### 常见问题与纠正\n\n#### ❌ 错误1：Trigger 层直接调用 Repository\n\n```java\n\u002F\u002F 错误示例\n@RestController\npublic class OrderController {\n    @Resource\n    private IOrderRepository orderRepository;  \u002F\u002F ❌ 直接依赖 Repository\n    \n    @PostMapping(\"\u002Forder\")\n    public Response create(@RequestBody OrderRequest request) {\n        \u002F\u002F 业务逻辑散落在 Controller\n        OrderEntity order = new OrderEntity();\n        order.setStatus(\"CREATED\");\n        orderRepository.save(order);  \u002F\u002F ❌ 直接操作数据库\n        return Response.success();\n    }\n}\n```\n\n**纠正**：Trigger 层只负责接收请求和路由，业务逻辑应下沉到 Domain 层。\n\n#### ❌ 错误2：Domain Service 直接依赖 DAO\n\n```java\n\u002F\u002F 错误示例\n@Service\npublic class OrderServiceImpl implements IOrderService {\n    @Resource\n    private IOrderDao orderDao;  \u002F\u002F ❌ 直接依赖 DAO，违反分层\n    \n    public OrderEntity queryOrder(String orderId) {\n        OrderPO po = orderDao.queryById(orderId);  \u002F\u002F ❌ 直接操作数据库\n        return convert(po);\n    }\n}\n```\n\n**纠正**：Domain 层应依赖 Repository 接口，由 Infrastructure 层实现。\n\n#### ❌ 错误3：Infrastructure 层包含业务逻辑\n\n```java\n\u002F\u002F 错误示例\n@Repository\npublic class OrderRepositoryImpl implements IOrderRepository {\n    \n    public void save(OrderEntity entity) {\n        \u002F\u002F ❌ 在 Repository 中做业务判断\n        if (entity.getAmount().compareTo(BigDecimal.ZERO) \u003C= 0) {\n            throw new BusinessException(\"金额必须大于0\");  \u002F\u002F 业务异常不应在这里抛\n        }\n        orderDao.update(convertToPO(entity));\n    }\n}\n```\n\n**纠正**：业务判断应在 Domain 层完成，Infrastructure 层只负责数据读写。\n\n#### ❌ 错误4：跨域直接调用 Repository\n\n```java\n\u002F\u002F 错误示例\n@Service\npublic class OrderServiceImpl implements IOrderService {\n    @Resource\n    private IInventoryRepository inventoryRepository;  \u002F\u002F ❌ 跨域依赖 Repository\n    \n    public void createOrder(OrderEntity order) {\n        \u002F\u002F 直接操作库存领域的数据\n        InventoryPO inventory = inventoryRepository.queryByProductId(order.getProductId());\n        \u002F\u002F ...\n    }\n}\n```\n\n**纠正**：跨域操作应通过 Case 层编排，或调用目标领域的 Service 接口。\n\n### 总结口诀\n\n```\nTrigger 只路由，Case 做编排\nDomain 管业务，Infra 做实现\n接口定义在 Domain，实现放在 Infra 层\n依赖永远向内指，Domain 是核心\n```\n\n---\n\n## 📦 新功能开发规范\n\n当用户需要增加新功能时，按照以下决策流程进行开发：\n\n### 决策流程图\n\n```\n用户需要新功能\n        │\n        ▼\n┌───────────────────┐\n│ 检查现有领域服务   │ ──是──→ 扩展现有 Service\n│ domain\u002Fxxx\u002Fservice│\n│ 是否有支持？      │\n└─────────┬─────────┘\n          │否\n          ▼\n┌───────────────────┐\n│ 创建新的领域？     │ ──是──→ 创建新领域（完整结构）\n│ domain\u002Fxxx\u002F       │\n│                   │\n└─────────┬─────────┘\n          │\n          ▼\n┌───────────────────┐\n│ Case 层是否需要？  │ ──是──→ 创建 Case 层编排\n│ 业务复杂？多领域？  │\n└─────────┬─────────┘\n          │否（轻量工程）\n          ▼\n┌───────────────────┐\n│ Trigger 直接调用   │ ←── Trigger → Domain\n│ Domain 领域层     │\n└───────────────────┘\n```\n\n### 决策指南\n\n| 问题 | 答案 | 处理方式 |\n|------|------|----------|\n| 现有领域能否支持新功能？ | ✅ 是 | 在现有 Service 中添加方法 |\n| 是否需要跨多个领域？ | ✅ 是 | 创建 Case 层编排 |\n| 业务逻辑是否复杂？ | ✅ 是 | 创建 Case 层编排 |\n| 是否是轻量工程？ | ✅ 是 | Trigger 直接调用 Domain |\n| Trigger 是否越来越复杂？ | ✅ 是 | 询问用户是否创建 Case 层 |\n\n---\n\n### 场景一：扩展现有领域服务\n\n**判断条件**：新功能属于现有领域的业务范围。\n\n**开发步骤**：\n\n1. **检查现有领域服务**\n   - 查看 `domain\u002F{domain}\u002Fservice\u002F` 目录\n   - 确认是否有相关的 Service 接口\n\n2. **扩展现有 Service**\n   - 在现有接口中添加新方法\n   - 在实现类中实现新方法\n\n**示例**：在交易域添加一个\"查询订单列表\"功能\n\n```java\n\u002F\u002F 1. 在现有接口中添加方法\npublic interface ITradeRepository {\n    \u002F\u002F 现有方法...\n    \n    \u002F\u002F 新增：查询订单列表\n    List\u003CMarketPayOrderEntity> queryOrderList(QueryOrderRequest request);\n}\n\n\u002F\u002F 2. 在实现类中实现\n@Repository\npublic class TradeRepository implements ITradeRepository {\n    \n    @Resource\n    private IMcpGatewayDao mcpGatewayDao;\n    \n    @Override\n    public List\u003CMarketPayOrderEntity> queryOrderList(QueryOrderRequest request) {\n        \u002F\u002F 实现查询逻辑\n    }\n}\n```\n\n---\n\n### 场景二：创建新的领域\n\n**判断条件**：新功能涉及全新的业务领域，与现有领域无关。\n\n**开发步骤**：\n\n1. **创建完整的领域结构**\n   ```\n   domain\u002F\n   └── {new-domain}\u002F                    # 新领域\n       ├── adapter\u002F                    # 适配器接口\n       │   ├── port\u002F                  # 端口接口\n       │   │   └── I{Xxx}Port.java\n       │   └── repository\u002F            # 仓储接口\n       │       └── I{Xxx}Repository.java\n       ├── model\u002F                     # 领域模型\n       │   ├── aggregate\u002F            # 聚合根\n       │   ├── entity\u002F               # 实体\n       │   └── valobj\u002F               # 值对象\n       └── service\u002F                   # 领域服务\n           ├── I{Xxx}Service.java     # 服务接口\n           └── {能力}\u002F\n               └── {Xxx}ServiceImpl.java\n   ```\n\n2. **定义 Adapter 接口**\n   ```java\n   \u002F\u002F Repository 接口\n   public interface I{Xxx}Repository {\n       XxxEntity queryById(Long id);\n       void save(XxxEntity entity);\n   }\n   \n   \u002F\u002F Port 接口\n   public interface I{Xxx}Port {\n       void notify(XxxEntity entity) throws Exception;\n   }\n   ```\n\n3. **定义 Model**\n   ```java\n   \u002F\u002F 实体\n   @Data\n   public class XxxEntity {\n       private Long id;\n       private String name;\n   }\n   \n   \u002F\u002F 值对象\n   @Getter\n   public enum XxxStatusEnumVO {\n       CREATED(\"created\", \"已创建\"),\n       PROCESSING(\"processing\", \"处理中\"),\n       COMPLETED(\"completed\", \"已完成\");\n       private String code;\n       private String info;\n   }\n   ```\n\n4. **实现 Service**\n   ```java\n   public interface I{Xxx}Service {\n       void process(XxxEntity entity) throws Exception;\n   }\n   \n   @Slf4j\n   @Service\n   public class XxxServiceImpl implements I{Xxx}Service {\n       \n       @Resource\n       private I{Xxx}Repository repository;\n       \n       @Resource\n       private I{Xxx}Port port;\n       \n       @Override\n       public void process(XxxEntity entity) throws Exception {\n           log.info(\"处理业务:{}\", entity.getId());\n           \u002F\u002F 业务逻辑\n           repository.save(entity);\n           port.notify(entity);\n       }\n   }\n   ```\n\n---\n\n### 场景三：创建 Case 层\n\n**判断条件**：业务涉及多个领域协作，或需要编排多个领域服务。\n\n**开发步骤**：\n\n1. **创建 Case 模块结构**\n   ```\n   case\u002F\n   └── {domain}\u002F\n       └── {capability}\u002F\n           ├── I{Xxx}Case.java           # Case 接口\n           └── impl\u002F\n               └── {Xxx}CaseImpl.java    # Case 实现\n   ```\n\n2. **定义 Case 接口**\n   ```java\n   \u002F**\n    * XXX 业务编排接口\n    * \n    * 职责：编排多个领域服务，完成复杂业务场景\n    *\u002F\n   public interface I{Xxx}Case {\n       \n       \u002F**\n        * 执行 XXX 业务\n        *\u002F\n       void execute(XxxRequest request) throws Exception;\n   }\n   ```\n\n3. **实现 Case 编排**\n   ```java\n   \u002F**\n    * XXX 业务编排实现\n    * \n    * @author xiaofuge\n    *\u002F\n   @Slf4j\n   @Service\n   public class XxxCaseImpl implements I{Xxx}Case {\n       \n       @Resource\n       private IDomain1Service domain1Service;\n       \n       @Resource\n       private IDomain2Service domain2Service;\n       \n       @Override\n       public void execute(XxxRequest request) throws Exception {\n           log.info(\"执行 XXX 业务\");\n           \n           \u002F\u002F 1. 调用领域服务1\n           Domain1Result r1 = domain1Service.method1(request.getParam1());\n           \n           \u002F\u002F 2. 调用领域服务2\n           domain2Service.method2(r1.getData());\n           \n           \u002F\u002F 3. 组装结果\n           \u002F\u002F ...\n       }\n   }\n   ```\n\n**Case 层命名规范**：\n- 接口命名：`I{Xxx}Case`\n- 实现类命名：`{Xxx}CaseImpl`\n\n---\n\n### 场景四：Trigger 直接调用 Domain\n\n**判断条件**：轻量工程，业务简单，不需要 Case 层编排。\n\n**开发步骤**：\n\n1. **在 Trigger 层直接调用 Domain**\n   ```java\n   @RestController\n   @RequestMapping(\"\u002Fapi\u002Fxxx\")\n   public class XxxController {\n       \n       @Resource\n       private I{Xxx}Service xxxService;\n       \n       @PostMapping(\"\u002Fprocess\")\n       public Response\u003CXxxResponse> process(@RequestBody XxxRequest request) {\n           try {\n               xxxService.process(request.toEntity());\n               return Response.success();\n           } catch (Exception e) {\n               return Response.fail(e.getMessage());\n           }\n       }\n   }\n   ```\n\n2. **Trigger 层职责**\n   - 接收请求参数\n   - 参数校验\n   - 调用 Domain 层\n   - 处理异常\n   - 返回响应\n\n---\n\n### 场景五：Trigger 复杂化后重构为 Case 层\n\n**判断条件**：Trigger 层代码越来越复杂，包含大量业务逻辑。\n\n**警告信号**：\n- Controller 代码超过 100 行\n- Controller 中有大量 if-else 判断\n- Controller 依赖多个 Domain Service\n- 业务逻辑难以测试\n\n**重构步骤**：\n\n1. **询问用户**\n   ```\n   AI：检测到 Trigger 层代码比较复杂，是否需要创建 Case 层来分摊业务逻辑？\n       这样可以：\n       1. 将业务逻辑从 Controller 移到 Case 层\n       2. 提高代码可测试性\n       3. 更好的职责分离\n   ```\n\n2. **创建 Case 层**\n   - 按照场景三的方式创建 Case 模块\n   - 将 Controller 中的业务逻辑移到 Case 层\n\n3. **简化 Trigger 层**\n   ```java\n   \u002F\u002F 重构前\n   @RestController\n   public class XxxController {\n       @Resource private IDomain1Service d1;\n       @Resource private IDomain2Service d2;\n       @Resource private IDomain3Service d3;\n       \n       public Response process(Request req) {\n           \u002F\u002F 100+ 行业务逻辑...\n       }\n   }\n   \n   \u002F\u002F 重构后\n   @RestController\n   public class XxxController {\n       @Resource private I{Xxx}Case xxxCase;\n       \n       public Response process(Request req) {\n           xxxCase.execute(req);\n           return Response.success();\n       }\n   }\n   ```\n\n---\n\n### 完整开发流程示例\n\n**需求**：在拼团系统中添加\"订单超时取消\"功能\n\n**步骤 1：检查现有领域**\n```\ntrade\u002F\n├── adapter\u002Frepository\u002FITradeRepository.java  ← 可以复用\n├── model\u002Fentity\u002FTradeLockRuleCommandEntity.java\n└── service\u002F\n    ├── lock\u002FTradeLockOrderService.java     ← 部分相关\n    └── refund\u002FTradeRefundOrderService.java  ← 退单逻辑可参考\n```\n\n**步骤 2：决策**\n- 现有领域（trade）已有相关服务\n- 需要扩展现有 Service\n- 不需要创建新领域\n\n**步骤 3：实现**\n\n```java\n\u002F\u002F 1. 扩展 ITradeRepository\npublic interface ITradeRepository {\n    \u002F\u002F 现有方法...\n    \n    \u002F\u002F 新增：查询超时未支付订单\n    List\u003CMarketPayOrderEntity> queryTimeoutUnpaidOrders();\n    \n    \u002F\u002F 新增：取消订单\n    void cancelOrder(String orderId);\n}\n\n\u002F\u002F 2. 扩展 TradeLockOrderService\npublic interface ITradeLockOrderService {\n    \u002F\u002F 现有方法...\n    \n    \u002F\u002F 新增：处理超时订单\n    void handleTimeoutOrders();\n}\n\n@Slf4j\n@Service\npublic class TradeLockOrderService implements ITradeLockOrderService {\n    \n    @Resource\n    private ITradeRepository repository;\n    \n    @Override\n    public void handleTimeoutOrders() {\n        log.info(\"处理超时未支付订单\");\n        \n        \u002F\u002F 1. 查询超时订单\n        List\u003CMarketPayOrderEntity> orders = repository.queryTimeoutUnpaidOrders();\n        \n        \u002F\u002F 2. 遍历取消\n        for (MarketPayOrderEntity order : orders) {\n            repository.cancelOrder(order.getOrderId());\n        }\n    }\n}\n```\n\n**步骤 4：添加 Trigger**\n```java\n@Component\npublic class OrderTimeoutJob {\n    \n    @Resource\n    private ITradeLockOrderService tradeLockOrderService;\n    \n    @Scheduled(cron = \"0 *\u002F5 * * * ?\")  \u002F\u002F 每5分钟执行\n    public void execute() {\n        try {\n            tradeLockOrderService.handleTimeoutOrders();\n        } catch (Exception e) {\n            log.error(\"订单超时处理异常\", e);\n        }\n    }\n}\n```\n\n---\n\n### 规范速查表\n\n| 场景 | 判断条件 | 实现位置 |\n|------|---------|----------|\n| 扩展现有服务 | 功能属于现有领域 | `domain\u002F{domain}\u002Fservice\u002F` |\n| 创建新领域 | 全新业务领域 | 创建完整的 `domain\u002F{new}\u002F` 结构 |\n| 创建 Case 层 | 多领域协作、复杂业务 | `case\u002F{domain}\u002F{capability}\u002F` |\n| Trigger 调用 | 轻量工程、简单业务 | `trigger\u002F{domain}\u002Fcontroller\u002F` |\n| 重构为 Case | Trigger 越来越复杂 | 询问用户后重构 |\n\n**核心原则**：\n1. **优先复用**：先检查现有领域是否能支持\n2. **单一职责**：新功能归到对应领域，不随意扩张\n3. **适度分层**：简单场景直接调用，复杂场景创建 Case\n4. **持续演进**：Trigger 复杂化时，询问用户是否重构\n\n---\n\n## Quick Templates\n\n### Aggregate 聚合对象\n\n```java\n@Data @Builder @AllArgsConstructor @NoArgsConstructor\npublic class GroupBuyOrderAggregate {\n    \u002F** 用户实体对象 *\u002F\n    private UserEntity userEntity;\n    \u002F** 支付活动实体对象 *\u002F\n    private PayActivityEntity payActivityEntity;\n    \u002F** 支付优惠实体对象 *\u002F\n    private PayDiscountEntity payDiscountEntity;\n    \u002F** 已参与拼团量 *\u002F\n    private Integer userTakeOrderCount;\n}\n```\n\n### Entity 普通实体\n\n```java\n@Data @Builder @AllArgsConstructor @NoArgsConstructor\npublic class MarketPayOrderEntity {\n    private String teamId;\n    private String orderId;\n    private BigDecimal originalPrice;\n    private BigDecimal deductionPrice;\n    private BigDecimal payPrice;\n    private TradeOrderStatusEnumVO tradeOrderStatusEnumVO;\n}\n```\n\n### Entity 命令实体（放在 entity 包）\n\n```java\n\u002F** 命令实体放在 entity 包，使用 CommandEntity 后缀 *\u002F\n@Data @Builder @AllArgsConstructor @NoArgsConstructor\npublic class TradeLockRuleCommandEntity {\n    private String userId;\n    private Long activityId;\n    private String teamId;\n}\n```\n\n### Value Object 值对象\n\n```java\n@Getter @Builder @AllArgsConstructor @NoArgsConstructor\npublic class NotifyConfigVO {\n    private NotifyTypeEnumVO notifyType;\n    private String notifyMQ;\n    private String notifyUrl;\n}\n```\n\n### EnumVO 枚举值对象（可包含策略逻辑）\n\n```java\n@Getter @AllArgsConstructor\npublic enum RefundTypeEnumVO {\n\n    UNPAID_UNLOCK(\"unpaid_unlock\", \"Unpaid2RefundStrategy\", \"未支付，未成团\") {\n        @Override\n        public boolean matches(GroupBuyOrderEnumVO groupBuyOrderEnumVO, TradeOrderStatusEnumVO tradeOrderStatusEnumVO) {\n            return GroupBuyOrderEnumVO.PROGRESS.equals(groupBuyOrderEnumVO) \n                && TradeOrderStatusEnumVO.CREATE.equals(tradeOrderStatusEnumVO);\n        }\n    },\n    \n    PAID_UNFORMED(\"paid_unformed\", \"Paid2RefundStrategy\", \"已支付，未成团\") {\n        @Override\n        public boolean matches(GroupBuyOrderEnumVO groupBuyOrderEnumVO, TradeOrderStatusEnumVO tradeOrderStatusEnumVO) {\n            return GroupBuyOrderEnumVO.PROGRESS.equals(groupBuyOrderEnumVO) \n                && TradeOrderStatusEnumVO.COMPLETE.equals(tradeOrderStatusEnumVO);\n        }\n    };\n\n    private String code;\n    private String strategy;\n    private String info;\n\n    public abstract boolean matches(GroupBuyOrderEnumVO groupBuyOrderEnumVO, TradeOrderStatusEnumVO tradeOrderStatusEnumVO);\n\n    public static RefundTypeEnumVO getRefundStrategy(GroupBuyOrderEnumVO g, TradeOrderStatusEnumVO t) {\n        return Arrays.stream(values()).filter(v -> v.matches(g, t)).findFirst()\n                .orElseThrow(() -> new RuntimeException(\"不支持的退款状态组合\"));\n    }\n}\n```\n\n### Domain Service 完整编码\n\n```java\n\u002F** 1. 定义服务接口 *\u002F\npublic interface ITradeLockOrderService {\n    MarketPayOrderEntity lockMarketPayOrder(UserEntity user, PayActivityEntity activity, PayDiscountEntity discount) throws Exception;\n}\n\n\u002F** 2. 实现服务（放在子包中） *\u002F\n@Slf4j @Service\npublic class TradeLockOrderService implements ITradeLockOrderService {\n\n    @Resource private ITradeRepository repository;\n    @Resource private BusinessLinkedList\u003CTradeLockRuleCommandEntity, TradeLockRuleFilterFactory.DynamicContext, TradeLockRuleFilterBackEntity> tradeRuleFilter;\n\n    @Override\n    public MarketPayOrderEntity lockMarketPayOrder(UserEntity userEntity, PayActivityEntity payActivityEntity, PayDiscountEntity payDiscountEntity) throws Exception {\n        log.info(\"锁定营销优惠支付订单:{} activityId:{}\", userEntity.getUserId(), payActivityEntity.getActivityId());\n\n        \u002F\u002F 1. 交易规则过滤（责任链）\n        TradeLockRuleFilterBackEntity back = tradeRuleFilter.apply(TradeLockRuleCommandEntity.builder()\n                .activityId(payActivityEntity.getActivityId())\n                .userId(userEntity.getUserId())\n                .teamId(payActivityEntity.getTeamId()).build(),\n                new TradeLockRuleFilterFactory.DynamicContext());\n\n        \u002F\u002F 2. 构建聚合对象\n        GroupBuyOrderAggregate aggregate = GroupBuyOrderAggregate.builder()\n                .userEntity(userEntity)\n                .payActivityEntity(payActivityEntity)\n                .payDiscountEntity(payDiscountEntity)\n                .userTakeOrderCount(back.getUserTakeOrderCount())\n                .build();\n\n        \u002F\u002F 3. 锁定聚合订单\n        return repository.lockMarketPayOrder(aggregate);\n    }\n}\n```\n\n### 策略模式实现\n\n```java\n\u002F** 1. 策略接口 *\u002F\npublic interface IRefundOrderStrategy {\n    void refundOrder(TradeRefundOrderEntity entity) throws Exception;\n    void reverseStock(TeamRefundSuccess success) throws Exception;\n}\n\n\u002F** 2. 抽象基类（模板方法） *\u002F\n@Slf4j\npublic abstract class AbstractRefundOrderStrategy implements IRefundOrderStrategy {\n    @Resource protected ITradeRepository repository;\n    @Resource protected ThreadPoolExecutor threadPoolExecutor;\n\n    protected void doReverseStock(TeamRefundSuccess s, String type) throws Exception {\n        log.info(\"退单恢复锁单量 - {}\", type);\n        repository.refund2AddRecovery(s.getActivityId() + \":\" + s.getTeamId(), s.getOrderId());\n    }\n}\n\n\u002F** 3. 具体策略 *\u002F\n@Slf4j @Service(\"paid2RefundStrategy\")\npublic class Paid2RefundStrategy extends AbstractRefundOrderStrategy {\n    @Override\n    public void refundOrder(TradeRefundOrderEntity e) throws Exception {\n        log.info(\"退单-已支付，未成团 userId:{}\", e.getUserId());\n        NotifyTaskEntity n = repository.paid2Refund(GroupBuyRefundAggregate.buildPaid2RefundAggregate(e, -1, -1));\n        if (n != null) threadPoolExecutor.execute(() -> tradeTaskService.execNotifyJob(n));\n    }\n    @Override\n    public void reverseStock(TeamRefundSuccess s) throws Exception {\n        doReverseStock(s, \"已支付，但有锁单记录，恢复锁单库存\");\n    }\n}\n```\n\n## Core Principles\n\n| Principle | Description |\n|-----------|-------------|\n| **Dependency Inversion** | Domain defines interfaces, Infrastructure implements |\n| **Rich Domain Model** | Entity contains both data and behavior |\n| **Aggregate Boundary** | Transaction consistency inside, eventual consistency outside |\n| **Anti-Corruption Layer** | Use Port to isolate external systems |\n| **Lightweight Trigger** | Trigger layer only routes requests, no business logic |\n\n## When to Use DDD\n\n**Use DDD when:**\n- Complex business domain with rich rules\n- Need to capture domain knowledge in code\n- Long-lived project with evolving requirements\n- Team needs shared domain language\n\n**Don't use DDD when:**\n- Simple CRUD operations\n- Prototype or throwaway code\n- Domain logic is trivial\n- Team unfamiliar with DDD concepts\n\n## Example Projects\n\n- [group-buy-market](file:\u002F\u002F\u002FUsers\u002Ffuzhengwei\u002FDocuments\u002Fproject\u002Fddd-demo\u002Fgroup-buy-market) - E-commerce domain\n- [ai-mcp-gateway](file:\u002F\u002F\u002FUsers\u002Ffuzhengwei\u002FDocuments\u002Fproject\u002Fddd-demo\u002Fai-mcp-gateway) - API gateway domain\n\n---\n\n# 🚀 DevOps 部署完整流程\n\n## 📋 部署检查清单\n\n当用户需要部署 DDD 项目时，按照以下流程执行：\n\n### 1. 确认项目信息\n- [ ] 项目名称（artifactId）\n- [ ] 项目路径（代码根目录）\n- [ ] 部署环境（开发\u002F测试\u002F生产）\n- [ ] 基础依赖（MySQL\u002FRedis\u002FRabbitMQ）\n\n### 2. 打包构建\n```bash\ncd \u002Fpath\u002Fto\u002Fproject\nmvn clean package -Dmaven.test.skip=true\n```\n\n### 3. 基础镜像拉取（加速）\n```bash\n# 使用阿里云加速镜像\ndocker pull registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fopenjdk:17-jdk-slim\ndocker pull registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fmysql:8.0.32\ndocker pull registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fredis:6.2\n```\n\n### 4. 数据库部署\n```bash\ncd docs\u002Fdev-ops\ndocker-compose -f docker-compose-environment-aliyun.yml up -d mysql\n\n# 等待 MySQL 就绪后初始化数据库\ndocker exec -it mysql mysql -uroot -p123456 -e \"source \u002Fdocker-entrypoint-initdb.d\u002Fxxx.sql\"\n```\n\n### 5. 应用容器构建\n```bash\ncd ai-mcp-gateway-app\ndocker build -t system\u002F{artifactId}:1.0.0 .\n```\n\n### 6. 应用启动\n```bash\ncd docs\u002Fdev-ops\ndocker-compose -f docker-compose-app.yml up -d\n```\n\n### 7. 验证部署\n```bash\n# 查看容器状态\ndocker ps -a | grep {artifactId}\n\n# 查看应用日志\ndocker logs -f {artifactId}\n\n# 健康检查\ncurl http:\u002F\u002Flocalhost:{port}\u002Factuator\u002Fhealth\n```\n\n---\n\n## 📁 标准部署目录结构\n\n```\n{project}\u002F\n├── docs\u002F\n│   └── dev-ops\u002F\n│       ├── docker-compose-environment-aliyun.yml  # 基础环境（MySQL\u002FRedis\u002FRabbitMQ）\n│       ├── docker-compose-app.yml                  # 应用服务\n│       ├── mysql\u002F\n│       │   ├── my.cnf                              # MySQL 配置\n│       │   └── sql\u002F\n│       │       └── {project}.sql                  # 数据库初始化脚本\n│       ├── redis\u002F\n│       │   └── redis.conf                          # Redis 配置\n│       ├── app\u002F\n│       │   ├── start.sh                            # 启动脚本\n│       │   └── stop.sh                             # 停止脚本\n│       └── README.md                               # 部署说明\n├── {project}-app\u002F\n│   ├── Dockerfile                                   # 应用 Dockerfile\n│   ├── pom.xml\n│   └── src\u002Fmain\u002Fresources\u002F\n│       ├── application.yml\n│       ├── application-dev.yml\n│       ├── application-test.yml\n│       ├── application-prod.yml\n│       └── logback-spring.xml\n```\n\n---\n\n## 🐳 Dockerfile 标准模板\n\n```dockerfile\n# 基础镜像\nFROM registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fopenjdk:17-jdk-slim\n\n# 作者\nMAINTAINER xiaofuge\n\n# 时区配置\nENV TZ=PRC\nRUN ln -snf \u002Fusr\u002Fshare\u002Fzoneinfo\u002F$TZ \u002Fetc\u002Flocaltime && echo $TZ > \u002Fetc\u002Ftimezone\n\n# 添加应用 JAR\nADD target\u002F{artifactId}.jar \u002F{artifactId}.jar\n\n# 暴露端口\nEXPOSE {port}\n\n# 启动命令\nENTRYPOINT [\"sh\",\"-c\",\"java -jar $JAVA_OPTS \u002F{artifactId}.jar $PARAMS\"]\n```\n\n---\n\n## 📦 docker-compose-app.yml 标准模板\n\n```yaml\nversion: '3.8'\n\nservices:\n  {artifactId}:\n    image: system\u002F{artifactId}:1.0.0\n    container_name: {artifactId}\n    restart: on-failure\n    ports:\n      - \"{port}:{port}\"\n    environment:\n      - TZ=PRC\n      - SERVER_PORT={port}\n      - SPRING_PROFILES_ACTIVE=prod\n    volumes:\n      - .\u002Flogs:\u002Fdata\u002Flog\n    logging:\n      driver: \"json-file\"\n      options:\n        max-size: \"10m\"\n        max-file: \"3\"\n    networks:\n      - my-network\n    depends_on:\n      - mysql\n      - redis\n\nnetworks:\n  my-network:\n    driver: bridge\n```\n\n---\n\n## 🗄️ docker-compose-environment-aliyun.yml 标准模板\n\n```yaml\nversion: '3.9'\n\nservices:\n  # MySQL 8.0\n  mysql:\n    image: registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fmysql:8.0.32\n    container_name: mysql\n    command: --default-authentication-plugin=mysql_native_password\n    restart: always\n    environment:\n      TZ: Asia\u002FShanghai\n      MYSQL_ROOT_PASSWORD: 123456\n    ports:\n      - \"13306:3306\"\n    volumes:\n      - .\u002Fmysql\u002Fmy.cnf:\u002Fetc\u002Fmysql\u002Fconf.d\u002Fmysql.cnf:ro\n      - .\u002Fmysql\u002Fsql:\u002Fdocker-entrypoint-initdb.d\n    healthcheck:\n      test: [\"CMD\", \"mysqladmin\", \"ping\", \"-h\", \"localhost\"]\n      interval: 5s\n      timeout: 10s\n      retries: 10\n      start_period: 15s\n    networks:\n      - my-network\n\n  # phpMyAdmin（可选）\n  phpmyadmin:\n    image: registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fphpmyadmin:5.2.1\n    container_name: phpmyadmin\n    ports:\n      - \"8899:80\"\n    environment:\n      - PMA_HOST=mysql\n      - PMA_PORT=3306\n      - MYSQL_ROOT_PASSWORD=123456\n    depends_on:\n      mysql:\n        condition: service_healthy\n    networks:\n      - my-network\n\n  # Redis 6.2\n  redis:\n    image: registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fredis:6.2\n    container_name: redis\n    restart: always\n    ports:\n      - \"16379:6379\"\n    networks:\n      - my-network\n    healthcheck:\n      test: [\"CMD\", \"redis-cli\", \"ping\"]\n      interval: 10s\n      timeout: 5s\n      retries: 3\n\n  # Redis Commander（可选）\n  redis-admin:\n    image: registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fredis-commander:0.8.0\n    container_name: redis-admin\n    ports:\n      - \"8081:8081\"\n    environment:\n      - REDIS_HOSTS=local:redis:6379\n      - HTTP_USER=admin\n      - HTTP_PASSWORD=admin\n    depends_on:\n      redis:\n        condition: service_healthy\n    networks:\n      - my-network\n\nnetworks:\n  my-network:\n    driver: bridge\n```\n\n---\n\n## 🚀 快速启动\u002F停止脚本\n\n### start.sh\n```bash\n#!\u002Fbin\u002Fbash\n\nCONTAINER_NAME={artifactId}\nIMAGE_NAME=system\u002F{artifactId}:1.0.0\nPORT={port}\n\necho \"容器部署开始 ${CONTAINER_NAME}\"\n\n# 停止容器\ndocker stop ${CONTAINER_NAME}\n\n# 删除容器\ndocker rm ${CONTAINER_NAME}\n\n# 启动容器\ndocker run --name ${CONTAINER_NAME} \\\n  --network my-network \\\n  -p ${PORT}:${PORT} \\\n  -e SPRING_PROFILES_ACTIVE=prod \\\n  -v $(pwd)\u002Flogs:\u002Fdata\u002Flog \\\n  -d ${IMAGE_NAME}\n\necho \"容器部署成功 ${CONTAINER_NAME}\"\n\n# 查看日志\ndocker logs -f ${CONTAINER_NAME}\n```\n\n### stop.sh\n```bash\n#!\u002Fbin\u002Fbash\n\nCONTAINER_NAME={artifactId}\n\necho \"停止容器 ${CONTAINER_NAME}\"\ndocker stop ${CONTAINER_NAME}\ndocker rm ${CONTAINER_NAME}\n\necho \"容器已停止\"\n```\n\n---\n\n## 🔧 application-prod.yml 标准配置\n\n```yaml\nserver:\n  port: {port}\n\nspring:\n  application:\n    name: {artifactId}\n  datasource:\n    driver-class-name: com.mysql.cj.jdbc.Driver\n    url: jdbc:mysql:\u002F\u002F${MYSQL_HOST:mysql}:${MYSQL_PORT:3306}\u002F${MYSQL_DATABASE:{database}}?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia\u002FShanghai&useSSL=false\n    username: ${MYSQL_USER:root}\n    password: ${MYSQL_PASSWORD:123456}\n    hikari:\n      pool-name: {artifactId}-hikari\n      minimum-idle: 10\n      maximum-pool-size: 50\n      idle-timeout: 300000\n      connection-timeout: 30000\n      max-lifetime: 1800000\n  redis:\n    host: ${REDIS_HOST:redis}\n    port: ${REDIS_PORT:6379}\n  rabbitmq:\n    host: ${RABBITMQ_HOST:rabbitmq}\n    port: ${RABBITMQ_PORT:5672}\n    username: ${RABBITMQ_USER:admin}\n    password: ${RABBITMQ_PASSWORD:admin123}\n\nlogging:\n  level:\n    root: INFO\n    cn.bugstack: INFO\n  file:\n    name: \u002Fdata\u002Flog\u002F{artifactId}.log\n```\n\n---\n\n## 📊 阿里云镜像加速仓库\n\n所有镜像已同步到阿里云，使用前缀 `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002F`\n\n> 📦 镜像来源：[docker-image-pusher](https:\u002F\u002Fgithub.com\u002Ffuzhengwei\u002Fdocker-image-pusher)\n> 添加新镜像：在 images.txt 添加镜像名，等待1分钟同步\n\n### 常用镜像速查表\n\n| 原始镜像 | 阿里云加速地址 | 用途 |\n|---------|--------------|------|\n| **JDK\u002FJava** | | |\n| openjdk:8-jre-slim | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fopenjdk:8-jre-slim` | Java 8 运行环境 |\n| openjdk:8-jdk | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fopenjdk:8-jdk` | Java 8 开发镜像 |\n| openjdk:17-jdk-slim | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fopenjdk:17-jdk-slim` | Java 17 运行环境 |\n| openjdk:17-ea-17-jdk-slim-buster | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fopenjdk:17-ea-17-jdk-slim-buster` | Java 17 EA 版本 |\n| **数据库** | | |\n| mysql:8.0.32 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fmysql:8.0.32` | MySQL 8.0 |\n| mysql:8.4.4 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fmysql:8.4.4` | MySQL 8.4 |\n| postgres:14.18 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fpostgres:14.18` | PostgreSQL 14 |\n| pgvector\u002Fpgvector:pg17 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fpgvector:pg17` | PostgreSQL 向量库 |\n| **缓存** | | |\n| redis:6.2 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fredis:6.2` | Redis 6.2 |\n| redis:7.2 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fredis:7.2` | Redis 7.2 |\n| redis:7.4.13 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fredis:7.2\u002F7.4.13` | Redis 7.4 |\n| **数据库管理** | | |\n| phpmyadmin:5.2.1 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fphpmyadmin:5.2.1` | MySQL Web 管理 |\n| redis-commander:0.8.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fredis-commander:0.8.0` | Redis Web 管理 |\n| dpage\u002Fpgadmin4:9.1.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fpgadmin4:9.1.0` | PostgreSQL Web 管理 |\n| **消息队列** | | |\n| rabbitmq:3.12.9 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Frabbitmq:3.12.9` | RabbitMQ |\n| rocketmq:5.1.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Frocketmq:5.1.0` | RocketMQ |\n| kafka:3.7.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fkafka:3.7.0` | Kafka |\n| kafka-eagle:3.0.2 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fkafka-eagle:3.0.2` | Kafka Eagle |\n| **注册中心\u002F配置中心** | | |\n| nacos-server:v2.2.3-slim | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fnacos-server:v2.2.3-slim` | Nacos 2.2.3 |\n| nacos-server:v3.1.1 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fnacos-server:v3.1.1` | Nacos 3.1.1 |\n| **Web 服务器** | | |\n| nginx:1.25.1 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fnginx:1.25.1` | Nginx 1.25 |\n| nginx:1.28.0-alpine | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fnginx:1.28.0-alpine` | Nginx 1.28 Alpine |\n| **任务调度** | | |\n| xxl-job-admin:2.4.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fxxl-job-admin:2.4.0` | XXL-Job 管理端 |\n| xxl-job-aarch64:2.4.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fxxl-job-aarch64:2.4.0` | XXL-Job ARM 版本 |\n| **监控** | | |\n| prometheus:2.47.2 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fprometheus:2.47.2` | Prometheus |\n| grafana:10.2.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fgrafana:10.2.0` | Grafana |\n| skywalking-oap-server:9.3.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fskywalking-oap-server:9.3.0` | SkyWalking OAP |\n| skywalking-ui:9.3.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fskywalking-ui:9.3.0` | SkyWalking UI |\n| **搜索引擎** | | |\n| elasticsearch:7.17.14 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Felasticsearch:7.17.14` | Elasticsearch |\n| kibana:7.17.14 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fkibana:7.17.14` | Kibana |\n| **Node** | | |\n| node:18-alpine | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fnode:18-alpine` | Node 18 |\n| node:20-alpine | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fnode:20-alpine` | Node 20 |\n| **AI\u002F工具** | | |\n| ollama\u002Follama:0.5.10 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Follama:0.5.10` | Ollama |\n| n8nio\u002Fn8n:1.88.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fn8n:1.88.0` | N8N 工作流 |\n| **其他** | | |\n| alpine:3.20.1 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Falpine:3.20.1` | Alpine Linux |\n| portainer:latest | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fportainer:latest` | Docker 可视化管理 |\n| jenkins:2.439 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fjenkins:2.439` | Jenkins |\n| sentinel-dashboard:1.8.7 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fsentinel-dashboard:1.8.7` | Sentinel 流量控制 |\n| canal-server:v1.1.6 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fcanal-server:v1.1.6` | Canal |\n| zookeeper:3.9.0 | `registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fzookeeper:3.9.0` | Zookeeper |\n\n### 拉取镜像示例\n\n```bash\n# 拉取 MySQL\ndocker pull registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fmysql:8.0.32\n\n# 拉取 Redis\ndocker pull registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fredis:6.2\n\n# 拉取 Java 17\ndocker pull registry.cn-hangzhou.aliyuncs.com\u002Fxfg-studio\u002Fopenjdk:17-jdk-slim\n```\n\n---\n\n## ⚠️ 常见问题处理\n\n### 1. MySQL 8.0 认证问题\n```bash\ndocker exec mysql mysql -uroot -p123456 -e \"ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; FLUSH PRIVILEGES;\"\n```\n\n### 2. 容器网络不通\n确保所有容器在同一个网络：\n```yaml\nnetworks:\n  - my-network\n```\n\n### 3. 端口冲突\n修改 docker-compose.yml 中的端口映射：\n```yaml\nports:\n  - \"13306:3306\"  # 改为非标准端口\n```\n\n### 4. 应用无法连接数据库\n检查环境变量配置和健康检查依赖：\n```yaml\ndepends_on:\n  mysql:\n    condition: service_healthy\n```\n\n---\n\n## 📝 部署操作流程示例\n\n当用户说\"帮我部署 ai-mcp-gateway\"时，执行：\n\n1. **确认项目信息**\n   - 项目路径：`\u002FUsers\u002Ffuzhengwei\u002FDocuments\u002Fproject\u002Fddd-demo\u002Fai-mcp-gateway`\n   - 端口：`8091`\n   - 镜像：`system\u002Fai-mcp-gateway:1.0.0`\n\n2. **执行部署**\n```bash\n# 进入项目目录\ncd \u002FUsers\u002Ffuzhengwei\u002FDocuments\u002Fproject\u002Fddd-demo\u002Fai-mcp-gateway\n\n# 打包\nmvn clean package -Dmaven.test.skip=true\n\n# 构建 Docker 镜像\ncd ai-mcp-gateway-app\ndocker build -t system\u002Fai-mcp-gateway:1.0.0 .\n\n# 部署基础环境\ncd ..\u002Fdocs\u002Fdev-ops\ndocker-compose -f docker-compose-environment-aliyun.yml up -d\n\n# 等待 MySQL 就绪\nsleep 30\n\n# 初始化数据库\ndocker exec -i mysql mysql -uroot -p123456 \u003C mysql\u002Fsql\u002Fai_mcp_gateway_v2.sql\n\n# 启动应用\ndocker-compose -f docker-compose-app.yml up -d\n\n# 验证\ndocker ps | grep ai-mcp-gateway\ncurl http:\u002F\u002Flocalhost:8091\u002Fapi\u002Fgateway\u002Flist\n```\n\n3. **部署完成检查**\n   - 容器状态正常\n   - 日志无报错\n   - 健康检查通过\n",{"name":5,"author":23,"license":14,"version":24,"metadata":25,"triggers":28,"description":7},"xiaofuge","2.2.3",{"openclaw":26},{"emoji":27},"🏗️",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61],"DDD","六边形架构","domain-driven design","领域驱动设计","ports and adapters","创建 Entity","创建聚合根","创建 DDD 项目","新建项目","Aggregate","ValueObject","值对象","聚合根","部署","deploy","Docker","docker-compose","容器化","发布","上线","打包","build","运维部署","启动服务","停止服务","重启服务","环境配置","生产环境","测试环境","数据库部署","MySQL","Redis","RabbitMQ","main","cb3f39689b7b3a95edb2753c8f3e97a313b885fc","Xiao-Q\u002Fskills\u002Fxfg-ddd-skills",0,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent","https:\u002F\u002Fgithub.com\u002FJinhong270","2026-09-30 23:42:56",{"source":8,"skillName":5,"commands":70,"prompt":80,"zipAvailable":81},[71,74,77],{"tool":72,"command":73},"npx","npx skills add Jinhong270\u002FAI-Agent --skill xfg-ddd-skills",{"tool":75,"command":76},"bunx","bunx skills add Jinhong270\u002FAI-Agent --skill xfg-ddd-skills",{"tool":78,"command":79},"pnpm","pnpm dlx skills add Jinhong270\u002FAI-Agent --skill xfg-ddd-skills","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002FSKILL.md",true,[83,89,93,97,101,105,109,113,117,121,125,129,133,137,141,145,149,153,157,161],{"path":84,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":87,"sourceHtmlUrl":88},"_meta.json","REFERENCE","参考文档",133,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002F_meta.json",{"path":90,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":91,"sourceHtmlUrl":92},"README.md",15079,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002FREADME.md",{"path":94,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":95,"sourceHtmlUrl":96},"references\u002Faggregate.md",8973,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Freferences\u002Faggregate.md",{"path":98,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":99,"sourceHtmlUrl":100},"references\u002Farchitecture.md",11005,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Freferences\u002Farchitecture.md",{"path":102,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":103,"sourceHtmlUrl":104},"references\u002Fcase-layer.md",18236,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Freferences\u002Fcase-layer.md",{"path":106,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":107,"sourceHtmlUrl":108},"references\u002Fdevops-deployment.md",15444,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Freferences\u002Fdevops-deployment.md",{"path":110,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":111,"sourceHtmlUrl":112},"references\u002Fdocker-images.md",4800,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Freferences\u002Fdocker-images.md",{"path":114,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":115,"sourceHtmlUrl":116},"references\u002Fdomain-design-guide.md",24918,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Freferences\u002Fdomain-design-guide.md",{"path":118,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":119,"sourceHtmlUrl":120},"references\u002Fdomain-patterns.md",31967,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Freferences\u002Fdomain-patterns.md",{"path":122,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":123,"sourceHtmlUrl":124},"references\u002Fdomain-service.md",19337,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Freferences\u002Fdomain-service.md",{"path":126,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":127,"sourceHtmlUrl":128},"references\u002Fentity.md",7306,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Freferences\u002Fentity.md",{"path":130,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":131,"sourceHtmlUrl":132},"references\u002Finfrastructure-layer.md",24695,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Freferences\u002Finfrastructure-layer.md",{"path":134,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":135,"sourceHtmlUrl":136},"references\u002Finfrastructure-patterns.md",20471,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Freferences\u002Finfrastructure-patterns.md",{"path":138,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":139,"sourceHtmlUrl":140},"references\u002Fnaming.md",4889,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Freferences\u002Fnaming.md",{"path":142,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":143,"sourceHtmlUrl":144},"references\u002Fport-adapter.md",18142,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Freferences\u002Fport-adapter.md",{"path":146,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":147,"sourceHtmlUrl":148},"references\u002Fproject-structure.md",13631,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Freferences\u002Fproject-structure.md",{"path":150,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":151,"sourceHtmlUrl":152},"references\u002Frepository.md",11322,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Freferences\u002Frepository.md",{"path":154,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":155,"sourceHtmlUrl":156},"references\u002Ftrigger-layer.md",9260,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Freferences\u002Ftrigger-layer.md",{"path":158,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":159,"sourceHtmlUrl":160},"references\u002Fvalue-object.md",10745,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Freferences\u002Fvalue-object.md",{"path":162,"resourceType":163,"resourceTypeDesc":164,"sizeBytes":165,"sourceHtmlUrl":166},"scripts\u002Fcreate-ddd-project.sh","SCRIPT","脚本",11535,"https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxfg-ddd-skills\u002Fscripts\u002Fcreate-ddd-project.sh",[168,175,183,190,197,205],{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":174,"publishedAt":18},"01M77Z0W1XHJVFS4M183VZTF3Z","xlsx","Open, create, read, analyze, edit, repair, or validate spreadsheet files (.xlsx, .xlsm, .xltx, .csv, .tsv) with zero format loss, with first-class support for Chinese \u002F CJK content. Use whenever the user asks to create, build, modify, fill, analyze, read, repair, validate, or format any spreadsheet, workbook, report, dashboard, budget, financial model, pivot table, or tabular data file. Handles Chinese text, encodings (UTF-8 \u002F GB18030 \u002F GBK), full-width characters, CJK fonts in rendering, and Chinese number\u002Fdate conventions (¥, 万\u002F亿, 年\u002F月\u002F日). Covers: creating new workbooks from scratch, reading and analyzing existing files, editing existing workbooks while preserving pivot tables \u002F VBA macros \u002F charts \u002F sparklines \u002F conditional formatting \u002F named ranges, formula recalculation and validation, visual review of results, and applying professional formatting. Triggers on 'spreadsheet', 'Excel', 'workbook', '表格', '工作簿', '.xlsx', '.xlsm', '.csv', 'pivot table', '透视表', 'macro', '宏', 'chart', '图表', 'financial model', '财务模型', 'formula', '公式', or any request to produce tabular data.","https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxlsx007-skill\u002FSKILL.md",[],[],{"skillNo":176,"name":177,"nameZh":6,"description":178,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":179,"sourceHtmlUrl":180,"categories":181,"keywords":182,"publishedAt":18},"01M77Z0EVYYQEYGJME2K56STBZ","xlsx-formula-master","你描述需求(人话)，它给你 Excel \u002F WPS 公式 + 解释 + 不踩坑的边界条件。\n专攻 VLOOKUP \u002F XLOOKUP \u002F INDEX-MATCH \u002F SUMIFS \u002F 数组公式 \u002F 动态数组 \u002F Power Query 等高频但易错场景。\n自动适配你的 Excel 版本（2019 \u002F 365 \u002F WPS）——版本不同公式可能不能用。\n触发：用户说 \"Excel 公式\"、\"VLOOKUP\"、\"怎么算\"、\"WPS 公式\"、\"求和怎么写\"、\"匹配数据\"、\"数据透视\"。","https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxlsx-formula-master\u002FLICENSE.md","https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxlsx-formula-master\u002FSKILL.md",[],[],{"skillNo":184,"name":185,"nameZh":6,"description":186,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":187,"categories":188,"keywords":189,"publishedAt":18},"01M77Z05X53XF8VVQFFFZE2Z4Z","self-improving-agent","Self-improving agent system that analyzes conversation quality, identifies improvement opportunities, and continuously optimizes response strategies.","https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxiucheng-self-improving-agent\u002FSKILL.md",[],[],{"skillNo":191,"name":192,"nameZh":6,"description":193,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":194,"categories":195,"keywords":196,"publishedAt":18},"01M77YZ7KXV2B7GDCBKE07QRWE","xiaohongshu-content-tools","小红书运营数据工具｜当提到小红书关键词搜索,小红书笔记详情及评论,小红书博主作品时使用，可实现爆款挖掘\u002F竞品分析\u002FKOL筛选\u002F趋势洞察，用数据驱动小红书流量增长，告别盲目创作","https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fxiaohongshu-content-tools\u002FSKILL.md",[],[],{"skillNo":198,"name":199,"nameZh":6,"description":200,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":201,"sourceHtmlUrl":202,"categories":203,"keywords":204,"publishedAt":18},"01M77YXP7QKKD0HX26W2V63Q9M","wordpress","WordPress.com API integration with managed OAuth. Manage posts, pages, sites, and content.\nUse this skill when users want to create, read, update, or delete WordPress.com posts, pages, or manage site content.\nFor other third party apps, use the api-gateway skill (https:\u002F\u002Fclawhub.ai\u002Fbyungkyu\u002Fapi-gateway).\nRequires network access and valid Maton API key.","https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fwordpress-api\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fwordpress-api\u002FSKILL.md",[],[],{"skillNo":206,"name":207,"nameZh":6,"description":208,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":209,"sourceHtmlUrl":210,"categories":211,"keywords":212,"publishedAt":18},"01M77YV46SQ48MSK5DMRGF6TG1","wechat-toolkit","微信公众号一站式工具包 — 集成文章搜索、文章下载、AI洗稿改写、公众号发布四大功能。当用户需要搜索\u002F下载\u002F改写\u002F发布微信公众号文章时使用。","https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fwechat-toolkit\u002FLICENSE.md","https:\u002F\u002Fgithub.com\u002FJinhong270\u002FAI-Agent\u002Fblob\u002Fmain\u002FXiao-Q\u002Fskills\u002Fwechat-toolkit\u002FSKILL.md",[],[]]