From 2ee7b5a921a65aae3b8a8a53d0e03068a4344ee8 Mon Sep 17 00:00:00 2001
From: ljfxxx <ljfxxx@qq.com>
Date: Tue, 22 Dec 2020 12:49:43 +0800
Subject: [PATCH] feature: add ddd demo

---
 .../com/seasky/dddtemplate/api/ITest.java     | 21 -----
 .../dddtemplate/api/ITestController.java      | 41 +++++++++
 .../dddtemplate/api/ITestWebService.java      | 16 ++++
 ServiceSite/pom.xml                           | 25 +++++
 .../command/api/TestCmdService.java           | 20 +++-
 .../command/service/TestCmdServiceImpl.java   | 91 ++++++++++++++++++-
 .../domain/aggregate/flow/FlowAggregate.java  | 14 +++
 .../aggregate/message/MessageAggregate.java   |  5 +
 .../domain/aggregate/test/TestAggregate.java  | 25 +++++
 .../domain/aggregate/test/TestRepository.java |  4 +-
 .../domain/api/TestDomainService.java         |  4 +-
 .../domain/event/DeleteTestEvent.java         | 26 ++++++
 .../domain/event/SendMessageEvent.java        | 41 +++++++++
 .../domain/service/FlowDomainServiceImpl.java | 17 ++++
 .../service/SendEmailDomainServiceImpl.java   | 18 ++++
 .../service/SendWXDomainServiceImpl.java      | 17 ++++
 .../domain/service/TestDomainServiceImpl.java | 31 ++++++-
 .../repository/test/TestRepositoryImpl.java   | 26 ++++++
 .../interfaces/controller/TestController.java | 76 ++++++++++++----
 .../dddtemplate/interfaces/rpc/TestRPC.java   |  4 +
 .../interfaces/soap/SOAPConfig.java           | 65 +++++++++++++
 .../interfaces/soap/TestWebService.java       | 26 ++++++
 .../src/main/resources/application.properties |  2 +-
 ServiceSite/src/main/resources/bootstrap.yml  | 22 +++++
 .../controller/test/TestControllerTest.java   |  4 +-
 25 files changed, 589 insertions(+), 52 deletions(-)
 delete mode 100644 ServiceSite/facade/src/main/java/com/seasky/dddtemplate/api/ITest.java
 create mode 100644 ServiceSite/facade/src/main/java/com/seasky/dddtemplate/api/ITestController.java
 create mode 100644 ServiceSite/facade/src/main/java/com/seasky/dddtemplate/api/ITestWebService.java
 create mode 100644 ServiceSite/src/main/java/com/seasky/dddtemplate/domain/aggregate/flow/FlowAggregate.java
 create mode 100644 ServiceSite/src/main/java/com/seasky/dddtemplate/domain/aggregate/message/MessageAggregate.java
 create mode 100644 ServiceSite/src/main/java/com/seasky/dddtemplate/domain/event/DeleteTestEvent.java
 create mode 100644 ServiceSite/src/main/java/com/seasky/dddtemplate/domain/event/SendMessageEvent.java
 create mode 100644 ServiceSite/src/main/java/com/seasky/dddtemplate/domain/service/FlowDomainServiceImpl.java
 create mode 100644 ServiceSite/src/main/java/com/seasky/dddtemplate/domain/service/SendEmailDomainServiceImpl.java
 create mode 100644 ServiceSite/src/main/java/com/seasky/dddtemplate/domain/service/SendWXDomainServiceImpl.java
 create mode 100644 ServiceSite/src/main/java/com/seasky/dddtemplate/interfaces/rpc/TestRPC.java
 create mode 100644 ServiceSite/src/main/java/com/seasky/dddtemplate/interfaces/soap/SOAPConfig.java
 create mode 100644 ServiceSite/src/main/java/com/seasky/dddtemplate/interfaces/soap/TestWebService.java

