diff --git a/microservices-modules/microservices-modules-dms/pom.xml b/microservices-modules/microservices-modules-dms/pom.xml
new file mode 100644
index 000000000..4b47b7dd6
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/pom.xml
@@ -0,0 +1,147 @@
+
+
+
+ com.microservices
+ microservices-modules
+ 3.6.2
+
+ 4.0.0
+
+ microservices-modules-dms
+
+
+ microservices-modules-dms数据管理体系模块
+
+
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-sentinel
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+
+ io.springfox
+ springfox-swagger-ui
+ ${swagger.fox.version}
+
+
+
+
+ mysql
+ mysql-connector-java
+
+
+
+
+ com.microservices
+ microservices-common-async
+
+
+
+
+ com.microservices
+ microservices-common-datasource
+
+
+
+
+ com.microservices
+ microservices-common-datascope
+
+
+
+
+ com.microservices
+ microservices-common-log
+
+
+
+
+ com.microservices
+ microservices-common-swagger
+
+
+ com.microservices
+ microservices-common-security
+
+
+ com.microservices
+ microservices-common-swagger
+
+
+ org.springframework.security
+ spring-security-core
+
+
+ com.microservices
+ microservices-common-log
+
+
+ com.microservices
+ microservices-common-core
+
+
+ org.projectlombok
+ lombok
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.14
+
+
+ com.microservices
+ microservices-common-httpClient
+ 3.6.2
+ compile
+
+
+ net.coobird
+ thumbnailator
+ 0.4.8
+ compile
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/MicroservicesDmsApplication.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/MicroservicesDmsApplication.java
new file mode 100644
index 000000000..c89588cec
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/MicroservicesDmsApplication.java
@@ -0,0 +1,25 @@
+package com.microservices.dms;
+
+import com.microservices.common.security.annotation.EnableCustomConfig;
+import com.microservices.common.security.annotation.EnableRyFeignClients;
+import com.microservices.common.swagger.annotation.EnableCustomSwagger2;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+/**
+ * 项目管理模块
+ *
+ * @author otto
+ */
+@EnableCustomConfig
+@EnableCustomSwagger2
+@EnableRyFeignClients
+@SpringBootApplication
+@EnableScheduling
+public class MicroservicesDmsApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(MicroservicesDmsApplication.class, args);
+ System.out.println("(♥◠‿◠)ノ゙ 数据管理体系模块启动成功 ლ(´ڡ`ლ)゙ \n");
+ }
+}
diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/common/controller/OpenController.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/common/controller/OpenController.java
new file mode 100644
index 000000000..07e0ee6cb
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/common/controller/OpenController.java
@@ -0,0 +1,30 @@
+package com.microservices.dms.common.controller;
+
+import com.microservices.common.core.web.controller.BaseController;
+import com.microservices.common.core.web.domain.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author otto
+ */
+@RestController
+@Api(tags = "数据管理体系-公开接口")
+@RequestMapping("/open")
+@RefreshScope
+public class OpenController extends BaseController {
+
+
+
+ @GetMapping("/loginUrl")
+ @ApiOperation(value = "获取登录地址")
+ public AjaxResult loginUrl() {
+ return success( );
+ }
+
+
+}
diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/constant/TaskConstant.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/constant/TaskConstant.java
new file mode 100644
index 000000000..e8b545c47
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/constant/TaskConstant.java
@@ -0,0 +1,11 @@
+package com.microservices.dms.constant;
+
+public class TaskConstant {
+
+ public static final String TASK_TYPE_WATCHERS = "MakerTask";
+ public static final String TASK_TYPE_JOURNALS = "makerSpaceTask";
+ public static final String TASK_TYPE_PAPERS = "";
+ public static final String TASK_TYPE_OTHER = "makerSpaceTask";
+ private TaskConstant() {
+ }
+}
diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/controller/CollectUserActDataController.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/controller/CollectUserActDataController.java
new file mode 100644
index 000000000..54f9470f9
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/controller/CollectUserActDataController.java
@@ -0,0 +1,41 @@
+package com.microservices.dms.task.controller;
+
+
+import com.microservices.common.core.web.domain.AjaxResult;
+import com.microservices.dms.task.domain.Clicker;
+import com.microservices.dms.task.domain.Downloader;
+import com.microservices.dms.task.domain.Searcher;
+import com.microservices.dms.task.service.TaskResourceLibraryService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Api(tags = "数据管理体系-用户行为信息接口")
+@RestController
+@RequestMapping("/collectUserActData")
+@RequiredArgsConstructor
+public class CollectUserActDataController {
+
+ private final TaskResourceLibraryService taskResourceLibraryService;
+
+ @PostMapping("/addClicker")
+ @ApiOperation(value = "记录点击次数")
+ public AjaxResult addTaskClick(Clicker clicker) {
+ return AjaxResult.success(taskResourceLibraryService.addClick(clicker));
+ }
+
+ @PostMapping("/addDownloader")
+ @ApiOperation(value = "记录下载次数")
+ public AjaxResult addDownloader(Downloader downloader) {
+ return AjaxResult.success(taskResourceLibraryService.addDownloader(downloader));
+ }
+
+ @PostMapping("/addSearcher")
+ @ApiOperation(value = "记录搜索次数")
+ public AjaxResult addSearcher(Searcher searcher) {
+ return AjaxResult.success(taskResourceLibraryService.addSearcher(searcher));
+ }
+}
diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/controller/TaskResourceLibraryController.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/controller/TaskResourceLibraryController.java
new file mode 100644
index 000000000..19b9da742
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/controller/TaskResourceLibraryController.java
@@ -0,0 +1,83 @@
+package com.microservices.dms.task.controller;
+
+import com.microservices.common.core.utils.PageUtils;
+import com.microservices.common.core.web.controller.BaseController;
+import com.microservices.common.core.web.page.GenericsTableDataInfo;
+import com.microservices.dms.task.domain.vo.TaskListVo;
+import com.microservices.dms.task.domain.vo.UserActionDataVo;
+import com.microservices.dms.task.service.TaskResourceLibraryService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Api(tags = "数据管理体系-任务资源库接口")
+@RestController
+@RequestMapping("/taskResourceLibrary")
+@RequiredArgsConstructor
+public class TaskResourceLibraryController extends BaseController {
+
+ private final TaskResourceLibraryService taskResourceLibraryService;
+
+
+ @GetMapping("/selectTaskJournalsCondition")
+ @ApiOperation(value = "查询用户评论")
+ public GenericsTableDataInfo selectTaskJournalsCondition(@RequestParam UserActionDataVo taskJournals) {
+ PageUtils.startPage();
+ List userActionDataVos = taskResourceLibraryService.selectTaskJournalsCondition(taskJournals);
+ return PageUtils.toPage(userActionDataVos);
+ }
+
+ @GetMapping("selectClickerCondition")
+ @ApiOperation(value = "查询用户点击")
+ public GenericsTableDataInfo selectClickerCondition(@RequestParam UserActionDataVo taskJournals) {
+ PageUtils.startPage();
+ List userActionDataVos = taskResourceLibraryService.selectClickerCondition(taskJournals);
+ return PageUtils.toPage(userActionDataVos);
+ }
+
+ @GetMapping("selectDownloaderCondition")
+ @ApiOperation(value = "查询用户下载")
+ public GenericsTableDataInfo selectDownloaderCondition(@RequestParam UserActionDataVo taskJournals) {
+ PageUtils.startPage();
+ List userActionDataVos = taskResourceLibraryService.selectDownloaderCondition(taskJournals);
+ return PageUtils.toPage(userActionDataVos);
+ }
+
+ @GetMapping("selectPapersCondition")
+ @ApiOperation(value = "查询用户交稿")
+ public GenericsTableDataInfo selectPapersCondition(@RequestParam UserActionDataVo taskJournals) {
+ PageUtils.startPage();
+ List userActionDataVos = taskResourceLibraryService.selectPapersCondition(taskJournals);
+ return PageUtils.toPage(userActionDataVos);
+ }
+
+ @GetMapping("selectWatcherCondition")
+ @ApiOperation(value = "查询用户关注")
+ public GenericsTableDataInfo selectWatcherCondition(@RequestParam UserActionDataVo taskJournals) {
+ PageUtils.startPage();
+ List userActionDataVos = taskResourceLibraryService.selectWatcherCondition(taskJournals);
+ return PageUtils.toPage(userActionDataVos);
+ }
+
+ @GetMapping("selectSearcherCondition")
+ @ApiOperation(value = "查询用户搜索")
+ public GenericsTableDataInfo selectSearcherCondition(@RequestParam UserActionDataVo taskJournals) {
+ PageUtils.startPage();
+ List userActionDataVos = taskResourceLibraryService.selectSearcherCondition(taskJournals);
+ return PageUtils.toPage(userActionDataVos);
+ }
+
+ @GetMapping("selectTaskListCondition")
+ @ApiOperation(value = "查询任务列表")
+ public GenericsTableDataInfo selectTaskListCondition(@RequestParam TaskListVo taskListVo) {
+ PageUtils.startPage();
+ List userActionDataVos = taskResourceLibraryService.selectTaskListCondition(taskListVo);
+ return PageUtils.toPage(userActionDataVos);
+ }
+}
diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/domain/Clicker.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/domain/Clicker.java
new file mode 100644
index 000000000..68f652193
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/domain/Clicker.java
@@ -0,0 +1,19 @@
+package com.microservices.dms.task.domain;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class Clicker{
+ private Long id;
+ private String clickType;
+ private Long clickId;
+ private Long userId;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "")
+ private Date createdAt;
+ private String extInfo;
+}
+
diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/domain/Downloader.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/domain/Downloader.java
new file mode 100644
index 000000000..5c83f04f0
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/domain/Downloader.java
@@ -0,0 +1,16 @@
+package com.microservices.dms.task.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+@Data
+public class Downloader {
+ private Long id;
+ private String downloadType;
+ private Long downloadId;
+ private Long userId;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "")
+ private Date createdAt;
+ private String extInfo;
+}
diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/domain/Searcher.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/domain/Searcher.java
new file mode 100644
index 000000000..aa0de994a
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/domain/Searcher.java
@@ -0,0 +1,18 @@
+package com.microservices.dms.task.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class Searcher {
+ private Long id;
+ private String clickType;
+ private Long clickId;
+ private Long userId;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "")
+ private Date createdAt;
+ private String extInfo;
+
+}
diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/domain/vo/TaskListVo.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/domain/vo/TaskListVo.java
new file mode 100644
index 000000000..cebb53e33
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/domain/vo/TaskListVo.java
@@ -0,0 +1,22 @@
+package com.microservices.dms.task.domain.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class TaskListVo {
+ private Long id;
+ private String name;
+ private String categoryName;
+ private Long categoryId;
+ private BigDecimal bounty;
+ private Long totalTaskDays;
+
+ private Long taskClickCount;
+ private Long taskWatcherCount;
+ private Long taskPapersCount;
+ private Long taskJournalCount;
+ private Long taskSearchCount;
+ private Long taskDownloadCount;
+}
diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/domain/vo/UserActionDataVo.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/domain/vo/UserActionDataVo.java
new file mode 100644
index 000000000..a33ded0ea
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/domain/vo/UserActionDataVo.java
@@ -0,0 +1,18 @@
+package com.microservices.dms.task.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class UserActionDataVo {
+ private Long id;
+ private String itemType;
+ private Integer itemId;
+ private String itemName;
+ private Integer userId;
+ private String userName;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "")
+ private Date createdAt;
+}
diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/mapper/TaskResourceLibraryMapper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/mapper/TaskResourceLibraryMapper.java
new file mode 100644
index 000000000..7c40bb3c1
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/mapper/TaskResourceLibraryMapper.java
@@ -0,0 +1,45 @@
+package com.microservices.dms.task.mapper;
+
+import com.microservices.dms.task.domain.Clicker;
+import com.microservices.dms.task.domain.Downloader;
+import com.microservices.dms.task.domain.Searcher;
+import com.microservices.dms.task.domain.vo.TaskListVo;
+import com.microservices.dms.task.domain.vo.UserActionDataVo;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface TaskResourceLibraryMapper {
+
+ int insertClicker(Clicker record);
+
+ int insertSearcher(Searcher record);
+
+ int insertDownloader(Downloader record);
+
+ List selectClickerCondition(UserActionDataVo clicker);
+
+ List selectSearcherCondition(UserActionDataVo searcher);
+
+ List selectDownloaderCondition(UserActionDataVo downloader);
+
+ List selectWatcherCondition(UserActionDataVo watcher);
+
+ List selectPapersCondition(UserActionDataVo paper);
+
+ List selectTaskJournalsCondition(UserActionDataVo taskJournals);
+
+ List selectTaskListCondition(TaskListVo taskListVo);
+
+ long countClickerCondition(UserActionDataVo clicker);
+
+ long countSearcherCondition(UserActionDataVo searcher);
+
+ long countDownloaderCondition(UserActionDataVo downloader);
+
+ long countWatcherCondition(UserActionDataVo watcher);
+
+ long countPapersCondition(UserActionDataVo paper);
+ long countTaskJournalsCondition(UserActionDataVo taskJournals);
+}
diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/service/TaskResourceLibraryService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/service/TaskResourceLibraryService.java
new file mode 100644
index 000000000..9bc9e4bc1
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/task/service/TaskResourceLibraryService.java
@@ -0,0 +1,86 @@
+package com.microservices.dms.task.service;
+
+import com.microservices.common.core.utils.DateUtils;
+import com.microservices.dms.constant.TaskConstant;
+import com.microservices.dms.task.domain.Clicker;
+import com.microservices.dms.task.domain.Downloader;
+import com.microservices.dms.task.domain.Searcher;
+import com.microservices.dms.task.domain.vo.TaskListVo;
+import com.microservices.dms.task.domain.vo.UserActionDataVo;
+import com.microservices.dms.task.mapper.TaskResourceLibraryMapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class TaskResourceLibraryService {
+ private final TaskResourceLibraryMapper taskResourceLibraryMapper;
+
+ public int addClick(Clicker click) {
+ click.setCreatedAt(DateUtils.getNowDate());
+ return taskResourceLibraryMapper.insertClicker(click);
+ }
+
+ public int addSearcher(Searcher searcher) {
+ searcher.setCreatedAt(DateUtils.getNowDate());
+ return taskResourceLibraryMapper.insertSearcher(searcher);
+ }
+
+ public int addDownloader(Downloader downloader) {
+ downloader.setCreatedAt(DateUtils.getNowDate());
+ return taskResourceLibraryMapper.insertDownloader(downloader);
+ }
+
+ public List selectClickerCondition(UserActionDataVo actionDataVo) {
+ return taskResourceLibraryMapper.selectClickerCondition(actionDataVo);
+ }
+
+ public List selectSearcherCondition(UserActionDataVo searcher) {
+ return taskResourceLibraryMapper.selectSearcherCondition(searcher);
+ }
+
+ public List selectDownloaderCondition(UserActionDataVo downloader) {
+ return taskResourceLibraryMapper.selectDownloaderCondition(downloader);
+ }
+
+ public List selectWatcherCondition(UserActionDataVo watcher) {
+ return taskResourceLibraryMapper.selectWatcherCondition(watcher);
+ }
+
+ public List selectPapersCondition(UserActionDataVo paper) {
+ return taskResourceLibraryMapper.selectPapersCondition(paper);
+ }
+
+ public List selectTaskJournalsCondition(UserActionDataVo taskJournals) {
+ return taskResourceLibraryMapper.selectTaskJournalsCondition(taskJournals);
+ }
+
+ public List selectTaskListCondition(TaskListVo taskListVo) {
+ List taskListVos = taskResourceLibraryMapper.selectTaskListCondition(taskListVo);
+ for (TaskListVo vo : taskListVos) {
+ UserActionDataVo c = new UserActionDataVo();
+ c.setId(vo.getId());
+ c.setItemType(TaskConstant.TASK_TYPE_PAPERS);
+ long papers = taskResourceLibraryMapper.countPapersCondition(c);
+ c.setItemType(TaskConstant.TASK_TYPE_WATCHERS);
+ long watcher = taskResourceLibraryMapper.countWatcherCondition(c);
+ c.setItemType(TaskConstant.TASK_TYPE_JOURNALS);
+ long clicker = taskResourceLibraryMapper.countClickerCondition(c);
+ long downloader = taskResourceLibraryMapper.countDownloaderCondition(c);
+ long taskJournals = taskResourceLibraryMapper.countTaskJournalsCondition(c);
+ long searcher = taskResourceLibraryMapper.countSearcherCondition(c);
+
+ vo.setTaskClickCount(clicker);
+ vo.setTaskWatcherCount(watcher);
+ vo.setTaskPapersCount(papers);
+ vo.setTaskDownloadCount(downloader);
+ vo.setTaskJournalCount(taskJournals);
+ vo.setTaskSearchCount(searcher);
+ }
+ return taskListVos;
+ }
+
+
+}
diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/CustomExecutorFactory.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/CustomExecutorFactory.java
new file mode 100644
index 000000000..c14a300bd
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/CustomExecutorFactory.java
@@ -0,0 +1,37 @@
+package com.microservices.dms.utils;
+
+import com.microservices.common.core.exception.ServiceException;
+import com.microservices.common.core.threadPool.ThreadPoolExecutorWrap;
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 线程池工厂
+ *
+ * @author OTTO
+ */
+public class CustomExecutorFactory {
+ /**
+ * 创建线程池
+ * 存在并发处理的情况,设置核心线程为2,设置有界队列长度为100,最大线程数为10
+ * 当超出队列已满且达到最大线程数时抛出异常
+ * Ncpu=CPU数量
+ * Ucpu=目标CPU的使用率,0<=Ucpu<=1
+ * W/C=任务等待时间与任务计算时间的比率
+ * Nthreads =Ncpu*Ucpu*(1+W/C)
+ */
+ public static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutorWrap(
+ 4
+ , 10
+ , 10
+ , TimeUnit.SECONDS
+ , new ArrayBlockingQueue<>(100)
+ , Executors.defaultThreadFactory()
+ , (r, executor) -> {
+ throw new ServiceException("目前处理的人太多了,请稍后再试");
+ }
+ );
+}
diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/DmsConstants.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/DmsConstants.java
new file mode 100644
index 000000000..83bdcc2bd
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/DmsConstants.java
@@ -0,0 +1,5 @@
+package com.microservices.dms.utils;
+
+public class DmsConstants {
+
+}
diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/DmsUtils.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/DmsUtils.java
new file mode 100644
index 000000000..8522ba0d2
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/DmsUtils.java
@@ -0,0 +1,82 @@
+package com.microservices.dms.utils;
+
+import com.microservices.common.core.exception.ServiceException;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.UUID;
+import java.util.function.Function;
+
+/**
+ * @author otto
+ */
+public class DmsUtils {
+ /**
+ * 产品标识使用六位随机值
+ *
+ * @return 产品标识
+ */
+ public static String generateRandomProductIdentifier() {
+ UUID uuid = UUID.randomUUID();
+ // 截取UUID的一部分,例如前6个字符
+ return uuid.toString().substring(0, 6).toUpperCase();
+ }
+
+ /**
+ * 校验开始时间和结束时间
+ *
+ * @param startDate 开始时间
+ * @param endDate 结束时间
+ */
+ public static void validStartTimeAndEndTime(Date startDate, Date endDate) {
+ if (startDate != null && endDate != null) {
+ if (endDate.before(startDate)) {
+ throw new ServiceException("结束时间不能早于开始时间");
+ }
+ }
+ }
+
+ /**
+ * 从HashMap中获取缓存数据,当HashMap中不存在时执行传入的数据查询方法获取数据并存入缓存(当HashMap为null时直接返回执行数据查询的结果)
+ * 使用方法名和输入参数作为缓存Key,简化代码
+ *
+ * @param hashMap 缓存
+ * @param dataRetrievalFunction 数据查询方法
+ * @param args 查询方法输入参数
+ * @param 查询方法输入参数类型
+ * @param 返回数据类型
+ * @return 结果
+ */
+ public static R getSelectObjectInCache(HashMap hashMap, Function dataRetrievalFunction, T args) {
+ if (dataRetrievalFunction == null) {
+ return null;
+ }
+ String cacheKey = dataRetrievalFunction.getClass().getSimpleName() + "-" + args;
+ if (hashMap == null) {
+ return dataRetrievalFunction.apply(args);
+ } else if (hashMap.containsKey(cacheKey)) {
+ @SuppressWarnings("unchecked")
+ R r = (R) hashMap.get(cacheKey);
+ return r;
+ } else {
+ R r = dataRetrievalFunction.apply(args);
+ hashMap.put(cacheKey, r);
+ return r;
+ }
+ }
+
+ /**
+ * 获取文件路径中文件所在的文件夹
+ *
+ * @return 文件夹
+ */
+ public static String parseDirectory(String filePath) {
+ // 找到最后一个"/"的位置
+ int lastSlashIndex = filePath.lastIndexOf('/');
+ if (lastSlashIndex > 0) {
+ // 截取到"/"之前的所有字符作为文件夹路径
+ return filePath.substring(0, lastSlashIndex);
+ }
+ return "";
+ }
+}
diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/YamlUtil.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/YamlUtil.java
new file mode 100644
index 000000000..e381bf502
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/YamlUtil.java
@@ -0,0 +1,58 @@
+package com.microservices.dms.utils;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
+import com.microservices.common.core.exception.ServiceException;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.io.StringWriter;
+
+@Slf4j
+public class YamlUtil {
+ /**
+ * 将yaml字符串转成类对象
+ *
+ * @param yamlStr 字符串
+ * @param clazz 目标类
+ * @param 泛型
+ * @return 目标类
+ */
+ public static T toObject(String yamlStr, Class clazz) {
+ ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
+ mapper.findAndRegisterModules();
+ try {
+ return mapper.readValue(yamlStr, clazz);
+ } catch (JsonProcessingException e) {
+ log.error("yaml文本解析成java对象错误:", e);
+ throw new ServiceException("yaml文本解析成java对象错误!");
+ }
+ }
+
+ /**
+ * 将类对象转yaml字符串
+ *
+ * @param object 对象
+ * @return yaml字符串
+ */
+ public static String toYaml(Object object) {
+ ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
+ mapper.findAndRegisterModules();
+ mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+ mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
+ mapper = new ObjectMapper(new YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER));
+ StringWriter stringWriter = new StringWriter();
+ try {
+ mapper.writeValue(stringWriter, object);
+ return stringWriter.toString();
+ } catch (IOException e) {
+ log.error("Java对象解析成Yaml文本错误", e);
+ }
+ return null;
+ }
+}
+
+
diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/banner.txt b/microservices-modules/microservices-modules-dms/src/main/resources/banner.txt
new file mode 100644
index 000000000..59ae9965a
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/resources/banner.txt
@@ -0,0 +1,10 @@
+Spring Boot Version: ${spring-boot.version}
+Spring Application Name: ${spring.application.name}
+ _
+ (_)
+ _ __ _ _ ___ _ _ _ ______ _ __ _ __ ___ ___
+| '__|| | | | / _ \ | | | || ||______|| '_ \ | '_ ` _ \ / __|
+| | | |_| || (_) || |_| || | | |_) || | | | | |\__ \
+|_| \__,_| \___/ \__, ||_| | .__/ |_| |_| |_||___/
+ __/ | | |
+ |___/ |_|
\ No newline at end of file
diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/bootstrap-prod.yml b/microservices-modules/microservices-modules-dms/src/main/resources/bootstrap-prod.yml
new file mode 100644
index 000000000..b222e5964
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/resources/bootstrap-prod.yml
@@ -0,0 +1,34 @@
+# Tomcat
+server:
+ port: 9118
+
+# Spring
+spring:
+ application:
+ # 应用名称
+ name: microservices-dms
+ config:
+ activate:
+ # 环境配置
+ on-profile:
+ prod
+ cloud:
+ sentinel:
+ # 取消控制台懒加载
+ eager: true
+ nacos:
+ discovery:
+ # 服务注册地址
+ server-addr: ${nacos_ip}:${nacos_port}
+ username: ${nacos_username}
+ password: ${nacos_password}
+ config:
+ # 配置中心地址
+ server-addr: ${nacos_ip}:${nacos_port}
+ username: ${nacos_username}
+ password: ${nacos_password}
+ # 配置文件格式
+ file-extension: yml
+ # 共享配置
+ shared-configs:
+ - { dataId: "application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}",refresh: true }
diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/bootstrap.yml b/microservices-modules/microservices-modules-dms/src/main/resources/bootstrap.yml
new file mode 100644
index 000000000..ac90e2bb5
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/resources/bootstrap.yml
@@ -0,0 +1,32 @@
+# Tomcat
+server:
+ port: 9118
+
+# Spring
+spring:
+ application:
+ # 应用名称
+ name: microservices-dms
+ profiles:
+ # 环境配置
+ active: dev
+ cloud:
+ sentinel:
+ # 取消控制台懒加载
+ eager: true
+ nacos:
+ discovery:
+ # 服务注册地址
+ server-addr: 127.0.0.1:8848
+ username: nacos
+ password: nacos
+ config:
+ # 配置中心地址
+ server-addr: 127.0.0.1:8848
+ username: nacos
+ password: nacos
+ # 配置文件格式
+ file-extension: yml
+ # 共享配置
+ shared-configs:
+ - { dataId: "application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}",refresh: true }
diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/logback.xml b/microservices-modules/microservices-modules-dms/src/main/resources/logback.xml
new file mode 100644
index 000000000..8d66f2a37
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/resources/logback.xml
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+ ${log.pattern}
+
+
+
+
+
+ ${log.path}/info.log
+
+
+
+ ${log.path}/info.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+ ${log.pattern}
+
+
+
+ INFO
+
+ ACCEPT
+
+ DENY
+
+
+
+
+ ${log.path}/error.log
+
+
+
+ ${log.path}/error.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+ ${log.pattern}
+
+
+
+ ERROR
+
+ ACCEPT
+
+ DENY
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ "level": "%level",
+ "tid": "%tid",
+ "skyWalkingContext": "%sw_ctx",
+ "thread": "%thread",
+ "class": "%logger{1.}:%L",
+ "message": "%message",
+ "stackTrace": "%exception{10}"
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TaskResourceLibraryMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TaskResourceLibraryMapper.xml
new file mode 100644
index 000000000..89af203c8
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TaskResourceLibraryMapper.xml
@@ -0,0 +1,267 @@
+
+
+
+
+
+ INSERT INTO clickers
+
+
+ click_type,
+
+
+ click_id,
+
+
+ user_id,
+
+
+ created_at,
+
+
+ ext_info
+
+
+
+
+ #{clickType},
+
+
+ #{clickId},
+
+
+ #{userId},
+
+
+ #{createdAt},
+
+
+ #{extInfo}
+
+
+
+
+
+ INSERT INTO searchers
+
+
+ search_type,
+
+
+ search_id,
+
+
+ user_id,
+
+
+ created_at,
+
+
+ ext_info
+
+
+
+
+ #{searchType},
+
+
+ #{searchId},
+
+
+ #{userId},
+
+
+ #{createdAt},
+
+
+ #{extInfo}
+
+
+
+
+
+ INSERT INTO downloaders
+
+
+ download_type,
+
+
+ download_id,
+
+
+ user_id,
+
+
+ created_at,
+
+
+ ext_info
+
+
+
+
+ #{downloadType},
+
+
+ #{downloadId},
+
+
+ #{userId},
+
+
+ #{createdAt},
+
+
+ #{extInfo}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/microservices-modules/microservices-modules-dms/src/main/test/com/microservices/pms/test/PmsProjectTestSheetTest.java b/microservices-modules/microservices-modules-dms/src/main/test/com/microservices/pms/test/PmsProjectTestSheetTest.java
new file mode 100644
index 000000000..8a38b37c2
--- /dev/null
+++ b/microservices-modules/microservices-modules-dms/src/main/test/com/microservices/pms/test/PmsProjectTestSheetTest.java
@@ -0,0 +1,63 @@
+package com.microservices.pms.test;
+
+import com.alibaba.fastjson2.JSON;
+import com.microservices.pms.enums.TestCaseStatus;
+import com.microservices.pms.project.domain.PmsProjectTestsheetCases;
+import com.microservices.pms.project.domain.vo.PmsProjectTestcaseStepDataVo;
+import com.microservices.pms.project.domain.vo.PmsProjectTestsheetCaseStepVo;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class PmsProjectTestSheetTest {
+
+ public static void main(String[] args) {
+ List testsheetCasesList= new ArrayList();
+ PmsProjectTestsheetCases a = new PmsProjectTestsheetCases();
+ a.setTestStatus(1l);
+ PmsProjectTestsheetCases b = new PmsProjectTestsheetCases();
+ b.setTestStatus(1l);
+ PmsProjectTestsheetCases c = new PmsProjectTestsheetCases();
+ c.setTestStatus(3l);
+ PmsProjectTestsheetCases d = new PmsProjectTestsheetCases();
+ d.setTestStatus(3l);
+
+ testsheetCasesList.add(a);
+ testsheetCasesList.add(b);
+ testsheetCasesList.add(c);
+ testsheetCasesList.add(d);
+ Map listMap = Optional.ofNullable(testsheetCasesList).orElse(Collections.emptyList()).stream()
+ .collect(Collectors.groupingBy(PmsProjectTestsheetCases::getTestStatus, Collectors.summingInt(value -> 1)));
+ listMap.forEach((key, value) -> System.out.println("" + key + ":" + value));
+
+ Long passCount = Optional.ofNullable(testsheetCasesList).orElse(Collections.emptyList()).stream()
+ .filter(testCase -> testCase.getTestStatus().intValue() == 1).count();
+ // 总 = 失败+通过+阻塞+未执行(或者排除跳过的)
+ Long execTotalCount = Optional.ofNullable(testsheetCasesList).orElse(Collections.emptyList()).stream()
+ .filter(testCase -> testCase.getTestStatus().intValue() != 2).count();
+ //Long execTotalCount = testsheetCasesList.stream().filter(testCase -> new HashSet<>(Arrays.asList(0L, 1L, 2L, 3L)).contains(testCase.getTestStatus())).count();
+ // 通过率s
+ System.out.println(passCount);
+ System.out.println(execTotalCount);
+ System.out.println(BigDecimal.valueOf(passCount / execTotalCount.doubleValue()).setScale(2, BigDecimal.ROUND_HALF_UP));
+// System.out.println(BigDecimal.valueOf(0 / 0d).setScale(2, BigDecimal.ROUND_HALF_UP));
+ System.out.println(BigDecimal.valueOf(new Double("0.1114")));
+
+ List testcaseStepList = new ArrayList<>();
+ PmsProjectTestsheetCaseStepVo aaa = new PmsProjectTestsheetCaseStepVo();
+ aaa.setStepId(1l);
+ aaa.setStepStatus(1);
+ PmsProjectTestsheetCaseStepVo bbb = new PmsProjectTestsheetCaseStepVo();
+ bbb.setStepId(2l);
+ bbb.setStepStatus(1);
+ testcaseStepList.add(aaa);
+ testcaseStepList.add(bbb);
+
+ System.out.println(JSON.toJSONString(Optional.ofNullable(testcaseStepList).orElse(Collections.emptyList())));
+ System.out.println(JSON.parseArray("[{\"stepId\":1,\"stepStatus\":1},{\"stepId\":2,\"stepStatus\":1}]", PmsProjectTestcaseStepDataVo.class));
+ System.out.println(JSON.parseArray("[{\"stepId\":1,\"stepStatus\":1},{\"stepId\":2,\"stepStatus\":1}]", HashMap.class));
+
+ Long[] testsheetCasesIds = testsheetCasesList.stream().map(PmsProjectTestsheetCases::getTestStatus).toArray(Long[]::new);
+ }
+}
diff --git a/microservices-modules/pom.xml b/microservices-modules/pom.xml
index 70605677d..8d77d8614 100644
--- a/microservices-modules/pom.xml
+++ b/microservices-modules/pom.xml
@@ -18,6 +18,7 @@
microservices-modules-pms
microservices-modules-wiki
microservices-modules-dss
+ microservices-modules-dms
microservices-modules