diff --git a/README.en.md b/README.en.md
deleted file mode 100644
index e028c40435c4f02d0948d827daf1672e912b9c14..0000000000000000000000000000000000000000
--- a/README.en.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# AMC-Cloud:自动化Mock组件服务项目
-
-#### Description
-AMC-Cloud(Automated Mock Component Cloud):自动化Mock组件服务项目,用来对外暴露接口提供服务。
-
-#### Software Architecture
-Software architecture description
-
-#### Installation
-
-1. xxxx
-2. xxxx
-3. xxxx
-
-#### Instructions
-
-1. xxxx
-2. xxxx
-3. xxxx
-
-#### Contribution
-
-1. Fork the repository
-2. Create Feat_xxx branch
-3. Commit your code
-4. Create Pull Request
-
-
-#### Gitee Feature
-
-1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
-2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
-3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
-4. The most valuable open source project [GVP](https://gitee.com/gvp)
-5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
-6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
diff --git a/application/pom.xml b/application/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..843629454e240bf148784b747f0b08c3bd931603
--- /dev/null
+++ b/application/pom.xml
@@ -0,0 +1,37 @@
+
+
+
+ amc-cloud-parent
+ cn.icanci.loopstack.amc
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ cloud-application
+
+
+ 8
+ 8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-logging
+
+
+
+
+ cn.icanci.loopstack.amc
+ cloud-facade
+ ${parent.version}
+
+
+
\ No newline at end of file
diff --git a/application/src/main/java/cn/icanci/loopstack/amc/cloud/application/MockCloudApplication.java b/application/src/main/java/cn/icanci/loopstack/amc/cloud/application/MockCloudApplication.java
new file mode 100644
index 0000000000000000000000000000000000000000..6d2846945ac7945996e7dbad4ed320ff9a8dbe50
--- /dev/null
+++ b/application/src/main/java/cn/icanci/loopstack/amc/cloud/application/MockCloudApplication.java
@@ -0,0 +1,17 @@
+package cn.icanci.loopstack.amc.cloud.application;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/16 15:25
+ */
+@ComponentScan(basePackages = { "cn.icanci.loopstack.amc.cloud", "cn.icanci.loopstack.amc.admin" })
+@SpringBootApplication
+public class MockCloudApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(MockCloudApplication.class, args);
+ }
+}
diff --git a/application/src/main/resources/application.yml b/application/src/main/resources/application.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c26f38c9cc80af608ee545fac437685f65d56a3c
--- /dev/null
+++ b/application/src/main/resources/application.yml
@@ -0,0 +1,28 @@
+server:
+ tomcat:
+ uri-encoding: UTF-8
+ port: 9996
+ servlet:
+ context-path: /
+
+logging:
+ config: classpath:log4j2.xml
+
+# 环境标识
+amc:
+ env: test
+
+# 接入方需要上报自己的信息给注册中心
+ddk:
+ env: test
+ load: true
+ client-port: 12000
+ server-ips: 127.0.0.1
+ server-port: 9998
+ app-id: lsi.bs.java.amc
+
+
+spring:
+ data:
+ mongodb:
+ uri: mongodb://127.0.0.1:27017/amc
\ No newline at end of file
diff --git a/application/src/main/resources/log4j2.xml b/application/src/main/resources/log4j2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6d98eec3bec1c24832906dba0ffebc1204584c15
--- /dev/null
+++ b/application/src/main/resources/log4j2.xml
@@ -0,0 +1,63 @@
+
+
+
+
+ ./logs
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %c{1.}#%M(%L) %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/biz/pom.xml b/biz/pom.xml
index 23ded5f6a27a9a21910ca37775296e35c7193d76..76d92c680ad295f10b94a7f53c5b3f73a1371e07 100644
--- a/biz/pom.xml
+++ b/biz/pom.xml
@@ -16,4 +16,37 @@
8
+
+
+ cn.icanci.loopstack.amc
+ cloud-dal
+ ${parent.version}
+
+
+ cn.icanci.loopstack.amc
+ cloud-trace
+ ${parent.version}
+
+
+ cn.icanci.loopstack.amc
+ cloud-common
+ ${parent.version}
+
+
+ cn.icanci.loopstack
+ lsi-script
+
+
+ cn.icanci.loopstack
+ lsi-event
+
+
+ org.aspectj
+ aspectjweaver
+
+
+ cn.icanci.loopstack.amc
+ amc-spi
+
+
\ No newline at end of file
diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/aop/MockCallAop.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/aop/MockCallAop.java
new file mode 100644
index 0000000000000000000000000000000000000000..a398d17e3232ba381b64d4802e74d5de15e92df8
--- /dev/null
+++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/aop/MockCallAop.java
@@ -0,0 +1,39 @@
+package cn.icanci.loopstack.amc.cloud.biz.aop;
+
+import cn.icanci.loopstack.amc.cloud.biz.event.call.MockCallEvent;
+import cn.icanci.loopstack.amc.cloud.common.model.MockCallWrapper;
+import cn.icanci.loopstack.lsi.event.EventDispatcher;
+
+import javax.annotation.Resource;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.stereotype.Component;
+
+/**
+ * AOP拦截
+ *
+ * @author icanci
+ * @since 1.0 Created in 2023/01/16 19:56
+ */
+@Aspect
+@Component
+public class MockCallAop {
+ @Resource
+ private EventDispatcher eventDispatcher;
+
+ @Pointcut("execution(public * cn.icanci.loopstack.amc.cloud.biz.service.impl.MockCallServiceImpl.mockCall(..))")
+ private void callAop() {
+
+ }
+
+ @Around("callAop()")
+ public Object doBefore(ProceedingJoinPoint pjp) throws Throwable {
+ Object[] args = pjp.getArgs();
+ Object returnVal = pjp.proceed();
+ eventDispatcher.fire(new MockCallEvent(String.valueOf(args[0]), String.valueOf(args[1]), (MockCallWrapper) returnVal), false);
+ return returnVal;
+ }
+}
diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/config/ConfigurationBeans.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/config/ConfigurationBeans.java
new file mode 100644
index 0000000000000000000000000000000000000000..4360d6a86b018937f19aa0c0f3c8f17ddf527904
--- /dev/null
+++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/config/ConfigurationBeans.java
@@ -0,0 +1,24 @@
+package cn.icanci.loopstack.amc.cloud.biz.config;
+
+import cn.icanci.loopstack.lsi.event.DefaultEventDispatcher;
+import cn.icanci.loopstack.lsi.event.EventDispatcher;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author icanci(1205068)
+ * @version Id: Config, v 0.1 2022/12/24 20:22 icanci Exp $
+ */
+@Configuration
+public class ConfigurationBeans {
+ /**
+ * 事件分发器
+ *
+ * @return 返回事件分发器
+ */
+ @Bean(name = "eventDispatcher")
+ public EventDispatcher eventDispatcher() {
+ return new DefaultEventDispatcher();
+ }
+}
\ No newline at end of file
diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/ddk/DDKResource.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/ddk/DDKResource.java
new file mode 100644
index 0000000000000000000000000000000000000000..0167d69fda52f32185d8fb5e2baf5510a65d540c
--- /dev/null
+++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/ddk/DDKResource.java
@@ -0,0 +1,44 @@
+package cn.icanci.loopstack.amc.cloud.biz.ddk;
+
+import cn.icanci.loopstack.amc.cloud.biz.repository.AmcMockCallRepository;
+import cn.icanci.loopstack.ddk.common.anno.DdkAfterCall;
+import cn.icanci.loopstack.ddk.common.anno.DdkBeforeCall;
+import cn.icanci.loopstack.ddk.common.anno.DdkCall;
+import cn.icanci.loopstack.ddk.common.anno.DdkResource;
+
+import javax.annotation.Resource;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/16 15:34
+ */
+@Service
+@DdkResource("#mock.cloud.notice")
+public class DDKResource {
+
+ private final Logger logger = LoggerFactory.getLogger(DDKResource.class);
+
+ @Resource
+ private AmcMockCallRepository amcMockCallRepository;
+
+ @DdkBeforeCall
+ private synchronized void ddkBeforeCall(String mockCallUuid) {
+ // No Op
+ }
+
+ @DdkCall
+ private synchronized void ddkCall(String mockCallUuid) {
+ logger.info("[DDKResource][ddkCall] mockCallUuid:{}, now is Start", mockCallUuid);
+ amcMockCallRepository.refresh(mockCallUuid);
+ logger.info("[DDKResource][ddkCall] mockCallUuid:{}, now is End", mockCallUuid);
+ }
+
+ @DdkAfterCall
+ private synchronized void ddkAfterCall(String mockCallUuid) {
+ // No Op
+ }
+}
diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/AmcCloudEvent.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/AmcCloudEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..c32b1b112125ef142c6b344f433f677e2fa6645c
--- /dev/null
+++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/AmcCloudEvent.java
@@ -0,0 +1,11 @@
+package cn.icanci.loopstack.amc.cloud.biz.event;
+
+import cn.icanci.loopstack.lsi.event.BaseEvent;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/07 22:26
+ */
+public class AmcCloudEvent extends BaseEvent {
+
+}
diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/call/MockCallEvent.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/call/MockCallEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..92a10ce394d8aec22b6a07569b495bf3d56a252e
--- /dev/null
+++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/call/MockCallEvent.java
@@ -0,0 +1,59 @@
+package cn.icanci.loopstack.amc.cloud.biz.event.call;
+
+import cn.icanci.loopstack.amc.cloud.biz.event.AmcCloudEvent;
+import cn.icanci.loopstack.amc.cloud.common.model.MockCallWrapper;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/16 20:09
+ */
+@Component
+public class MockCallEvent extends AmcCloudEvent {
+ /**
+ * Mock 请求uuid
+ */
+ private String mockCallUuid;
+ /**
+ * mock请求参数
+ */
+ private String mockCallRequest;
+ /**
+ * Mock请求Wrapper
+ */
+ private MockCallWrapper wrapper;
+
+ public MockCallEvent() {
+ }
+
+ public MockCallEvent(String mockCallUuid, String mockCallRequest, MockCallWrapper wrapper) {
+ this.mockCallUuid = mockCallUuid;
+ this.mockCallRequest = mockCallRequest;
+ this.wrapper = wrapper;
+ }
+
+ public String getMockCallRequest() {
+ return mockCallRequest;
+ }
+
+ public void setMockCallRequest(String mockCallRequest) {
+ this.mockCallRequest = mockCallRequest;
+ }
+
+ public String getMockCallUuid() {
+ return mockCallUuid;
+ }
+
+ public void setMockCallUuid(String mockCallUuid) {
+ this.mockCallUuid = mockCallUuid;
+ }
+
+ public MockCallWrapper getWrapper() {
+ return wrapper;
+ }
+
+ public void setWrapper(MockCallWrapper wrapper) {
+ this.wrapper = wrapper;
+ }
+}
diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/call/MockCallEventListener.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/call/MockCallEventListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d7b8ab02da94a812da9c069f82eccb5210dffd2
--- /dev/null
+++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/event/call/MockCallEventListener.java
@@ -0,0 +1,30 @@
+package cn.icanci.loopstack.amc.cloud.biz.event.call;
+
+import cn.icanci.loopstack.amc.cloud.biz.service.AppMockTestService;
+import cn.icanci.loopstack.lsi.event.BaseEventListener;
+
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Service;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/16 20:10
+ */
+@Service
+public class MockCallEventListener extends BaseEventListener {
+
+ @Resource
+ private AppMockTestService appMockTestService;
+
+ @Override
+ protected void event(MockCallEvent event) {
+ appMockTestService.log(event.getMockCallUuid(), event.getMockCallRequest(), event.getWrapper());
+ }
+
+ @Override
+ protected boolean isSupport(MockCallEvent event) {
+ // 确定标准
+ return event.getWrapper() != null;
+ }
+}
diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/exception/MockCallScriptException.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/exception/MockCallScriptException.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac4a5d3ded98246069a9733d32919559f17748b3
--- /dev/null
+++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/exception/MockCallScriptException.java
@@ -0,0 +1,27 @@
+package cn.icanci.loopstack.amc.cloud.biz.exception;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/16 20:33
+ */
+public class MockCallScriptException extends RuntimeException {
+ public MockCallScriptException() {
+ super();
+ }
+
+ public MockCallScriptException(String message) {
+ super(message);
+ }
+
+ public MockCallScriptException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public MockCallScriptException(Throwable cause) {
+ super(cause);
+ }
+
+ protected MockCallScriptException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
+ }
+}
diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/package-info.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..14474b73bcc40dc34c964fb2bdc2d23de232bb41
--- /dev/null
+++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/16 15:33
+ */
+package cn.icanci.loopstack.amc.cloud.biz;
\ No newline at end of file
diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/repository/AmcMockCallHolder.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/repository/AmcMockCallHolder.java
new file mode 100644
index 0000000000000000000000000000000000000000..f823f77fe6c399db226cad55fd7d508792111297
--- /dev/null
+++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/repository/AmcMockCallHolder.java
@@ -0,0 +1,130 @@
+package cn.icanci.loopstack.amc.cloud.biz.repository;
+
+import cn.icanci.loopstack.amc.spi.mock.MockCallStandardHandler;
+import cn.icanci.loopstack.script.enums.ScriptTypeEnum;
+
+import javax.script.Compilable;
+import javax.script.CompiledScript;
+import javax.script.ScriptEngine;
+
+/**
+ * 脚本执行数据持有者
+ * - 如果是mvel2.0脚本,则不会有handlerClass和instance
+ * - 如果是groovy脚本
+ * - 如果不是 {cn.icanci.loopstack.amc.spi.mock.MockCallStandardHandler}的实现类,则不会有handlerClass和instance
+ * - 如果是 {cn.icanci.loopstack.amc.spi.mock.MockCallStandardHandler}的实现类,则有handlerClass和instance
+ *
+ * @author icanci
+ * @since 1.0 Created in 2023/01/16 15:44
+ */
+public class AmcMockCallHolder {
+ /**
+ * mock uuid
+ */
+ private String mockCallUuid;
+ /**
+ * mock uuid
+ */
+ private String mockCallName;
+ /**
+ * 脚本类型
+ */
+ private ScriptTypeEnum scriptType;
+ /**
+ * 脚本内容
+ */
+ private String scriptContent;
+ /**
+ * 脚本执行引擎
+ */
+ private ScriptEngine scriptEngine;
+ /**
+ * 脚本执行引擎编译器,如果脚本执行引擎实现了Compilable
+ * 那么 scriptEngine 和 compilable 则是同一个对象
+ */
+ private Compilable compilable;
+ /**
+ * 通过 Compilable 编译 scriptContent 之后的实例对象
+ */
+ private CompiledScript compiledScript;
+ /**
+ * 处理器groovy脚本Invoke类型
+ */
+ private Class handlerClass;
+ /**
+ * handlerClass 实例化对象
+ */
+ private MockCallStandardHandler instance;
+
+ public String getMockCallUuid() {
+ return mockCallUuid;
+ }
+
+ public void setMockCallUuid(String mockCallUuid) {
+ this.mockCallUuid = mockCallUuid;
+ }
+
+ public String getMockCallName() {
+ return mockCallName;
+ }
+
+ public void setMockCallName(String mockCallName) {
+ this.mockCallName = mockCallName;
+ }
+
+ public ScriptTypeEnum getScriptType() {
+ return scriptType;
+ }
+
+ public void setScriptType(ScriptTypeEnum scriptType) {
+ this.scriptType = scriptType;
+ }
+
+ public String getScriptContent() {
+ return scriptContent;
+ }
+
+ public void setScriptContent(String scriptContent) {
+ this.scriptContent = scriptContent;
+ }
+
+ public ScriptEngine getScriptEngine() {
+ return scriptEngine;
+ }
+
+ public void setScriptEngine(ScriptEngine scriptEngine) {
+ this.scriptEngine = scriptEngine;
+ }
+
+ public Compilable getCompilable() {
+ return compilable;
+ }
+
+ public void setCompilable(Compilable compilable) {
+ this.compilable = compilable;
+ }
+
+ public CompiledScript getCompiledScript() {
+ return compiledScript;
+ }
+
+ public void setCompiledScript(CompiledScript compiledScript) {
+ this.compiledScript = compiledScript;
+ }
+
+ public Class getHandlerClass() {
+ return handlerClass;
+ }
+
+ public void setHandlerClass(Class handlerClass) {
+ this.handlerClass = handlerClass;
+ }
+
+ public MockCallStandardHandler getInstance() {
+ return instance;
+ }
+
+ public void setInstance(MockCallStandardHandler instance) {
+ this.instance = instance;
+ }
+}
diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/repository/AmcMockCallRepository.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/repository/AmcMockCallRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..3f1e5e00431c64a0f3007338a068fb2ea0cf1be9
--- /dev/null
+++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/repository/AmcMockCallRepository.java
@@ -0,0 +1,150 @@
+package cn.icanci.loopstack.amc.cloud.biz.repository;
+
+import cn.icanci.loopstack.amc.cloud.biz.exception.MockCallScriptException;
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.AppMockCallDAO;
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.AppMockCallDO;
+import cn.icanci.loopstack.amc.spi.mock.MockCallStandardHandler;
+import cn.icanci.loopstack.script.LsiScriptEngineFactory;
+import cn.icanci.loopstack.script.compile.GroovyClassLoaderHolder;
+import cn.icanci.loopstack.script.enums.ScriptTypeEnum;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.annotation.Resource;
+import javax.script.Compilable;
+import javax.script.CompiledScript;
+import javax.script.ScriptEngine;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/16 15:36
+ */
+@Service
+public class AmcMockCallRepository {
+
+ private final Logger logger = LoggerFactory.getLogger(AmcMockCallRepository.class);
+ /**
+ * 判断是否是第一次加载 变量标识
+ */
+ private static final AtomicBoolean ATOMIC_BOOLEAN_REFRESHED = new AtomicBoolean(false);
+
+ /**
+ * 执行缓存
+ *
+ * key: uuid
+ * value: 配置数据
+ */
+ private static final Map MOCK_CALL_HOLDER_MAP = new ConcurrentHashMap<>();
+
+ @Resource
+ private AppMockCallDAO appMockCallDAO;
+
+ /**
+ * 刷新本地执行仓储
+ *
+ * @param mockCallUuid mockCallUuid
+ */
+ public void refresh(String mockCallUuid) {
+ // 1.判断是否是第一次加载
+ if (!ATOMIC_BOOLEAN_REFRESHED.get()) {
+ // 1.1 如果是第一次加载,则加载所有的数据,然后再加载mockCallUuid
+ refreshAll();
+ // 1.1.1 加载结束之后设置标识
+ ATOMIC_BOOLEAN_REFRESHED.compareAndSet(false, true);
+ }
+ // 1.2 如果不是第一次加载,则加载mockCallUuid
+ refreshForUuid(mockCallUuid);
+ }
+
+ /**
+ * 刷新缓存所有数据
+ */
+ private void refreshAll() {
+ List appMockCallList = appMockCallDAO.queryAll();
+ if (CollectionUtils.isEmpty(appMockCallList)) {
+ logger.warn("[AmcMockCallRepository][refreshAll] appMockCallList is Empty!");
+ return;
+ }
+ for (AppMockCallDO appMockCall : appMockCallList) {
+ if (appMockCall.getIsDelete() == 1) {
+ continue;
+ }
+ refresh(appMockCall);
+ }
+ }
+
+ /**
+ * 刷新单独组件
+ *
+ * @param appMockCall appMockCall
+ */
+ private void refresh(AppMockCallDO appMockCall) {
+ try {
+ String appMockUuid = appMockCall.getUuid();
+ ScriptTypeEnum scriptType = ScriptTypeEnum.valueOf(appMockCall.getScriptType());
+ String script = appMockCall.getScript();
+
+ AmcMockCallHolder holder = new AmcMockCallHolder();
+ holder.setMockCallUuid(appMockUuid);
+ holder.setMockCallName(appMockCall.getMockName());
+ holder.setScriptType(scriptType);
+ holder.setScriptContent(script);
+
+ ScriptEngine scriptEngine = LsiScriptEngineFactory.getScriptEngine(scriptType);
+ holder.setScriptEngine(scriptEngine);
+ if (scriptEngine instanceof Compilable) {
+ Compilable compilable = (Compilable) scriptEngine;
+ holder.setCompilable(compilable);
+ CompiledScript compile = compilable.compile(script);
+ holder.setCompiledScript(compile);
+ }
+ Class> compileClass = GroovyClassLoaderHolder.compile(script);
+ Object instance = compileClass.newInstance();
+ if (instance instanceof MockCallStandardHandler) {
+ holder.setHandlerClass((Class) compileClass);
+ // TODO 后置处理器 注入一些工具bean之类,此版本暂时没有
+ holder.setInstance((MockCallStandardHandler) instance);
+ }
+ MOCK_CALL_HOLDER_MAP.put(appMockUuid, holder);
+ } catch (Exception ex) {
+ logger.error("[AmcMockCallRepository][refresh] Compile Script error:{}", ex.getLocalizedMessage());
+ throw new MockCallScriptException(ex);
+ }
+ }
+
+ /**
+ * 只刷新指定的uuid
+ *
+ * @param mockCallUuid mockCallUuid
+ */
+ private void refreshForUuid(String mockCallUuid) {
+ AppMockCallDO appMockCall = appMockCallDAO.queryByUuid(mockCallUuid);
+ if (appMockCall == null) {
+ logger.warn("[AmcMockCallRepository][refreshForUuid] appMockCall is Null!");
+ return;
+ }
+ if (appMockCall.getIsDelete() == 1) {
+ logger.warn("[AmcMockCallRepository][refreshForUuid] appMockCall is Offline!");
+ return;
+ }
+ refresh(appMockCall);
+ }
+
+ /**
+ * 获取仓储数据
+ *
+ * @param mockCallUuid mockCallUuid
+ * @return 返回仓储数据
+ */
+ public AmcMockCallHolder getAmcMockCallHolder(String mockCallUuid) {
+ return MOCK_CALL_HOLDER_MAP.get(mockCallUuid);
+ }
+}
diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/AppMockTestService.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/AppMockTestService.java
new file mode 100644
index 0000000000000000000000000000000000000000..a97234c02371be3ac2c7aa4d1d6a9741a1835a22
--- /dev/null
+++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/AppMockTestService.java
@@ -0,0 +1,21 @@
+package cn.icanci.loopstack.amc.cloud.biz.service;
+
+import cn.icanci.loopstack.amc.cloud.common.model.MockCallWrapper;
+
+/**
+ * 记录执行日志
+ *
+ * @author icanci
+ * @since 1.0 Created in 2023/01/17 22:50
+ */
+public interface AppMockTestService {
+
+ /**
+ * 记录操作轨迹日志
+ *
+ * @param mockUuid mockUuid
+ * @param request 执行请求
+ * @param wrapper Wrapper对象
+ */
+ void log(String mockUuid, String request, MockCallWrapper wrapper);
+}
diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/MockCallService.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/MockCallService.java
new file mode 100644
index 0000000000000000000000000000000000000000..00f21e1d648d83c5a57446e0f15f3ee4aff312ea
--- /dev/null
+++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/MockCallService.java
@@ -0,0 +1,18 @@
+package cn.icanci.loopstack.amc.cloud.biz.service;
+
+import cn.icanci.loopstack.amc.cloud.common.model.MockCallWrapper;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/16 15:52
+ */
+public interface MockCallService {
+ /**
+ * mockCall
+ *
+ * @param mockCallUuid mockCallUuid
+ * @param mockRequest mockRequest
+ * @return 执行结果包装器
+ */
+ MockCallWrapper mockCall(String mockCallUuid, String mockRequest);
+}
diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/impl/AppMockTestServiceImpl.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/impl/AppMockTestServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..9bfd846af24cfa2fc4e363ea56897fbd5354f68f
--- /dev/null
+++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/impl/AppMockTestServiceImpl.java
@@ -0,0 +1,39 @@
+package cn.icanci.loopstack.amc.cloud.biz.service.impl;
+
+import cn.hutool.json.JSONUtil;
+import cn.icanci.loopstack.amc.cloud.biz.service.AppMockTestService;
+import cn.icanci.loopstack.amc.cloud.common.model.MockCallWrapper;
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.AppMockCallReportDAO;
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.AppMockCallReportDO;
+
+import javax.annotation.Resource;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/17 22:57
+ */
+@Service
+public class AppMockTestServiceImpl implements AppMockTestService {
+ private static final Logger logger = LoggerFactory.getLogger(AppMockTestServiceImpl.class);
+
+ @Resource
+ private AppMockCallReportDAO appMockCallReportDAO;
+
+ @Override
+ public void log(String mockUuid, String request, MockCallWrapper wrapper) {
+ logger.info("[AppMockTestService][log] mockUuid:{},request:{},wrapper:{}", mockUuid, request, JSONUtil.toJsonStr(wrapper));
+
+ AppMockCallReportDO report = new AppMockCallReportDO();
+ report.setSuccess(wrapper.isSuccess());
+ report.setMockName(wrapper.getMockName());
+ report.setMockUuid(wrapper.getMockUuid());
+ report.setMockRequest(wrapper.getMockRequest());
+ report.setMockErrorMessage(wrapper.getMockErrorMessage());
+ report.setMockResponse(JSONUtil.toJsonStr(wrapper.getMockResponse()));
+ appMockCallReportDAO.insert(report);
+ }
+}
diff --git a/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/impl/MockCallServiceImpl.java b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/impl/MockCallServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..6fa14c00c016281de0bc4dbb74a1637f2a085474
--- /dev/null
+++ b/biz/src/main/java/cn/icanci/loopstack/amc/cloud/biz/service/impl/MockCallServiceImpl.java
@@ -0,0 +1,65 @@
+package cn.icanci.loopstack.amc.cloud.biz.service.impl;
+
+import cn.hutool.json.JSONUtil;
+import cn.icanci.loopstack.amc.cloud.biz.repository.AmcMockCallHolder;
+import cn.icanci.loopstack.amc.cloud.biz.repository.AmcMockCallRepository;
+import cn.icanci.loopstack.amc.cloud.biz.service.MockCallService;
+import cn.icanci.loopstack.amc.cloud.common.model.MockCallWrapper;
+
+import javax.annotation.Resource;
+import javax.script.SimpleBindings;
+
+import org.springframework.stereotype.Service;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/16 15:53
+ */
+@Service
+public class MockCallServiceImpl implements MockCallService {
+ @Resource
+ private AmcMockCallRepository amcMockCallRepository;
+
+ @Override
+ public MockCallWrapper mockCall(String mockCallUuid, String mockRequest) {
+ AmcMockCallHolder holder = amcMockCallRepository.getAmcMockCallHolder(mockCallUuid);
+ if (holder == null) {
+ return MockCallWrapper.fail(mockCallUuid, "Cannot found the Mock Config for:" + mockCallUuid);
+ }
+
+ try {
+ SimpleBindings simpleBindings = JSONUtil.toBean(mockRequest, SimpleBindings.class);
+
+ Object ret = null;
+ // 优先处理实例
+ if (holder.getInstance() != null) {
+ ret = holder.getInstance().execute(mockRequest);
+ } else if (holder.getCompiledScript() != null) {
+ ret = holder.getCompiledScript().eval(simpleBindings);
+ } else {
+ ret = holder.getScriptEngine().eval(holder.getScriptContent(), simpleBindings);
+ }
+ return buildWrapper(ret, holder, mockRequest);
+ } catch (Exception e) {
+ return MockCallWrapper.fail(mockCallUuid, holder.getMockCallName(), mockRequest, "Invoke Script error:" + e.getLocalizedMessage());
+ }
+ }
+
+ /**
+ * 返回 Wrapper
+ *
+ * @param ret 脚本执行返回结果
+ * @param holder mock配置持有者
+ * @param mockRequest mock 请求
+ * @return 返回Wrapper
+ */
+ private MockCallWrapper buildWrapper(Object ret, AmcMockCallHolder holder, String mockRequest) {
+ MockCallWrapper wrapper = new MockCallWrapper();
+ wrapper.setSuccess(true);
+ wrapper.setMockName(holder.getMockCallName());
+ wrapper.setMockUuid(holder.getMockCallUuid());
+ wrapper.setMockRequest(mockRequest);
+ wrapper.setMockResponse(ret);
+ return wrapper;
+ }
+}
diff --git a/biz/src/test/java/cn/icanci/loopstack/amc/cloud/biz/repository/test/TestHandler.java b/biz/src/test/java/cn/icanci/loopstack/amc/cloud/biz/repository/test/TestHandler.java
new file mode 100644
index 0000000000000000000000000000000000000000..8324cdc7b2424c25e32afa1722403bb10af86427
--- /dev/null
+++ b/biz/src/test/java/cn/icanci/loopstack/amc/cloud/biz/repository/test/TestHandler.java
@@ -0,0 +1,184 @@
+package cn.icanci.loopstack.amc.cloud.biz.repository.test;
+
+import cn.hutool.json.JSONUtil;
+import cn.icanci.loopstack.amc.spi.mock.MockCallStandardHandler;
+
+/**
+ * 测试TestHandler处理器
+ *
+ * @author icanci
+ * @since 1.0 Created in 2023/01/17 18:48
+ */
+public class TestHandler extends MockCallStandardHandler {
+
+ @Override
+ public Object execute(Object request) throws Exception {
+ QuotaRequest bean = JSONUtil.toBean(String.valueOf(request), QuotaRequest.class);
+ Quota quota = new Quota();
+ quota.setMethod(bean.getUuid());
+ quota.setResourceType(bean.getUuid());
+ quota.setSource(bean.getUuid());
+ quota.setPrepayValidateCount(bean.getUuid());
+ quota.setBookCount(bean.getUuid());
+ quota.setConversionRate(System.currentTimeMillis());
+ return quota;
+ }
+
+ public static class QuotaRequest {
+ private String uuid;
+
+ public String getUuid() {
+ return uuid;
+ }
+
+ public void setUuid(String uuid) {
+ this.uuid = uuid;
+ }
+ }
+
+ public static class Quota {
+ String method = "ALL";
+ String resourceType;
+ String source;
+ String prepayValidateCount;
+ String bookCount;
+ long conversionRate;
+
+ public String getMethod() {
+ return method;
+ }
+
+ public void setMethod(String method) {
+ this.method = method;
+ }
+
+ public String getResourceType() {
+ return resourceType;
+ }
+
+ public void setResourceType(String resourceType) {
+ this.resourceType = resourceType;
+ }
+
+ public String getSource() {
+ return source;
+ }
+
+ public void setSource(String source) {
+ this.source = source;
+ }
+
+ public String getPrepayValidateCount() {
+ return prepayValidateCount;
+ }
+
+ public void setPrepayValidateCount(String prepayValidateCount) {
+ this.prepayValidateCount = prepayValidateCount;
+ }
+
+ public String getBookCount() {
+ return bookCount;
+ }
+
+ public void setBookCount(String bookCount) {
+ this.bookCount = bookCount;
+ }
+
+ public long getConversionRate() {
+ return conversionRate;
+ }
+
+ public void setConversionRate(long conversionRate) {
+ this.conversionRate = conversionRate;
+ }
+ }
+}
+
+// Tips 脚本内容
+// import cn.hutool.json.JSONUtil;
+// import cn.icanci.loopstack.amc.spi.mock.MockCallStandardHandler;
+//
+// public class TestHandler extends MockCallStandardHandler {
+//å
+// @Override
+// public Object execute(Object request) throws Exception {
+// QuotaRequest bean = JSONUtil.toBean(String.valueOf(request), QuotaRequest.class);
+// Quota quota = new Quota();
+// quota.setMethod(bean.getUuid());
+// quota.setResourceType(bean.getUuid());
+// quota.setSource(bean.getUuid());
+// quota.setPrepayValidateCount(bean.getUuid());
+// quota.setBookCount(bean.getUuid());
+// quota.setConversionRate(System.currentTimeMillis());
+// return quota;
+// }
+//
+// public static class QuotaRequest {
+// private String uuid;
+//
+// public String getUuid() {
+// return uuid;
+// }
+//
+// public void setUuid(String uuid) {
+// this.uuid = uuid;
+// }
+// }
+//
+// public static class Quota {
+// String method = "ALL";
+// String resourceType;
+// String source;
+// String prepayValidateCount;
+// String bookCount;
+// long conversionRate;
+//
+// public String getMethod() {
+// return method;
+// }
+//
+// public void setMethod(String method) {
+// this.method = method;
+// }
+//
+// public String getResourceType() {
+// return resourceType;
+// }
+//
+// public void setResourceType(String resourceType) {
+// this.resourceType = resourceType;
+// }
+//
+// public String getSource() {
+// return source;
+// }
+//
+// public void setSource(String source) {
+// this.source = source;
+// }
+//
+// public String getPrepayValidateCount() {
+// return prepayValidateCount;
+// }
+//
+// public void setPrepayValidateCount(String prepayValidateCount) {
+// this.prepayValidateCount = prepayValidateCount;
+// }
+//
+// public String getBookCount() {
+// return bookCount;
+// }
+//
+// public void setBookCount(String bookCount) {
+// this.bookCount = bookCount;
+// }
+//
+// public long getConversionRate() {
+// return conversionRate;
+// }
+//
+// public void setConversionRate(long conversionRate) {
+// this.conversionRate = conversionRate;
+// }
+// }
+//}
\ No newline at end of file
diff --git a/trace/pom.xml b/common/pom.xml
similarity index 93%
rename from trace/pom.xml
rename to common/pom.xml
index fdadfa00985fc60c1284a307f199b5ad2b64d8b6..bb25e22baa58e354dbffc8c22bf0f46da4b75247 100644
--- a/trace/pom.xml
+++ b/common/pom.xml
@@ -9,11 +9,10 @@
4.0.0
- cloud-trace
+ cloud-common
8
8
-
\ No newline at end of file
diff --git a/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/exception/UnSupportWrapperException.java b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/exception/UnSupportWrapperException.java
new file mode 100644
index 0000000000000000000000000000000000000000..c8649c29be1cc164f640bc91da8c8d6f975272dd
--- /dev/null
+++ b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/exception/UnSupportWrapperException.java
@@ -0,0 +1,27 @@
+package cn.icanci.loopstack.amc.cloud.common.exception;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/17 11:16
+ */
+public class UnSupportWrapperException extends RuntimeException {
+ public UnSupportWrapperException() {
+ super();
+ }
+
+ public UnSupportWrapperException(String message) {
+ super(message);
+ }
+
+ public UnSupportWrapperException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public UnSupportWrapperException(Throwable cause) {
+ super(cause);
+ }
+
+ protected UnSupportWrapperException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
+ }
+}
diff --git a/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/model/MockCallWrapper.java b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/model/MockCallWrapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..3e32474c0e476bdf2f32a5b2ef8ff35557054ded
--- /dev/null
+++ b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/model/MockCallWrapper.java
@@ -0,0 +1,118 @@
+package cn.icanci.loopstack.amc.cloud.common.model;
+
+import java.io.Serializable;
+
+/**
+ * MockFacade执行请求返回结果
+ *
+ * @author icanci
+ * @since 1.0 Created in 2023/01/16 15:20
+ */
+public class MockCallWrapper implements Serializable {
+ /**
+ * mock 过程是否成功
+ */
+ private boolean success;
+ /**
+ * mockName
+ */
+ private String mockName;
+ /**
+ * mockUuid
+ */
+ private String mockUuid;
+ /**
+ * mock执行的请求
+ */
+ private String mockRequest;
+ /**
+ * mock执行的异常信息
+ */
+ private String mockErrorMessage;
+ /**
+ * 真正mock返回的结果
+ */
+ private Object mockResponse;
+
+ /**
+ * 失败
+ *
+ * @param mockUuid mockUuid
+ * @param message message
+ * @return Wrapper
+ */
+ public static MockCallWrapper fail(String mockUuid, String message) {
+ MockCallWrapper wrapper = new MockCallWrapper();
+ wrapper.setSuccess(false);
+ wrapper.setMockUuid(mockUuid);
+ wrapper.setMockErrorMessage(message);
+ return wrapper;
+ }
+
+ /**
+ * 失败
+ *
+ * @param mockUuid mockUuid
+ * @param mockName mockName
+ * @param mockRequest mockRequest
+ * @param message message
+ * @return 返回结果
+ */
+ public static MockCallWrapper fail(String mockUuid, String mockName, String mockRequest, String message) {
+ MockCallWrapper wrapper = new MockCallWrapper();
+ wrapper.setSuccess(false);
+ wrapper.setMockName(mockName);
+ wrapper.setMockUuid(mockUuid);
+ wrapper.setMockRequest(mockRequest);
+ wrapper.setMockErrorMessage(message);
+ return wrapper;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public String getMockName() {
+ return mockName;
+ }
+
+ public void setMockName(String mockName) {
+ this.mockName = mockName;
+ }
+
+ public String getMockUuid() {
+ return mockUuid;
+ }
+
+ public void setMockUuid(String mockUuid) {
+ this.mockUuid = mockUuid;
+ }
+
+ public String getMockRequest() {
+ return mockRequest;
+ }
+
+ public void setMockRequest(String mockRequest) {
+ this.mockRequest = mockRequest;
+ }
+
+ public String getMockErrorMessage() {
+ return mockErrorMessage;
+ }
+
+ public void setMockErrorMessage(String mockErrorMessage) {
+ this.mockErrorMessage = mockErrorMessage;
+ }
+
+ public Object getMockResponse() {
+ return mockResponse;
+ }
+
+ public void setMockResponse(Object mockResponse) {
+ this.mockResponse = mockResponse;
+ }
+}
diff --git a/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/request/MockCallRequest.java b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/request/MockCallRequest.java
new file mode 100644
index 0000000000000000000000000000000000000000..5844006fbea01af59eecd50f01dd34bd204c22a8
--- /dev/null
+++ b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/request/MockCallRequest.java
@@ -0,0 +1,46 @@
+package cn.icanci.loopstack.amc.cloud.common.request;
+
+import java.io.Serializable;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/16 15:19
+ */
+public class MockCallRequest implements Serializable {
+ /**
+ * Mock 的链路id
+ */
+ private String traceId;
+ /**
+ * 需要执行的Mock
+ */
+ private String mockCallUuid;
+ /**
+ * 需要处理的请求数据
+ */
+ private String mockRequest;
+
+ public String getTraceId() {
+ return traceId;
+ }
+
+ public void setTraceId(String traceId) {
+ this.traceId = traceId;
+ }
+
+ public String getMockCallUuid() {
+ return mockCallUuid;
+ }
+
+ public void setMockCallUuid(String mockCallUuid) {
+ this.mockCallUuid = mockCallUuid;
+ }
+
+ public String getMockRequest() {
+ return mockRequest;
+ }
+
+ public void setMockRequest(String mockRequest) {
+ this.mockRequest = mockRequest;
+ }
+}
diff --git a/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/response/MockCallResponse.java b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/response/MockCallResponse.java
new file mode 100644
index 0000000000000000000000000000000000000000..40d94460dc7576359c8a785a48e6f697c7b2d117
--- /dev/null
+++ b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/response/MockCallResponse.java
@@ -0,0 +1,65 @@
+package cn.icanci.loopstack.amc.cloud.common.response;
+
+import cn.icanci.loopstack.amc.cloud.common.model.MockCallWrapper;
+
+import java.io.Serializable;
+
+/**
+ * MockFacade执行请求返回结果
+ *
+ * @author icanci
+ * @since 1.0 Created in 2023/01/16 15:20
+ */
+public class MockCallResponse implements Serializable {
+
+ /**
+ * 是否成功
+ */
+ private boolean success;
+ /**
+ * 请求调用错误信息
+ */
+ private String errorMessage;
+ /**
+ * Mock Wrapper
+ */
+ private MockCallWrapper wrapper;
+
+ public static MockCallResponse success(MockCallWrapper wrapper) {
+ MockCallResponse response = new MockCallResponse();
+ response.setSuccess(true);
+ response.setWrapper(wrapper);
+ return response;
+ }
+
+ public static MockCallResponse fail(String localizedMessage) {
+ MockCallResponse response = new MockCallResponse();
+ response.setSuccess(true);
+ response.setErrorMessage(localizedMessage);
+ return response;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public String getErrorMessage() {
+ return errorMessage;
+ }
+
+ public void setErrorMessage(String errorMessage) {
+ this.errorMessage = errorMessage;
+ }
+
+ public MockCallWrapper getWrapper() {
+ return wrapper;
+ }
+
+ public void setWrapper(MockCallWrapper wrapper) {
+ this.wrapper = wrapper;
+ }
+}
diff --git a/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/utils/WrapperUtils.java b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/utils/WrapperUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..01d62eadfdf943a3b6d2148646f8a34051a91419
--- /dev/null
+++ b/common/src/main/java/cn/icanci/loopstack/amc/cloud/common/utils/WrapperUtils.java
@@ -0,0 +1,269 @@
+package cn.icanci.loopstack.amc.cloud.common.utils;
+
+import cn.hutool.json.JSONUtil;
+import cn.icanci.loopstack.amc.cloud.common.exception.UnSupportWrapperException;
+
+import java.math.BigDecimal;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/17 11:10
+ */
+public class WrapperUtils {
+ private WrapperUtils() {
+ }
+
+ /**
+ * 转换为bean
+ *
+ * @param wrapperResp wrapperResp
+ * @param clazz clazz
+ * @param T 类型
+ * @return 返回指定对象数据
+ */
+ public static T toObjectBean(Object wrapperResp, Class clazz) {
+ try {
+ return JSONUtil.toBean(JSONUtil.toJsonStr(wrapperResp), clazz);
+ } catch (Exception ex) {
+ throw new UnSupportWrapperException(ex);
+ }
+ }
+
+ /**
+ * toBoolean
+ *
+ * @param wrapperResp wrapperResp
+ * @return toBoolean
+ */
+ public static Boolean toBoolean(Object wrapperResp) {
+ try {
+ if (wrapperResp == null) {
+ return null;
+ }
+ if (wrapperResp instanceof Boolean) {
+ return (Boolean) wrapperResp;
+ }
+ String resp = wrapperResp.toString();
+ if (Boolean.TRUE.toString().equalsIgnoreCase(resp) || Boolean.FALSE.toString().equalsIgnoreCase(resp)) {
+ return Boolean.valueOf(resp);
+ }
+ throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toBoolean");
+ } catch (Exception ex) {
+ throw new UnSupportWrapperException(ex);
+ }
+ }
+
+ /**
+ * toBooleanUnBox
+ *
+ * @param wrapperResp wrapperResp
+ * @return toBooleanUnBox
+ */
+ public static boolean toBooleanUnBox(Object wrapperResp) {
+ try {
+ if (wrapperResp == null) {
+ throw new UnSupportWrapperException("UnSupport parse null toBooleanUnBox");
+ }
+ if (wrapperResp instanceof Boolean) {
+ return (Boolean) wrapperResp;
+ }
+ throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toBoolean");
+ } catch (Exception ex) {
+ throw new UnSupportWrapperException(ex);
+ }
+ }
+
+ /**
+ * toInteger
+ *
+ * @param wrapperResp wrapperResp
+ * @return toInteger
+ */
+ public static Integer toInteger(Object wrapperResp) {
+ try {
+ if (wrapperResp == null) {
+ return null;
+ }
+ if (wrapperResp instanceof Integer) {
+ return (Integer) wrapperResp;
+ }
+ throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toInteger");
+ } catch (Exception ex) {
+ throw new UnSupportWrapperException(ex);
+ }
+ }
+
+ /**
+ * toIntegerUnBox
+ *
+ * @param wrapperResp wrapperResp
+ * @return toIntegerUnBox
+ */
+ public static int toIntegerUnBox(Object wrapperResp) {
+ try {
+ if (wrapperResp == null) {
+ throw new UnSupportWrapperException("UnSupport parse null toIntegerUnBox");
+ }
+ if (wrapperResp instanceof Integer) {
+ return (Integer) wrapperResp;
+ }
+ throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toIntegerUnBox");
+ } catch (Exception ex) {
+ throw new UnSupportWrapperException(ex);
+ }
+ }
+
+ /**
+ * toLong
+ *
+ * @param wrapperResp wrapperResp
+ * @return toLong
+ */
+ public static Long toLong(Object wrapperResp) {
+ try {
+ if (wrapperResp == null) {
+ return null;
+ }
+ if (wrapperResp instanceof Long) {
+ return (Long) wrapperResp;
+ }
+ throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toLong");
+ } catch (Exception ex) {
+ throw new UnSupportWrapperException(ex);
+ }
+ }
+
+ /**
+ * toLongUnBox
+ *
+ * @param wrapperResp wrapperResp
+ * @return toLongUnBox
+ */
+ public static long toLongUnBox(Object wrapperResp) {
+ try {
+ if (wrapperResp == null) {
+ throw new UnSupportWrapperException("UnSupport parse null toLongUnBox");
+ }
+ if (wrapperResp instanceof Long) {
+ return (Long) wrapperResp;
+ }
+ throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toLongUnBox");
+ } catch (Exception ex) {
+ throw new UnSupportWrapperException(ex);
+ }
+ }
+
+ /**
+ * toDouble
+ *
+ * @param wrapperResp wrapperResp
+ * @return toDouble
+ */
+ public static Double toDouble(Object wrapperResp) {
+ try {
+ if (wrapperResp == null) {
+ return null;
+ }
+ if (wrapperResp instanceof Double) {
+ return (Double) wrapperResp;
+ }
+ throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toDouble");
+ } catch (Exception ex) {
+ throw new UnSupportWrapperException(ex);
+ }
+ }
+
+ /**
+ * toDoubleUnBox
+ *
+ * @param wrapperResp wrapperResp
+ * @return toDoubleUnBox
+ */
+ public static double toDoubleUnBox(Object wrapperResp) {
+ try {
+ if (wrapperResp == null) {
+ throw new UnSupportWrapperException("UnSupport parse null toDoubleUnBox");
+ }
+ if (wrapperResp instanceof Double) {
+ return (Double) wrapperResp;
+ }
+ throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toDoubleUnBox");
+ } catch (Exception ex) {
+ throw new UnSupportWrapperException(ex);
+ }
+ }
+
+ /**
+ * toFloat
+ *
+ * @param wrapperResp wrapperResp
+ * @return toFloat
+ */
+ public static Float toFloat(Object wrapperResp) {
+ try {
+ if (wrapperResp == null) {
+ return null;
+ }
+ if (wrapperResp instanceof Float) {
+ return (Float) wrapperResp;
+ }
+ throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toFloat");
+ } catch (Exception ex) {
+ throw new UnSupportWrapperException(ex);
+ }
+ }
+
+ /**
+ * toFloatUnBox
+ *
+ * @param wrapperResp wrapperResp
+ * @return toFloatUnBox
+ */
+ public static float toFloatUnBox(Object wrapperResp) {
+ try {
+ if (wrapperResp == null) {
+ throw new UnSupportWrapperException("UnSupport parse null toFloatUnBox");
+ }
+ if (wrapperResp instanceof Float) {
+ return (Float) wrapperResp;
+ }
+ throw new UnSupportWrapperException("UnSupport parse " + wrapperResp + " toFloatUnBox");
+ } catch (Exception ex) {
+ throw new UnSupportWrapperException(ex);
+ }
+ }
+
+ /**
+ * toBigDecimal
+ *
+ * @param wrapperResp wrapperResp
+ * @return toBigDecimal
+ */
+ public static BigDecimal toBigDecimal(Object wrapperResp) {
+ try {
+ if (wrapperResp == null) {
+ return null;
+ }
+ return new BigDecimal(String.valueOf(wrapperResp));
+ } catch (Exception ex) {
+ throw new UnSupportWrapperException(ex);
+ }
+ }
+
+ /**
+ * toStringValue
+ *
+ * @param wrapperResp wrapperResp
+ * @return toStringValue
+ */
+ public static String toStringValue(Object wrapperResp) {
+ try {
+ if (wrapperResp == null) {
+ return null;
+ }
+ return wrapperResp.toString();
+ } catch (Exception ex) {
+ throw new UnSupportWrapperException(ex);
+ }
+ }
+}
diff --git a/common/src/test/java/cn/icanci/loopstack/amc/cloud/common/utils/test/WrapperUtilsTest.java b/common/src/test/java/cn/icanci/loopstack/amc/cloud/common/utils/test/WrapperUtilsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..ad81259fb6b1fda6304525fb0bed2edb5b7e7fd2
--- /dev/null
+++ b/common/src/test/java/cn/icanci/loopstack/amc/cloud/common/utils/test/WrapperUtilsTest.java
@@ -0,0 +1,18 @@
+package cn.icanci.loopstack.amc.cloud.common.utils.test;
+
+import cn.icanci.loopstack.amc.cloud.common.utils.WrapperUtils;
+
+import org.junit.Test;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/17 11:19
+ */
+public class WrapperUtilsTest {
+ @Test
+ public void testBoolean() {
+ Boolean b = Boolean.TRUE;
+ Boolean aBoolean = WrapperUtils.toBoolean("FAlse");
+ System.out.println(aBoolean);
+ }
+}
diff --git a/dal/pom.xml b/dal/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..804caf0842e578498e2c7203ba51abe533d2075a
--- /dev/null
+++ b/dal/pom.xml
@@ -0,0 +1,44 @@
+
+
+
+ amc-cloud-parent
+ cn.icanci.loopstack.amc
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ cloud-dal
+
+
+ 8
+ 8
+
+
+
+ org.springframework
+ spring-context
+
+
+ org.springframework.boot
+ spring-boot-starter-data-mongodb
+
+
+ org.apache.commons
+ commons-lang3
+
+
+ org.apache.commons
+ commons-collections4
+
+
+ com.google.guava
+ guava
+
+
+ cn.icanci.loopstack.amc
+ amc-common
+
+
+
\ No newline at end of file
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/exception/NotSupportAccessException.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/exception/NotSupportAccessException.java
new file mode 100644
index 0000000000000000000000000000000000000000..459f764619078e2f7f32daa48fbc9208b9baaaeb
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/exception/NotSupportAccessException.java
@@ -0,0 +1,27 @@
+package cn.icanci.loopstack.amc.cloud.dal.exception;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/17 23:37
+ */
+public class NotSupportAccessException extends RuntimeException {
+ public NotSupportAccessException() {
+ super();
+ }
+
+ public NotSupportAccessException(String message) {
+ super(message);
+ }
+
+ public NotSupportAccessException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public NotSupportAccessException(Throwable cause) {
+ super(cause);
+ }
+
+ protected NotSupportAccessException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
+ }
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..29fe7e114e5b52950cc0b0226b4e141d9fab5b4a
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppDAO.java
@@ -0,0 +1,28 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface;
+
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.AppDO;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/15 12:31
+ */
+public interface AppDAO extends BaseDAO {
+ /**
+ * 文档对应的名字
+ */
+ String COLLECTION_NAME = "amc-app";
+ /**
+ * 文档对应的Class
+ */
+ Class COLLECTION_CLASS = AppDO.class;
+
+ AppDO queryByAppId(String appId);
+
+ AppDO queryByAppName(String appName);
+
+ interface AppColumn extends BaseColumn {
+ String appId = "appId";
+ String appName = "appName";
+ String teamUuid = "teamUuid";
+ }
+}
\ No newline at end of file
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppMockCallDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppMockCallDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..817d93ffc799fa2acea94794332a443e9aa0e943
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppMockCallDAO.java
@@ -0,0 +1,30 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface;
+
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.AppMockCallDO;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/15 12:23
+ */
+public interface AppMockCallDAO extends BaseDAO {
+ /**
+ * 文档对应的名字
+ */
+ String COLLECTION_NAME = "amc-app-mock-call";
+ /**
+ * 文档对应的Class
+ */
+ Class COLLECTION_CLASS = AppMockCallDO.class;
+
+ AppMockCallDO queryByAppMockName(String mockName);
+
+ AppMockCallDO queryByUuid(String uuid);
+
+ interface AppMockCallColumn extends BaseColumn {
+ String mockName = "mockName";
+ String appUuid = "appUuid";
+ String scriptType = "scriptType";
+ String script = "script";
+ String method = "method";
+ }
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppMockCallReportDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppMockCallReportDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..0990873c0fd7975e20070c16e38323aad6d2ce53
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/AppMockCallReportDAO.java
@@ -0,0 +1,21 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface;
+
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.AppMockCallReportDO;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/17 23:28
+ */
+public interface AppMockCallReportDAO extends BaseDAO {
+ /**
+ * 文档对应的名字
+ */
+ String COLLECTION_NAME = "amc-app-mock-call-report";
+ /**
+ * 文档对应的Class
+ */
+ Class COLLECTION_CLASS = AppMockCallReportDO.class;
+
+ interface AppMockCallReportColumn extends BaseColumn {
+ }
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/BaseDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/BaseDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef030fafa226e2f5513834e25234796fc20a21a9
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/BaseDAO.java
@@ -0,0 +1,71 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface;
+
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.BaseDO;
+import cn.icanci.loopstack.amc.common.model.PageList;
+
+import java.util.List;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/15 11:55
+ */
+public interface BaseDAO {
+
+ /**
+ * 插入文档一条记录
+ *
+ * @param t t
+ */
+ void insert(T t);
+
+ /**
+ * 更新文档一条记录
+ *
+ * @param t t
+ * @return 更新结果
+ */
+ void update(T t);
+
+ /**
+ * 查询文档所有记录
+ *
+ * @return 返回查询的结果
+ */
+ List queryAll();
+
+ /**
+ * 查询文档所有记录
+ *
+ * @param t 请求参数
+ * @param pageNum pageNum
+ * @param pageSize pageSize
+ * @return 返回查询的结果
+ */
+ PageList pageQuery(T t, int pageNum, int pageSize);
+
+ /**
+ * 根据 _id 查询一条信息
+ *
+ * @param _id _id
+ * @return 返回查询的结果
+ */
+ T queryOneById(String _id);
+
+ /** 基本表 */
+ interface BaseColumn {
+ /** 文档id */
+ String _id = "_id";
+ /** uuid */
+ String uuid = "uuid";
+ /** desc */
+ String desc = "desc";
+ /** createTime */
+ String createTime = "createTime";
+ /** updateTime */
+ String updateTime = "updateTime";
+ /** 状态 0:有效,1:无效 */
+ String isDelete = "isDelete";
+ /** 操作环境 */
+ String env = "env";
+ }
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/GroupDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/GroupDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..acc025f0171c5dd0253ee27cd96bccc596194f90
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/GroupDAO.java
@@ -0,0 +1,27 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface;
+
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.GroupDO;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/15 12:31
+ */
+public interface GroupDAO extends BaseDAO {
+ /**
+ * 文档对应的名字
+ */
+ String COLLECTION_NAME = "amc-group";
+ /**
+ * 文档对应的Class
+ */
+ Class COLLECTION_CLASS = GroupDO.class;
+
+ GroupDO queryByGroupId(String groupId);
+
+ GroupDO queryByGroupName(String groupName);
+
+ interface GroupColumn extends BaseColumn {
+ String groupId = "groupId";
+ String groupName = "groupName";
+ }
+}
\ No newline at end of file
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/LogOperateDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/LogOperateDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..4e310a3864dcf5ce0d540ff4b0565c398f14c20b
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/LogOperateDAO.java
@@ -0,0 +1,83 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface;
+
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.LogOperateDO;
+import cn.icanci.loopstack.amc.common.model.PageList;
+
+import java.util.List;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2022/11/11 14:05
+ */
+public interface LogOperateDAO {
+ /**
+ * 文档对应的名字
+ */
+ String COLLECTION_NAME = "amc-log";
+ /**
+ * 文档对应的Class
+ */
+ Class COLLECTION_CLASS = LogOperateDO.class;
+
+ /**
+ * 插入文档一条记录
+ *
+ * @param t t
+ */
+ void insert(LogOperateDO t);
+
+ /**
+ * 更新文档一条记录
+ *
+ * @param t t
+ * @return 更新结果
+ */
+ void update(LogOperateDO t);
+
+ /**
+ * 查询文档所有记录
+ *
+ * @return 返回查询的结果
+ */
+ List queryAll();
+
+ /**
+ * 查询文档所有记录
+ *
+ * @param t 请求参数
+ * @param pageNum pageNum
+ * @param pageSize pageSize
+ * @return 返回查询的结果
+ */
+ PageList pageQuery(LogOperateDO t, int pageNum, int pageSize);
+
+ /**
+ * 根据 _id 查询一条信息
+ *
+ * @param _id _id
+ * @return 返回查询的结果
+ */
+ LogOperateDO queryOneById(String _id);
+
+ interface LogColumn {
+ String _id = "id";
+
+ /** 操作模块 */
+ String module = "module";
+
+ /** 对象编号 */
+ String targetId = "targetId";
+
+ /** 操作类型*/
+ String operatorType = "operatorType";
+
+ /** 操作内容 */
+ String content = "content";
+
+ /** 创建时间 */
+ String createTime = "createTime";
+
+ /** 环境 */
+ String env = "env";
+ }
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/TeamDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/TeamDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..f955e1f2560593550f22a040908fc4448452f6b7
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/daointerface/TeamDAO.java
@@ -0,0 +1,28 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface;
+
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.TeamDO;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/15 12:38
+ */
+public interface TeamDAO extends BaseDAO {
+ /**
+ * 文档对应的名字
+ */
+ String COLLECTION_NAME = "amc-team";
+ /**
+ * 文档对应的Class
+ */
+ Class COLLECTION_CLASS = TeamDO.class;
+
+ TeamDO queryByTeamId(String teamId);
+
+ TeamDO queryByTeamName(String teamName);
+
+ interface TeamColumn extends BaseColumn {
+ String teamId = "teamId";
+ String teamName = "teamName";
+ String groupUuid = "groupUuid";
+ }
+}
\ No newline at end of file
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppDO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppDO.java
new file mode 100644
index 0000000000000000000000000000000000000000..6ee56f5bc2d628ab822af30b1a8fb77efab67aa2
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppDO.java
@@ -0,0 +1,47 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject;
+
+/**
+* @author icanci
+* @since 1.0 Created in 2023/01/07 15:22
+*/
+public class AppDO extends BaseDO {
+
+ /**
+ * 项目id,全局唯一
+ */
+ private String appId;
+
+ /**
+ * 项目名字
+ */
+ private String appName;
+
+ /**
+ * 项目组关联uuid
+ */
+ private String teamUuid;
+
+ public void setAppId(String appId) {
+ this.appId = appId;
+ }
+
+ public String getAppId() {
+ return this.appId;
+ }
+
+ public void setAppName(String appName) {
+ this.appName = appName;
+ }
+
+ public String getAppName() {
+ return this.appName;
+ }
+
+ public void setTeamUuid(String teamUuid) {
+ this.teamUuid = teamUuid;
+ }
+
+ public String getTeamUuid() {
+ return this.teamUuid;
+ }
+}
\ No newline at end of file
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppMockCallDO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppMockCallDO.java
new file mode 100644
index 0000000000000000000000000000000000000000..09a9d2650c5817964d829f29634e0722eaceb679
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppMockCallDO.java
@@ -0,0 +1,69 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject;
+
+/**
+* @author icanci
+* @since 1.0 Created in 2023/01/07 15:22
+*/
+public class AppMockCallDO extends BaseDO {
+
+ /**
+ * mock 配置名称
+ */
+ private String mockName;
+ /**
+ * 脚本关联的uuid
+ */
+ private String appUuid;
+ /**
+ * 脚本执行类型
+ */
+ private String scriptType;
+ /**
+ * 执行的脚本内容
+ */
+ private String script;
+ /**
+ * 脚本的请求方法
+ */
+ private String method;
+
+ public String getMockName() {
+ return mockName;
+ }
+
+ public void setMockName(String mockName) {
+ this.mockName = mockName;
+ }
+
+ public String getAppUuid() {
+ return appUuid;
+ }
+
+ public void setAppUuid(String appUuid) {
+ this.appUuid = appUuid;
+ }
+
+ public String getScriptType() {
+ return scriptType;
+ }
+
+ public void setScriptType(String scriptType) {
+ this.scriptType = scriptType;
+ }
+
+ public String getScript() {
+ return script;
+ }
+
+ public void setScript(String script) {
+ this.script = script;
+ }
+
+ public String getMethod() {
+ return method;
+ }
+
+ public void setMethod(String method) {
+ this.method = method;
+ }
+}
\ No newline at end of file
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppMockCallReportDO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppMockCallReportDO.java
new file mode 100644
index 0000000000000000000000000000000000000000..2efbcb226aa38586ac4be55a533c65b8acc76c13
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/AppMockCallReportDO.java
@@ -0,0 +1,80 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/17 23:29
+ */
+public class AppMockCallReportDO extends BaseDO {
+ /**
+ * mock 过程是否成功
+ */
+ private boolean success;
+ /**
+ * mockName
+ */
+ private String mockName;
+ /**
+ * mockUuid
+ */
+ private String mockUuid;
+ /**
+ * mock执行的请求
+ */
+ private String mockRequest;
+ /**
+ * mock执行的异常信息
+ */
+ private String mockErrorMessage;
+ /**
+ * 真正mock返回的结果
+ */
+ private String mockResponse;
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public String getMockName() {
+ return mockName;
+ }
+
+ public void setMockName(String mockName) {
+ this.mockName = mockName;
+ }
+
+ public String getMockUuid() {
+ return mockUuid;
+ }
+
+ public void setMockUuid(String mockUuid) {
+ this.mockUuid = mockUuid;
+ }
+
+ public String getMockRequest() {
+ return mockRequest;
+ }
+
+ public void setMockRequest(String mockRequest) {
+ this.mockRequest = mockRequest;
+ }
+
+ public String getMockErrorMessage() {
+ return mockErrorMessage;
+ }
+
+ public void setMockErrorMessage(String mockErrorMessage) {
+ this.mockErrorMessage = mockErrorMessage;
+ }
+
+ public String getMockResponse() {
+ return mockResponse;
+ }
+
+ public void setMockResponse(String mockResponse) {
+ this.mockResponse = mockResponse;
+ }
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/BaseDO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/BaseDO.java
new file mode 100644
index 0000000000000000000000000000000000000000..96d1fa563d5d861bfb295b9db1f021d6e482db7f
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/BaseDO.java
@@ -0,0 +1,116 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject;
+
+import java.util.Date;
+import java.util.StringJoiner;
+
+import org.springframework.data.annotation.Id;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 存储基本模型
+ *
+ * @author icanci
+ * @since 1.0 Created in 2023/01/15 11:55
+ */
+public class BaseDO {
+ /**
+ * 文档id
+ */
+ @Id
+ private String id;
+
+ /**
+ * 雪花算法随机UUID
+ */
+ private String uuid;
+
+ /**
+ * 功能描述
+ */
+ private String desc;
+
+ /**
+ * 创建时间
+ */
+ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date updateTime;
+
+ /**
+ * 状态 0有效,1无效
+ */
+ private int isDelete;
+
+ /**
+ * 环境
+ */
+ private String env;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getUuid() {
+ return uuid;
+ }
+
+ public void setUuid(String uuid) {
+ this.uuid = uuid;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public void setDesc(String desc) {
+ this.desc = desc;
+ }
+
+ public Date getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(Date createTime) {
+ this.createTime = createTime;
+ }
+
+ public Date getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ public int getIsDelete() {
+ return isDelete;
+ }
+
+ public void setIsDelete(int isDelete) {
+ this.isDelete = isDelete;
+ }
+
+ public String getEnv() {
+ return env;
+ }
+
+ public void setEnv(String env) {
+ this.env = env;
+ }
+
+ @Override
+ public String toString() {
+ return new StringJoiner(",").add("id=" + id).add("uuid=" + uuid).add("desc=" + desc).add("createTime=" + createTime).add("updateTime=" + updateTime)
+ .add("isDelete=" + isDelete).add("env=" + env).toString();
+ }
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/GroupDO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/GroupDO.java
new file mode 100644
index 0000000000000000000000000000000000000000..53289ab89160524bc25702c62438df48d67d9550
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/GroupDO.java
@@ -0,0 +1,34 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject;
+
+/**
+* @author icanci
+* @since 1.0 Created in 2023/01/07 15:22
+*/
+public class GroupDO extends BaseDO {
+
+ /**
+ * 事业群组id,唯一
+ */
+ private String groupId;
+
+ /**
+ * 组名字
+ */
+ private String groupName;
+
+ public String getGroupId() {
+ return groupId;
+ }
+
+ public void setGroupId(String groupId) {
+ this.groupId = groupId;
+ }
+
+ public String getGroupName() {
+ return groupName;
+ }
+
+ public void setGroupName(String groupName) {
+ this.groupName = groupName;
+ }
+}
\ No newline at end of file
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/LogOperateDO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/LogOperateDO.java
new file mode 100644
index 0000000000000000000000000000000000000000..a87c5e8e74ec7b533675c87708be5b4c6799e434
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/LogOperateDO.java
@@ -0,0 +1,98 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject;
+
+import cn.icanci.loopstack.amc.common.enums.LogOperatorTypeEnum;
+
+import java.util.Date;
+
+import org.springframework.data.annotation.Id;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2022/11/11 13:39
+ */
+public class LogOperateDO {
+ /** 编号 */
+ @Id
+ private String id;
+
+ /** 操作模块 */
+ private String module;
+
+ /** 对象编号 */
+ private String targetId;
+
+ /**
+ * 操作类型
+ *
+ * @see LogOperatorTypeEnum#name()
+ */
+ private String operatorType;
+
+ /** 操作内容 */
+ private String content;
+
+ /** 创建时间 */
+ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date createTime;
+
+ /** 环境 */
+ private String env;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getModule() {
+ return module;
+ }
+
+ public void setModule(String module) {
+ this.module = module;
+ }
+
+ public String getTargetId() {
+ return targetId;
+ }
+
+ public void setTargetId(String targetId) {
+ this.targetId = targetId;
+ }
+
+ public String getOperatorType() {
+ return operatorType;
+ }
+
+ public void setOperatorType(String operatorType) {
+ this.operatorType = operatorType;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public Date getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(Date createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getEnv() {
+ return env;
+ }
+
+ public void setEnv(String env) {
+ this.env = env;
+ }
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/TeamDO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/TeamDO.java
new file mode 100644
index 0000000000000000000000000000000000000000..4f3b0bd5fa9e45dd623d7b7752f3700a90ae6f81
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/dataobject/TeamDO.java
@@ -0,0 +1,47 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject;
+
+/**
+* @author icanci
+* @since 1.0 Created in 2023/01/07 15:22
+*/
+public class TeamDO extends BaseDO {
+
+ /**
+ * 项目组id,唯一
+ */
+ private String teamId;
+
+ /**
+ * 项目组名字
+ */
+ private String teamName;
+
+ /**
+ * 事业群关联uuid
+ */
+ private String groupUuid;
+
+ public String getTeamId() {
+ return teamId;
+ }
+
+ public void setTeamId(String teamId) {
+ this.teamId = teamId;
+ }
+
+ public String getTeamName() {
+ return teamName;
+ }
+
+ public void setTeamName(String teamName) {
+ this.teamName = teamName;
+ }
+
+ public String getGroupUuid() {
+ return groupUuid;
+ }
+
+ public void setGroupUuid(String groupUuid) {
+ this.groupUuid = groupUuid;
+ }
+}
\ No newline at end of file
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/AbstractBaseDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/AbstractBaseDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..6646855f5bc00f0e3c7c4748ab8cf0b754385e80
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/AbstractBaseDAO.java
@@ -0,0 +1,40 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.mongo;
+
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.BaseDAO;
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.BaseDO;
+import cn.icanci.loopstack.amc.cloud.dal.utils.EnvUtils;
+import cn.icanci.loopstack.amc.cloud.dal.utils.IDHolder;
+
+import java.util.Date;
+
+import org.springframework.beans.factory.InitializingBean;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2022/10/24 22:47
+ */
+public abstract class AbstractBaseDAO extends MongoPageHelper implements BaseDAO, InitializingBean {
+
+ protected String DEFAULT_ENV;
+
+ @Override
+ public void insert(T t) {
+ // 处理插入数据
+ t.setId(null);
+ t.setIsDelete(0);
+ t.setCreateTime(new Date());
+ t.setUpdateTime(new Date());
+ t.setEnv(DEFAULT_ENV);
+ t.setUuid(IDHolder.generateNoBySnowFlakeDefaultPrefix());
+ }
+
+ @Override
+ public void update(T t) {
+ t.setUpdateTime(new Date());
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ DEFAULT_ENV = EnvUtils.getEnv();
+ }
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..75d4e6871bec5fafb7ad5c35c9a9adf5e5626375
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppDAO.java
@@ -0,0 +1,83 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.mongo;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.AppDAO;
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.AppDO;
+import cn.icanci.loopstack.amc.common.model.PageList;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/15 12:24
+ */
+@Service("appDAO")
+public class MongoAppDAO extends AbstractBaseDAO implements AppDAO {
+
+ @Override
+ public void insert(AppDO app) {
+ super.insert(app);
+ mongoTemplate.insert(app, COLLECTION_NAME);
+ }
+
+ @Override
+ public void update(AppDO app) {
+ super.update(app);
+ mongoTemplate.save(app, COLLECTION_NAME);
+ }
+
+ @Override
+ public List queryAll() {
+ Criteria criteria = Criteria.where(AppColumn.env).is(DEFAULT_ENV);
+ Query query = new Query(criteria);
+ return mongoTemplate.find(query, COLLECTION_CLASS, COLLECTION_NAME);
+ }
+
+ @Override
+ public PageList pageQuery(AppDO app, int pageNum, int pageSize) {
+ Criteria criteria = Criteria.where(AppColumn.env).is(DEFAULT_ENV);
+
+ if (StringUtils.isNotBlank(app.getAppName())) {
+ // 不分区大小写查询,其中操作符"i":表示不分区大小写
+ criteria.and(AppColumn.appName).regex("^.*" + app.getAppName() + ".*$", "i");
+ }
+
+ if (StringUtils.isNotBlank(app.getTeamUuid())) {
+ criteria.and(AppColumn.teamUuid).is(app.getTeamUuid());
+ }
+
+ Query query = new Query(criteria);
+ query.with(Sort.by(Sort.Direction.DESC, AppColumn.createTime));
+
+ return pageQuery(query, COLLECTION_CLASS, pageSize, pageNum, COLLECTION_NAME);
+ }
+
+ @Override
+ public AppDO queryOneById(String _id) {
+ Criteria criteria = Criteria.where(AppColumn._id).is(_id);
+ criteria.and(AppColumn.env).is(DEFAULT_ENV);
+ Query query = new Query(criteria);
+ return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME);
+ }
+
+ @Override
+ public AppDO queryByAppId(String appId) {
+ Criteria criteria = Criteria.where(AppColumn.appId).is(appId);
+ criteria.and(AppColumn.env).is(DEFAULT_ENV);
+ Query query = new Query(criteria);
+ return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME);
+ }
+
+ @Override
+ public AppDO queryByAppName(String appName) {
+ Criteria criteria = Criteria.where(AppColumn.appName).is(appName);
+ criteria.and(AppColumn.env).is(DEFAULT_ENV);
+ Query query = new Query(criteria);
+ return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME);
+ }
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppMockCallDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppMockCallDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..c9063e7b36c790dd92beeb80e2ec7800c4bd05ed
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppMockCallDAO.java
@@ -0,0 +1,79 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.mongo;
+
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.AppMockCallDAO;
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.AppMockCallDO;
+import cn.icanci.loopstack.amc.common.model.PageList;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/15 12:24
+ */
+@Service("appMockCallDAO")
+public class MongoAppMockCallDAO extends AbstractBaseDAO implements AppMockCallDAO {
+
+ @Override
+ public void insert(AppMockCallDO appMockCallDO) {
+ super.insert(appMockCallDO);
+ mongoTemplate.insert(appMockCallDO, COLLECTION_NAME);
+ }
+
+ @Override
+ public void update(AppMockCallDO appMockCallDO) {
+ super.update(appMockCallDO);
+ mongoTemplate.save(appMockCallDO, COLLECTION_NAME);
+ }
+
+ @Override
+ public List queryAll() {
+ Criteria criteria = Criteria.where(AppMockCallColumn.env).is(DEFAULT_ENV);
+ Query query = new Query(criteria);
+ return mongoTemplate.find(query, COLLECTION_CLASS, COLLECTION_NAME);
+ }
+
+ @Override
+ public PageList pageQuery(AppMockCallDO appMockCallDO, int pageNum, int pageSize) {
+ Criteria criteria = Criteria.where(AppMockCallColumn.env).is(DEFAULT_ENV);
+
+ if (StringUtils.isNotBlank(appMockCallDO.getMockName())) {
+ // 不分区大小写查询,其中操作符"i":表示不分区大小写
+ criteria.and(AppMockCallColumn.mockName).regex("^.*" + appMockCallDO.getMockName() + ".*$", "i");
+ }
+
+ Query query = new Query(criteria);
+ query.with(Sort.by(Sort.Direction.DESC, AppMockCallColumn.createTime));
+
+ return pageQuery(query, COLLECTION_CLASS, pageSize, pageNum, COLLECTION_NAME);
+ }
+
+ @Override
+ public AppMockCallDO queryOneById(String _id) {
+ Criteria criteria = Criteria.where(AppMockCallColumn._id).is(_id);
+ criteria.and(AppMockCallColumn.env).is(DEFAULT_ENV);
+ Query query = new Query(criteria);
+ return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME);
+ }
+
+ @Override
+ public AppMockCallDO queryByAppMockName(String mockName) {
+ Criteria criteria = Criteria.where(AppMockCallColumn.mockName).is(mockName);
+ criteria.and(AppMockCallColumn.env).is(DEFAULT_ENV);
+ Query query = new Query(criteria);
+ return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME);
+ }
+
+ @Override
+ public AppMockCallDO queryByUuid(String uuid) {
+ Criteria criteria = Criteria.where(AppMockCallColumn.uuid).is(uuid);
+ criteria.and(AppMockCallColumn.env).is(DEFAULT_ENV);
+ Query query = new Query(criteria);
+ return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME);
+ }
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppMockCallReportDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppMockCallReportDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..66d4f7ed17b1defdc05d00756be53ac1b2e81875
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoAppMockCallReportDAO.java
@@ -0,0 +1,44 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.mongo;
+
+import cn.icanci.loopstack.amc.cloud.dal.exception.NotSupportAccessException;
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.AppMockCallReportDAO;
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.AppMockCallReportDO;
+import cn.icanci.loopstack.amc.common.model.PageList;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/17 23:35
+ */
+@Service("appMockCallReportDAO")
+public class MongoAppMockCallReportDAO extends AbstractBaseDAO implements AppMockCallReportDAO {
+
+ @Override
+ public void insert(AppMockCallReportDO appMockCallReportDO) {
+ super.insert(appMockCallReportDO);
+ mongoTemplate.insert(appMockCallReportDO, COLLECTION_NAME);
+ }
+
+ @Override
+ public void update(AppMockCallReportDO appMockCallReportDO) {
+ throw new NotSupportAccessException();
+ }
+
+ @Override
+ public List queryAll() {
+ throw new NotSupportAccessException();
+ }
+
+ @Override
+ public PageList pageQuery(AppMockCallReportDO appMockCallReportDO, int pageNum, int pageSize) {
+ throw new NotSupportAccessException();
+ }
+
+ @Override
+ public AppMockCallReportDO queryOneById(String _id) {
+ throw new NotSupportAccessException();
+ }
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoGroupDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoGroupDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..5255188698aca587a3f9ec8e04bc52877c1c96af
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoGroupDAO.java
@@ -0,0 +1,83 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.mongo;
+
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.GroupDAO;
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.GroupDO;
+import cn.icanci.loopstack.amc.common.model.PageList;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/15 12:24
+ */
+@Service("groupDAO")
+public class MongoGroupDAO extends AbstractBaseDAO implements GroupDAO {
+
+ @Override
+ public void insert(GroupDO group) {
+ super.insert(group);
+ mongoTemplate.insert(group, COLLECTION_NAME);
+ }
+
+ @Override
+ public void update(GroupDO group) {
+ super.update(group);
+ mongoTemplate.save(group, COLLECTION_NAME);
+ }
+
+ @Override
+ public List queryAll() {
+ Criteria criteria = Criteria.where(GroupColumn.env).is(DEFAULT_ENV);
+ Query query = new Query(criteria);
+ return mongoTemplate.find(query, COLLECTION_CLASS, COLLECTION_NAME);
+ }
+
+ @Override
+ public PageList pageQuery(GroupDO group, int pageNum, int pageSize) {
+ Criteria criteria = Criteria.where(GroupColumn.env).is(DEFAULT_ENV);
+
+ if (StringUtils.isNotBlank(group.getGroupName())) {
+ // 不分区大小写查询,其中操作符"i":表示不分区大小写
+ criteria.and(GroupColumn.groupName).regex("^.*" + group.getGroupName() + ".*$", "i");
+ }
+
+ if (StringUtils.isNotBlank(group.getGroupId())) {
+ criteria.and(GroupColumn.groupId).is(group.getGroupId());
+ }
+
+ Query query = new Query(criteria);
+ query.with(Sort.by(Sort.Direction.DESC, GroupColumn.createTime));
+
+ return pageQuery(query, COLLECTION_CLASS, pageSize, pageNum, COLLECTION_NAME);
+ }
+
+ @Override
+ public GroupDO queryOneById(String _id) {
+ Criteria criteria = Criteria.where(GroupColumn._id).is(_id);
+ criteria.and(GroupColumn.env).is(DEFAULT_ENV);
+ Query query = new Query(criteria);
+ return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME);
+ }
+
+ @Override
+ public GroupDO queryByGroupId(String groupId) {
+ Criteria criteria = Criteria.where(GroupColumn.groupId).is(groupId);
+ criteria.and(GroupColumn.env).is(DEFAULT_ENV);
+ Query query = new Query(criteria);
+ return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME);
+ }
+
+ @Override
+ public GroupDO queryByGroupName(String groupName) {
+ Criteria criteria = Criteria.where(GroupColumn.groupName).is(groupName);
+ criteria.and(GroupColumn.env).is(DEFAULT_ENV);
+ Query query = new Query(criteria);
+ return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME);
+ }
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoLogOperateDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoLogOperateDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..db01626a40aea76bb149d37ded20338cddbfced9
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoLogOperateDAO.java
@@ -0,0 +1,61 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.mongo;
+
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.LogOperateDAO;
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.LogOperateDO;
+import cn.icanci.loopstack.amc.cloud.dal.utils.EnvUtils;
+import cn.icanci.loopstack.amc.common.model.PageList;
+
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2022/11/11 16:06
+ */
+@Service("logOperateDAO")
+public class MongoLogOperateDAO extends MongoPageHelper implements LogOperateDAO {
+ @Override
+ public void insert(LogOperateDO t) {
+ t.setId(null);
+ t.setEnv(EnvUtils.getEnv());
+ mongoTemplate.insert(t, COLLECTION_NAME);
+ }
+
+ @Override
+ public void update(LogOperateDO t) {
+ throw new RuntimeException("Not Support Update!");
+ }
+
+ @Override
+ public List queryAll() {
+ Criteria criteria = Criteria.where(LogColumn.env).is(EnvUtils.getEnv());
+ Query query = new Query(criteria);
+ return mongoTemplate.find(query, COLLECTION_CLASS, COLLECTION_NAME);
+
+ }
+
+ @Override
+ public PageList pageQuery(LogOperateDO t, int pageNum, int pageSize) {
+ Criteria criteria = Criteria.where(LogColumn.env).is(EnvUtils.getEnv());
+ criteria.and(LogColumn.module).is(t.getModule());
+ criteria.and(LogColumn.targetId).is(t.getTargetId());
+
+ Query query = new Query(criteria);
+ query.with(Sort.by(Sort.Direction.DESC, LogColumn.createTime));
+
+ return pageQuery(query, COLLECTION_CLASS, pageSize, pageNum, COLLECTION_NAME);
+
+ }
+
+ @Override
+ public LogOperateDO queryOneById(String _id) {
+ Criteria criteria = Criteria.where(LogColumn._id).is(_id);
+ criteria.and(LogColumn.env).is(EnvUtils.getEnv());
+ Query query = new Query(criteria);
+ return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME);
+ }
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoPageHelper.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoPageHelper.java
new file mode 100644
index 0000000000000000000000000000000000000000..5ad13c71c2045bac2d19ef0a61915abe282d68df
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoPageHelper.java
@@ -0,0 +1,114 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.mongo;
+
+import cn.icanci.loopstack.amc.common.model.PageList;
+import cn.icanci.loopstack.amc.common.model.Paginator;
+
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import javax.annotation.Resource;
+
+import org.apache.commons.lang3.StringUtils;
+import org.bson.types.ObjectId;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Order;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+
+import com.google.common.collect.Lists;
+
+/**
+ * 分页插件
+ *
+ * @author icanci(1205068)
+ * @version Id: MongoPageHelper, v 0.1 2022/10/24 16:44 icanci Exp $
+ */
+public class MongoPageHelper {
+ @Resource
+ protected MongoTemplate mongoTemplate;
+
+ public static final int FIRST_PAGE_NUM = 1;
+
+ public static final String ID = "_id";
+
+ /**
+ * 分页查询,直接返回集合类型的结果.
+ *
+ * @param query 查询
+ * @param entityClass class
+ * @param pageSize pageSize
+ * @param pageNum pageNum
+ * @param collectionName collectionName
+ * @param T
+ * @return PageResult
+ */
+ public PageList pageQuery(Query query, Class entityClass, Integer pageSize, Integer pageNum, String collectionName) {
+ return pageQuery(query, entityClass, Function.identity(), pageSize, pageNum, null, collectionName);
+ }
+
+ /**
+ * 分页查询,不考虑条件分页,直接使用skip-limit来分页.
+ *
+ * @param query 查询
+ * @param entityClass class
+ * @param pageSize pageSize
+ * @param pageNum pageNum
+ * @param collectionName collectionName
+ * @param T
+ * @param R
+ * @param mapper mapper
+ * @return PageResult
+ */
+ public PageList pageQuery(Query query, Class entityClass, Function mapper, Integer pageSize, Integer pageNum, String collectionName) {
+ return pageQuery(query, entityClass, mapper, pageSize, pageNum, null, collectionName);
+ }
+
+ /**
+ * 分页查询.
+ *
+ * @param query Mongo Query对象,构造你自己的查询条件
+ * @param entityClass Mongo collection定义的entity class,用来确定查询哪个集合
+ * @param mapper 映射器,从db查出来的list的元素类型是entityClass, 如果你想要转换成另一个对象,比如去掉敏感字段等,可以使用mapper来决定如何转换
+ * @param pageSize 分页的大小
+ * @param pageNum 当前页
+ * @param lastId 条件分页参数, 区别于skip-limit,采用find(_id>lastId).limit分页
+ * @param collection定义的class类型
+ * @param 最终返回时,展现给页面时的一条记录的类型
+ * @return PageResult,一个封装page信息的对象
+ */
+ public PageList pageQuery(Query query, Class entityClass, Function mapper, Integer pageSize, Integer pageNum, String lastId, String collectionName) {
+ //分页逻辑
+ long total = mongoTemplate.count(query, entityClass, collectionName);
+
+ final int pages = (int) Math.ceil(total / (double) pageSize);
+
+ if (pageNum <= 0 || pageNum > pages) {
+ pageNum = FIRST_PAGE_NUM;
+ }
+
+ final Criteria criteria = new Criteria();
+
+ if (StringUtils.isNotBlank(lastId)) {
+ if (pageNum != FIRST_PAGE_NUM) {
+ criteria.and(ID).gt(new ObjectId(lastId));
+ }
+ query.limit(pageSize);
+ } else {
+ int skip = pageSize * (pageNum - 1);
+ query.skip(skip).limit(pageSize);
+ }
+
+ final List entityList = mongoTemplate.find(query.addCriteria(criteria).with(Sort.by(Lists.newArrayList(new Order(Sort.Direction.ASC, ID)))), entityClass,
+ collectionName);
+
+ final PageList pageResult = new PageList<>();
+ Paginator paginator = pageResult.getPaginator();
+ paginator.setTotalCount((int) total);
+ paginator.setPageSize(pageSize);
+ paginator.setCurrentPage(pageNum);
+ pageResult.setData(entityList.stream().map(mapper).collect(Collectors.toList()));
+ return pageResult;
+ }
+}
\ No newline at end of file
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoTeamDAO.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoTeamDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..833f7787fe009e5409a734a56cde7be0b94d1242
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/mongo/MongoTeamDAO.java
@@ -0,0 +1,87 @@
+package cn.icanci.loopstack.amc.cloud.dal.mongodb.mongo;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.daointerface.TeamDAO;
+import cn.icanci.loopstack.amc.cloud.dal.mongodb.dataobject.TeamDO;
+import cn.icanci.loopstack.amc.common.model.PageList;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/15 12:24
+ */
+@Service("teamDAO")
+public class MongoTeamDAO extends AbstractBaseDAO implements TeamDAO {
+
+ @Override
+ public void insert(TeamDO team) {
+ super.insert(team);
+ mongoTemplate.insert(team, COLLECTION_NAME);
+ }
+
+ @Override
+ public void update(TeamDO team) {
+ super.update(team);
+ mongoTemplate.save(team, COLLECTION_NAME);
+ }
+
+ @Override
+ public List queryAll() {
+ Criteria criteria = Criteria.where(TeamColumn.env).is(DEFAULT_ENV);
+ Query query = new Query(criteria);
+ return mongoTemplate.find(query, COLLECTION_CLASS, COLLECTION_NAME);
+ }
+
+ @Override
+ public PageList pageQuery(TeamDO team, int pageNum, int pageSize) {
+ Criteria criteria = Criteria.where(TeamColumn.env).is(DEFAULT_ENV);
+
+ if (StringUtils.isNotBlank(team.getTeamName())) {
+ // 不分区大小写查询,其中操作符"i":表示不分区大小写
+ criteria.and(TeamColumn.teamName).regex("^.*" + team.getTeamName() + ".*$", "i");
+ }
+
+ if (StringUtils.isNotBlank(team.getTeamId())) {
+ criteria.and(TeamColumn.teamId).is(team.getTeamId());
+ }
+
+ if (StringUtils.isNotBlank(team.getGroupUuid())) {
+ criteria.and(TeamColumn.groupUuid).is(team.getGroupUuid());
+ }
+
+ Query query = new Query(criteria);
+ query.with(Sort.by(Sort.Direction.DESC, TeamColumn.createTime));
+
+ return pageQuery(query, COLLECTION_CLASS, pageSize, pageNum, COLLECTION_NAME);
+ }
+
+ @Override
+ public TeamDO queryOneById(String _id) {
+ Criteria criteria = Criteria.where(TeamColumn._id).is(_id);
+ criteria.and(TeamColumn.env).is(DEFAULT_ENV);
+ Query query = new Query(criteria);
+ return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME);
+ }
+
+ @Override
+ public TeamDO queryByTeamId(String teamId) {
+ Criteria criteria = Criteria.where(TeamColumn.teamId).is(teamId);
+ criteria.and(TeamColumn.env).is(DEFAULT_ENV);
+ Query query = new Query(criteria);
+ return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME);
+ }
+
+ @Override
+ public TeamDO queryByTeamName(String teamName) {
+ Criteria criteria = Criteria.where(TeamColumn.teamName).is(teamName);
+ criteria.and(TeamColumn.env).is(DEFAULT_ENV);
+ Query query = new Query(criteria);
+ return mongoTemplate.findOne(query, COLLECTION_CLASS, COLLECTION_NAME);
+ }
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/package-info.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..510f4a357929d4d97a8873f2688b723edb4e1d60
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/mongodb/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/15 11:54
+ */
+package cn.icanci.loopstack.amc.cloud.dal.mongodb;
\ No newline at end of file
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/package-info.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..48646bb18fba765c97eb2f5e5273ec5878a3de20
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/15 11:53
+ */
+package cn.icanci.loopstack.amc.cloud.dal;
\ No newline at end of file
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/EnvUtils.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/EnvUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..0a6e10d6c96f3fe71080d73b946f9be0522691e6
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/EnvUtils.java
@@ -0,0 +1,33 @@
+package cn.icanci.loopstack.amc.cloud.dal.utils;
+
+import org.apache.commons.lang3.StringUtils;
+
+import cn.icanci.loopstack.amc.cloud.dal.utils.service.EnvService;
+import cn.icanci.loopstack.amc.cloud.dal.utils.service.impl.EnvServiceImpl;
+
+/**
+ * 环境标识
+ *
+ * @author icanci
+ * @since 1.0 Created in 2022/11/12 08:26
+ */
+public class EnvUtils {
+
+ private static final String DEFAULT_ENV = "test";
+
+ private static EnvService envService;
+
+ private static String currEnv;
+
+ public static String getEnv() {
+ if (StringUtils.isBlank(currEnv)) {
+ String env = envService.getEnv();
+ currEnv = StringUtils.isBlank(env) ? DEFAULT_ENV : env;
+ }
+ return currEnv;
+ }
+
+ public static void setEnvService(EnvServiceImpl envService) {
+ EnvUtils.envService = envService;
+ }
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/IDHolder.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/IDHolder.java
new file mode 100644
index 0000000000000000000000000000000000000000..4557f85e8dca628c857bf3484b2c322916a222b1
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/IDHolder.java
@@ -0,0 +1,40 @@
+package cn.icanci.loopstack.amc.cloud.dal.utils;
+
+import cn.icanci.loopstack.amc.cloud.dal.utils.service.IDGeneratorService;
+
+/**
+ * Id 生成器
+ *
+ * @author icanci
+ * @since 1.0 Created in 2022/11/11 14:18
+ */
+public class IDHolder {
+ /** 分布式id服务 */
+ private static IDGeneratorService idGeneratorService;
+
+ private static final String DEFAULT_PREFIX = "AMC";
+
+ public static void setIdGeneratorService(IDGeneratorService idGeneratorService) {
+ IDHolder.idGeneratorService = idGeneratorService;
+ }
+
+ /**
+ * 通过雪花算法生成唯一id
+ *
+ * @param prefix 前缀
+ * @return id
+ */
+ public static String generateNoBySnowFlake(String prefix) {
+ return idGeneratorService.generateBySnowFlake(prefix);
+ }
+
+ /**
+ * 通过雪花算法生成唯一id,默认 REC
+ *
+ * @return id
+ */
+ public static String generateNoBySnowFlakeDefaultPrefix() {
+ return idGeneratorService.generateBySnowFlake(DEFAULT_PREFIX);
+ }
+
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/EnvService.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/EnvService.java
new file mode 100644
index 0000000000000000000000000000000000000000..895d5c031faf344f350cc97f2bcf240350419409
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/EnvService.java
@@ -0,0 +1,14 @@
+package cn.icanci.loopstack.amc.cloud.dal.utils.service;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2022/11/12 08:28
+ */
+public interface EnvService {
+ /**
+ * 获取当前的环境信息
+ *
+ * @return 返回当前的环境信息
+ */
+ String getEnv();
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/IDGeneratorService.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/IDGeneratorService.java
new file mode 100644
index 0000000000000000000000000000000000000000..6b78daf677341622a75233165c73babfbea7cce8
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/IDGeneratorService.java
@@ -0,0 +1,15 @@
+package cn.icanci.loopstack.amc.cloud.dal.utils.service;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2022/10/30 08:43
+ */
+public interface IDGeneratorService {
+ /**
+ * 生成唯一id
+ *
+ * @param prefix 前缀
+ * @return id
+ */
+ String generateBySnowFlake(String prefix);
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/impl/EnvServiceImpl.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/impl/EnvServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..1f86d07265fea9622184d0fd021ad2c9e25d88bb
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/impl/EnvServiceImpl.java
@@ -0,0 +1,30 @@
+package cn.icanci.loopstack.amc.cloud.dal.utils.service.impl;
+
+import cn.icanci.loopstack.amc.cloud.dal.utils.EnvUtils;
+import cn.icanci.loopstack.amc.cloud.dal.utils.service.EnvService;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2022/11/12 08:29
+ */
+@Service("envService")
+public class EnvServiceImpl implements EnvService, BeanPostProcessor {
+ @Value("${amc.env}")
+ private String env;
+
+ @Override
+ public String getEnv() {
+ return env;
+ }
+
+ @Override
+ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+ EnvUtils.setEnvService(this);
+ return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
+ }
+}
diff --git a/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/impl/IDGeneratorServiceImpl.java b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/impl/IDGeneratorServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..e6907706aa0bd27480866390735db2640f1ac9b5
--- /dev/null
+++ b/dal/src/main/java/cn/icanci/loopstack/amc/cloud/dal/utils/service/impl/IDGeneratorServiceImpl.java
@@ -0,0 +1,31 @@
+package cn.icanci.loopstack.amc.cloud.dal.utils.service.impl;
+
+import org.apache.commons.lang3.RandomUtils;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.stereotype.Service;
+
+import cn.hutool.core.lang.Snowflake;
+import cn.icanci.loopstack.amc.cloud.dal.utils.IDHolder;
+import cn.icanci.loopstack.amc.cloud.dal.utils.service.IDGeneratorService;
+
+/**
+ * 分布式ID生成器
+ *
+ * @author icanci
+ * @since 1.0 Created in 2022/10/30 08:43
+ */
+@Service
+public class IDGeneratorServiceImpl implements IDGeneratorService, InitializingBean {
+ /** 雪花序列号生成算法 */
+ private static final Snowflake SNOW_FLAKE = new Snowflake(RandomUtils.nextInt(1, 9), RandomUtils.nextInt(1, 9));
+
+ @Override
+ public String generateBySnowFlake(String prefix) {
+ return prefix + SNOW_FLAKE.nextId();
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ IDHolder.setIdGeneratorService(this);
+ }
+}
diff --git a/facade/pom.xml b/facade/pom.xml
index 953ff5a808450195a0340ab2abdd3eeb933a5399..25e567f3f34c4a9f357ce7ff79596e6673529c97 100644
--- a/facade/pom.xml
+++ b/facade/pom.xml
@@ -16,4 +16,22 @@
8
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-logging
+
+
+
+
+ cn.icanci.loopstack.amc
+ cloud-biz
+ ${parent.version}
+
+
\ No newline at end of file
diff --git a/facade/src/main/java/cn/icanci/loopstack/amc/cloud/MockCallCloudFacade.java b/facade/src/main/java/cn/icanci/loopstack/amc/cloud/MockCallCloudFacade.java
new file mode 100644
index 0000000000000000000000000000000000000000..293418d1ed134269ffc5bf515890c7e4d6de173b
--- /dev/null
+++ b/facade/src/main/java/cn/icanci/loopstack/amc/cloud/MockCallCloudFacade.java
@@ -0,0 +1,41 @@
+package cn.icanci.loopstack.amc.cloud;
+
+import cn.hutool.json.JSONUtil;
+import cn.icanci.loopstack.amc.cloud.common.model.MockCallWrapper;
+import cn.icanci.loopstack.amc.cloud.biz.service.MockCallService;
+import cn.icanci.loopstack.amc.cloud.common.request.MockCallRequest;
+import cn.icanci.loopstack.amc.cloud.common.response.MockCallResponse;
+
+import javax.annotation.Resource;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/16 14:31
+ */
+@RestController
+@RequestMapping("mock/call")
+public class MockCallCloudFacade {
+ private static final Logger logger = LoggerFactory.getLogger(MockCallCloudFacade.class);
+ @Resource
+ private MockCallService mockCallService;
+
+ @PostMapping("invoke")
+ public MockCallResponse invoke(@RequestBody MockCallRequest request) {
+ logger.info("[MockCallCloudFacade][invoke] request:{}", JSONUtil.toJsonStr(request));
+ try {
+ MockCallWrapper wrapper = mockCallService.mockCall(request.getMockCallUuid(), request.getMockRequest());
+ logger.info("[MockCallCloudFacade][invoke] response:{}", JSONUtil.toJsonStr(wrapper));
+ return MockCallResponse.success(wrapper);
+ } catch (Exception ex) {
+ logger.error("[MockCallCloudFacade][invoke] invoke error:{}", ex.getLocalizedMessage());
+ return MockCallResponse.fail(ex.getLocalizedMessage());
+ }
+ }
+}
diff --git a/facade/src/main/java/cn/icanci/loopstack/amc/cloud/package-info.java b/facade/src/main/java/cn/icanci/loopstack/amc/cloud/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..a6ce0f7696f7288e4f48eacf3c040da114f096b3
--- /dev/null
+++ b/facade/src/main/java/cn/icanci/loopstack/amc/cloud/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * @author icanci
+ * @since 1.0 Created in 2023/01/16 14:30
+ */
+package cn.icanci.loopstack.amc.cloud;
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index a75baad693eedfc8640c245a8a93f80354504189..e0909458b631a3173673aae73581a0da4684a81f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,12 +11,461 @@
biz
facade
- trace
+ dal
+ application
+ common
+
+ UTF-8
+
+ 3.8.1
+ 3.0.0-M1
+ 3.2.1
+ 3.2.0
+ 1.6.8
+ 1.6
+ 3.0.0-M1
+
+ 1.8
+ UTF-8
8
8
+
+ 4.13.2
+
+ 1.7.30
+ 2.12.1
+ 2.13.3
+ 2.13.3
+ 3.3.4
+
+ 2.2.2.RELEASE
+
+ 3.4
+ 2.4
+ 4.3
+ 19.0
+
+
+ 2.4.7.Final
+
+ 2.5.11
+
+ 2.11.2
+ 1.2.70
+
+ 1.4.2.Final
+ 5.4.2
+
+ 4.1.63.Final
+
+ 1.0-SNAPSHOT
+
+ 0.0.0.1-SNAPSHOT
+ 1.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+
+
+ org.springframework.boot
+ spring-boot-starter-logging
+
+
+ ${spring.boot.version}
+ import
+ pom
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons.lang3.version}
+
+
+ commons-io
+ commons-io
+ ${commons.io.version}
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons.collections4.version}
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ ${jackson.version}
+
+
+ com.alibaba
+ fastjson
+ ${fastjson.version}
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+ ${jackson.version}
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+
+
+ org.slf4j
+ slf4j-api
+ ${org.slf4j.version}
+
+
+
+ org.apache.logging.log4j
+ log4j-slf4j-impl
+ ${log4j-slf4j-impl.version}
+
+
+
+ org.apache.logging.log4j
+ log4j-api
+ ${log4j-api.version}
+
+
+
+ org.apache.logging.log4j
+ log4j-core
+ ${log4j-core.version}
+
+
+
+ com.lmax
+ disruptor
+ ${disruptor.version}
+
+
+
+ org.mapstruct
+ mapstruct
+ ${mapstruct.version}
+
+
+
+ cn.hutool
+ hutool-all
+ ${hutool.version}
+
+
+
+ org.mvel
+ mvel2
+ ${mvel2.version}
+
+
+ org.codehaus.groovy
+ groovy-all
+ ${groovy.version}
+ pom
+
+
+ io.netty
+ netty-all
+ ${netty-all.version}
+
+
+
+ cn.icanci.loopstack
+ lsi-event
+ ${lsi.version}
+
+
+ cn.icanci.loopstack.ddk
+ ddk-client
+ ${ddk.version}
+
+
+ cn.icanci.loopstack
+ lsi-api
+ ${lsi.version}
+
+
+ cn.icanci.loopstack
+ lsi-script
+ ${lsi.version}
+
+
+ cn.icanci.loopstack.amc
+ amc-common
+ ${amc.version}
+
+
+ cn.icanci.loopstack.amc
+ amc-spi
+ ${amc.version}
+
+
+
+
+
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+ org.apache.logging.log4j
+ log4j-slf4j-impl
+
+
+
+ org.apache.logging.log4j
+ log4j-api
+
+
+
+ org.apache.logging.log4j
+ log4j-core
+
+
+
+ com.lmax
+ disruptor
+
+
+ org.springframework.boot
+ spring-boot-starter-log4j2
+
+
+ junit
+ junit
+ test
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+
+
+ com.alibaba
+ fastjson
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+ cn.hutool
+ hutool-all
+
+
+ cn.icanci.loopstack.ddk
+ ddk-client
+ ${ddk.version}
+
+
+ cn.icanci.loopstack
+ lsi-api
+ ${lsi.version}
+
+
+
+
+
+ The Apache Software License, Version 2.0
+ http://www.apache.org/licenses/LICENSE-2.0.txt
+ repo
+
+
+
+
+
+ icanci
+ icanci@foxmail.com
+ https://gitee.com/icanci
+ +8
+
+
+
+
+ ${project.artifactId}-${project.version}
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 3.0.1
+
+
+ attach-sources
+ verify
+
+ jar-no-fork
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ ${maven-deploy-plugin.version}
+
+ ${javadoc.opts}
+
+
+
+
+
+
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven.compiler.target}
+ ${maven.compiler.source}
+ ${project.build.sourceEncoding}
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ package
+
+ jar-no-fork
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+
+
+ package
+
+ jar
+
+
+
+
+
+
+
+
+
+
+ disable-javadoc-doclint
+
+ [1.8,)
+
+
+ -Xdoclint:none
+
+
+
+ release
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ package
+
+ jar-no-fork
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+
+
+ package
+
+ jar
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-gpg-plugin
+ 1.6
+
+
+ verify
+
+ sign
+
+
+
+
+
+ org.sonatype.plugins
+ nexus-staging-maven-plugin
+ ${nexus-staging-maven-plugin.version}
+ true
+
+ oss-release
+ https://s01.oss.sonatype.org/
+ true
+
+
+
+
+
+
+ sonatype-snapshots
+ https://s01.oss.sonatype.org/content/repositories/snapshots
+
+
+ sonatype-release
+ https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/
+
+
+
+
+
+
+
+ sonatype-snapshots
+ https://s01.oss.sonatype.org/content/repositories/snapshots
+
+
+ sonatype-release
+ https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/
+
+
\ No newline at end of file