diff --git a/ServiceSite/facade/src/main/java/com/seasky/dddtemplate/api/ITest.java b/ServiceSite/facade/src/main/java/com/seasky/dddtemplate/api/ITest.java
deleted file mode 100644
index 5d79450..0000000
--- a/ServiceSite/facade/src/main/java/com/seasky/dddtemplate/api/ITest.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.seasky.dddtemplate.api;
-
-import com.seasky.core.common.Result;
-import com.seasky.dddtemplate.dto.test.TestCmd;
-import com.seasky.dddtemplate.dto.test.TestQueryOut;
-import com.seasky.dddtemplate.dto.test.TestQueryQry;
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-@FeignClient("dddtemplate-provider")
-@RequestMapping("test")
-public interface ITest {
-
-    @PostMapping(path = "/pc/v1/add")
-    Result<Integer> testC(@RequestBody TestCmd testCmd);
-
-    @PostMapping(path = "/pc/v1/queryList")
-    Result<TestQueryOut> testQ(@RequestBody TestQueryQry testQry);
-}
diff --git a/ServiceSite/facade/src/main/java/com/seasky/dddtemplate/api/ITestController.java b/ServiceSite/facade/src/main/java/com/seasky/dddtemplate/api/ITestController.java
new file mode 100644
index 0000000..55ddd66
--- /dev/null
+++ b/ServiceSite/facade/src/main/java/com/seasky/dddtemplate/api/ITestController.java
@@ -0,0 +1,41 @@
+package com.seasky.dddtemplate.api;
+
+import com.seasky.core.common.Result;
+import com.seasky.dddtemplate.dto.test.TestCmd;
+import com.seasky.dddtemplate.dto.test.TestQueryOut;
+import com.seasky.dddtemplate.dto.test.TestQueryQry;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.io.UnsupportedEncodingException;
+
+@FeignClient("dddtemplate-provider")
+@RequestMapping("test")
+@Api("Test")
+public interface ITestController {
+
+    @ApiOperation("1.testQ")
+    @PostMapping(path = "/pc/v1/queryList")
+    Result<TestQueryOut> testQ(@RequestBody TestQueryQry testQry);
+
+    @ApiOperation("2.testExport")
+    @PostMapping(path = "/pc/v1/export")
+    ResponseEntity<byte[]> testExcelExport(@RequestBody TestQueryQry testQry) throws UnsupportedEncodingException;
+
+    @ApiOperation("3.testSave")
+    @PostMapping(path = "/pc/v1/save")
+    Result<Long> testSave(@RequestBody TestCmd testCmd);
+
+    @ApiOperation("4.testSubmit")
+    @PostMapping(path = "/pc/v1/submit")
+    Result<Long> testSubmit(@RequestBody TestCmd testCmd);
+
+    @ApiOperation("5.testSaveAndSubmit")
+    @PostMapping(path = "/pc/v1/saveandsubmit")
+    Result<Long> testSaveAndSubmit(@RequestBody TestCmd testCmd);
+}
diff --git a/ServiceSite/facade/src/main/java/com/seasky/dddtemplate/api/ITestWebService.java b/ServiceSite/facade/src/main/java/com/seasky/dddtemplate/api/ITestWebService.java
new file mode 100644
index 0000000..5dcfd35
--- /dev/null
+++ b/ServiceSite/facade/src/main/java/com/seasky/dddtemplate/api/ITestWebService.java
@@ -0,0 +1,16 @@
+package com.seasky.dddtemplate.api;
+
+import com.seasky.core.common.Result;
+import com.seasky.dddtemplate.dto.test.TestQueryOut;
+import com.seasky.dddtemplate.dto.test.TestQueryQry;
+
+import javax.jws.WebMethod;
+import javax.jws.WebParam;
+import javax.jws.WebService;
+
+@WebService(name = "TestService", targetNamespace = "http://www.seaskysh.com")
+public interface ITestWebService {
+    @WebMethod
+    Result<TestQueryOut> testQ(@WebParam TestQueryQry testQry);
+}
+
diff --git a/ServiceSite/pom.xml b/ServiceSite/pom.xml
index ca24a34..f8daca5 100644
--- a/ServiceSite/pom.xml
+++ b/ServiceSite/pom.xml
@@ -73,6 +73,31 @@
         </dependency>
 
 
+
+
+
+
+        <!-- webService-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web-services</artifactId>
+        </dependency>
+        <!-- CXF webservice -->
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
+            <version>3.2.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-transports-http</artifactId>
+            <version>3.2.1</version>
+        </dependency>
+        <!-- CXF webservice -->
+
+
+
+
 <!--        <dependency>-->
 <!--            <groupId>org.jetbrains</groupId>-->
 <!--            <artifactId>annotations</artifactId>-->
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/application/command/api/TestCmdService.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/application/command/api/TestCmdService.java
index ec4e8a6..ded4e56 100644
--- a/ServiceSite/src/main/java/com/seasky/dddtemplate/application/command/api/TestCmdService.java
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/application/command/api/TestCmdService.java
@@ -9,5 +9,23 @@ public interface TestCmdService {
      * @param testCmd 娴嬭瘯cmd
      * @return int
      */
-    int saveTest(TestCmd testCmd);
+    Long SaveTest(TestCmd testCmd);
+
+    /**
+     * 鎻愪氦绀轰緥
+     *
+     * @param testCmd 娴嬭瘯cmd
+     * @return int
+     */
+    Long SubmitTest(TestCmd testCmd);
+
+    /**
+     * 淇濆瓨骞舵彁浜ょず渚�
+     *
+     * @param testCmd 娴嬭瘯cmd
+     * @return int
+     */
+    Long SavaAndSubmitTest(TestCmd testCmd);
+
+    void Delete(TestCmd testCmd);
 }
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/application/command/service/TestCmdServiceImpl.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/application/command/service/TestCmdServiceImpl.java
index 8743fed..6f61141 100644
--- a/ServiceSite/src/main/java/com/seasky/dddtemplate/application/command/service/TestCmdServiceImpl.java
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/application/command/service/TestCmdServiceImpl.java
@@ -1,10 +1,13 @@
 package com.seasky.dddtemplate.application.command.service;
 
 import com.seasky.dddtemplate.application.command.api.TestCmdService;
