feat(oa): 添加项目延期功能
- 在 SysOaProject 实体类中新增 originalFinishTime 和 postponeCount 字段- 在 SysOaProjectBo 和 SysOaProjectVo 中同步添加延期相关字段 - 新增 postponeProject 接口方法及其实现,支持-项目延期逻辑 控制器中增加 /postpone 接口用于处理项目延期请求 - Mapper XML 文件中查询语句加入延期相关字段 - 增加延期次数自增、延期时间更新等业务逻辑校验
This commit is contained in:
@@ -8,6 +8,8 @@ import java.util.List;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
|
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.bo.SysOaWarehouseDetailBo;
|
||||||
import com.ruoyi.oa.domain.dto.ProjectActivityDTO;
|
import com.ruoyi.oa.domain.dto.ProjectActivityDTO;
|
||||||
import com.ruoyi.oa.domain.dto.ProjectDataDTO;
|
import com.ruoyi.oa.domain.dto.ProjectDataDTO;
|
||||||
@@ -260,5 +262,22 @@ public class SysOaProjectController extends BaseController {
|
|||||||
beginTimeStart, beginTimeEnd, profitType,signingCompany, pageQuery);
|
beginTimeStart, beginTimeEnd, profitType,signingCompany, pageQuery);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//项目id 延期日期 延期次数加一 修改finish_time
|
||||||
|
/**
|
||||||
|
* 项目延期接口
|
||||||
|
* 前端通过@RequestParam传参:项目ID(projectId)、延期后结束日期(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));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -155,4 +155,9 @@ public class SysOaProject extends BaseEntity {
|
|||||||
private String projectCode;
|
private String projectCode;
|
||||||
//签约公司
|
//签约公司
|
||||||
private Integer signingCompany;
|
private Integer signingCompany;
|
||||||
|
|
||||||
|
//初始结束时间
|
||||||
|
private Date originalFinishTime;
|
||||||
|
//延期次数
|
||||||
|
private Integer postponeCount;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -191,5 +191,10 @@ public class SysOaProjectBo extends BaseEntity {
|
|||||||
private String status;
|
private String status;
|
||||||
//签约公司
|
//签约公司
|
||||||
private Integer signingCompany;
|
private Integer signingCompany;
|
||||||
|
|
||||||
|
//初始结束时间
|
||||||
|
private Date originalFinishTime;
|
||||||
|
//延期次数
|
||||||
|
private Integer postponeCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -258,4 +258,8 @@ public class SysOaProjectVo {
|
|||||||
//签约公司
|
//签约公司
|
||||||
private Integer signingCompany;
|
private Integer signingCompany;
|
||||||
|
|
||||||
|
//初始结束时间
|
||||||
|
private Date originalFinishTime;
|
||||||
|
//延期次数
|
||||||
|
private Integer postponeCount;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.ruoyi.oa.service;
|
package com.ruoyi.oa.service;
|
||||||
|
|
||||||
|
import com.ruoyi.oa.domain.SysOaProject;
|
||||||
import com.ruoyi.oa.domain.bo.SysOaWarehouseDetailBo;
|
import com.ruoyi.oa.domain.bo.SysOaWarehouseDetailBo;
|
||||||
import com.ruoyi.oa.domain.dto.ProjectActivityDTO;
|
import com.ruoyi.oa.domain.dto.ProjectActivityDTO;
|
||||||
import com.ruoyi.oa.domain.dto.ProjectDataDTO;
|
import com.ruoyi.oa.domain.dto.ProjectDataDTO;
|
||||||
@@ -98,4 +99,6 @@ public interface ISysOaProjectService {
|
|||||||
|
|
||||||
List<ProjectDataDTO> getProjectData(String month);
|
List<ProjectDataDTO> getProjectData(String month);
|
||||||
List<ProjectActivityDTO> getProjectActivities();
|
List<ProjectActivityDTO> getProjectActivities();
|
||||||
|
|
||||||
|
Boolean postponeProject(SysOaProject bo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ package com.ruoyi.oa.service.impl;
|
|||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
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.DateUtils;
|
||||||
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
import com.ruoyi.common.core.page.TableDataInfo;
|
import com.ruoyi.common.core.page.TableDataInfo;
|
||||||
@@ -460,6 +463,8 @@ public class SysOaProjectServiceImpl implements ISysOaProjectService {
|
|||||||
return baseMapper.getProjectActivities();
|
return baseMapper.getProjectActivities();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private QueryWrapper<SysOaProject> buildOutWareQueryWrapper(SysOaWarehouseDetailBo bo) {
|
private QueryWrapper<SysOaProject> buildOutWareQueryWrapper(SysOaWarehouseDetailBo bo) {
|
||||||
QueryWrapper<SysOaProject> lqw = Wrappers.query();
|
QueryWrapper<SysOaProject> lqw = Wrappers.query();
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getProjectName()), "sop.projec_name", bo.getProjectName());
|
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));
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -304,6 +304,8 @@
|
|||||||
p.postpone_time,
|
p.postpone_time,
|
||||||
p.color,
|
p.color,
|
||||||
p.signing_company,
|
p.signing_company,
|
||||||
|
p.postpone_count,
|
||||||
|
p.original_finish_time,
|
||||||
TIMESTAMPDIFF(DAY, NOW(), p.postpone_time) AS remainTime
|
TIMESTAMPDIFF(DAY, NOW(), p.postpone_time) AS remainTime
|
||||||
FROM sys_oa_project p
|
FROM sys_oa_project p
|
||||||
|
|
||||||
@@ -583,6 +585,8 @@
|
|||||||
sop.update_time,
|
sop.update_time,
|
||||||
sop.project_code,
|
sop.project_code,
|
||||||
sop.signing_company,
|
sop.signing_company,
|
||||||
|
sop.original_finish_time,
|
||||||
|
sop.postpone_count,
|
||||||
is_postpone,
|
is_postpone,
|
||||||
postpone_reason,
|
postpone_reason,
|
||||||
postpone_time,
|
postpone_time,
|
||||||
|
|||||||
Reference in New Issue
Block a user