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

@@ -8,6 +8,8 @@ import java.util.List;
import java.util.Arrays;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.ruoyi.common.core.AjaxResult;
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;
@@ -260,5 +262,22 @@ public class SysOaProjectController extends BaseController {
beginTimeStart, beginTimeEnd, profitType,signingCompany, pageQuery);
}
//项目id 延期日期 延期次数加一 修改finish_time
/**
* 项目延期接口
* 前端通过@RequestParam传参项目IDprojectId、延期后结束日期tempTime
*/
@Log(title = "项目延期", businessType = BusinessType.UPDATE)
@PutMapping("/postpone")
public R<Void> postpone(@RequestParam Long projectId,
// 加@DateTimeFormat确保前端字符串日期能正确转为Date格式可根据前端调整
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @RequestParam Date tempTime) {
// 1. 构建BO将RequestParam参数封装为BO传给Service层
SysOaProject bo = new SysOaProject();
bo.setProjectId(projectId); // 项目ID
bo.setFinishTime(tempTime); // 延期后结束日期对应前端tempTime
// 2. 调用Service层执行延期逻辑通过toAjax统一返回结果若依框架常用方式
return toAjax(iSysOaProjectService.postponeProject(bo));
}
}

View File

@@ -155,4 +155,9 @@ public class SysOaProject extends BaseEntity {
private String projectCode;
//签约公司
private Integer signingCompany;
//初始结束时间
private Date originalFinishTime;
//延期次数
private Integer postponeCount;
}

View File

@@ -191,5 +191,10 @@ public class SysOaProjectBo extends BaseEntity {
private String status;
//签约公司
private Integer signingCompany;
//初始结束时间
private Date originalFinishTime;
//延期次数
private Integer postponeCount;
}

View File

@@ -258,4 +258,8 @@ public class SysOaProjectVo {
//签约公司
private Integer signingCompany;
//初始结束时间
private Date originalFinishTime;
//延期次数
private Integer postponeCount;
}

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

View File

@@ -304,6 +304,8 @@
p.postpone_time,
p.color,
p.signing_company,
p.postpone_count,
p.original_finish_time,
TIMESTAMPDIFF(DAY, NOW(), p.postpone_time) AS remainTime
FROM sys_oa_project p
@@ -583,6 +585,8 @@
sop.update_time,
sop.project_code,
sop.signing_company,
sop.original_finish_time,
sop.postpone_count,
is_postpone,
postpone_reason,
postpone_time,