feat(oa): 添加项目延期功能

- 在 SysOaProject 实体类中新增 originalFinishTime 和 postponeCount 字段- 在 SysOaProjectBo 和 SysOaProjectVo 中同步添加延期相关字段
- 新增 postponeProject 接口方法及其实现,支持-项目延期逻辑 控制器中增加 /postpone 接口用于处理项目延期请求
- Mapper XML 文件中查询语句加入延期相关字段
- 增加延期次数自增、延期时间更新等业务逻辑校验
This commit is contained in:
2025-10-18 17:32:00 +08:00
parent 8b498405af
commit ad3d0324b0
7 changed files with 78 additions and 0 deletions

View File

@@ -1,5 +1,6 @@
package com.ruoyi.oa.service;
import com.ruoyi.oa.domain.SysOaProject;
import com.ruoyi.oa.domain.bo.SysOaWarehouseDetailBo;
import com.ruoyi.oa.domain.dto.ProjectActivityDTO;
import com.ruoyi.oa.domain.dto.ProjectDataDTO;
@@ -98,4 +99,6 @@ public interface ISysOaProjectService {
List<ProjectDataDTO> getProjectData(String month);
List<ProjectActivityDTO> getProjectActivities();
Boolean postponeProject(SysOaProject bo);
}

View File

@@ -2,6 +2,9 @@ package com.ruoyi.oa.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.page.TableDataInfo;
@@ -460,6 +463,8 @@ public class SysOaProjectServiceImpl implements ISysOaProjectService {
return baseMapper.getProjectActivities();
}
private QueryWrapper<SysOaProject> buildOutWareQueryWrapper(SysOaWarehouseDetailBo bo) {
QueryWrapper<SysOaProject> lqw = Wrappers.query();
lqw.like(StringUtils.isNotBlank(bo.getProjectName()), "sop.projec_name", bo.getProjectName());
@@ -484,4 +489,37 @@ public class SysOaProjectServiceImpl implements ISysOaProjectService {
return DateUtils.parseDate(DateUtils.parseDateToStr(format, time));
}
@Override
public Boolean postponeProject(SysOaProject bo) {
// 1. 基础参数校验
if (bo.getProjectId() == null || bo.getFinishTime() == null) {
throw new RuntimeException("项目ID和延期日期不能为空"); // 也可返回false根据业务选择
}
// 2. 查询项目是否存在
SysOaProject project = baseMapper.selectById(bo.getProjectId());
if (project == null) {
throw new RuntimeException("项目不存在,无法延期");
}
// 3. 校验延期日期合理性(延期日期不能早于当前结束日期)
if (project.getFinishTime() != null && bo.getFinishTime().before(project.getFinishTime())) {
throw new RuntimeException("延期日期不能早于当前结束日期(当前结束日期:" + project.getFinishTime() + "");
}
// 4. 构建更新条件,执行延期操作
LambdaUpdateWrapper<SysOaProject> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(SysOaProject::getProjectId, bo.getProjectId()) // 锁定指定项目
.set(SysOaProject::getFinishTime, bo.getFinishTime()) // 延期日期赋值给finish_time
.set(SysOaProject::getPostponeTime, bo.getFinishTime()) // 同步更新“延期至日期”
.set(SysOaProject::getIsPostpone, 1) // 标记为已延期1=是)
.setSql("postpone_count = postpone_count + 1") // 延期次数+1
.set(SysOaProject::getUpdateTime, new Date()) // 更新时间
.set(SysOaProject::getUpdateBy, LoginHelper.getLoginUser()); // 获取当前操作用户
// 5. 执行更新,返回操作结果(更新行数>0则视为成功
return baseMapper.update(null, updateWrapper) > 0;
}
}