-import com.seasky.dddtemplate.dto.test.TestCmd;
-import com.seasky.dddtemplate.domain.aggregate.test.TestAggregate;
 import com.seasky.dddtemplate.application.command.factory.TestFactory;
+import com.seasky.dddtemplate.domain.aggregate.test.TestAggregate;
+import com.seasky.dddtemplate.domain.aggregate.test.TestRepository;
 import com.seasky.dddtemplate.domain.api.TestDomainService;
+import com.seasky.dddtemplate.domain.event.DeleteTestEvent;
+import com.seasky.dddtemplate.domain.event.SendMessageEvent;
+import com.seasky.dddtemplate.dto.test.TestCmd;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -13,9 +16,89 @@ public class TestCmdServiceImpl implements TestCmdService {
     @Autowired
     private TestDomainService testDomainService;
 
+    @Autowired
+    private TestRepository testRepository;
+
+    @Autowired
+    private SendMessageEvent sendMessageEvent;
+
+    @Autowired
+    private DeleteTestEvent  deleteTestEvent;
+    /**
+     * 淇濆瓨
+     *
+     * @param testCmd
+     * @return {@link Long}
+     */
+    @Override
+    public Long SaveTest(TestCmd testCmd) {
+        TestAggregate testAggregate = TestFactory.buildTestAggregate(testCmd);
+        return this.save(testAggregate);
+    }
+
+    /**
+     * 鎻愪氦
+     *
+     * @param testCmd
+     * @return {@link int}
+     */
     @Override
-    public int saveTest(TestCmd testCmd) {
+    public Long SubmitTest(TestCmd testCmd) {
         TestAggregate testAggregate = TestFactory.buildTestAggregate(testCmd);
-        return testDomainService.saveTest(testAggregate);
+        this.submit(testAggregate);
+        return 0l;
+    }
+
+    /**
+     * 淇濆瓨骞舵彁浜�
+     *
+     * @param testCmd
+     * @return {@link int}
+     */
+    @Override
+    public Long SavaAndSubmitTest(TestCmd testCmd) {
+        TestAggregate testAggregate = TestFactory.buildTestAggregate(testCmd);
+        Long result = this.save(testAggregate);
+        this.submit(testAggregate);
+        return result;
+    }
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param testCmd
+     * @return {@link int}
+     */
+    @Override
+    public void Delete(TestCmd testCmd) {
+        TestAggregate testAggregate = TestFactory.buildTestAggregate(testCmd);
+        deleteTestEvent.DeleteVerify(testAggregate.getCode());
+        testRepository.remove(testAggregate);
+    }
+
+    /**
+     * 淇濆瓨鍏辩敤鏂规硶
+     *
+     * @param testAggregate
+     * @return {@link Long}
+     */
+    private Long save(TestAggregate testAggregate){
+        TestAggregate aggregate = testRepository.findByPersistentId(testAggregate.getId());
+        aggregate = aggregate.updata(testAggregate);
+        return testRepository.save(aggregate);
+    }
+
+    /**
+     * 鎻愪氦鍏辩敤鏂规硶
+     *
+     * @param testAggregate
+     * @return {@link TestAggregate}
+     */
+    private TestAggregate submit(TestAggregate testAggregate) {
+        testAggregate = testDomainService.submitTest(testAggregate);
+        String  message = testAggregate.BuildSubmitMessage();
+        // 姝ゅ璋冪敤flowRepository 鏍规嵁 涓氬姟鍗曞彿鑾峰彇瀹℃牳鐢ㄦ埛鍒楄〃
+        sendMessageEvent.send(message,"鑾峰彇鍒扮殑鐢ㄦ埛鍒楄〃");
+        return testAggregate;
     }
 }
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/aggregate/flow/FlowAggregate.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/aggregate/flow/FlowAggregate.java
new file mode 100644
index 0000000..1d737d5
--- /dev/null
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/aggregate/flow/FlowAggregate.java
@@ -0,0 +1,14 @@
+package com.seasky.dddtemplate.domain.aggregate.flow;
+
+import lombok.Data;
+
+@Data
+public class FlowAggregate {
+    private String status;
+    private String userCode;
+    private String flowID;
+
+    public void submit(String userCode){
+        this.userCode = userCode;
+    }
+}
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/aggregate/message/MessageAggregate.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/aggregate/message/MessageAggregate.java
new file mode 100644
index 0000000..8cd8d6c
--- /dev/null
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/aggregate/message/MessageAggregate.java
@@ -0,0 +1,5 @@
+package com.seasky.dddtemplate.domain.aggregate.message;
+
+public class MessageAggregate {
+
+}
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/aggregate/test/TestAggregate.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/aggregate/test/TestAggregate.java
index cf2bf96..c16bf66 100644
--- a/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/aggregate/test/TestAggregate.java
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/aggregate/test/TestAggregate.java
@@ -35,8 +35,33 @@ public class TestAggregate extends BaseAggregate {
      */
     private Integer age;
 
+    /**
+     * 鐘舵€�
+     */
+    private String status;
+
     @Override
     protected String iniDescribeName() {
         return "绀轰緥";
     }
+
+    public TestAggregate updata(TestAggregate aggregate) {
+        // 杩涜鏍¢獙 渚嬪骞撮緞澶т簬0 灏忎簬 150
+        // name code涓笉鑳芥湁鐗规畩瀛楃绛�
+        this.name = aggregate.name;
+        this.code = aggregate.code;
+        this.sex = aggregate.sex;
+        this.age = aggregate.age;
+        this.id = aggregate.id;
+        return this;
+    }
+
+    public TestAggregate submit(String status) {
+        this.status = status;
+        return this;
+    }
+
+    public String BuildSubmitMessage() {
+        return "";
+    }
 }
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/aggregate/test/TestRepository.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/aggregate/test/TestRepository.java
index f116a9e..52dc00c 100644
--- a/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/aggregate/test/TestRepository.java
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/aggregate/test/TestRepository.java
@@ -1,12 +1,14 @@
 package com.seasky.dddtemplate.domain.aggregate.test;
 
+import com.seasky.core.ddd.base.DddRepository;
+
 /**
  * 绀轰緥瀛樺偍搴�
  *
  * @author XueYawei
  * @date 2020/12/07
  */
-public interface TestRepository {
+public interface TestRepository extends DddRepository<TestAggregate> {
     /**
      * 淇濆瓨绀轰緥
      *
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/api/TestDomainService.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/api/TestDomainService.java
index 8c11e57..00ff77a 100644
--- a/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/api/TestDomainService.java
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/api/TestDomainService.java
@@ -10,10 +10,10 @@ import com.seasky.dddtemplate.domain.aggregate.test.TestAggregate;
  */
 public interface TestDomainService {
     /**
-     * 淇濆瓨绀轰緥
+     * 鎻愪氦绀轰緥
      *
      * @param testAggregate 娴嬭瘯aggregate
      * @return int
      */
-    int saveTest(TestAggregate testAggregate);
+    TestAggregate submitTest(TestAggregate testAggregate);
 }
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/event/DeleteTestEvent.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/event/DeleteTestEvent.java
new file mode 100644
index 0000000..55dafa1
--- /dev/null
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/event/DeleteTestEvent.java
@@ -0,0 +1,26 @@
+package com.seasky.dddtemplate.domain.event;
+
+import com.seasky.core.common.SpringContainer;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DeleteTestEvent extends ApplicationEvent {
+
+    public DeleteTestEvent() {
+        super("");
+    }
+
+    DeleteTestEvent(String userCode){
+        super(userCode);
+    }
+
+    /**
+     * 鍙戝竷娑堟伅
+     */
+    public void DeleteVerify(String userCode){
+        ApplicationEvent event = new DeleteTestEvent(userCode);
+        SpringContainer.getContainer().publishEvent(event);
+    }
+
+}
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/event/SendMessageEvent.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/event/SendMessageEvent.java
new file mode 100644
index 0000000..c164854
--- /dev/null
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/event/SendMessageEvent.java
@@ -0,0 +1,41 @@
+package com.seasky.dddtemplate.domain.event;
+
+import com.seasky.core.common.SpringContainer;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.stereotype.Service;
+
+/**
+ * 瀹氫箟涓€涓彂閫佹秷鎭殑event
+ *
+ */
+@Service
+public class SendMessageEvent extends ApplicationEvent {
+    String message; // 娑堟伅鍐呭
+    public String getMessage(){
+        return this.message;
+    }
+
+    String user;
+    public String getUser(){
+        return this.user;
+    }
+
+    public SendMessageEvent() {
+        super("");
+    }
+
+    SendMessageEvent(String message,String  user){
+        super(message);
+        this.message = message;
+        this.user = user;
+    }
+
+    /**
+     * 鍙戝竷娑堟伅
+     */
+    public void send(String message, String  user){
+        ApplicationEvent event = new SendMessageEvent(message, user);
+        SpringContainer.getContainer().publishEvent(event);
+    }
+
+}
\ No newline at end of file
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/service/FlowDomainServiceImpl.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/service/FlowDomainServiceImpl.java
new file mode 100644
index 0000000..951a570
--- /dev/null
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/service/FlowDomainServiceImpl.java
@@ -0,0 +1,17 @@
+package com.seasky.dddtemplate.domain.service;
+
+import com.seasky.dddtemplate.domain.event.DeleteTestEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Service;
+
+@Service
+public class FlowDomainServiceImpl {
+
+    @EventListener
+    @Order(0)
+    public void deleteTestVerify(DeleteTestEvent event) {
+        // 杩涜鍒犻櫎test鐨勬牎楠�
+        System.out.println("娴佺▼鏀跺埌鍒犻櫎浜嬩欢锛屽弬鏁�:" + event.getSource());//鑾峰彇鍙傛暟
+    }
+}
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/service/SendEmailDomainServiceImpl.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/service/SendEmailDomainServiceImpl.java
new file mode 100644
index 0000000..b29bf0b
--- /dev/null
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/service/SendEmailDomainServiceImpl.java
@@ -0,0 +1,18 @@
+package com.seasky.dddtemplate.domain.service;
+
+import com.seasky.dddtemplate.domain.event.SendMessageEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SendEmailDomainServiceImpl {
+
+    @EventListener
+    @Async
+    public void send(SendMessageEvent event) {
+        // 鎶奺vent杞垚 鍙戦€侀偖浠剁殑鑱氬悎
+        // 鐒跺悗鍘诲彂閫佹秷鎭�
+        System.out.println("閭欢娑堟伅鏀跺埌浜嬩欢锛屽弬鏁�:" + event.getMessage());//鑾峰彇鍙傛暟
+    }
+}
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/service/SendWXDomainServiceImpl.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/service/SendWXDomainServiceImpl.java
new file mode 100644
index 0000000..a1d59c3
--- /dev/null
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/service/SendWXDomainServiceImpl.java
@@ -0,0 +1,17 @@
+package com.seasky.dddtemplate.domain.service;
+
+import com.seasky.dddtemplate.domain.event.SendMessageEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SendWXDomainServiceImpl {
+    @EventListener
+    @Async
+    public void send(SendMessageEvent event) {
+        // 鎶奺vent杞垚 鍙戦€佸井淇$殑鑱氬悎
+        // 鐒跺悗鍘诲彂閫佹秷鎭�
+        System.out.println("寰俊娑堟伅鏀跺埌浜嬩欢锛屽弬鏁�:" + event.getMessage());//鑾峰彇鍙傛暟
+    }
+}
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/service/TestDomainServiceImpl.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/service/TestDomainServiceImpl.java
index b9cb828..7c004ca 100644
--- a/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/service/TestDomainServiceImpl.java
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/domain/service/TestDomainServiceImpl.java
@@ -4,7 +4,10 @@ package com.seasky.dddtemplate.domain.service;
 import com.seasky.dddtemplate.domain.aggregate.test.TestAggregate;
 import com.seasky.dddtemplate.domain.aggregate.test.TestRepository;
 import com.seasky.dddtemplate.domain.api.TestDomainService;
+import com.seasky.dddtemplate.domain.event.DeleteTestEvent;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.event.EventListener;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 /**
@@ -19,12 +22,36 @@ public class TestDomainServiceImpl implements TestDomainService {
     @Autowired
     TestRepository testRepository;
 
+
     /**
      * 涓氬姟鎿嶄綔
      */
     @Override
-    public int saveTest(TestAggregate testAggregate) {
+    public TestAggregate submitTest(TestAggregate testAggregate) {
         // 涓氬姟浠g爜
-        return testRepository.saveTest(testAggregate);
+        TestAggregate aggregate = testRepository.findByPersistentId(testAggregate.getId());
+
+        // 姝ゅ璋冪敤repository鑾峰彇鏁版嵁鍋氭牎楠�,姣斿宸ュ彿涓嶈兘閲嶅
+//
+//        FlowAggregate flowAggregate = flowRepository.findByTestCode(testAggregate.getCode());
+//        flowAggregate.submit(testAggregate.getCode());
+//
+//        if(aggregate.getAge()>50){
+//            flowAggregate = flowRepository.submitA(flowAggregate);
+//        } else {
+//            flowAggregate = flowRepository.submitB(flowAggregate);
+//        }
+//
+//        aggregate.submit(flowAggregate.getStatus());
+         testRepository.save(testAggregate);
+        return aggregate;
+    }
+
+
+    @EventListener
+    @Order(1)
+    public void deleteTestVerify(DeleteTestEvent event) {
+        // 杩涜鍒犻櫎test鐨勬牎楠�
+        System.out.println("Test鏀跺埌鍒犻櫎浜嬩欢锛屽弬鏁�:" + event.getSource());//鑾峰彇鍙傛暟
     }
 }
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/infrastructure/repository/test/TestRepositoryImpl.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/infrastructure/repository/test/TestRepositoryImpl.java
index 81b3069..0ec7f14 100644
--- a/ServiceSite/src/main/java/com/seasky/dddtemplate/infrastructure/repository/test/TestRepositoryImpl.java
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/infrastructure/repository/test/TestRepositoryImpl.java
@@ -3,6 +3,7 @@ package com.seasky.dddtemplate.infrastructure.repository.test;
 
 import com.seasky.core.common.Error;
 import com.seasky.core.common.ResponseCode;
+import com.seasky.core.ddd.base.DomainKeysMap;
 import com.seasky.core.exception.DataAccessException;
 import com.seasky.dddtemplate.dto.test.TestQueryQry;
 import com.seasky.dddtemplate.domain.aggregate.test.TestAggregate;
@@ -43,4 +44,29 @@ public class TestRepositoryImpl implements TestRepository {
 
         return testMapper.insert(testPo);
     }
+
+    @Override
+    public Long save(TestAggregate aggregate) {
+        return null;
+    }
+
+    @Override
+    public void remove(TestAggregate aggregate) {
+
+    }
+
+    @Override
+    public TestAggregate findByDomainKey(DomainKeysMap domainKeysMap) {
+        return null;
+    }
+
+    @Override
+    public Boolean isExistsByDomainKey(DomainKeysMap domainKeysMap) {
+        return null;
+    }
+
+    @Override
+    public TestAggregate findByPersistentId(Long aLong) {
+        return null;
+    }
 }
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/interfaces/controller/TestController.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/interfaces/controller/TestController.java
index fbf28da..53fa680 100644
--- a/ServiceSite/src/main/java/com/seasky/dddtemplate/interfaces/controller/TestController.java
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/interfaces/controller/TestController.java
@@ -3,19 +3,24 @@ package com.seasky.dddtemplate.interfaces.controller;
 
 import com.seasky.core.common.ResponseCode;
 import com.seasky.core.common.Result;
-import com.seasky.dddtemplate.api.ITest;
+import com.seasky.dddtemplate.api.ITestController;
 import com.seasky.dddtemplate.application.command.api.TestCmdService;
 import com.seasky.dddtemplate.application.query.TestQueryService;
 import com.seasky.dddtemplate.dto.test.TestCmd;
 import com.seasky.dddtemplate.dto.test.TestQueryOut;
 import com.seasky.dddtemplate.dto.test.TestQueryQry;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.List;
+
 import static com.seasky.core.common.Response.ok;
 
 /**
@@ -24,10 +29,9 @@ import static com.seasky.core.common.Response.ok;
  * @author XueYawei
  * @date 2020/12/07
  */
-@Api("Test")
 @RestController
 @RequestMapping("test")
-public class TestController extends BaseController implements ITest {
+public class TestController extends BaseController implements ITestController {
 
     @Autowired
     private TestCmdService testApplicationCmdService;
@@ -35,28 +39,64 @@ public class TestController extends BaseController implements ITest {
     private TestQueryService testQueryService;
 
     /**
-     * C绾跨ず渚�
+     * 鏌ヨ绀轰緥
      *
-     * @param testCmd
-     * @return {@link Object}
+     * @param testQry
+     * @return {@link Result<TestQueryOut>}
      */
-    @ApiOperation("1.testC")
     @Override
-    public Result<Integer> testC(@RequestBody TestCmd testCmd){
-        //TODO  淇濆瓨鐢ㄦ埛淇℃伅
-        return ok(ResponseCode.SUCCESS, testApplicationCmdService.saveTest(testCmd));
+    public Result<TestQueryOut> testQ(@RequestBody TestQueryQry testQry){
+        return ok(ResponseCode.SUCCESS, testQueryService.queryTestList(testQry));
     }
 
     /**
-     * Q绾跨ず渚�
+     * 瀵煎嚭
+     * 涓巘estQ鍚屾牱鑾峰彇鏁版嵁,浣嗚浆鎹㈡垚涓嶅悓鏁版嵁鏍煎紡杩斿洖
      *
      * @param testQry
-     * @return {@link Object}
+     * @return {@link ResponseEntity<byte[]>}
      */
-    @ApiOperation("1.testQ")
     @Override
-    public Result<TestQueryOut> testQ(@RequestBody TestQueryQry testQry){
-        //TODO 鏌ヨ鐢ㄦ埛闆嗗悎淇℃伅
-        return ok(ResponseCode.SUCCESS, testQueryService.queryTestList(testQry));
+    public ResponseEntity<byte[]> testExcelExport(@RequestBody TestQueryQry testQry) throws UnsupportedEncodingException {
+        List<TestQueryOut> list = testQueryService.queryTestList(testQry);
+
+        byte[] excelbyte = null; // 姝ゅ璋冪敤excel宸ュ叿绫昏浆鎴恊xcel
+        HttpHeaders header = new HttpHeaders();
+        header.add("Content-Length", "0");
+        header.add("Content-Disposition", "attachment;filename*=utf-8'zh_cn'" + URLEncoder.encode("xxxnanme", "UTF-8"));
+        return new ResponseEntity<>(excelbyte, header, HttpStatus.OK);
+    }
+
+    /**
+     * 淇濆瓨鑽夌ǹ
+     *
+     * @param testCmd
+     * @return {@link Result<Long>}
+     */
+    @Override
+    public Result<Long> testSave(TestCmd testCmd) {
+        return ok(ResponseCode.SUCCESS, testApplicationCmdService.SaveTest(testCmd));
+    }
+
+    /**
+     * 鎻愪氦
+     *
+     * @param testCmd
+     * @return {@link Result<Long>}
+     */
+    @Override
+    public Result<Long> testSubmit(TestCmd testCmd) {
+        return ok(ResponseCode.SUCCESS, testApplicationCmdService.SubmitTest(testCmd));
+    }
+
+    /**
+     * 淇濆瓨骞舵彁浜�
+     *
+     * @param testCmd
+     * @return {@link Result<Long>}
+     */
+    @Override
+    public Result<Long> testSaveAndSubmit(TestCmd testCmd) {
+        return  ok(ResponseCode.SUCCESS, testApplicationCmdService.SavaAndSubmitTest(testCmd));
     }
 }
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/interfaces/rpc/TestRPC.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/interfaces/rpc/TestRPC.java
new file mode 100644
index 0000000..648b094
--- /dev/null
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/interfaces/rpc/TestRPC.java
@@ -0,0 +1,4 @@
+package com.seasky.dddtemplate.interfaces.rpc;
+
+public class TestRPC {
+}
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/interfaces/soap/SOAPConfig.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/interfaces/soap/SOAPConfig.java
new file mode 100644
index 0000000..917ea00
--- /dev/null
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/interfaces/soap/SOAPConfig.java
@@ -0,0 +1,65 @@
+package com.seasky.dddtemplate.interfaces.soap;
+
+import com.seasky.dddtemplate.api.ITestWebService;
+import org.apache.cxf.Bus;
+import org.apache.cxf.bus.spring.SpringBus;
+import org.apache.cxf.jaxws.EndpointImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.xml.ws.Endpoint;
+
+
+@Configuration
+public class SOAPConfig {
+    @Autowired
+    private ITestWebService testWebServiceImpl;
+
+    @Autowired
+    private ITestWebService test2WebServiceImpl;
+
+    /**
+     * Apache CXF 鏍稿績鏋舵瀯鏄互BUS涓烘牳蹇冿紝鏁村悎鍏朵粬缁勪欢銆�
+     * Bus鏄疌XF鐨勪富骞�, 涓哄叡浜祫婧愭彁渚涗竴涓彲閰嶇疆鐨勫満鎵€锛屼綔鐢ㄧ被浼间簬Spring鐨凙pplicationContext锛岃繖浜涘叡浜祫婧愬寘鎷�
+     * WSDl绠$悊鍣ㄣ€佺粦瀹氬伐鍘傜瓑銆傞€氳繃瀵笲US杩涜鎵╁睍锛屽彲浠ユ柟渚垮湴瀹圭撼鑷繁鐨勮祫婧愶紝鎴栬€呮浛鎹㈢幇鏈夌殑璧勬簮銆傞粯璁us瀹炵幇鍩轰簬Spring鏋舵瀯锛�
+     * 閫氳繃渚濊禆娉ㄥ叆锛屽湪杩愯鏃跺皢缁勪欢涓茶仈璧锋潵銆侭usFactory璐熻矗Bus鐨勫垱寤恒€傞粯璁ょ殑BusFactory鏄疭pringBusFactory锛屽搴斾簬榛樿
+     * 鐨凚us瀹炵幇銆傚湪鏋勯€犺繃绋嬩腑锛孲pringBusFactory浼氭悳绱ETA-INF/cxf锛堝寘鍚湪 CXF 鐨刯ar涓級涓嬬殑鎵€鏈塨ean閰嶇疆鏂囦欢銆�
+     * 鏍规嵁杩欎簺閰嶇疆鏂囦欢鏋勫缓涓€涓狝pplicationContext銆傚紑鍙戣€呬篃鍙互鎻愪緵鑷繁鐨勯厤缃枃浠舵潵瀹氬埗Bus銆�
+     */
+    @Bean(name = Bus.DEFAULT_BUS_ID)
+    public SpringBus springBus() {
+        return new SpringBus();
+    }
+
+    /**
+     * 姝ゆ柟娉曚綔鐢ㄦ槸鏀瑰彉椤圭洰涓湇鍔″悕鐨勫墠缂€鍚嶏紝姝ゅ127.0.0.1鎴栬€卨ocalhost涓嶈兘璁块棶鏃讹紝璇蜂娇鐢╥pconfig鏌ョ湅鏈満ip鏉ヨ闂�
+     * 姝ゆ柟娉曡娉ㄩ噴鍚�, 鍗充笉鏀瑰彉鍓嶇紑鍚�(榛樿鏄痵ervices), wsdl璁块棶鍦板潃涓� http://127.0.0.1:8080/services/ws/api?wsdl
+     * 鍘绘帀娉ㄩ噴鍚巜sdl璁块棶鍦板潃涓猴細http://127.0.0.1:8080/soap/ws/api?wsdl
+     * http://127.0.0.1:8080/soap/鍒楀嚭鏈嶅姟鍒楄〃 鎴� http://127.0.0.1:8080/soap/ws/api?wsdl 鏌ョ湅瀹為檯鐨勬湇鍔�
+     * 鏂板缓Servlet璁板緱闇€瑕佸湪鍚姩绫绘坊鍔犳敞瑙o細@ServletComponentScan
+     *
+     * 濡傛灉鍚姩鏃跺嚭鐜伴敊璇細not loaded because DispatcherServlet Registration found non dispatcher servlet dispatcherServlet
+     * 鍙兘鏄痵pringboot涓巆fx鐗堟湰涓嶅吋瀹广€�
+     * 鍚屾椂鍦╯pring boot2.0.6涔嬪悗鐨勭増鏈笌xcf闆嗘垚锛屼笉闇€瑕佸湪瀹氫箟浠ヤ笅鏂规硶锛岀洿鎺ュ湪application.properties閰嶇疆鏂囦欢涓坊鍔狅細
+     * cxf.path=/service锛堥粯璁ゆ槸services锛�
+     */
+    //@Bean
+    //public ServletRegistrationBean dispatcherServlet() {
+    //    return new ServletRegistrationBean(new CXFServlet(), "/soap/*");
+    //}
+
+    @Bean
+    public Endpoint testendpoint() {
+        EndpointImpl endpoint = new EndpointImpl(springBus(), testWebServiceImpl);
+        endpoint.publish("/ws/api");
+        return endpoint;
+    }
+
+    @Bean
+    public Endpoint test2endpoint() {
+        EndpointImpl endpoint = new EndpointImpl(springBus(), test2WebServiceImpl);
+        endpoint.publish("/ws/api2");
+        return endpoint;
+    }
+}
diff --git a/ServiceSite/src/main/java/com/seasky/dddtemplate/interfaces/soap/TestWebService.java b/ServiceSite/src/main/java/com/seasky/dddtemplate/interfaces/soap/TestWebService.java
new file mode 100644
index 0000000..c1c9949
--- /dev/null
+++ b/ServiceSite/src/main/java/com/seasky/dddtemplate/interfaces/soap/TestWebService.java
@@ -0,0 +1,26 @@
+package com.seasky.dddtemplate.interfaces.soap;
+
+import com.seasky.core.common.ResponseCode;
+import com.seasky.core.common.Result;
+import com.seasky.dddtemplate.api.ITestWebService;
+import com.seasky.dddtemplate.application.query.TestQueryService;
+import com.seasky.dddtemplate.dto.test.TestQueryOut;
+import com.seasky.dddtemplate.dto.test.TestQueryQry;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.jws.WebService;
+import static com.seasky.core.common.Response.ok;
+
+@Component
+@WebService(name = "TestService", targetNamespace = "http://www.seaskysh.com",
+        endpointInterface = "com.seasky.dddtemplate.api.ITestWebService")
+public class TestWebService implements ITestWebService {
+    @Autowired
+    private TestQueryService testQueryService;
+
+    @Override
+    public Result<TestQueryOut> testQ(TestQueryQry testQry) {
+        return ok(ResponseCode.SUCCESS, testQueryService.queryTestList(testQry));
+    }
+}
diff --git a/ServiceSite/src/main/resources/application.properties b/ServiceSite/src/main/resources/application.properties
index b6b0966..42e86f8 100644
--- a/ServiceSite/src/main/resources/application.properties
+++ b/ServiceSite/src/main/resources/application.properties
@@ -1,6 +1,6 @@
 spring.application.name=dddtemplate-provider
 spring.profiles.active=@env@
-server.port=8008
+server.port=8009
 swagger.enable=true
 
 mybatis-plus.global-config.db-config.db-type=mysql
diff --git a/ServiceSite/src/main/resources/bootstrap.yml b/ServiceSite/src/main/resources/bootstrap.yml
index 139597f..7fd252b 100644
--- a/ServiceSite/src/main/resources/bootstrap.yml
+++ b/ServiceSite/src/main/resources/bootstrap.yml
@@ -1,2 +1,24 @@
+seasky:
+  version: @version@
+server:
+  port: 8009
+spring:
+  main:
+    allow-bean-definition-overriding: true
+  application:
+    name: dddtemplate-provider
+  profiles:
+    active: dev
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 192.168.1.80:8848
+      config:
+        server-addr: 192.168.1.80:8848
+        file-extension: properties
+    inetutils:
+      preferred-networks:
+        - 10.0.8
+
 
 
diff --git a/ServiceSite/src/test/java/com/seasky/dddtemplate/interfaces/controller/test/TestControllerTest.java b/ServiceSite/src/test/java/com/seasky/dddtemplate/interfaces/controller/test/TestControllerTest.java
index f4a6a98..279fd58 100644
--- a/ServiceSite/src/test/java/com/seasky/dddtemplate/interfaces/controller/test/TestControllerTest.java
+++ b/ServiceSite/src/test/java/com/seasky/dddtemplate/interfaces/controller/test/TestControllerTest.java
@@ -34,10 +34,10 @@ class TestControllerTest {
     @MethodSource("getTCStream")
     void testC(TestCmdTc testCase) {
         if(testCase.getIsPositiveCase()){//鏄惁涓烘甯稿叆鍙傚璞�
-            testCmdService.saveTest(testCase.getCmdParam());
+            testCmdService.SaveTest(testCase.getCmdParam());
         }else {//寮傚父鍏ュ弬瀵硅薄鎵ц
             assertThrows(testCase.getExpectExceptionType().getClass(),
-                    ()->testCmdService.saveTest(testCase.getCmdParam()),testCase.getFlag());
+                    ()->testCmdService.SaveTest(testCase.getCmdParam()),testCase.getFlag());
         }
 
         //楠岃瘉 浠ヤ笂鎺ュ彛鏄惁鎵ц鎴愬姛
-- 
GitLab