直转审核,数据迁移功能修复,

This commit is contained in:
hongchao 2025-08-31 20:55:53 +08:00
parent 59842231f8
commit 4ecc905556
16 changed files with 162 additions and 31 deletions

View File

@ -22,4 +22,6 @@ public class SysUserRoleVo extends SysUserRole {
private String roleName;
private Long deptId;
private String ancestors;
}

View File

@ -51,10 +51,31 @@ public class ApplyEventListener {
if (sysWorkflowTypeList.isEmpty()) {
throw new ServiceException("新增任务审批记录失败,请创建审核流程");
}
SysWorkflowRecord sysWorkflowRecord = new SysWorkflowRecord();
if (sysWorkflowTypeList.size() == 1) {
// 如果该任务类型配置了一个审批流则直接使用
sysWorkflowType = sysWorkflowTypeList.get(0);
sysWorkflowRecord = new SysWorkflowRecord();
sysWorkflowRecord.setWorkflowId(sysWorkflowType.getId());
sysWorkflowRecord.setTaskId(event.getTaskId());
sysWorkflowRecord.setTaskType(event.getTaskType());
sysWorkflowRecord.setTaskCode(event.getTaskCode());
//创建审批任务
int count = sysWorkflowRecordMapper.addSysWorkflowRecord(sysWorkflowRecord);
if (0 == count) {
throw new RuntimeException("创建审批任务失败!");
}
} else {
sysWorkflowRecord = new SysWorkflowRecord();
sysWorkflowRecord.setTaskId(event.getTaskId());
sysWorkflowRecord.setTaskType(event.getTaskType());
sysWorkflowRecord.setTaskCode(event.getTaskCode());
//创建审批任务
int count = sysWorkflowRecordMapper.addSysWorkflowRecord(sysWorkflowRecord);
if (0 == count) {
throw new RuntimeException("创建审批任务失败!");
}
// 如果该任务类型配置了多个审批流则根据任务信息判断使用
if (event.getTaskType() == TmTaskTypeEnum.TM_TASK_DIRECT.getTaskTypeId()) {
// 直转审批任务则根据转出和转入的部门判断同一部门使用无需接收审批流不同部门则使用需要接收审批流
@ -71,7 +92,12 @@ public class ApplyEventListener {
// 如果有转出转入信息则根据转出转入部门判断使用
DirectApplyInfo directApplyInfo = directAuditMapperList.get(0);
// 如果转入转出的部门ID相同则使用不需要接收审批流
if (directApplyInfo.getBackUnitId().equals(directApplyInfo.getLeaseUnitId())) {
//查询是否是同一实施单位
int proIdBack = directAuditMapper.getImpUnit(directApplyInfo.getBackProId());
int proIdLease = directAuditMapper.getImpUnit(directApplyInfo.getLeaseProId());
if (proIdBack == proIdLease) {
sysWorkflowTypeList.removeIf(removeIfSysWorkflowType -> removeIfSysWorkflowType.getTypeName().contains("需要接收审批"));
} else {
// 如果转入转出的部门ID不同则使用需要接收审批流
@ -83,18 +109,12 @@ public class ApplyEventListener {
// 除了直转任务外其他任务类型如果有配置多个审批流先默认选第一个
sysWorkflowType = sysWorkflowTypeList.get(0);
}
sysWorkflowRecord.setWorkflowId(sysWorkflowType.getId());
//插入任务审批类型
int countTwo = sysWorkflowRecordMapper.updateSysWorkflowType(sysWorkflowRecord);
}
SysWorkflowRecord sysWorkflowRecord = new SysWorkflowRecord();
sysWorkflowRecord.setWorkflowId(sysWorkflowType.getId());
sysWorkflowRecord.setTaskId(event.getTaskId());
sysWorkflowRecord.setTaskType(event.getTaskType());
sysWorkflowRecord.setTaskCode(event.getTaskCode());
//创建审批任务
int count = sysWorkflowRecordMapper.addSysWorkflowRecord(sysWorkflowRecord);
if (0 == count) {
throw new RuntimeException("创建审批任务失败!");
}
// 获取新创建的ID
int newId = sysWorkflowRecord.getId();
//获取当前审核流下的节点

View File

@ -372,9 +372,10 @@ public class MachineServiceImpl implements IMachineService
baseInfo.setLeaseTime(null);
baseInfo.setLeaseUnit(null);
baseInfo.setLeaseProject(null);
}else{
LeaseApplyInfo leaseDetail = machineMapper.getLeaseUnitAndProject(leaseInfo);
baseInfo.setLeaseTime(String.valueOf(leaseDetail.getLeaseTime()));
baseInfo.setLeaseTime(String.valueOf(leaseInfo.getLeaseTime()));
baseInfo.setLeaseUnit(leaseDetail.getUnitName());
baseInfo.setLeaseProject(leaseDetail.getProjectName());
}

View File

@ -43,7 +43,7 @@ public class ScheduledCheckWarning {
/**
* 定时任务执行频率每周三/五天上午9点执行一次
*/
private String cronExpression = "0 0 9 ? * WED,SAT";
private String cronExpression = "0 0 9 ? * WED,FRI";
/**
@ -71,7 +71,7 @@ public class ScheduledCheckWarning {
private String getCronFromDatabase() {
// 这里假设从数据库中获取 cron 表达式
//return "0 */1 * * * ?";
return "0 0 9 ? * WED,SAT";
return "0 0 9 ? * WED,FRI";
}
/**

View File

@ -7,6 +7,7 @@ import com.bonus.material.ma.domain.DirectApplyInfo;
import com.bonus.material.ma.domain.Type;
import com.bonus.material.work.domain.DirectAudit;
import com.bonus.material.work.domain.SysWorkflowRecord;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -27,4 +28,6 @@ public interface DirectAuditMapper {
void updateWorkflowRecord(DirectAudit fr);
void updateDirectAudit(DirectApplyInfo directApplyInfo);
int getImpUnit(@Param("proId") String backProId);
}

View File

@ -23,4 +23,6 @@ public interface SysWorkflowConfigMapper {
String selectRolesByNodeId(Integer nodeId);
SysWorkflowConfig selectConfigValueInfoByNodeId(Integer nodeId);
int getImpUnit(String backProId);
}

View File

@ -2,6 +2,7 @@ package com.bonus.material.work.mapper;
import com.bonus.material.work.domain.SysWorkflowRecord;
import com.bonus.material.work.domain.SysWorkflowRecordHistory;
import com.bonus.material.work.domain.SysWorkflowType;
import com.bonus.material.work.domain.dto.SysWorkflowAuditDto;
import org.apache.ibatis.annotations.Param;
@ -28,4 +29,6 @@ public interface SysWorkflowRecordMapper {
List<SysWorkflowRecordHistory> getAuditUserByTaskId(SysWorkflowRecordHistory sysWorkflowRecordHistory);
List<SysWorkflowRecordHistory> getAuditUserByRecordId(@Param("recordId") Integer recordId);
int updateSysWorkflowType(SysWorkflowRecord sysWorkflowRecord);
}

View File

@ -1,6 +1,7 @@
package com.bonus.material.work.service;
import com.bonus.material.ma.domain.DirectApplyInfo;
import com.bonus.material.work.domain.SysWorkflowNode;
import java.util.List;
@ -18,6 +19,7 @@ public interface SysWorkflowNodeService {
List<SysWorkflowNode> listByTaskId(SysWorkflowNode sysWorkflowNode);
void copeNodeConfigPersonValuesByNode(SysWorkflowNode forSysWorkflowNode);
void copeNodeConfigPersonValuesByNodeTwo(SysWorkflowNode forSysWorkflowNode, DirectApplyInfo directApplyInfo);
Map<Integer, SysWorkflowNode> listByProId(SysWorkflowNode sysWorkflowNode);
}

View File

@ -74,7 +74,7 @@ public class DirectAuditImpl implements IDirectAuditService {
// 先根据下个节点的ID去查询下个节点信息
SysWorkflowNode nextWorkflowInfo = sysWorkflowNodeMapper.selectSysWorkflowNodeById(sysWorkflowRecordHistoryList.get(0).getNextNodeId());
// 再根据下个节点信息查询到配置值
sysWorkflowNodeService.copeNodeConfigPersonValuesByNode(nextWorkflowInfo);
sysWorkflowNodeService.copeNodeConfigPersonValuesByNodeTwo(nextWorkflowInfo,directApplyInfoNew);
directApplyInfoNew.setNodeId(sysWorkflowRecordHistoryList.get(0).getNextNodeId());
if (nextWorkflowInfo != null && nextWorkflowInfo.getConfigValues() != null) {
directApplyInfoNew.setConfigValue(nextWorkflowInfo.getConfigValues());

View File

@ -5,6 +5,7 @@ import com.bonus.common.core.utils.DateUtils;
import com.bonus.common.security.utils.SecurityUtils;
import com.bonus.material.basic.domain.dto.SysUserRoleVo;
import com.bonus.material.basic.mapper.BmUserRoleMapper;
import com.bonus.material.ma.domain.DirectApplyInfo;
import com.bonus.material.work.domain.SysWorkflowConfig;
import com.bonus.material.work.domain.SysWorkflowNode;
import com.bonus.material.work.domain.SysWorkflowRecordHistory;
@ -16,10 +17,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@ -223,6 +221,85 @@ public class SysWorkflowNodeServiceImpl implements SysWorkflowNodeService {
}
}
@Override
public void copeNodeConfigPersonValuesByNodeTwo(SysWorkflowNode forSysWorkflowNode, DirectApplyInfo directApplyInfo) {
if (forSysWorkflowNode == null) {
System.err.println("传入的节点信息为空!");
return;
}
try {
// 判断配置的类型
if (forSysWorkflowNode.getConfigType() == null || forSysWorkflowNode.getConfigType() == 0) {
// 如果配置的是角色那么要根据角色id去查询有哪些用户
String roleIds = forSysWorkflowNode.getRoleIds();
// 如果参数没有那么就从数据库中查询
if (roleIds == null || roleIds.isEmpty()) {
System.out.println("节点配置角色为空!去再执行数据库查询");
roleIds = sysWorkflowConfigMapper.selectRolesByNodeId(forSysWorkflowNode.getNodeId());
}
if (roleIds != null && !roleIds.isEmpty()) {
StringBuilder roleConfigValues = new StringBuilder();
String[] roleIdArray = roleIds.split(",");
for (String forRoleId : roleIdArray) {
List<SysUserRoleVo> userList = bmUserRoleMapper.getUserRoleListByDeptId(SecurityUtils.getLoginUser().getSysUser().getDeptId(), Long.valueOf(forRoleId));
if(forSysWorkflowNode.getNodeName().contains("接收方")){
int proIdLease = sysWorkflowConfigMapper.getImpUnit(directApplyInfo.getLeaseProId());
// 使用 Iterator 迭代器遍历支持安全删除元素
Iterator<SysUserRoleVo> iterator = userList.iterator();
while (iterator.hasNext()) {
SysUserRoleVo user = iterator.next();
// 条件1部门ID等于proIdBack 保留跳过删除
if (proIdLease == user.getDeptId()) {
continue;
}
// 条件2祖先ID列表包含proIdBack 保留跳过删除
String ancestors = user.getAncestors();
if (ancestors != null && Arrays.asList(ancestors.split(",")).contains(String.valueOf(proIdLease))) {
continue;
}
// 若以上条件均不满足 剔除该条数据
iterator.remove();
}
}else{
int proIdBack = sysWorkflowConfigMapper.getImpUnit(directApplyInfo.getBackProId());
// 使用 Iterator 迭代器遍历支持安全删除元素
Iterator<SysUserRoleVo> iterator = userList.iterator();
while (iterator.hasNext()) {
SysUserRoleVo user = iterator.next();
// 条件1部门ID等于proIdBack 保留跳过删除
if (proIdBack == user.getDeptId()) {
continue;
}
// 条件2祖先ID列表包含proIdBack 保留跳过删除
String ancestors = user.getAncestors();
if (ancestors != null && Arrays.asList(ancestors.split(",")).contains(String.valueOf(proIdBack))) {
continue;
}
// 若以上条件均不满足 剔除该条数据
iterator.remove();
}
}
if (!userList.isEmpty()) {
// 如果不是第一次拼接先添加逗号分隔
if (roleConfigValues.length() > 0) {
roleConfigValues.append(",");
}
roleConfigValues.append(userList.stream().map(user -> String.valueOf(user.getUserId())).collect(Collectors.joining(",")));
}
}
forSysWorkflowNode.setConfigValues(roleConfigValues.toString());
} else {
System.err.println("节点配置角色为空!请检查参数");
}
} else {
System.err.println("节点配置类型为:" + forSysWorkflowNode.getConfigType() + ",方法不进行处理!请检查参数");
}
} catch (NumberFormatException e) {
System.err.println("执行审核流配置角色处理方法时发生异常:" + e.getMessage());
}
}
@Override
public Map<Integer, SysWorkflowNode> listByProId(SysWorkflowNode sysWorkflowNode) {
Long userId = SecurityUtils.getLoginUser().getUserid();

View File

@ -6,11 +6,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="getUserRoleListByDeptId" resultType="com.bonus.material.basic.domain.dto.SysUserRoleVo">
SELECT
su.user_id as userId, su.user_name as userName, su.dept_id as deptId, sr.role_name as roleName, sr.role_id as roleId
su.user_id as userId, su.user_name as userName, su.dept_id as deptId, sr.role_name as roleName, sr.role_id as roleId,
sd.ancestors as ancestors
FROM
sys_user su
LEFT JOIN
sys_user_role sur ON su.user_id = sur.user_id
LEFT JOIN
sys_dept sd ON su.dept_id = sd.dept_id
LEFT JOIN
sys_role sr ON sur.role_id = sr.role_id
WHERE su.dept_id = #{deptId} AND sr.role_id = #{roleId}

View File

@ -961,7 +961,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
LIMIT 100
</select>
<select id="getLeaseParentId" resultType="com.bonus.common.biz.domain.lease.LeaseApplyInfo">
select parent_id as parentId from lease_out_details where ma_id = #{maId} order by create_time desc limit 1
select parent_id as parentId,create_time as leaseTime as parentId from lease_out_details where ma_id = #{maId} order by create_time desc limit 1
</select>
<select id="getLeaseUnitAndProject" resultType="com.bonus.common.biz.domain.lease.LeaseApplyInfo">
select

View File

@ -349,7 +349,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
JOIN ma_type_repair mtr ON mtr.type_id = rad.type_id AND mtr.user_id = #{userId}
</if>
WHERE
tk.task_type = #{taskType}
tk.task_type = #{taskType} and tt2.CODE is not null
AND tk.create_time &lt; '2025-08-20 00:00:00'
<if test="backUnit != null and backUnit != ''">
AND bui.unit_id = #{backUnit}
@ -410,7 +410,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
JOIN ma_type_repair mtr ON mtr.type_id = rad.type_id AND mtr.user_id = #{userId}
</if>
WHERE
tk.task_type = #{taskType}
tk.task_type = #{taskType} and tt.CODE is not null
AND tk.create_time &gt;= '2025-08-20 00:00:00'
<if test="backUnit != null and backUnit != ''">
AND bui.unit_id = #{backUnit}

View File

@ -87,6 +87,14 @@
LEFT JOIN sys_workflow_node wn2 on wc.node_id = wn2.id
WHERE wh.record_id = #{flowId}
</select>
<select id="getImpUnit" resultType="java.lang.Integer">
select
imp_unit as impUnit
from
bm_project
where
pro_id = #{proId}
</select>
<update id="updateWorkflowRecord">
update sys_workflow_record set workflow_status = #{flowStatus} where id = #{id}

View File

@ -40,20 +40,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<select id="selectRolesByNodeId" resultType="java.lang.String">
select roleIds from sys_workflow_config where node_id = #{nodeId}
</select>
<select id="selectUnitConfigValuesByTaskId" resultType="java.lang.String">
SELECT
select roleIds from sys_workflow_config where node_id = #{nodeId} SELECT
GROUP_CONCAT(su.user_id) configValue
FROM
direct_apply_info dai
LEFT JOIN bm_agreement_info bai ON dai.lease_agreement_id = bai.agreement_id
LEFT JOIN bm_project bp ON bai.project_id = bp.pro_id
LEFT JOIN data_center.dx_fb_son dfs ON dfs.`ID` = bp.external_id
LEFT JOIN sbd_audit.sg_project_post_personnel sppp ON sppp.depart_id = dfs.`project dept id`
LEFT JOIN sbd_audit.sg_project_post_personnel sppp ON sppp.depart_id = dfs.`project_dept_id`
LEFT JOIN sys_user su ON su.user_name = sppp.cno
WHERE
dai.id = #{taskId}
</select>
<select id="selectUnitConfigValuesByTaskId" resultType="java.lang.String">
</select>
<select id="getImpUnit" resultType="java.lang.Integer">
select
imp_unit as impUnit
from
bm_project
where
pro_id = #{proId}
</select>
</mapper>

View File

@ -28,9 +28,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and task_type = #{taskType}
</if>
</update>
<update id="updateSysWorkflowType">
update sys_workflow_record set workflow_id = #{workflowId} where id = #{id}
</update>
<select id="getSysWorkflowRecodeByTaskId" parameterType="Integer" resultType="com.bonus.material.work.domain.dto.SysWorkflowAuditDto">
<select id="getSysWorkflowRecodeByTaskId" parameterType="Integer" resultType="com.bonus.material.work.domain.dto.SysWorkflowAuditDto">
select
a.task_id as taskId,
a.task_type as taskType,