diff --git a/backend/pom.xml b/backend/pom.xml
index 950c890a..66e4440d 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -407,6 +407,13 @@
${revision}
+
+
+ org.dromara
+ ruoyi-zsjy
+ ${revision}
+
+
-
+
org.dromara
ruoyi-jcbt
${revision}
-
+
diff --git a/backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/mapper/CwApprovalRecordMapper.java b/backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/mapper/CwApprovalRecordMapper.java
index 38fbd29e..89087eeb 100644
--- a/backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/mapper/CwApprovalRecordMapper.java
+++ b/backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/mapper/CwApprovalRecordMapper.java
@@ -41,29 +41,30 @@ public interface CwApprovalRecordMapper extends BaseMapperPlus selectPendingByApproverId(@Param("approverId") Long approverId, @Param("nodeStatus") String nodeStatus);
+ List selectPendingByApproverId(@Param("approverId") Long approverId,
+ @Param("nodeStatus") String nodeStatus);
/**
* 根据审批人ID和节点编码查询审批记录
*
* @param approverId 审批人ID
- * @param nodeCode 节点编码
+ * @param nodeCode 节点编码
* @param nodeStatus 节点状态
* @return 审批记录列表
*/
List selectByApproverAndNode(@Param("approverId") Long approverId,
- @Param("nodeCode") String nodeCode,
- @Param("nodeStatus") String nodeStatus);
+ @Param("nodeCode") String nodeCode,
+ @Param("nodeStatus") String nodeStatus);
/**
* 根据节点编码查询审批记录
*
- * @param nodeCode 节点编码
+ * @param nodeCode 节点编码
* @param nodeStatus 节点状态
* @return 审批记录列表
*/
List selectByNode(@Param("nodeCode") String nodeCode,
- @Param("nodeStatus") String nodeStatus);
+ @Param("nodeStatus") String nodeStatus);
/**
* 查询财务审批节点的待审批记录(包含waiting和pending状态)
@@ -91,11 +92,11 @@ public interface CwApprovalRecordMapper extends BaseMapperPlus selectPageWithJoin(IPage page, @Param("bo") CwApprovalRecordBo bo);
@@ -140,4 +141,12 @@ public interface CwApprovalRecordMapper extends BaseMapperPlus> selectAvailableApprovers();
+
}
diff --git a/backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/service/impl/CwApprovalRecordServiceImpl.java b/backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/service/impl/CwApprovalRecordServiceImpl.java
index f522adfd..84f2b634 100644
--- a/backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/service/impl/CwApprovalRecordServiceImpl.java
+++ b/backend/ruoyi-modules/ruoyi-cw/src/main/java/org/dromara/cw/service/impl/CwApprovalRecordServiceImpl.java
@@ -37,7 +37,6 @@ import java.util.*;
import java.util.stream.Collectors;
import org.dromara.common.core.utils.SpringUtils;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.jdbc.core.JdbcTemplate;
/**
* 审批记录Service业务层处理
@@ -56,9 +55,6 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
private final ISysUserService sysUserService;
private final ISysDeptService sysDeptService;
- @Autowired
- private JdbcTemplate jdbcTemplate;
-
/**
* 根据主键查询审批记录
*/
@@ -90,7 +86,8 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
*/
@Override
public TableDataInfo queryPageList(CwApprovalRecordBo bo, PageQuery pageQuery) {
- log.info("🔍 开始查询审批记录,查询参数:deptId={}, pageNum={}, pageSize={}", bo.getDeptId(), pageQuery.getPageNum(), pageQuery.getPageSize());
+ log.info("🔍 开始查询审批记录,查询参数:deptId={}, pageNum={}, pageSize={}", bo.getDeptId(), pageQuery.getPageNum(),
+ pageQuery.getPageSize());
// 🔧 使用新的关联查询方法(支持完整字段显示)
Page page = pageQuery.build();
@@ -167,7 +164,7 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
for (int i = 0; i < Math.min(result.getRecords().size(), 2); i++) {
CwApprovalRecordVo record = result.getRecords().get(i);
log.info("📋 记录{}详情:id={}, 申报编号={}, 项目名称={}, 申报人={}, 部门={}, 总投资={}, 当前审批人={}, 状态={}",
- i+1, record.getId(), record.getApplicationNo(), record.getProjectName(),
+ i + 1, record.getId(), record.getApplicationNo(), record.getProjectName(),
record.getApplicantName(), record.getDeptName(), record.getTotalInvestment(),
record.getCurrentApproverName(), record.getApprovalStatus());
}
@@ -196,7 +193,8 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
private LambdaQueryWrapper buildQueryWrapper(CwApprovalRecordBo bo) {
LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getApplicationId() != null, CwApprovalRecord::getApplicationId, bo.getApplicationId());
- lqw.eq(StringUtils.isNotBlank(bo.getApplicationNo()), CwApprovalRecord::getApplicationNo, bo.getApplicationNo());
+ lqw.eq(StringUtils.isNotBlank(bo.getApplicationNo()), CwApprovalRecord::getApplicationNo,
+ bo.getApplicationNo());
lqw.eq(StringUtils.isNotBlank(bo.getNodeCode()), CwApprovalRecord::getNodeCode, bo.getNodeCode());
lqw.eq(StringUtils.isNotBlank(bo.getNodeStatus()), CwApprovalRecord::getNodeStatus, bo.getNodeStatus());
lqw.eq(bo.getApproverId() != null, CwApprovalRecord::getApproverId, bo.getApproverId());
@@ -212,7 +210,8 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
if (currentDeptId != null) {
// 查询该部门的项目申报ID列表
lqw.inSql(CwApprovalRecord::getApplicationId,
- "SELECT id FROM cw_project_application WHERE department_id = " + currentDeptId + " AND deleted = 0");
+ "SELECT id FROM cw_project_application WHERE department_id = " + currentDeptId
+ + " AND deleted = 0");
// 只显示部门审批节点的记录
lqw.eq(CwApprovalRecord::getNodeCode, "dept_approve");
@@ -234,7 +233,8 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
try {
Long deptId = Long.valueOf(bo.getDeptId());
lqw.in(CwApprovalRecord::getApplicationId,
- "SELECT id FROM cw_project_application WHERE department_id = " + deptId + " AND deleted = 0");
+ "SELECT id FROM cw_project_application WHERE department_id = " + deptId
+ + " AND deleted = 0");
} catch (NumberFormatException e) {
log.warn("无效的部门ID格式:{}", bo.getDeptId());
}
@@ -245,11 +245,11 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
// 其他查询条件 - 暂时注释掉,避免复杂的关联查询导致编译错误
// if (StringUtils.isNotBlank(bo.getProjectName())) {
- // // 项目名称查询需要关联查询,暂时跳过
+ // // 项目名称查询需要关联查询,暂时跳过
// }
// if (StringUtils.isNotBlank(bo.getApplicantName())) {
- // // 申报人姓名查询需要关联查询,暂时跳过
+ // // 申报人姓名查询需要关联查询,暂时跳过
// }
if (StringUtils.isNotBlank(bo.getApproverName())) {
@@ -304,8 +304,8 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
if (deptId != null) {
// 通过关联查询,只显示本部门用户提交的申报对应的审批记录
lqw.exists("SELECT 1 FROM cw_project_application a " +
- "WHERE a.id = cw_approval_record.application_id " +
- "AND a.department_id = " + deptId);
+ "WHERE a.id = cw_approval_record.application_id " +
+ "AND a.department_id = " + deptId);
// 🔧 关键修复:部门领导也需要过滤为自己作为审批人的记录
lqw.eq(CwApprovalRecord::getApproverId, currentUserId);
log.debug("部门领导权限过滤完成:deptId={}, approverId={}", deptId, currentUserId);
@@ -383,8 +383,8 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
// 查询当前用户已审批的记录(精确匹配已完成的状态)
LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(CwApprovalRecord::getApproverId, currentUserId)
- .in(CwApprovalRecord::getNodeStatus, Arrays.asList("approved", "rejected", "returned"))
- .orderByDesc(CwApprovalRecord::getEndTime);
+ .in(CwApprovalRecord::getNodeStatus, Arrays.asList("approved", "rejected", "returned"))
+ .orderByDesc(CwApprovalRecord::getEndTime);
return baseMapper.selectList(queryWrapper);
});
@@ -544,8 +544,8 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
@Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public Boolean createApprovalProcess(Long applicationId, String applicationNo,
- Long currentUserId, String currentUserName,
- Long currentDeptId, String currentTenantId) {
+ Long currentUserId, String currentUserName,
+ Long currentDeptId, String currentTenantId) {
log.info("🚀 开始创建审批流程:applicationId={}, applicationNo={}", applicationId, applicationNo);
log.info("📋 使用用户上下文:userId={}, userName={}, deptId={}, tenantId={}",
currentUserId, currentUserName, currentDeptId, currentTenantId);
@@ -565,15 +565,15 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
log.error("❌ 申报记录不存在:applicationId={}", applicationId);
throw new RuntimeException("申报记录不存在");
}
- log.info("✅ 成功获取申报信息:projectName={}, status={}", application.getProjectName(), application.getApprovalStatus());
+ log.info("✅ 成功获取申报信息:projectName={}, status={}", application.getProjectName(),
+ application.getApprovalStatus());
// 🔧 重要修复:清理该申报的旧审批记录(避免重复数据)
log.info("🧹 开始清理申报ID={}的旧审批记录...", applicationId);
try {
int deletedCount = baseMapper.delete(
- Wrappers.lambdaQuery()
- .eq(CwApprovalRecord::getApplicationId, applicationId)
- );
+ Wrappers.lambdaQuery()
+ .eq(CwApprovalRecord::getApplicationId, applicationId));
log.info("✅ 清理旧审批记录完成:删除{}条记录", deletedCount);
} catch (Exception e) {
log.error("❌ 清理旧审批记录失败:applicationId={}, error={}", applicationId, e.getMessage(), e);
@@ -587,8 +587,8 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
// 第1节点:部门审批(提交时只创建这一个记录)
CwApprovalRecord deptRecord = createApprovalRecord(applicationId, applicationNo,
- "dept_approve", "部门审批", 1, "waiting",
- currentUserId, currentUserName, currentDeptId, currentTenantId);
+ "dept_approve", "部门审批", 1, "waiting",
+ currentUserId, currentUserName, currentDeptId, currentTenantId);
records.add(deptRecord);
log.info("✅ 创建部门审批记录:ID={}, 审批人={}", deptRecord.getId(), deptRecord.getApproverName());
@@ -602,8 +602,8 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
for (int i = 0; i < records.size(); i++) {
CwApprovalRecord record = records.get(i);
log.info("📋 记录{}详情: ID={}, ApplicationId={}, NodeCode={}, ApproverId={}, CreateBy={}, TenantId={}",
- i+1, record.getId(), record.getApplicationId(), record.getNodeCode(),
- record.getApproverId(), record.getCreateBy(), record.getTenantId());
+ i + 1, record.getId(), record.getApplicationId(), record.getNodeCode(),
+ record.getApproverId(), record.getCreateBy(), record.getTenantId());
}
// 批量插入审批记录
@@ -626,11 +626,10 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
try {
// 直接使用Mapper在当前事务中更新,避免调用Service层的新事务
int updateCount = applicationMapper.update(null,
- Wrappers.lambdaUpdate()
- .set(CwProjectApplication::getApprovalStatus, "approving")
- .set(CwProjectApplication::getUpdateTime, new Date())
- .eq(CwProjectApplication::getId, applicationId)
- );
+ Wrappers.lambdaUpdate()
+ .set(CwProjectApplication::getApprovalStatus, "approving")
+ .set(CwProjectApplication::getUpdateTime, new Date())
+ .eq(CwProjectApplication::getId, applicationId));
if (updateCount > 0) {
log.info("✅ 申报状态直接更新成功:applicationId={} -> approving, 影响行数={}", applicationId, updateCount);
@@ -673,10 +672,10 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
}
private CwApprovalRecord createApprovalRecord(Long applicationId, String applicationNo,
- String nodeCode, String nodeName,
- Integer nodeOrder, String nodeStatus,
- Long currentUserId, String currentUserName,
- Long currentDeptId, String currentTenantId) {
+ String nodeCode, String nodeName,
+ Integer nodeOrder, String nodeStatus,
+ Long currentUserId, String currentUserName,
+ Long currentDeptId, String currentTenantId) {
CwApprovalRecord record = new CwApprovalRecord();
// 生成唯一ID(批量插入需要手动生成)
@@ -709,7 +708,7 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
record.setCreateDept(currentDeptId);
record.setTenantId(currentTenantId);
- // 设置其他必需字段(为批量插入提供完整数据)
+ // 设置其他必需字段(为批量插入提供完整数据)
record.setIsDelegate(false);
record.setIsOvertime(false);
@@ -748,7 +747,7 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
* 根据节点类型设置审批人
*/
private void setApproverByNodeCode(CwApprovalRecord record, String nodeCode,
- Long currentUserId, String currentUserName) {
+ Long currentUserId, String currentUserName) {
// 根据审批节点类型查找正确的审批人,而不是使用申报人
try {
switch (nodeCode) {
@@ -875,12 +874,12 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
try {
// SQL查询:查找该部门内具有project_dept_manage角色的用户
String sql = "SELECT ur.user_id FROM sys_user_role ur " +
- "INNER JOIN sys_role r ON ur.role_id = r.role_id " +
- "INNER JOIN sys_user u ON ur.user_id = u.user_id " +
- "WHERE r.role_key = 'project_dept_manage' " +
- "AND u.dept_id = " + deptId + " " +
- "AND u.del_flag = 0 AND u.status = 0 " +
- "LIMIT 1";
+ "INNER JOIN sys_role r ON ur.role_id = r.role_id " +
+ "INNER JOIN sys_user u ON ur.user_id = u.user_id " +
+ "WHERE r.role_key = 'project_dept_manage' " +
+ "AND u.dept_id = " + deptId + " " +
+ "AND u.del_flag = 0 AND u.status = 0 " +
+ "LIMIT 1";
log.info("查找部门审批人SQL:{}", sql);
@@ -958,8 +957,8 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
// 更新当前审批记录
CwApprovalRecordBo updateBo = new CwApprovalRecordBo();
updateBo.setId(currentRecord.getId());
- updateBo.setNodeStatus("approve".equals(approveAction) ? "approved" :
- "reject".equals(approveAction) ? "rejected" : "returned");
+ updateBo.setNodeStatus("approve".equals(approveAction) ? "approved"
+ : "reject".equals(approveAction) ? "rejected" : "returned");
updateBo.setApproveAction(approveAction);
updateBo.setApproveOpinion(approveOpinion);
updateBo.setEndTime(new Date());
@@ -974,7 +973,7 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
} catch (Exception e) {
log.error("处理审批失败:applicationId={}, nodeCode={}, error={}",
- applicationId, nodeCode, e.getMessage(), e);
+ applicationId, nodeCode, e.getMessage(), e);
throw new RuntimeException("处理审批失败:" + e.getMessage(), e);
}
}
@@ -1020,8 +1019,8 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
// 根据节点类型创建对应的审批记录
CwApprovalRecord newRecord = createApprovalRecordForNode(applicationId, application.getApplicationNo(),
- nextNodeCode, application.getCreateBy(), application.getApplicantName(),
- application.getDepartmentId(), LoginHelper.getTenantId());
+ nextNodeCode, application.getCreateBy(), application.getApplicantName(),
+ application.getDepartmentId(), LoginHelper.getTenantId());
if (newRecord != null) {
// 插入新的审批记录
@@ -1046,7 +1045,7 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
return true;
} catch (Exception e) {
log.error("启动下一个审批节点失败:applicationId={}, nodeCode={}, error={}",
- applicationId, nextNodeCode, e.getMessage(), e);
+ applicationId, nextNodeCode, e.getMessage(), e);
throw new RuntimeException("启动下一个审批节点失败:" + e.getMessage());
}
}
@@ -1055,8 +1054,8 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
* 动态创建指定节点的审批记录
*/
private CwApprovalRecord createApprovalRecordForNode(Long applicationId, String applicationNo,
- String nodeCode, Long createBy, String createByName,
- Long deptId, String tenantId) {
+ String nodeCode, Long createBy, String createByName,
+ Long deptId, String tenantId) {
try {
String nodeName;
Integer nodeOrder;
@@ -1077,11 +1076,11 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
// 创建审批记录
CwApprovalRecord record = createApprovalRecord(applicationId, applicationNo,
- nodeCode, nodeName, nodeOrder, "waiting",
- createBy, createByName, deptId, tenantId);
+ nodeCode, nodeName, nodeOrder, "waiting",
+ createBy, createByName, deptId, tenantId);
log.info("✅ 动态创建审批记录:nodeCode={}, nodeName={}, approverId={}",
- nodeCode, nodeName, record.getApproverId());
+ nodeCode, nodeName, record.getApproverId());
return record;
} catch (Exception e) {
@@ -1124,7 +1123,7 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
return checkApprovalPermission(applicationId, "dept_approve");
}
- /**
+ /**
* 获取可选审批人列表(院领导)
* 修改为基于权限角色查找:查找具有cw:approval:leader权限的用户
*/
@@ -1135,46 +1134,22 @@ public class CwApprovalRecordServiceImpl implements ICwApprovalRecordService {
List