feat(软件工厂统计): 今日工作态势、周月工作态势、项目研发状态

This commit is contained in:
liuhuazhong 2025-03-11 15:12:42 +08:00
parent ce00202d67
commit 7a4abfa7e9
11 changed files with 659 additions and 0 deletions

View File

@ -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<Integer> ISSUE_NOT_FINISHED = Arrays.asList(1,2);
public static final List<Integer> 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;
}

View File

@ -0,0 +1,38 @@
package com.microservices.pms.specialArea.controller;
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 lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController()
@RequestMapping("/specialArea/softwareFact/statis")
@Api(tags = "项目管理-软件工厂统计相关接口")
@RequiredArgsConstructor
public class SoftwareFactStatisticsController {
private final SoftwareFactStatisticsServiceImpl softwareFactStatisticsService;
@ApiOperation(value = "今日工作态势")
@GetMapping("/todayWorkSituation")
public AjaxResult todayWorkSituation(){
return AjaxResult.success(softwareFactStatisticsService.todayWorkSituation());
}
@ApiOperation(value = "周、月工作态势")
@GetMapping("/weekMonthWorkSituation")
public AjaxResult weekMonthWorkSituation(String type){
return AjaxResult.success(softwareFactStatisticsService.weekMonthWorkSituation(type));
}
@ApiOperation(value = "项目研发状态")
@GetMapping("/projectSituation")
public AjaxResult projectSituation(){
return AjaxResult.success(softwareFactStatisticsService.projectSituation());
}
}

View File

@ -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<Integer> statusIds;
//创建时间开始
private Date createTimeS;
//创建时间结束
private Date createTimeE;
//更新时间开始
private Date updateTimeS;
private Date updateTimeE;
}

View File

@ -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;
}

View File

@ -0,0 +1,9 @@
package com.microservices.pms.specialArea.domain.vo;
import lombok.Data;
@Data
public class KeyValVO {
private Integer key;
private Long val;
}

View File

@ -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;
}

View File

@ -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<ForgeProject> selectForgeProject(ForgeProject forgeProject);
Long countForgeProject(ForgeProject forgeProject);
Long countForgeProjectByCUES(ForgeProject forgeProject);
Long countForgeProjectByProject(ForgeProject forgeProject);
Long countForgeProjectByAssigner(ForgeProject forgeProject);
}

View File

@ -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<ZonePmsProject> selectPmsProjectList();
ZonePmsProject selectPmsProjectById(@Param("id") Long id);
// 状态 0待开始 1进行中 2已关闭
List<KeyValVO> 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<Long> selectPmsProjectListByDict();
}

View File

