feat: collaboration and statistics

This commit is contained in:
gin
2026-05-15 09:19:09 +08:00
parent cdee21ee8e
commit 2757a4fb49
91 changed files with 4504 additions and 1301 deletions
@@ -0,0 +1,104 @@
package com.agileboot.admin.controller.collaboration;
import com.agileboot.admin.customize.aop.accessLog.AccessLog;
import com.agileboot.common.core.base.BaseController;
import com.agileboot.common.core.dto.ResponseDTO;
import com.agileboot.common.core.page.PageDTO;
import com.agileboot.common.enums.common.BusinessTypeEnum;
import com.agileboot.domain.collaboration.record.CollaborationRecordApplicationService;
import com.agileboot.domain.collaboration.record.command.AddCollaborationRecordCommand;
import com.agileboot.domain.collaboration.record.command.UpdateCollaborationRecordCommand;
import com.agileboot.domain.collaboration.record.dto.CollaborationMonthlyStatisticsDTO;
import com.agileboot.domain.collaboration.record.dto.CollaborationOptionDTO;
import com.agileboot.domain.collaboration.record.dto.CollaborationRecordDTO;
import com.agileboot.domain.collaboration.record.dto.CollaborationRecordDetailDTO;
import com.agileboot.domain.collaboration.record.query.CollaborationRecordQuery;
import com.agileboot.domain.common.command.BulkOperationCommand;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.List;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @author codex
*/
@Tag(name = "合作记录API", description = "合作记录相关的增删查改和统计")
@RestController
@RequestMapping("/collaboration/record")
@Validated
@RequiredArgsConstructor
public class CollaborationRecordController extends BaseController {
private final CollaborationRecordApplicationService recordApplicationService;
@Operation(summary = "合作记录列表")
@PreAuthorize("@permission.has('collaboration:record:list')")
@GetMapping("/list")
public ResponseDTO<PageDTO<CollaborationRecordDTO>> list(CollaborationRecordQuery query) {
return ResponseDTO.ok(recordApplicationService.getRecordList(query));
}
@Operation(summary = "合作记录详情")
@PreAuthorize("@permission.has('collaboration:record:query')")
@GetMapping("/{recordId}")
public ResponseDTO<CollaborationRecordDetailDTO> getInfo(@PathVariable @Positive Long recordId) {
return ResponseDTO.ok(recordApplicationService.getRecordInfo(recordId));
}
@Operation(summary = "合作记录选项")
@PreAuthorize("@permission.has('collaboration:record:list')")
@GetMapping("/options")
public ResponseDTO<List<CollaborationOptionDTO>> options() {
return ResponseDTO.ok(recordApplicationService.getOptions());
}
@Operation(summary = "合作记录月度统计")
@PreAuthorize("@permission.has('collaboration:record:statistics')")
@GetMapping("/monthly-statistics")
public ResponseDTO<List<CollaborationMonthlyStatisticsDTO>> monthlyStatistics(@RequestParam Integer year) {
return ResponseDTO.ok(recordApplicationService.getMonthlyStatistics(year));
}
@Operation(summary = "新增合作记录")
@PreAuthorize("@permission.has('collaboration:record:add')")
@AccessLog(title = "合作记录", businessType = BusinessTypeEnum.ADD)
@PostMapping
public ResponseDTO<Void> add(@Valid @RequestBody AddCollaborationRecordCommand command) {
recordApplicationService.addRecord(command);
return ResponseDTO.ok();
}
@Operation(summary = "修改合作记录")
@PreAuthorize("@permission.has('collaboration:record:edit')")
@AccessLog(title = "合作记录", businessType = BusinessTypeEnum.MODIFY)
@PutMapping
public ResponseDTO<Void> edit(@Valid @RequestBody UpdateCollaborationRecordCommand command) {
recordApplicationService.updateRecord(command);
return ResponseDTO.ok();
}
@Operation(summary = "删除合作记录")
@PreAuthorize("@permission.has('collaboration:record:remove')")
@AccessLog(title = "合作记录", businessType = BusinessTypeEnum.DELETE)
@DeleteMapping
public ResponseDTO<Void> remove(@RequestParam @NotNull @NotEmpty List<Long> ids) {
recordApplicationService.deleteRecord(new BulkOperationCommand<>(ids));
return ResponseDTO.ok();
}
}
@@ -50,7 +50,7 @@ spring:
datasource:
# 主库数据源
master:
url: jdbc:mysql://localhost:3306/agileboot_pure?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
url: jdbc:mysql://localhost:33061/todo_agileboot_pure?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root123
# 从库数据源
@@ -64,7 +64,7 @@ spring:
# 地址
host: localhost
# 端口,默认为6379
port: 6379
port: 63791
# 数据库索引
database: 0
# 密码
@@ -84,7 +84,7 @@ spring:
logging:
file:
path: D:/logs/agileboot-dev
path: /home/agileboot/logs/agileboot-dev
springdoc:
@@ -98,8 +98,8 @@ springdoc:
# 项目相关配置
agileboot:
# 文件基路径 示例( Windows配置D:\agilebootLinux配置 /home/agileboot
file-base-dir: D:\agileboot
# 文件基路径 示例(Linux配置 /home/agileboot
file-base-dir: /home/agileboot
# 前端url请求转发前缀
api-prefix: /dev-api
demo-enabled: false
@@ -6,14 +6,11 @@ import com.agileboot.common.config.AgileBootConfig;
import com.agileboot.common.constant.Constants.UploadSubDir;
import java.io.File;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.jupiter.api.Assertions;
import org.junit.runner.RunWith;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest(classes = AgileBootAdminApplication.class)
@RunWith(SpringRunner.class)
public class AgileBootConfigTest {
@Resource
@@ -21,7 +18,7 @@ public class AgileBootConfigTest {
@Test
public void testConfig() {
String fileBaseDir = "D:\\agileboot\\profile";
String fileBaseDir = "/home/agileboot/profile";
Assertions.assertEquals("AgileBoot", config.getName());
Assertions.assertEquals("1.8.0", config.getVersion());
@@ -31,13 +28,13 @@ public class AgileBootConfigTest {
Assertions.assertFalse(AgileBootConfig.isAddressEnabled());
Assertions.assertEquals("math", AgileBootConfig.getCaptchaType());
Assertions.assertEquals("math", AgileBootConfig.getCaptchaType());
Assertions.assertEquals(fileBaseDir + "\\import",
Assertions.assertEquals(fileBaseDir + "/import",
AgileBootConfig.getFileBaseDir() + File.separator + UploadSubDir.IMPORT_PATH);
Assertions.assertEquals(fileBaseDir + "\\avatar",
Assertions.assertEquals(fileBaseDir + "/avatar",
AgileBootConfig.getFileBaseDir() + File.separator + UploadSubDir.AVATAR_PATH);
Assertions.assertEquals(fileBaseDir + "\\download",
Assertions.assertEquals(fileBaseDir + "/download",
AgileBootConfig.getFileBaseDir() + File.separator + UploadSubDir.DOWNLOAD_PATH);
Assertions.assertEquals(fileBaseDir + "\\upload",
Assertions.assertEquals(fileBaseDir + "/upload",
AgileBootConfig.getFileBaseDir() + File.separator + UploadSubDir.UPLOAD_PATH);
}