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