diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/common/controller/OpenController.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/common/controller/OpenController.java index 6b14dde11..b9a1bedb6 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/common/controller/OpenController.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/common/controller/OpenController.java @@ -3,8 +3,10 @@ package com.microservices.pms.common.controller; import com.microservices.common.core.utils.html.EscapeUtil; import com.microservices.common.core.web.controller.BaseController; import com.microservices.common.core.web.domain.AjaxResult; +import com.microservices.pms.specialArea.service.SoftwareFactStatisticsServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; @@ -23,6 +25,9 @@ public class OpenController extends BaseController { @Value("${http.gitLinkUrl}") public String gitLinkUrl; + @Autowired + private SoftwareFactStatisticsServiceImpl softwareFactStatisticsService; + /** * 查询项目管理企业列表 */ @@ -33,4 +38,23 @@ public class OpenController extends BaseController { (Object) EscapeUtil.removeExtraSlashOfUrl(gitLinkUrl + "/login") ); } + + @ApiOperation(value = "今日工作态势") + @GetMapping("/specialArea/softwareFact/statis/todayWorkSituation") + public AjaxResult todayWorkSituation(){ + return AjaxResult.success(softwareFactStatisticsService.todayWorkSituation()); + } + + @ApiOperation(value = "周、月工作态势") + @GetMapping("/specialArea/softwareFact/statis/weekMonthWorkSituation") + public AjaxResult weekMonthWorkSituation(String type){ + return AjaxResult.success(softwareFactStatisticsService.weekMonthWorkSituation(type)); + } + + @ApiOperation(value = "项目研发状态") + @GetMapping("/specialArea/softwareFact/statis/projectSituation") + public AjaxResult projectSituation(){ + return AjaxResult.success(softwareFactStatisticsService.projectSituation()); + } + } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/constant/Constant.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/constant/Constant.java new file mode 100644 index 000000000..bd9227093 --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/constant/Constant.java @@ -0,0 +1,30 @@ +package com.microservices.pms.specialArea.constant; + +import java.util.Arrays; +import java.util.List; + +public class Constant { + + private Constant() {} + + public static final List ISSUE_NOT_FINISHED = Arrays.asList(1,2); + public static final List ISSUE_FINISHED = Arrays.asList(3,5,6); + + public static final Integer NEED = 1; + public static final Integer TASK = 2; + public static final Integer BUG = 3; + + + public static final Integer TASK_CASE_STATUS_NOT_EXEC = 0; + public static final Integer TASK_CASE_STATUS_PASS = 1; + public static final Integer TASK_CASE_STATUS_FAIL = 2; + public static final Integer TASK_CASE_STATUS_BLOCK = 3; + public static final Integer TASK_CASE_STATUS_SKIP = 4; + + + public static final Integer SPRINT_STATUS_CLOSED = 2; + public static final Integer SPRINT_STATUS_PROCESSING = 1; + public static final Integer SPRINT_STATUS_NOT_START = 0; + + +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/domain/ForgeProject.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/domain/ForgeProject.java new file mode 100644 index 000000000..e111a1ef3 --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/domain/ForgeProject.java @@ -0,0 +1,25 @@ +package com.microservices.pms.specialArea.domain; + +import lombok.Data; + +import java.util.Date; +import java.util.List; + +@Data +public class ForgeProject { + + //项目ID + private Long pmProjectId; + // 需求1 任务2 缺陷3,默认为 1 + private Integer pmIssueType; + + //状态ID + private List statusIds; + //创建时间开始 + private Date createTimeS; + //创建时间结束 + private Date createTimeE; + //更新时间开始 + private Date updateTimeS; + private Date updateTimeE; +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/domain/ZonePmsProject.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/domain/ZonePmsProject.java new file mode 100644 index 000000000..619ed55e4 --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/domain/ZonePmsProject.java @@ -0,0 +1,42 @@ +package com.microservices.pms.specialArea.domain; + +import com.microservices.common.core.annotation.Excel; +import lombok.Data; + +@Data +public class ZonePmsProject { + + /** 项目ID */ + private Long id; + + /** + * 组织Id + */ + private Long deptId; + + /** 项目标识 */ + @Excel(name = "项目标识") + private String projectIdentifier; + + /** 项目名称 */ + @Excel(name = "项目名称") + private String projectName; + + /** 项目负责人 */ + @Excel(name = "项目负责人") + private Long projectAssigneeId; + + /** 项目负责人 */ + @Excel(name = "项目负责人") + private String projectAssigneeName; + /** 所属企业ID */ + @Excel(name = "所属企业ID") + private Long pmsEnterpriseId; + /** 所属企业ID */ + @Excel(name = "所属企业") + private String pmsEnterpriseName; + + /** 状态 0关闭 1开启 2暂停 */ + @Excel(name = "状态 0关闭 1开启 2暂停") + private String status; +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/domain/vo/KeyValVO.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/domain/vo/KeyValVO.java new file mode 100644 index 000000000..c45ea9b8b --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/domain/vo/KeyValVO.java @@ -0,0 +1,9 @@ +package com.microservices.pms.specialArea.domain.vo; + +import lombok.Data; + +@Data +public class KeyValVO { + private Integer key; + private Long val; +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/domain/vo/ProjectSituationVO.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/domain/vo/ProjectSituationVO.java new file mode 100644 index 000000000..f90e70baa --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/domain/vo/ProjectSituationVO.java @@ -0,0 +1,19 @@ +package com.microservices.pms.specialArea.domain.vo; + +import com.microservices.pms.specialArea.domain.ZonePmsProject; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class ProjectSituationVO extends ZonePmsProject { + private Long needCount; + private Long needFinishedCount; + private Long taskCount; + private Long taskFinishedCount; + private Long sprintCount; + private Long sprintFinishedCount; + private Long testCaseCount; + private Long testBugCount; + private Long notExecTestCaseCount; +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/mapper/SoftwareFactStatisForgeMapper.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/mapper/SoftwareFactStatisForgeMapper.java new file mode 100644 index 000000000..a58a5e647 --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/mapper/SoftwareFactStatisForgeMapper.java @@ -0,0 +1,19 @@ +package com.microservices.pms.specialArea.mapper; + +import com.microservices.common.datasource.annotation.Slave; +import com.microservices.pms.specialArea.domain.ForgeProject; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +@Slave +public interface SoftwareFactStatisForgeMapper { + + List selectForgeProject(ForgeProject forgeProject); + + Long countForgeProject(ForgeProject forgeProject); + Long countForgeProjectByCUES(ForgeProject forgeProject); + Long countForgeProjectByProject(ForgeProject forgeProject); + Long countForgeProjectByAssigner(ForgeProject forgeProject); +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/mapper/SoftwareFactStatisPmsMapper.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/mapper/SoftwareFactStatisPmsMapper.java new file mode 100644 index 000000000..a9f75432f --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/mapper/SoftwareFactStatisPmsMapper.java @@ -0,0 +1,30 @@ +package com.microservices.pms.specialArea.mapper; + +import com.microservices.common.datasource.annotation.Master; +import com.microservices.pms.specialArea.domain.ForgeProject; +import com.microservices.pms.specialArea.domain.ZonePmsProject; +import com.microservices.pms.specialArea.domain.vo.KeyValVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Master +@Mapper +public interface SoftwareFactStatisPmsMapper { + + List selectPmsProjectList(); + + ZonePmsProject selectPmsProjectById(@Param("id") Long id); + // 状态 0待开始 1进行中 2已关闭 + List countSprintByStatus(Long projectId); + Long countSprintByCUES(ForgeProject forgeProject); + Long countTestCaseBy(Long projectId); + Long countTestCaseInSheet(ForgeProject forgeProject); + Long countTestCaseByCUES(ForgeProject forgeProject); + + String selectPmsUserByGitlinkId(@Param("gitlinkId") Long gitlinkId); + + List selectPmsProjectListByDict(); + +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/service/SoftwareFactStatisticsServiceImpl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/service/SoftwareFactStatisticsServiceImpl.java new file mode 100644 index 000000000..3f216f91b --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/specialArea/service/SoftwareFactStatisticsServiceImpl.java @@ -0,0 +1,276 @@ +package com.microservices.pms.specialArea.service; + +import com.microservices.common.core.web.controller.BaseController; +import com.microservices.pms.specialArea.domain.ForgeProject; +import com.microservices.pms.specialArea.domain.ZonePmsProject; +import com.microservices.pms.specialArea.domain.vo.KeyValVO; +import com.microservices.pms.specialArea.domain.vo.ProjectSituationVO; +import com.microservices.pms.specialArea.mapper.SoftwareFactStatisForgeMapper; +import com.microservices.pms.specialArea.mapper.SoftwareFactStatisPmsMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.util.*; +import java.util.stream.Collectors; + +import static com.microservices.pms.specialArea.constant.Constant.*; + +@Service +@RequiredArgsConstructor +public class SoftwareFactStatisticsServiceImpl extends BaseController { + + private final SoftwareFactStatisPmsMapper statisPmsMapper; + private final SoftwareFactStatisForgeMapper statisForgeMapper; + + public static Date[] getDayStartAndEnd(int days) { + // 获取今天的日期 + LocalDate today = LocalDate.now(); + today = today.plusDays(days); + // 获取今天的开始时间(00:00:00) + LocalDateTime startOfDay = today.atStartOfDay(); + + // 获取今天的结束时间(23:59:59.999999999) + LocalDateTime endOfDay = today.atTime(LocalTime.MAX); + + // 转换为 Date 对象 + Date startDate = Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant()); + Date endDate = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant()); + + return new Date[]{startDate, endDate}; + } + + public static Date[] getCurrentWeek() { + LocalDate today = LocalDate.now(); + LocalDate startOfWeek = today.with(java.time.DayOfWeek.MONDAY); + LocalDate endOfWeek = today.with(java.time.DayOfWeek.SUNDAY); + + LocalDateTime startDateTime = startOfWeek.atStartOfDay(); + LocalDateTime endDateTime = endOfWeek.atTime(23, 59, 59); + + return new Date[]{ + Date.from(startDateTime.atZone(ZoneId.systemDefault()).toInstant()), + Date.from(endDateTime.atZone(ZoneId.systemDefault()).toInstant()) + }; + } + + public static Date[] getCurrentMonth() { + LocalDate today = LocalDate.now(); + LocalDate startOfMonth = today.withDayOfMonth(1); + LocalDate endOfMonth = today.withDayOfMonth(today.lengthOfMonth()); + + LocalDateTime startDateTime = startOfMonth.atStartOfDay(); + LocalDateTime endDateTime = endOfMonth.atTime(23, 59, 59); + + return new Date[]{ + Date.from(startDateTime.atZone(ZoneId.systemDefault()).toInstant()), + Date.from(endDateTime.atZone(ZoneId.systemDefault()).toInstant()) + }; + } + + public Map todayWorkSituation() { + + Map res = new HashMap<>(); + + ForgeProject forgeProject = new ForgeProject(); + forgeProject.setStatusIds(ISSUE_NOT_FINISHED); + + //需求待评审 + forgeProject.setPmIssueType(NEED); + Long needNotFinishCount = statisForgeMapper.countForgeProject(forgeProject); + res.put("needNotFinishCount", needNotFinishCount); + + //任务待完成 + forgeProject.setPmIssueType(TASK); + Long taskNotFinishCount = statisForgeMapper.countForgeProject(forgeProject); + res.put("taskNotFinishCount", taskNotFinishCount); + + //缺陷待修复 + forgeProject.setPmIssueType(BUG); + Long bugNotFinishCount = statisForgeMapper.countForgeProject(forgeProject); + res.put("bugNotFinishCount", bugNotFinishCount); + //测试用例未执行数 + forgeProject.setStatusIds(Collections.singletonList(TASK_CASE_STATUS_NOT_EXEC)); + Long notExecTestCaseCount = statisPmsMapper.countTestCaseInSheet(forgeProject); + res.put("notExecTestCaseCount", notExecTestCaseCount); + + ForgeProject f2 = new ForgeProject(); + f2.setStatusIds(ISSUE_NOT_FINISHED); + f2.setPmIssueType(TASK); + //任务最多项目 + Long taskMaxProjectId = statisForgeMapper.countForgeProjectByProject(f2); + ZonePmsProject taskMaxProject = statisPmsMapper.selectPmsProjectById(taskMaxProjectId); + res.put("taskMaxProject", taskMaxProject == null ?"": taskMaxProject.getProjectName()); + //任务最多个人 + Long taskMaxAssignerId = statisForgeMapper.countForgeProjectByAssigner(f2); + String taskMaxAssigner = statisPmsMapper.selectPmsUserByGitlinkId(taskMaxAssignerId); + res.put("taskMaxAssigner", taskMaxAssigner); + f2.setPmIssueType(BUG); + //缺陷最多项目 + Long bugMaxProjectId = statisForgeMapper.countForgeProjectByProject(f2); + ZonePmsProject bugMaxProject = statisPmsMapper.selectPmsProjectById(bugMaxProjectId); + res.put("bugMaxProject", bugMaxProject == null ?"": bugMaxProject.getProjectName()); + //缺陷最多个人 + Long bugMaxAssignerId = statisForgeMapper.countForgeProjectByAssigner(f2); + String bugMaxAssigner = statisPmsMapper.selectPmsUserByGitlinkId(bugMaxAssignerId); + res.put("bugMaxAssigner", bugMaxAssigner); + + + // 昨日完成、昨日新增 + Date[] dayStartAndEnd = getDayStartAndEnd(-1); + ForgeProject forgeProjectTime = new ForgeProject(); + forgeProjectTime.setCreateTimeS(dayStartAndEnd[0]); + forgeProjectTime.setCreateTimeE(dayStartAndEnd[1]); + buildDayWeekMonthData(forgeProjectTime, res, dayStartAndEnd); + + return res; + } + + private void buildDayWeekMonthData(ForgeProject forgeProjectTime, Map res, Date[] dayStartAndEnd) { + // 昨日新增需求 + forgeProjectTime.setPmIssueType(NEED); + Long yesterdayAddNeed = statisForgeMapper.countForgeProject(forgeProjectTime); + res.put("yesterdayAddNeed", yesterdayAddNeed); +//昨日新增 任务 + forgeProjectTime.setPmIssueType(TASK); + Long yesterdayAddTask = statisForgeMapper.countForgeProject(forgeProjectTime); + res.put("yesterdayAddTask", yesterdayAddTask); +//昨日新增 缺陷 + forgeProjectTime.setPmIssueType(BUG); + Long yesterdayAddBug = statisForgeMapper.countForgeProject(forgeProjectTime); + res.put("yesterdayAddBug", yesterdayAddBug); + + ForgeProject forgeProjectFinish = new ForgeProject(); + forgeProjectFinish.setStatusIds(ISSUE_FINISHED); + forgeProjectFinish.setUpdateTimeS(dayStartAndEnd[0]); + forgeProjectFinish.setUpdateTimeE(dayStartAndEnd[1]); + //昨日任务完结 + forgeProjectFinish.setPmIssueType(TASK); + Long yesterdayFinishTask = statisForgeMapper.countForgeProject(forgeProjectFinish); + res.put("yesterdayFinishTask", yesterdayFinishTask); + //昨日缺陷关闭数 + forgeProjectFinish.setPmIssueType(BUG); + Long yesterdayFinishBug = statisForgeMapper.countForgeProject(forgeProjectFinish); + res.put("yesterdayFinishBug", yesterdayFinishBug); +// 昨日需求评审数 + forgeProjectFinish.setPmIssueType(NEED); + Long yesterdayFinishNeed = statisForgeMapper.countForgeProject(forgeProjectFinish); + res.put("yesterdayFinishNeed", yesterdayFinishNeed); + //昨日测试用例执行 + ForgeProject forgeProjectTest = new ForgeProject(); + forgeProjectFinish.setStatusIds(Arrays.asList(TASK_CASE_STATUS_PASS, TASK_CASE_STATUS_FAIL, TASK_CASE_STATUS_BLOCK, TASK_CASE_STATUS_SKIP)); + forgeProjectFinish.setUpdateTimeS(dayStartAndEnd[0]); + forgeProjectFinish.setUpdateTimeE(dayStartAndEnd[1]); + Long yesterdayTestCase = statisPmsMapper.countTestCaseInSheet(forgeProjectTest); + res.put("yesterdayTestCase", yesterdayTestCase); + + // 昨日最活跃项目 + List zonePmsProjects = statisPmsMapper.selectPmsProjectList(); + long pmsProjectIdMax = 0L, maxVal = -1L; + for (ZonePmsProject p : zonePmsProjects) { + ForgeProject f = new ForgeProject(); + f.setCreateTimeS(dayStartAndEnd[0]); + f.setCreateTimeE(dayStartAndEnd[1]); + f.setUpdateTimeS(dayStartAndEnd[0]); + f.setUpdateTimeE(dayStartAndEnd[1]); + f.setPmProjectId(p.getId()); + + f.setPmIssueType(NEED); + Long a = statisForgeMapper.countForgeProjectByCUES(f); + f.setPmIssueType(TASK); + Long b = statisForgeMapper.countForgeProjectByCUES(f); + f.setPmIssueType(BUG); + Long c = statisForgeMapper.countForgeProjectByCUES(f); + Long d = statisPmsMapper.countSprintByCUES(f); + Long e = statisPmsMapper.countTestCaseByCUES(f); + + long total = a + b + c + d + e; + if (total > maxVal) { + pmsProjectIdMax = p.getId(); + maxVal = total; + } + } + + ZonePmsProject zonePmsProjectMax = statisPmsMapper.selectPmsProjectById(pmsProjectIdMax); + res.put("zonePmsProjectMax", zonePmsProjectMax==null? "": zonePmsProjectMax.getProjectName()); + } + + public List projectSituation() { + + List zonePmsProjects = statisPmsMapper.selectPmsProjectList(); + List showProjectList = statisPmsMapper.selectPmsProjectListByDict() + .stream().filter(Objects::nonNull) + .collect(Collectors.toList()); + + if (!showProjectList.isEmpty()) { + zonePmsProjects = zonePmsProjects.stream().filter(e->showProjectList.contains(e.getId())) + .collect(Collectors.toList()); + } + List res = new ArrayList<>(); + zonePmsProjects.forEach(zonePmsProject -> { + + ProjectSituationVO vo = new ProjectSituationVO(); + BeanUtils.copyProperties(zonePmsProject, vo); + + Map sprintCountMap = statisPmsMapper.countSprintByStatus(zonePmsProject.getId()) + .stream() + .collect(Collectors.toMap(KeyValVO::getKey, KeyValVO::getVal, (o, n) -> n)); + + vo.setSprintFinishedCount(sprintCountMap.getOrDefault(SPRINT_STATUS_CLOSED,0L)); + vo.setSprintCount(sprintCountMap.values().stream().reduce(0L, Long::sum)); + + ForgeProject forgeProject = new ForgeProject(); + forgeProject.setPmProjectId(zonePmsProject.getId()); + forgeProject.setPmIssueType(NEED); + Long planCount = statisForgeMapper.countForgeProject(forgeProject); + vo.setNeedCount(planCount); + forgeProject.setStatusIds(ISSUE_FINISHED); + Long planFinishCount = statisForgeMapper.countForgeProject(forgeProject); + vo.setNeedFinishedCount(planFinishCount); + forgeProject.setPmIssueType(TASK); + Long taskFinishCount = statisForgeMapper.countForgeProject(forgeProject); + vo.setTaskFinishedCount(taskFinishCount); + forgeProject.setStatusIds(new ArrayList<>()); + Long taskCount = statisForgeMapper.countForgeProject(forgeProject); + vo.setTaskCount(taskCount); + + // 测试相关 + //测试用例数 + Long testCaseCount = statisPmsMapper.countTestCaseBy(zonePmsProject.getId()); + forgeProject.setPmIssueType(BUG); + forgeProject.setStatusIds(ISSUE_NOT_FINISHED); + vo.setTestCaseCount(testCaseCount); +// 测试缺陷数 + Long testBugCount = statisForgeMapper.countForgeProject(forgeProject); + vo.setTestBugCount(testBugCount); +// 测试用例未执行数 + forgeProject.setStatusIds(Collections.singletonList(TASK_CASE_STATUS_NOT_EXEC)); + Long notExecTestCaseCount = statisPmsMapper.countTestCaseInSheet(forgeProject); + vo.setNotExecTestCaseCount(notExecTestCaseCount); + + res.add(vo); + }); + + return res; + } + + public Map weekMonthWorkSituation(String type) { + Map res = new HashMap<>(); + Date[] dayStartAndEnd = getDayStartAndEnd(-1); + if (Objects.equals(type, "week")) { + dayStartAndEnd = getCurrentWeek(); + } else if (Objects.equals(type, "month")) { + dayStartAndEnd = getCurrentMonth(); + } + ForgeProject forgeProjectTime = new ForgeProject(); + forgeProjectTime.setCreateTimeS(dayStartAndEnd[0]); + forgeProjectTime.setCreateTimeE(dayStartAndEnd[1]); + buildDayWeekMonthData(forgeProjectTime, res, dayStartAndEnd); + + return res; + } +} diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/SoftwareFactStatisForgeMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/SoftwareFactStatisForgeMapper.xml new file mode 100644 index 000000000..d82bf9417 --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/SoftwareFactStatisForgeMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/SoftwareFactStatisPmsMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/SoftwareFactStatisPmsMapper.xml new file mode 100644 index 000000000..964903987 --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/SoftwareFactStatisPmsMapper.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/vo/ZoneDetailDataVo.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/vo/ZoneDetailDataVo.java index 28d2e6f53..7a1fe28d2 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/vo/ZoneDetailDataVo.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/domain/vo/ZoneDetailDataVo.java @@ -247,4 +247,22 @@ public class ZoneDetailDataVo extends BaseEntity { */ @ApiModelProperty(value = "数据集板块标题") private String sectionDataSetTitle; + + /** + * 近一周的文章新增发布数 + */ + @ApiModelProperty(value = "近一周的文章新增发布数") + private Long weekArticles = 0L; + + /** + * 近一周UV数(点击去重) + */ + @ApiModelProperty(value = "近一周UV数(点击去重)") + private Long weekUV = 0L; + + /** + * 近一周PV数(总访问量) + */ + @ApiModelProperty(value = "近一周PV数(总访问量)") + private Long weekPV = 0L; } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/mapper/ZoneDetailMapper.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/mapper/ZoneDetailMapper.java index 4b92aa8ad..b2a0eda48 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/mapper/ZoneDetailMapper.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/mapper/ZoneDetailMapper.java @@ -2,9 +2,13 @@ package com.microservices.zone.detail.mapper; import com.microservices.common.datascope.annotation.DataScope; import com.microservices.zone.detail.domain.ZoneDetail; +import com.microservices.zone.detail.domain.vo.ZoneDetailDataVo; import com.microservices.zone.detail.domain.vo.ZoneDetailSearchVo; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.security.access.method.P; +import java.util.Date; import java.util.List; /** @@ -95,4 +99,22 @@ public interface ZoneDetailMapper { * @return */ ZoneDetail selectZoneDetailByName(String name); + + /** + * 专区文章数统计 + * @param createTimeS + * @param createTimeE + * @param key + * @return + */ + ZoneDetailDataVo countArticlesGroupByKey(@Param("createTimeS") Date createTimeS, @Param("createTimeE") Date createTimeE, @Param("key") String key); + + /** + * 专区浏览数据统计 + * @param createTimeS + * @param createTimeE + * @param key + * @return + */ + ZoneDetailDataVo countPUVsGroupByKey(@Param("createTimeS") Date createTimeS, @Param("createTimeE") Date createTimeE, @Param("key") String key); } diff --git a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/service/impl/ZoneDetailServiceImpl.java b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/service/impl/ZoneDetailServiceImpl.java index 7eb151787..a84b8dc0d 100644 --- a/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/service/impl/ZoneDetailServiceImpl.java +++ b/microservices-modules/microservices-modules-zone/src/main/java/com/microservices/zone/detail/service/impl/ZoneDetailServiceImpl.java @@ -57,10 +57,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletRequest; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.*; import java.util.stream.Collectors; /** @@ -198,6 +198,22 @@ public class ZoneDetailServiceImpl implements IZoneDetailService { gitLinkRequestHelper.gitLinkUrl + "/zone/" + zoneDetail.getKey() ) ); + + Date[] lastWeek = getLastWeek(); + //专区文章数统计 + ZoneDetailDataVo articlesGroupByKey = zoneDetailMapper + .countArticlesGroupByKey(lastWeek[0],lastWeek[1],zoneDetail.getKey()) ; + if (articlesGroupByKey != null) { + zoneDetailDataVo.setWeekArticles(articlesGroupByKey.getWeekArticles()); + } + //专区浏览数据统计 + ZoneDetailDataVo puVsGroupByKey = zoneDetailMapper + .countPUVsGroupByKey(lastWeek[0],lastWeek[1],zoneDetail.getKey()) ; + if (puVsGroupByKey != null) { + zoneDetailDataVo.setWeekPV(puVsGroupByKey.getWeekPV()); + zoneDetailDataVo.setWeekUV(puVsGroupByKey.getWeekUV()); + } + return zoneDetailDataVo; } @@ -776,4 +792,17 @@ public class ZoneDetailServiceImpl implements IZoneDetailService { return zoneStatisticsVo; } + public Date[] getLastWeek() { + LocalDate today = LocalDate.now(); + LocalDate startOfWeek = today.with(java.time.DayOfWeek.MONDAY).minusDays(7); + LocalDate endOfWeek = today.with(java.time.DayOfWeek.SUNDAY).minusDays(7); + + LocalDateTime startDateTime = startOfWeek.atStartOfDay(); + LocalDateTime endDateTime = endOfWeek.atTime(23, 59, 59); + + return new Date[]{ + Date.from(startDateTime.atZone(ZoneId.systemDefault()).toInstant()), + Date.from(endDateTime.atZone(ZoneId.systemDefault()).toInstant()) + }; + } } diff --git a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneDetailMapper.xml b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneDetailMapper.xml index 9bdfbe0df..c7cddd80d 100644 --- a/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneDetailMapper.xml +++ b/microservices-modules/microservices-modules-zone/src/main/resources/mapper/zone/ZoneDetailMapper.xml @@ -192,215 +192,235 @@ - - - - - + + + + + - - insert into zone_detail - - name, - `key`, - dept_id, - del_flag, - create_by, - create_time, - update_by, - update_time, - main_title, - sub_title, - first_title, - banner_list, - introduction_title, - introduction_content, - introduction_image, - homepage_membership_size, - homepage_cms_size, - homepage_project_size, - cms_project_id, - gitlink_project_keys, - cms_show, - project_show, - member_show, - partners_show, - special_project_show, - homepage_special_project_title, - resource_show, - homepage_resource_title, - homepage_cms_title, - homepage_project_title, - homepage_member_title, - homepage_partners_title, - template, - helper_title, - helper_show, - doc_need_audit, - resource_need_audit, - is_lock_cms, - section_cms_show, - section_project_show, - section_member_show, - section_helper_show, - section_homepage_show, - section_resource_show, - section_dataset_show, - section_cms_title, - section_project_title, - section_member_title, - section_helper_title, - section_homepage_title, - section_resource_title, - section_dataset_title, - - - #{name}, - #{key}, - #{deptId}, - #{delFlag}, - #{createBy}, - #{createTime}, - #{updateBy}, - #{updateTime}, - #{mainTitle}, - #{subTitle}, - #{firstTitle}, - #{bannerList}, - #{introductionTitle}, - #{introductionContent}, - #{introductionImage}, - #{homepageMembershipSize}, - #{homepageCmsSize}, - #{homepageProjectSize}, - #{cmsProjectId}, - #{gitlinkProjectKeys}, - #{cmsShow}, - #{projectShow}, - #{memberShow}, - #{partnersShow}, - #{specialProjectShow}, - #{homepageSpecialProjectTitle}, - #{resourceShow}, - #{homepageResourceTitle}, - #{homepageCmsTitle}, - #{homepageProjectTitle}, - #{homepageMemberTitle}, - #{homepagePartnersTitle}, - #{template}, - #{helperTitle}, - #{helperShow}, - #{docNeedAudit}, - #{resourceNeedAudit}, - #{isLockCms}, - #{sectionCmsShow}, - #{sectionProjectShow}, - #{sectionMemberShow}, - #{sectionHelperShow}, - #{sectionHomepageShow}, - #{sectionResourceShow}, - #{sectionDataSetShow}, - #{sectionCmsTitle}, - #{sectionProjectTitle}, - #{sectionMemberTitle}, - #{sectionHelperTitle}, - #{sectionHomepageTitle}, - #{sectionResourceTitle}, - #{sectionDataSetTitle}, - - + - - update zone_detail - - name = #{name}, - `key` = #{key}, - dept_id = #{deptId}, - del_flag = #{delFlag}, - create_by = #{createBy}, - create_time = #{createTime}, - update_by = #{updateBy}, - update_time = #{updateTime}, - main_title = #{mainTitle}, - sub_title = #{subTitle}, - first_title = #{firstTitle}, - banner_list = #{bannerList}, - introduction_title = #{introductionTitle}, - introduction_content = #{introductionContent}, - introduction_image = #{introductionImage}, - homepage_membership_size = #{homepageMembershipSize}, - homepage_cms_size = #{homepageCmsSize}, - homepage_project_size = #{homepageProjectSize}, - cms_project_id = #{cmsProjectId}, - gitlink_project_keys = #{gitlinkProjectKeys}, - is_publish = #{isPublish}, - cms_show = #{cmsShow}, - project_show = #{projectShow}, - member_show = #{memberShow}, - partners_show = #{partnersShow}, - special_project_show = #{specialProjectShow}, - homepage_special_project_title = - #{homepageSpecialProjectTitle}, - - resource_show = #{resourceShow}, - homepage_resource_title = - #{homepageResourceTitle}, - - homepage_cms_title = #{homepageCmsTitle}, - homepage_project_title = #{homepageProjectTitle}, - homepage_member_title = #{homepageMemberTitle}, - homepage_partners_title = #{homepagePartnersTitle}, - template = #{template}, - helper_show = #{helperShow}, - helper_title = #{helperTitle}, - doc_need_audit = #{docNeedAudit}, - resource_need_audit = #{resourceNeedAudit}, - is_lock_cms = #{isLockCms}, - section_cms_show = #{sectionCmsShow}, - section_project_show = #{sectionProjectShow}, - section_member_show = #{sectionMemberShow}, - section_helper_show = #{sectionHelperShow}, - section_homepage_show = #{sectionHomepageShow}, - section_resource_show = #{sectionResourceShow}, - section_dataset_show = #{sectionDataSetShow}, - section_cms_title = #{sectionCmsTitle}, - section_project_title = #{sectionProjectTitle}, - section_member_title = #{sectionMemberTitle}, - section_helper_title = #{sectionHelperTitle}, - section_homepage_title = #{sectionHomepageTitle}, - section_resource_title = #{sectionResourceTitle}, - section_dataset_title = #{sectionDataSetTitle}, - + + + + insert into zone_detail + + name, + `key`, + dept_id, + del_flag, + create_by, + create_time, + update_by, + update_time, + main_title, + sub_title, + first_title, + banner_list, + introduction_title, + introduction_content, + introduction_image, + homepage_membership_size, + homepage_cms_size, + homepage_project_size, + cms_project_id, + gitlink_project_keys, + cms_show, + project_show, + member_show, + partners_show, + special_project_show, + homepage_special_project_title, + resource_show, + homepage_resource_title, + homepage_cms_title, + homepage_project_title, + homepage_member_title, + homepage_partners_title, + template, + helper_title, + helper_show, + doc_need_audit, + resource_need_audit, + is_lock_cms, + section_cms_show, + section_project_show, + section_member_show, + section_helper_show, + section_homepage_show, + section_resource_show, + section_dataset_show, + section_cms_title, + section_project_title, + section_member_title, + section_helper_title, + section_homepage_title, + section_resource_title, + section_dataset_title, + + + #{name}, + #{key}, + #{deptId}, + #{delFlag}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{mainTitle}, + #{subTitle}, + #{firstTitle}, + #{bannerList}, + #{introductionTitle}, + #{introductionContent}, + #{introductionImage}, + #{homepageMembershipSize}, + #{homepageCmsSize}, + #{homepageProjectSize}, + #{cmsProjectId}, + #{gitlinkProjectKeys}, + #{cmsShow}, + #{projectShow}, + #{memberShow}, + #{partnersShow}, + #{specialProjectShow}, + #{homepageSpecialProjectTitle}, + #{resourceShow}, + #{homepageResourceTitle}, + #{homepageCmsTitle}, + #{homepageProjectTitle}, + #{homepageMemberTitle}, + #{homepagePartnersTitle}, + #{template}, + #{helperTitle}, + #{helperShow}, + #{docNeedAudit}, + #{resourceNeedAudit}, + #{isLockCms}, + #{sectionCmsShow}, + #{sectionProjectShow}, + #{sectionMemberShow}, + #{sectionHelperShow}, + #{sectionHomepageShow}, + #{sectionResourceShow}, + #{sectionDataSetShow}, + #{sectionCmsTitle}, + #{sectionProjectTitle}, + #{sectionMemberTitle}, + #{sectionHelperTitle}, + #{sectionHomepageTitle}, + #{sectionResourceTitle}, + #{sectionDataSetTitle}, + + + + + update zone_detail + + name = #{name}, + `key` = #{key}, + dept_id = #{deptId}, + del_flag = #{delFlag}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + main_title = #{mainTitle}, + sub_title = #{subTitle}, + first_title = #{firstTitle}, + banner_list = #{bannerList}, + introduction_title = #{introductionTitle}, + introduction_content = #{introductionContent}, + introduction_image = #{introductionImage}, + homepage_membership_size = #{homepageMembershipSize}, + homepage_cms_size = #{homepageCmsSize}, + homepage_project_size = #{homepageProjectSize}, + cms_project_id = #{cmsProjectId}, + gitlink_project_keys = #{gitlinkProjectKeys}, + is_publish = #{isPublish}, + cms_show = #{cmsShow}, + project_show = #{projectShow}, + member_show = #{memberShow}, + partners_show = #{partnersShow}, + special_project_show = #{specialProjectShow}, + homepage_special_project_title = + #{homepageSpecialProjectTitle}, + + resource_show = #{resourceShow}, + homepage_resource_title = + #{homepageResourceTitle}, + + homepage_cms_title = #{homepageCmsTitle}, + homepage_project_title = #{homepageProjectTitle}, + homepage_member_title = #{homepageMemberTitle}, + homepage_partners_title = #{homepagePartnersTitle}, + template = #{template}, + helper_show = #{helperShow}, + helper_title = #{helperTitle}, + doc_need_audit = #{docNeedAudit}, + resource_need_audit = #{resourceNeedAudit}, + is_lock_cms = #{isLockCms}, + section_cms_show = #{sectionCmsShow}, + section_project_show = #{sectionProjectShow}, + section_member_show = #{sectionMemberShow}, + section_helper_show = #{sectionHelperShow}, + section_homepage_show = #{sectionHomepageShow}, + section_resource_show = #{sectionResourceShow}, + section_dataset_show = #{sectionDataSetShow}, + section_cms_title = #{sectionCmsTitle}, + section_project_title = #{sectionProjectTitle}, + section_member_title = #{sectionMemberTitle}, + section_helper_title = #{sectionHelperTitle}, + section_homepage_title = #{sectionHomepageTitle}, + section_resource_title = #{sectionResourceTitle}, + section_dataset_title = #{sectionDataSetTitle}, + - where id = #{id} - + where id = #{id} + - - delete - from zone_detail - where id = #{id} - + + delete + from zone_detail + where id = #{id} + - - delete from zone_detail where id in - - #{id} - - - \ No newline at end of file + + delete from zone_detail where id in + + #{id} + + + \ No newline at end of file