{"id":22239670,"url":"https://github.com/dddplus/dddplus-demo","last_synced_at":"2025-04-05T20:09:32.512Z","repository":{"id":37459976,"uuid":"303268875","full_name":"dddplus/dddplus-demo","owner":"dddplus","description":"♨️ Demonstrate how to use DDDplus to build a complex OMS.演示如何使用DDDplus实现一套订单履约中台OMS","archived":false,"fork":false,"pushed_at":"2023-08-01T03:02:31.000Z","size":251,"stargazers_count":324,"open_issues_count":9,"forks_count":127,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-03-29T19:07:24.777Z","etag":null,"topics":["ddd","ddd-demo","ddd-example","dddplus","demo","headless-commerce","headless-components","hot-module-reloading","hotswap","hotswappable","java","oms","scaffold","skeleton"],"latest_commit_sha":null,"homepage":"https://github.com/funkygao/cp-ddd-framework","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dddplus.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2020-10-12T03:36:09.000Z","updated_at":"2025-03-13T09:46:21.000Z","dependencies_parsed_at":"2022-07-12T14:30:38.186Z","dependency_job_id":"60fe5e0a-516e-4962-88d2-101d5f3313b5","html_url":"https://github.com/dddplus/dddplus-demo","commit_stats":null,"previous_names":[],"tags_count":0,"template":true,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dddplus%2Fdddplus-demo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dddplus%2Fdddplus-demo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dddplus%2Fdddplus-demo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dddplus%2Fdddplus-demo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dddplus","download_url":"https://codeload.github.com/dddplus/dddplus-demo/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247393573,"owners_count":20931813,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ddd","ddd-demo","ddd-example","dddplus","demo","headless-commerce","headless-components","hot-module-reloading","hotswap","hotswappable","java","oms","scaffold","skeleton"],"created_at":"2024-12-03T03:20:55.826Z","updated_at":"2025-04-05T20:09:32.487Z","avatar_url":"https://github.com/dddplus.png","language":"Java","readme":"# Archived\n\nPlease visit [new demo](https://github.com/funkygao/cp-ddd-framework/blob/master/dddplus-test/src/test/java/ddd/plus/showcase/README.md).\n\n# Demo of DDDplus\n\n演示如何使用[DDDplus](https://github.com/funkygao/cp-ddd-framework)实现一套`订单履约中台OMS`。\n\n![Requirement](https://img.shields.io/badge/JDK-8+-green.svg)\n[![DDDplus version](https://img.shields.io/badge/DDDplus-1.1.0--SNAPSHOT-blue)](https://github.com/funkygao/cp-ddd-framework)\n\n[OMS业务入门](https://github.com/funkygao/oms/blob/master/README.md)。\n\n## 目录\n\n- [Terms explained](#terms-explained)\n- [如何运行该演示](#如何运行该演示)\n- [演示代码入口](#演示代码入口)\n- [项目基本介绍](https://github.com/funkygao/cp-ddd-framework/wiki/The-Demo)\n- [代码快速入门](#代码快速入门)\n- [代码结构](#代码结构)\n   - [依赖关系](#依赖关系)\n   - 一套[订单履约中台代码库](#order-center-cp)\n   - [中台的个性化业务包](#order-center-pattern)\n   - [三个业务前台代码库](#订单履约中台的多个业务前台)\n      - [KA业务前台](#order-center-bp-ka)\n      - [ISV业务前台](#order-center-bp-isv)\n      - [生鲜业务前台](#order-center-bp-fresh)\n   - [支撑域](#支撑域)\n- [如何快速搭建中台工程骨架](#如何快速搭建中台工程骨架)\n\n## Terms explained\n\n- bp\n   - Business Partner\n   - 业务前台\n- cp\n   - Central Platform\n   - 中台\n- isv\n   - Independent Software Vendors\n- ka\n   - Key Account\n   - 关键客户\n- oc\n   - Order Center\n   - 订单中心\n\n\n## 如何运行该演示\n\n``` bash\ngit clone https://github.com/dddplus/dddplus-demo.git\ncd dddplus-demo\nmvn package\njava -jar order-center-cp/cp-oc-main/target/dddplus-demo.jar\n#java -jar order-center-cp/cp-oc-main/target/dddplus-demo.jar 9090 plugin\n\n# in another terminal\ncurl -XPOST http://localhost:9090/order             # submit an order\ncurl -XPOST http://localhost:9090/reload?plugin=isv # plugin hot reloading\n```\n\n## 演示代码入口\n\n- 启动入口 [OrderServer.java](order-center-cp/cp-oc-main/src/main/java/org/example/cp/oms/OrderServer.java)\n- Web Controller [OrderController.java](order-center-cp/cp-oc-controller/src/main/java/org/example/cp/oms/controller/OrderController.java)\n\n## 代码快速入门\n\n- [中台架构特色的DDD分层架构](order-center-cp)\n   - 也可以通过[dddplus-archetype](https://github.com/dddplus/dddplus-archetype)，快速从零开始搭建中台的分层架构，并融入最佳实践\n   - [domain层是如何通过依赖倒置模式与infrastructure层交互的](order-center-cp/cp-oc-domain/src/main/java/org/example/cp/oms/domain/facade/mq/IMessageProducer.java)\n   - [Repository同理](order-center-cp/cp-oc-domain/src/main/java/org/example/cp/oms/domain/facade/repository/IOrderRepository.java)\n   - [为什么依赖倒置统一存放在facade包](order-center-cp/cp-oc-domain/src/main/java/org/example/cp/oms/domain/facade/package-info.java)\n- 如何理解 [Step](https://github.com/funkygao/cp-ddd-framework/wiki/Steps)\n- 扩展点：订单的防并发\n   - [如何识别该业务属于KA业务前台](order-center-bp-ka/src/main/java/org/example/bp/oms/ka/KaPartner.java)\n   - [一个扩展点声明](order-center-cp/cp-oc-spec/src/main/java/org/example/cp/oms/spec/ext/ISerializableIsolationExt.java)\n   - [该扩展点，KA业务前台的实现](order-center-bp-ka/src/main/java/org/example/bp/oms/ka/extension/SerializableIsolationExt.java)\n   - [该扩展点，ISV业务前台的实现](order-center-bp-isv/src/main/java/org/example/bp/oms/isv/extension/SerializableIsolationExt.java)\n   - [该扩展点，中台的一个业务场景实现](order-center-pattern/src/main/java/org/example/cp/oms/pattern/extension/coldchain_b2b/SerializableIsolationExt.java)\n   - [扩展点被封装到DomainAbility](order-center-cp/cp-oc-domain/src/main/java/org/example/cp/oms/domain/ability/SerializableIsolationAbility.java)\n   - [扩展点被调用](order-center-cp/cp-oc-domain/src/main/java/org/example/cp/oms/domain/service/SubmitOrder.java)\n- [前台对中台的步骤编排](order-center-bp-ka/src/main/java/org/example/bp/oms/ka/extension/DecideStepsExt.java)\n   - [动态的步骤编排](order-center-cp/cp-oc-domain/src/main/java/org/example/cp/oms/domain/step/submitorder/BasicStep.java)\n- [扩展属性通过扩展点的实现](order-center-bp-isv/src/main/java/org/example/bp/oms/isv/extension/CustomModelExt.java)\n- [业务约束规则的显式化](order-center-cp/cp-oc-domain/src/main/java/org/example/cp/oms/domain/specification/ProductNotEmptySpec.java)\n   - [如何使用](order-center-cp/cp-oc-domain/src/main/java/org/example/cp/oms/domain/ability/extension/DefaultAssignOrderNoExt.java)\n- [中台统一定义，兼顾前台个性化的错误码机制](order-center-cp/cp-oc-spec/src/main/java/org/example/cp/oms/spec/exception/OrderException.java)\n- [中台特色的领域模型](order-center-cp/cp-oc-spec/src/main/java/org/example/cp/oms/spec/model/IOrderMain.java)\n   - spec jar里定义受限的领域模型输出给业务前台：通过接口，而不是类\n   - 一种中台控制力更强的shared kernel机制\n   - domain层是如何实现的领域模型接口的：[订单主档](order-center-cp/cp-oc-domain/src/main/java/org/example/cp/oms/domain/model/OrderMain.java)\n   - [Creator的作用](order-center-cp/cp-oc-domain/src/main/java/org/example/cp/oms/domain/model/OrderMain.java#L50)\n- 领域步骤，业务模式等，中台如何统一定义，并输出给前台使用？\n   - 例如，业务前台是可以编排中台的步骤的，它必须要知道中台有哪些步骤\n   - [领域步骤的统一输出](order-center-cp/cp-oc-spec/src/main/java/org/example/cp/oms/spec/Steps.java)\n   - [业务模式的统一输出](order-center-cp/cp-oc-spec/src/main/java/org/example/cp/oms/spec/Patterns.java)\n- [中台如何输出资源给业务前台使用](order-center-cp/cp-oc-spec/src/main/java/org/example/cp/oms/spec/resource/IStockRpc.java)\n   - 如果业务前台要使用中台的MQ怎么办？能否中台封装一下，不直接暴露给前台\n- [库存支撑域给订单核心域的能力输出](order-center-domain-stock/order-center-stock-spec/src/main/java/org/example/oms/d/stock/spec/)\n   - [能力的实现](order-center-domain-stock/order-center-stock-domain/src/main/java/org/example/oms/d/stock/domain/service/StockService.java)\n   - [订单核心域对库存支撑域的调用](order-center-cp/cp-oc-domain/src/main/java/org/example/cp/oms/domain/step/submitorder/StockStep.java)\n- [按需打包](order-center-cp/cp-oc-main/pom.xml)\n   - 这样才能做到一套代码，支撑国内、国际业务\n   - 灵活的部署形式\n\n## 代码结构\n\n### 依赖关系\n\n![](/doc/assets/img/ddd-depgraph.png)\n\n### [order-center-cp](order-center-cp)\n\n订单履约中台，通过[spec jar](order-center-cp/cp-oc-spec)为业务前台赋能，输出中台标准，并提供扩展机制。\n\n#### [order-center-pattern](order-center-pattern)\n\n订单履约中台本身的个性化业务，即个性化的业务模式包。\n\n### 订单履约中台的多个业务前台\n\n#### [order-center-bp-ka](order-center-bp-ka)\n\nKA，关键客户的个性化业务通过扩展点的实现完成。\n\n#### [order-center-bp-isv](order-center-bp-isv)\n\nISV，独立软件开发商的个性化业务通过扩展点的实现完成。\n\n#### [order-center-bp-fresh](order-center-bp-fresh)\n\nFresh，生鲜业务前台的个性化业务通过扩展点的实现完成。\n\n这个业务BP，被中台要求不能使用Spring框架开发，不能在业务扩展包里使用AOP等Spring机制，只能严格实现中台定义的扩展点。\n\n为了演示，ISV和KA这2个业务前台BP在开发业务扩展包时，可以使用Spring框架。\n\n### 支撑域\n\n![](http://www.plantuml.com/plantuml/svg/RPBFRh905CNtFWMhRy4pV6byWQwwwDf4cfYeCTNkmJzeDKHGI9lM5ajCQfk8DgcK0jMNcJiCRz7HcKObBCyzltivSCZN6uNhHgLKBLOAjPme4DS1pSBc4eyCiErSJXG52CQmkDyfaQh__setvRfqbZXjqARCInoLsdYYGV-5GfH2FnQ-ynY3Rz_WmugRtynYAyXVmBR50B8UW1mbSaWsHWecNeVUWLaxrjMK5KT1qXrcFY9fpQ6dPbY7zAO2xaDs-WFKxMDpam5HIhWylq3130MZz8T1_W261Wh7TF74OAFOj57m6lSzB2lm-8oYwVvSqj78LZ--A82bWkinXe-G7s9hXJNt21ahNB3k86g2x--xAqjN3Q5UAaginiuShvLuFY1VDl7V-HBDShYmIxWCSQ1pJKETQFBfqDVd0YOhU9Ave2LXg_Ut9gkW6pkHbwf5_dFz0W00)\n\n- [库存支撑域](order-center-domain-stock)\n- 更多的支撑域...\n\n## 如何快速搭建中台工程骨架\n\n使用 [dddplus-archetype](https://github.com/dddplus/dddplus-archetype)，可以快速搭建中台的工程骨架。\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdddplus%2Fdddplus-demo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdddplus%2Fdddplus-demo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdddplus%2Fdddplus-demo/lists"}