From e10ba62c8b46f5fbb25292d343590651a59bbfcf Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Mon, 27 Oct 2025 09:51:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(oa):=20=E6=B7=BB=E5=8A=A0=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E7=94=A8=E6=88=B7=E5=90=8D=E5=92=8C=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?ID=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=20-=20=E5=9C=A8=20ISysOaTaskService=20?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=B8=AD=E6=96=B0=E5=A2=9E=20getTasksByNickn?= =?UTF-8?q?ameAndProjectIds=20=E6=96=B9=E6=B3=95-=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=9C=A8=20SysOaTaskServiceImpl=20=E4=B8=AD=E7=9A=84=E5=85=B7?= =?UTF-8?q?=E4=BD=93=E9=80=BB=E8=BE=91=EF=BC=8C=E6=94=AF=E6=8C=81=E6=8C=89?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E4=BA=BA=E5=92=8C=E9=A1=B9=E7=9B=AE=E7=AD=9B?= =?UTF-8?q?=E9=80=89=E4=BB=BB=E5=8A=A1-=20=E6=9B=B4=E6=96=B0=20PersonalRep?= =?UTF-8?q?ortDTO=E4=BB=A5=E5=8C=85=E5=90=AB=E5=85=B3=E8=81=94=E7=9A=84?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=88=97=E8=A1=A8=20-=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=20OaProjectScheduleStepServiceImpl=20=E4=B8=AD=E7=9A=84=20pers?= =?UTF-8?q?onalReport=20=E6=96=B9=E6=B3=95=EF=BC=8C=20=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E6=96=B0=E6=8E=A5=E5=8F=A3=E8=8E=B7=E5=8F=96=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=B9=B6=E5=B0=81=E8=A3=85=E5=88=B0=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E7=BB=93=E6=9E=9C=E4=B8=AD=20-=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84=EF=BC=8C=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E5=86=97=E4=BD=99=E7=9A=84=E6=B3=A8=E9=87=8A=E7=BC=96=E5=8F=B7?= =?UTF-8?q?=EF=BC=8C=E6=8F=90=E5=8D=87=E5=8F=AF=E8=AF=BB=E6=80=A7-=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BF=85=E8=A6=81=E7=9A=84=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E8=AF=AD=E5=8F=A5=E4=BB=A5=E6=94=AF=E6=8C=81=E6=96=B0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oa/domain/dto/PersonalReportDTO.java | 3 +++ .../ruoyi/oa/service/ISysOaTaskService.java | 10 +++++++ .../OaProjectScheduleStepServiceImpl.java | 24 +++++++++-------- .../oa/service/impl/SysOaTaskServiceImpl.java | 27 +++++++++++++++++++ 4 files changed, 53 insertions(+), 11 deletions(-) diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/dto/PersonalReportDTO.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/dto/PersonalReportDTO.java index ce6bce3..8c05926 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/dto/PersonalReportDTO.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/dto/PersonalReportDTO.java @@ -3,6 +3,7 @@ package com.ruoyi.oa.domain.dto; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.oa.domain.OaProjectScheduleStep; import com.ruoyi.oa.domain.SysOaProject; +import com.ruoyi.oa.domain.SysOaTask; import lombok.Data; import java.util.List; @@ -21,6 +22,8 @@ public class PersonalReportDTO { private ProgressStats progressStats; private List userSteps; + //nickname和projectId关联的任务 + private List tasks; /** * 进度统计内部类(封装total、completed等字段) */ diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaTaskService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaTaskService.java index a24f492..7a59739 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaTaskService.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/ISysOaTaskService.java @@ -1,6 +1,7 @@ package com.ruoyi.oa.service; import com.ruoyi.common.core.domain.R; +import com.ruoyi.oa.domain.SysOaTask; import com.ruoyi.oa.domain.UserMonthlyData; import com.ruoyi.oa.domain.vo.SysOaTaskVo; import com.ruoyi.oa.domain.bo.SysOaTaskBo; @@ -112,4 +113,13 @@ public interface ISysOaTaskService { */ List queryListPlus(SysOaTaskBo bo); + + /** + * 根据用户名和项目ID列表查询任务 + * @param nickName 执行人用户名 + * @param projectIds 项目ID列表 + * @return 符合条件的任务列表 + */ + List getTasksByNicknameAndProjectIds(String nickName, List projectIds); + } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectScheduleStepServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectScheduleStepServiceImpl.java index 1aaf661..fc51ce4 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectScheduleStepServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectScheduleStepServiceImpl.java @@ -13,22 +13,20 @@ import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.ruoyi.oa.domain.OaBonusProjectRel; -import com.ruoyi.oa.domain.OaProjectSchedule; -import com.ruoyi.oa.domain.SysOaProject; +import com.ruoyi.oa.domain.*; import com.ruoyi.oa.domain.bo.BatchBo; import com.ruoyi.oa.domain.dto.NodeDTO; import com.ruoyi.oa.domain.dto.PersonalReportDTO; import com.ruoyi.oa.mapper.OaBonusProjectRelMapper; import com.ruoyi.oa.mapper.OaProjectScheduleMapper; import com.ruoyi.oa.mapper.SysOaProjectMapper; +import com.ruoyi.oa.service.ISysOaTaskService; import com.ruoyi.system.mapper.SysUserMapper; import lombok.RequiredArgsConstructor; import org.flowable.job.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import com.ruoyi.oa.domain.bo.OaProjectScheduleStepBo; import com.ruoyi.oa.domain.vo.OaProjectScheduleStepVo; -import com.ruoyi.oa.domain.OaProjectScheduleStep; import com.ruoyi.oa.mapper.OaProjectScheduleStepMapper; import com.ruoyi.oa.service.IOaProjectScheduleStepService; import org.springframework.transaction.annotation.Transactional; @@ -61,6 +59,8 @@ public class OaProjectScheduleStepServiceImpl implements IOaProjectScheduleStepS private final OaProjectScheduleStepMapper projectScheduleStepMapper; + private final ISysOaTaskService sysOaTaskService; + /** @@ -342,7 +342,7 @@ public class OaProjectScheduleStepServiceImpl implements IOaProjectScheduleStepS */ @Override public PersonalReportDTO personalReport(Long poolId, String nickName) { - // 1. 查询用户基本信息 + // 查询用户基本信息 SysUser user = sysUserMapper.selectOne( Wrappers.lambdaQuery() .eq(SysUser::getNickName, nickName) @@ -352,7 +352,7 @@ public class OaProjectScheduleStepServiceImpl implements IOaProjectScheduleStepS throw new RuntimeException("未找到用户:" + nickName); } - // 2. 查询奖金池关联的项目ID + // 查询奖金池关联的项目ID List rels = bonusProjectRelMapper.selectList( Wrappers.lambdaQuery() .eq(OaBonusProjectRel::getPoolId, poolId) @@ -362,14 +362,14 @@ public class OaProjectScheduleStepServiceImpl implements IOaProjectScheduleStepS ? Collections.emptyList() : rels.stream().map(OaBonusProjectRel::getProjectId).collect(Collectors.toList()); - // 3. 筛选用户负责的项目 + // 筛选用户负责的项目 List responsibleProjects = projectMapper.selectList( Wrappers.lambdaQuery() .in(SysOaProject::getProjectId, projectIds) .eq(SysOaProject::getFunctionary, nickName) ); - // 4. 查询用户负责的进度步骤(核心数据),并关联项目ID + // 查询用户负责的进度步骤(核心数据),并关联项目ID List userSteps = new ArrayList<>(); // 存储 scheduleId 与 projectId 的映射关系(关键:通过进度主表关联项目ID) Map scheduleProjectMap = new HashMap<>(); @@ -414,7 +414,7 @@ public class OaProjectScheduleStepServiceImpl implements IOaProjectScheduleStepS } } - // 5. 统计进度数据(逻辑不变) + // 统计进度数据 PersonalReportDTO.ProgressStats progressStats = new PersonalReportDTO.ProgressStats(); progressStats.setTotal((long) userSteps.size()); progressStats.setCompleted(userSteps.stream() @@ -427,13 +427,15 @@ public class OaProjectScheduleStepServiceImpl implements IOaProjectScheduleStepS .filter(step -> step.getEndTime() != null && step.getOriginalEndTime() != null) .filter(step -> step.getEndTime().isAfter(step.getOriginalEndTime())) .count()); - - // 6. 封装返回DTO + // 查询用户相关任务 + List tasks = sysOaTaskService.getTasksByNicknameAndProjectIds(nickName, projectIds); + // 封装返回DTO PersonalReportDTO result = new PersonalReportDTO(); result.setUserInfo(user); result.setResponsibleProjects(responsibleProjects); result.setProgressStats(progressStats); result.setUserSteps(userSteps); // 此时userSteps已包含每个步骤对应的projectId + result.setTasks(tasks); return result; } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaTaskServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaTaskServiceImpl.java index 6cf10e0..bab5987 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaTaskServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/SysOaTaskServiceImpl.java @@ -1,7 +1,9 @@ package com.ruoyi.oa.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.domain.PageQuery; @@ -11,6 +13,7 @@ import com.ruoyi.oa.domain.*; import com.ruoyi.oa.domain.bo.SysOaTaskItemBo; import com.ruoyi.oa.mapper.SysOaTaskItemMapper; import com.ruoyi.oa.service.ISysOaTaskItemService; +import com.ruoyi.system.mapper.SysUserMapper; import com.ruoyi.system.service.ISysOssService; import jodd.util.StringUtil; import lombok.RequiredArgsConstructor; @@ -45,6 +48,8 @@ public class SysOaTaskServiceImpl implements ISysOaTaskService { private final ISysOssService ossService; + private SysUserMapper userMapper; + /** * 查询任务管理 */ @@ -136,6 +141,7 @@ public class SysOaTaskServiceImpl implements ISysOaTaskService { return baseMapper.queryListPlus(bo); } + private QueryWrapper buildQueryWrapper(SysOaTaskBo bo) { Map params = bo.getParams(); QueryWrapper lqw = Wrappers.query(); @@ -305,4 +311,25 @@ public class SysOaTaskServiceImpl implements ISysOaTaskService { .atZone(ZoneId.systemDefault()) .toInstant()); } + + + @Override + public List getTasksByNicknameAndProjectIds(String nickName, List projectIds) { + // 假设已有用户Mapper可以查询ID + SysUser user = userMapper.selectOne(Wrappers.lambdaQuery() + .eq(SysUser::getNickName, nickName) + .eq(SysUser::getDelFlag, "0")); + + if (user == null) { + return Collections.emptyList(); + } + + // 查询条件: + // 1. 任务执行人ID = 当前用户ID + // 2. 任务所属项目ID在奖金池关联的项目列表中 + // 3. 未删除 + return baseMapper.selectList(Wrappers.lambdaQuery() + .eq(SysOaTask::getWorkerId, user.getUserId()) // 执行人ID匹配 + .in(projectIds != null && !projectIds.isEmpty(), SysOaTask::getProjectId, projectIds)); // 项目ID在列表中 + } }