添加顶部导航,添加采购与合同审批,另外添加采购流合同流说明

This commit is contained in:
2026-06-16 17:27:22 +08:00
parent 7efc03570d
commit 184202b82f
14 changed files with 1272 additions and 8 deletions

View File

@@ -138,4 +138,9 @@ public class SysOaContractVo {
@ExcelProperty(value = "备注")
private String remark;
/** 审批状态null=未提交审批0=待审1=通过2=驳回3=撤回 */
private Integer approvalStatus;
/** 审批单 id最新一次 */
private Long approvalInstanceId;
}

View File

@@ -211,14 +211,15 @@ public class OaRequirementsServiceImpl implements IOaRequirementsService {
public Boolean updateByBo(OaRequirementsBo bo) {
OaRequirements update = BeanUtil.toBean(bo, OaRequirements.class);
validEntityBeforeSave(update);
// 推进到采购中/完成 前必须审批通过
// 推进到采购中/完成 前审批通过
// 若审批未启用/未配置 (无实例),则放行,避免「停用审批反而卡住业务」。
if (bo.getStatus() != null && (bo.getStatus() == 1 || bo.getStatus() == 2)) {
OaApprovalInstance i = approvalInstanceMapper.selectOne(
Wrappers.<OaApprovalInstance>lambdaQuery()
.eq(OaApprovalInstance::getBusinessType, BIZ_TYPE)
.eq(OaApprovalInstance::getBusinessId, bo.getRequirementId())
.orderByDesc(OaApprovalInstance::getId).last("LIMIT 1"));
if (i == null || i.getStatus() == null || i.getStatus() != 1) {
if (i != null && (i.getStatus() == null || i.getStatus() != 1)) {
throw new com.ruoyi.common.exception.ServiceException("该采购需求尚未审批通过,无法推进状态");
}
}

View File

@@ -16,12 +16,19 @@ import org.springframework.stereotype.Service;
import com.ruoyi.oa.domain.bo.SysOaContractBo;
import com.ruoyi.oa.domain.vo.SysOaContractVo;
import com.ruoyi.oa.domain.SysOaContract;
import com.ruoyi.oa.domain.OaApprovalInstance;
import com.ruoyi.oa.mapper.SysOaContractMapper;
import com.ruoyi.oa.mapper.OaApprovalInstanceMapper;
import com.ruoyi.oa.service.ISysOaContractService;
import com.ruoyi.oa.service.IOaApprovalService;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* 合同管理Service业务层处理
@@ -33,16 +40,26 @@ import java.util.Collection;
@Service
public class SysOaContractServiceImpl implements ISysOaContractService {
public static final String BIZ_TYPE = "contract";
@Autowired
private SysOaContractMapper contractMapper;
@Autowired
private IOaApprovalService approvalService;
@Autowired
private OaApprovalInstanceMapper approvalInstanceMapper;
/**
* 查询合同管理
*/
@Override
public SysOaContractVo queryById(Long contractId){
return contractMapper.selectVoById(contractId);
SysOaContractVo vo = contractMapper.selectVoById(contractId);
enrichApproval(Collections.singletonList(vo));
return vo;
}
/**
@@ -52,6 +69,7 @@ public class SysOaContractServiceImpl implements ISysOaContractService {
public TableDataInfo<SysOaContractVo> queryPageList(SysOaContractBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<SysOaContract> lqw = buildQueryWrapper(bo);
Page<SysOaContractVo> result = contractMapper.selectVoPage(pageQuery.build(), lqw);
enrichApproval(result.getRecords());
return TableDataInfo.build(result);
}
@@ -61,7 +79,32 @@ public class SysOaContractServiceImpl implements ISysOaContractService {
@Override
public List<SysOaContractVo> queryList(SysOaContractBo bo) {
LambdaQueryWrapper<SysOaContract> lqw = buildQueryWrapper(bo);
return contractMapper.selectVoList(lqw);
List<SysOaContractVo> list = contractMapper.selectVoList(lqw);
enrichApproval(list);
return list;
}
/** 给 VO 列表注入审批状态(最新一条实例) */
private void enrichApproval(List<SysOaContractVo> list) {
if (list == null || list.isEmpty()) return;
List<Long> ids = list.stream().filter(v -> v != null && v.getContractId() != null)
.map(SysOaContractVo::getContractId).collect(Collectors.toList());
if (ids.isEmpty()) return;
List<OaApprovalInstance> insts = approvalInstanceMapper.selectList(
Wrappers.<OaApprovalInstance>lambdaQuery()
.eq(OaApprovalInstance::getBusinessType, BIZ_TYPE)
.in(OaApprovalInstance::getBusinessId, ids)
.orderByAsc(OaApprovalInstance::getId));
Map<Long, OaApprovalInstance> latest = new HashMap<>();
for (OaApprovalInstance i : insts) latest.put(i.getBusinessId(), i);
for (SysOaContractVo v : list) {
if (v == null) continue;
OaApprovalInstance i = latest.get(v.getContractId());
if (i != null) {
v.setApprovalStatus(i.getStatus());
v.setApprovalInstanceId(i.getId());
}
}
}
/**
@@ -119,6 +162,8 @@ public class SysOaContractServiceImpl implements ISysOaContractService {
boolean flag = contractMapper.insert(add) > 0;
if (flag) {
bo.setContractId(add.getContractId());
// 触发审批流(依赖 oa_approval_config 里 contract 配置;未配置/未启用会跳过)
approvalService.submit(BIZ_TYPE, add.getContractId(), add.getContractName());
}
return flag;
}
@@ -146,6 +191,17 @@ public class SysOaContractServiceImpl implements ISysOaContractService {
public Boolean updateByBo(SysOaContractBo bo) {
SysOaContract update = BeanUtil.toBean(bo, SysOaContract.class);
validEntityBeforeSave(update);
// 标记「完结」(1) 前必须审批通过;若审批未启用/未配置 (无实例),放行。
if (bo.getContractStatus() != null && "1".equals(bo.getContractStatus())) {
OaApprovalInstance i = approvalInstanceMapper.selectOne(
Wrappers.<OaApprovalInstance>lambdaQuery()
.eq(OaApprovalInstance::getBusinessType, BIZ_TYPE)
.eq(OaApprovalInstance::getBusinessId, bo.getContractId())
.orderByDesc(OaApprovalInstance::getId).last("LIMIT 1"));
if (i != null && (i.getStatus() == null || i.getStatus() != 1)) {
throw new com.ruoyi.common.exception.ServiceException("该合同尚未审批通过,无法标记为完结");
}
}
return contractMapper.updateById(update) > 0;
}