@ -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<String, Object> todayWorkSituation() {
Map<String, Object> 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<String, Object> 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<ZonePmsProject> 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<ProjectSituationVO> projectSituation() {
List<ZonePmsProject> zonePmsProjects = statisPmsMapper.selectPmsProjectList();
List<Long> 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<ProjectSituationVO> res = new ArrayList<>();
zonePmsProjects.forEach(zonePmsProject -> {
ProjectSituationVO vo = new ProjectSituationVO();
BeanUtils.copyProperties(zonePmsProject, vo);
Map<Integer, Long> 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<String, Object> weekMonthWorkSituation(String type) {
Map<String, Object> 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;
}
}

View File

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.microservices.pms.specialArea.mapper.SoftwareFactStatisForgeMapper">
<select id="selectForgeProject" resultType="com.microservices.pms.specialArea.domain.ForgeProject">
select pm_project_id,pm_issue_type from issues
<where>
<if test="pmIssueType != null ">and pm_issue_type = #{pmIssueType}</if>
<if test="createTimeS != null ">and created_on &gt;= #{createTimeS}</if>
<if test="createTimeE != null ">and created_on &lt;= #{createTimeE}</if>
<if test="updateTimeS != null ">and updated_on &gt;= #{updateTimeS}</if>
<if test="updateTimeE != null ">and updated_on &lt;= #{updateTimeE}</if>
<if test="pmIssueType != null ">and pm_issue_type = #{pmIssueType}</if>
<if test="pmProjectId != null ">and pm_project_id = #{pmProjectId}</if>
<if test="statusIds != null and statusIds.size() > 0">and status_id in
<foreach item="item" collection="statusIds" open="(" separator="," close=")">
#{item}
</foreach>
</if>
</where>
</select>
<select id="countForgeProject" resultType="java.lang.Long">
select count(id) from issues
<where>
<if test="createTimeS != null ">and created_on &gt;= #{createTimeS}</if>
<if test="createTimeE != null ">and created_on &lt;= #{createTimeE}</if>
<if test="updateTimeS != null ">and updated_on &gt;= #{updateTimeS}</if>
<if test="updateTimeE != null ">and updated_on &lt;= #{updateTimeE}</if>
<if test="pmIssueType != null ">and pm_issue_type = #{pmIssueType}</if>
<if test="pmProjectId != null ">and pm_project_id = #{pmProjectId}</if>
<if test="statusIds != null and statusIds.size() > 0">and status_id in
<foreach item="item" collection="statusIds" open="(" separator="," close=")">
#{item}
</foreach>
</if>
</where>
</select>
<select id="countForgeProjectByCUES" resultType="java.lang.Long">
select count(id) from issues
where pm_project_id = #{pmProjectId} and ((created_on &gt;= #{createTimeS} and created_on &lt;= #{createTimeE})
OR (updated_on &gt;= #{updateTimeS} and updated_on &lt;= #{updateTimeE}))
</select>
<select id="countForgeProjectByProject" resultType="java.lang.Long">
select pm_project_id from (select pm_project_id, count(id) as val from issues
where pm_project_id is not null
<if test="pmIssueType != null ">and pm_issue_type = #{pmIssueType}</if>
<if test="pmProjectId != null ">and pm_project_id = #{pmProjectId}</if>
<if test="statusIds != null and statusIds.size() > 0">and status_id in
<foreach item="item" collection="statusIds" open="(" separator="," close=")">
#{item}
</foreach>
</if>
group by pm_project_id
order by val DESC LIMIT 1) tmp
</select>
<select id="countForgeProjectByAssigner" resultType="java.lang.Long">
select assigner_id from (SELECT ia.assigner_id, COUNT(i.id) AS issue_count
FROM issue_assigners ia
JOIN issues i ON ia.issue_id = i.id
WHERE ia.assigner_id is not null
<if test="pmIssueType != null ">and i.pm_issue_type = #{pmIssueType}</if>
<if test="pmProjectId != null ">and i.pm_project_id = #{pmProjectId}</if>
<if test="statusIds != null and statusIds.size() > 0">and i.status_id in
<foreach item="item" collection="statusIds" open="(" separator="," close=")">
#{item}
</foreach>
</if>
GROUP BY ia.assigner_id
ORDER BY issue_count DESC
LIMIT 1
) tmp
</select>
</mapper>

View File

@ -0,0 +1,89 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.microservices.pms.specialArea.mapper.SoftwareFactStatisPmsMapper">
<select id="selectPmsProjectList" resultType="com.microservices.pms.specialArea.domain.ZonePmsProject">
select id,
project_name as projectName,
project_assignee_id projectAssigneeId,
pms_enterprise_id pmsEnterpriseId,
dept_id deptId,
`status`,
(select enterprise_name from pms_enterprise where id = pms_enterprise_id) as pmsEnterpriseName,
(select nick_name from sys_user where gitlink_user_id = project_assignee_id) as projectAssigneeName
from pms_project
where is_deleted = 0
</select>
<select id="countSprintByStatus" resultType="com.microservices.pms.specialArea.domain.vo.KeyValVO">
select `status` as `key`, count(id) as val
from pms_project_sprint
where `status` is not null
<if test="projectId != null">
and pms_project_id = #{projectId}
</if>
group by `status`
</select>
<select id="countSprintByCUES" resultType="java.lang.Long">
select count(id)
from pms_project_sprint
where pms_project_id = #{pmProjectId} and ((create_time &gt;= #{createTimeS} and create_time &lt;= #{createTimeE})
OR (update_time &gt;= #{updateTimeS} and update_time &lt;= #{updateTimeE}))
</select>
<select id="countTestCaseInSheet" resultType="java.lang.Long">
select count(id) from pms_project_testsheet_cases
<where>
<if test="statusIds != null and statusIds.size() > 0">and test_status in
<foreach item="item" collection="statusIds" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="pmProjectId != null">and project_testsheet_id in (
select id from pms_project_testsheet where pms_project_id = #{pmProjectId}
)
</if>
<if test="createTimeS != null ">and created_on &gt;= #{createTimeS}</if>
<if test="createTimeE != null ">and created_on &lt;= #{createTimeE}</if>
<if test="updateTimeS != null ">and updated_on &gt;= #{updateTimeS}</if>
<if test="updateTimeE != null ">and updated_on &lt;= #{updateTimeE}</if>
</where>
</select>
<select id="countTestCaseBy" resultType="java.lang.Long">
select count(id) from pms_project_testcase
<where>
<if test="pmsProjectId != null">pms_project_id=#{pmsProjectId}</if>
</where>
</select>
<select id="selectPmsProjectById" resultType="com.microservices.pms.specialArea.domain.ZonePmsProject">
select id,
project_name as projectName,
project_assignee_id projectAssigneeId,
pms_enterprise_id pmsEnterpriseId,
dept_id deptId,
`status`,
(select enterprise_name from pms_enterprise where id = pms_enterprise_id) as pmsEnterpriseName,
(select nick_name from sys_user where gitlink_user_id = project_assignee_id) as projectAssigneeName
from pms_project
where is_deleted = 0 and id = #{id}
</select>
<select id="selectPmsUserByGitlinkId" resultType="java.lang.String">
select nick_name from sys_user where gitlink_user_id = #{gitlinkId}
</select>
<select id="countTestCaseByCUES" resultType="java.lang.Long">
select count(pptc.id) from pms_project_testsheet_cases pptc
left join pms_project_testcase ppt on pptc.project_testcase_id = ppt.id
where ppt.pms_project_id = #{pmProjectId} and ((pptc.create_time &gt;= #{createTimeS} and pptc.create_time &lt;= #{createTimeE})
OR (pptc.update_time &gt;= #{updateTimeS} and pptc.update_time &lt;= #{updateTimeE}))
</select>
<select id="selectPmsProjectListByDict" resultType="java.lang.Long">
select dict_value from sys_dict_data where dict_type = 'xjy_zone_project_list'
</select>
</mapper>