计划申请审核流配置

This commit is contained in:
cwchen 2025-01-24 14:32:11 +08:00
parent 3cfbb4178c
commit 2fb4348dfb
9 changed files with 288 additions and 26 deletions

View File

@ -137,6 +137,12 @@ public class PlanApplyVo {
@JsonInclude(JsonInclude.Include.NON_NULL)
private List<PlanAuditRecordVo> planRecordList;
/**审核次数*/
private int auditNum;
/**是否具有审核按钮*/
private boolean hasAuditBtn = true;
/**
* 新增条件限制
*/

View File

@ -75,4 +75,17 @@ public class PlanAuditRecordVo {
* 申请人手机号
*/
private String phone;
/**
* 审核次数
*/
private int auditNum;
/**
* 审核节点
*/
private int statusType;
/**
* 完结
* */
private boolean completed = false;
}

View File

@ -159,4 +159,13 @@ public interface PlanApplyMapper {
* @date 2024/12/25 11:10
*/
void editAuditStatus(PlanApplyVo data);
/**
* 判断需求计划是否被修改
* @param data
* @return Integer
* @author cwchen
* @date 2025/1/23 18:47
*/
Integer getPlanData(PlanApplyVo data);
}

View File

@ -2,9 +2,11 @@ package com.bonus.aqgqj.business.backstage.mapper.plan;
import com.bonus.aqgqj.business.backstage.entity.plan.PlanApplyVo;
import com.bonus.aqgqj.business.backstage.entity.plan.PlanAuditRecordVo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
/**
* @className:PlanAuditMapper
@ -17,6 +19,7 @@ import java.util.List;
public interface PlanAuditMapper {
/**
* 需求计划审核列表
*
* @param data
* @return List<PlanApplyVo>
* @author cwchen
@ -26,6 +29,7 @@ public interface PlanAuditMapper {
/**
* 查询计划审核节点及状态
*
* @param id
* @return PlanApplyVo
* @author cwchen
@ -35,6 +39,7 @@ public interface PlanAuditMapper {
/**
* 修改审核状态
*
* @param vo
* @return void
* @author cwchen
@ -44,10 +49,59 @@ public interface PlanAuditMapper {
/**
* 统计本次计划所需数量
*
* @param applyId
* @return int
* @author cwchen
* @date 2024/11/29 9:35
*/
int getPlanNeedNum(Integer applyId);
/**
* 查询用户是否有审核权限
*
* @param name
* @param statusType
* @param userId
* @return boolean
* @author cwchen
* @date 2025/1/23 15:05
*/
int getUserPermission(@Param("name") String name, @Param("statusType") Integer statusType, @Param("userId") Long userId);
/**
* 查询该条数据属于审核节点的审核类型1 会签 2 或签
*
* @param name
* @param statusType
* @return int
* @author cwchen
* @date 2025/1/23 16:00
*/
int getAuditType(@Param("name") String name, @Param("statusType") Integer statusType);
/**
* 查询审核记录
*
* @param name
* @param statusType
* @param plan
* @return List<Map < String, String>>
* @author cwchen
* @date 2025/1/23 17:21
*/
List<Map<String, String>> getUserAuditRecord(@Param("name") String name, @Param("statusType") int statusType, @Param("params") PlanApplyVo plan);
/**
* 判断是否具有审核按钮
*
* @param vo
* @param userId
* @param type
* @return int
* @author cwchen
* @date 2025/1/23 18:21
*/
Integer getHasAuditBtn(@Param("params") PlanApplyVo vo, @Param("userId") Long userId, @Param("name") String name, @Param("statusType") int statusType, @Param("type") int type);
}

View File

@ -95,12 +95,14 @@ public class PlanApplyServiceImpl implements PlanApplyService {
String code = getCode(num);
data.setCode(code);
data.setNeedNum(needNum);
data.setAuditNum(1);
// 添加计划申请数据
mapper.addPlanApply(data);
// 添加安全工器具数据
mapper.addPlanDetail(details, data);
// 添加需求计划申请节点
PlanAuditRecordVo vo = setPlanAuditRecordVoData(data, acount, "0");
vo.setAuditNum(1);
mapper.addPlanRecord(vo);
return ServerResponse.createBySuccessMsg("新增成功");
} catch (Exception e) {
@ -114,6 +116,10 @@ public class PlanApplyServiceImpl implements PlanApplyService {
@Transactional(rollbackFor = Exception.class)
public ServerResponse editApplyPlan(PlanApplyVo data) {
try {
Integer num = mapper.getPlanData(data);
if(num == null || num > 0){
return ServerResponse.createBySuccessMsg("修改成功");
}
// 添加创建人信息
SelfUserEntity acount = UserUtil.getLoginUser();
String userName = UserUtil.getLoginUser().getUsername();
@ -201,11 +207,16 @@ public class PlanApplyServiceImpl implements PlanApplyService {
if (CollectionUtils.isNotEmpty(auditList) && auditList.size() > 1) {
for (int i = 0; i < auditList.size(); i++) {
PlanAuditRecordVo item = auditList.get(i);
if (Objects.equals(item.getAuditType(), "4") && Objects.equals(item.getAuditStatus(), "2")) {
if (Objects.equals(vo.getStatusType(),"1") && Objects.equals(vo.getStatus(),"2") && Objects.equals(item.getAuditType(), "4") && Objects.equals(item.getAuditStatus(), "2") && i == 0) {
// 审核完结-->计算所有流程的时间差
Long[] timeDiff = DateTimeHelper.getTimeDiff(item.getAuditTime(), auditList.get(auditList.size() - 1).getAuditTime());
item.setHours(timeDiff[0]);
item.setMinutes(timeDiff[1]);
item.setCompleted(true);
} else if (Objects.equals(vo.getStatusType(),"1") && Objects.equals(vo.getStatus(),"2") && Objects.equals(item.getAuditType(), "4") && Objects.equals(item.getAuditStatus(), "2") && i != 0) {
Long[] timeDiff = DateTimeHelper.getTimeDiff(item.getAuditTime(), auditList.get(i + 1).getAuditTime());
item.setHours(timeDiff[0]);
item.setMinutes(timeDiff[1]);
} else {
// 未审核完结-计算每个流程的时间差
if (i != auditList.size() - 1) {

View File

@ -5,9 +5,11 @@ import com.bonus.aqgqj.business.backstage.entity.plan.PlanAuditRecordVo;
import com.bonus.aqgqj.business.backstage.mapper.plan.PlanApplyMapper;
import com.bonus.aqgqj.business.backstage.mapper.plan.PlanAuditMapper;
import com.bonus.aqgqj.manager.common.util.UserUtil;
import com.bonus.aqgqj.manager.constant.BusinessConstants;
import com.bonus.aqgqj.manager.security.entity.SelfUserEntity;
import com.bonus.aqgqj.manager.webResult.ServerResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
@ -17,6 +19,7 @@ import org.springframework.transaction.interceptor.TransactionAspectSupport;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
@ -42,9 +45,25 @@ public class PlanAuditServiceImpl implements PlanAuditService {
@Override
public List<PlanApplyVo> getPlanAuditList(PlanApplyVo data) {
SelfUserEntity acount = UserUtil.getLoginUser();
List<PlanApplyVo> list = null;
try {
list = mapper.getPlanAuditList(data);
for (PlanApplyVo vo : list) {
if(Objects.equals(vo.getStatusType(),"1") && Objects.equals(vo.getStatus(),"2")){
continue;
}
// 判断是否具有审核按钮
Integer num = mapper.getHasAuditBtn(vo, acount.getUserId(),BusinessConstants.SAFETY_PLAN,Integer.parseInt(vo.getStatusType()) - 1,1);
if(num == null || num == 0){
vo.setHasAuditBtn(false);
}else{
Integer num2 = mapper.getHasAuditBtn(vo, acount.getUserId(),BusinessConstants.SAFETY_PLAN,Integer.parseInt(vo.getStatusType()) - 1,2);
if(num2 > 0){
vo.setHasAuditBtn(false);
}
}
}
} catch (Exception e) {
log.error(e.toString(), e);
}
@ -57,30 +76,46 @@ public class PlanAuditServiceImpl implements PlanAuditService {
try {
// 通过applicationContext获取代理对象
PlanAuditServiceImpl proxy = applicationContext.getBean(PlanAuditServiceImpl.class);
SelfUserEntity acount = UserUtil.getLoginUser();
SelfUserEntity account = UserUtil.getLoginUser();
String userName = UserUtil.getLoginUser().getUsername();
Integer applyId = vo.getApplyId();
if (applyId == null) {
return ServerResponse.createErroe("请选择计划进行审核");
} else {
//需要配置审核流程节点 按照不同的用户 角色权限 进行审核
//查询计划节点 及状态
PlanApplyVo plan = mapper.getPlanApplyData(applyId);
//目前未配置角色 全部都可以审核
String statusType = plan.getStatusType();
String status = plan.getStatus();
if (!Objects.equals(status, "1")) {
return ServerResponse.createErroe("该计划已被审核,请刷新重试");
//1.查询该账号是否具有审核权限
int result = mapper.getUserPermission(BusinessConstants.SAFETY_PLAN, Integer.parseInt(statusType) - 1, account.getUserId());
if (result == 0) {
return ServerResponse.createErroe("该账号无权限审核");
}
//2.验证是否重复审核
if (((Integer.parseInt(statusType) > vo.getStatusType())) || Objects.equals(status, "2")) {
return ServerResponse.createBySuccessMsg("该数据已被审核请刷新后重试");
}
int isRepeatAudit = mapper.getHasAuditBtn(plan, account.getUserId(),BusinessConstants.SAFETY_PLAN,Integer.parseInt(plan.getStatusType()) - 1,2);
if (isRepeatAudit > 0) {
return ServerResponse.createBySuccessMsg("请勿重复审核");
}
//3.查询该条数据所属审核节点的审核类型1 会签 2 或签
int auditType = mapper.getAuditType(BusinessConstants.SAFETY_PLAN, Integer.parseInt(statusType) - 1);
// 审核结果 2.审核通过 3.审核不通过
String auditStatus = vo.getAuditStatus();
//审核通过
if (Objects.equals(auditStatus, "2")) {
proxy.auditSuccess(vo, statusType, acount, plan);
return ServerResponse.createBySuccessMsg("审核成功");
} else {
//审核驳回
proxy.aduitError(vo, statusType, acount);
return ServerResponse.createBySuccessMsg("驳回成功");
if (auditType == 1) { // 会签情况
if (Objects.equals(auditStatus, "2")) {
return proxy.countersignAuditSuccess(vo, statusType, account, plan);
} else {
return proxy.countersignAuditError(vo, statusType, account, plan);
}
} else if (auditType == 2) { // 或签情况
if (Objects.equals(auditStatus, "2")) {
proxy.orVisaAuditSuccess(vo, statusType, account, plan);
return ServerResponse.createBySuccessMsg("审核通过");
} else {
proxy.orVisaAuditError(vo, statusType, account, plan);
return ServerResponse.createBySuccessMsg("驳回成功");
}
}
}
} catch (Exception e) {
@ -88,20 +123,21 @@ public class PlanAuditServiceImpl implements PlanAuditService {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return ServerResponse.createErroe("审核失败");
}
return null;
}
/**
* 审核通过
* 或签-审核通过
*/
@Transactional
public void auditSuccess(PlanAuditRecordVo vo, String statusType, SelfUserEntity user, PlanApplyVo plan) {
public void orVisaAuditSuccess(PlanAuditRecordVo vo, String statusType, SelfUserEntity user, PlanApplyVo plan) {
// 通过applicationContext获取代理对象
PlanAuditServiceImpl proxy = applicationContext.getBean(PlanAuditServiceImpl.class);
//添加审核记录
vo.setAuditType(statusType);//审核节点
vo.setAuditor(Integer.parseInt(user.getUserId() + ""));
vo.setUpdater(Integer.parseInt(user.getUserId() + ""));
vo.setAuditName(user.getUsername());
vo.setAuditNum(plan.getAuditNum());
planApplyMapper.addPlanRecord(vo);
//修改下次 审核流程
vo.setAuditStatus("1");
@ -118,16 +154,78 @@ public class PlanAuditServiceImpl implements PlanAuditService {
}
/**
* 审核驳回
* 或签-审核驳回
*/
@Transactional
public void aduitError(PlanAuditRecordVo vo, String statusType, SelfUserEntity user) {
public void orVisaAuditError(PlanAuditRecordVo vo, String statusType, SelfUserEntity user, PlanApplyVo plan) {
//修改审核状态
vo.setAuditType(statusType);//审核节点
mapper.updatePlanAudit(vo);
vo.setAuditor(Integer.parseInt(user.getUserId() + ""));
vo.setUpdater(Integer.parseInt(user.getUserId() + ""));
vo.setAuditName(user.getUsername());
vo.setAuditNum(plan.getAuditNum());
planApplyMapper.addPlanRecord(vo);
}
/**
* 会签-审核通过
*/
@Transactional
public ServerResponse countersignAuditSuccess(PlanAuditRecordVo vo, String statusType, SelfUserEntity user, PlanApplyVo plan) {
//添加审核记录
vo.setAuditType(statusType);//审核节点
vo.setAuditor(Integer.parseInt(user.getUserId() + ""));
vo.setUpdater(Integer.parseInt(user.getUserId() + ""));
vo.setAuditName(user.getUsername());
vo.setAuditNum(plan.getAuditNum());
planApplyMapper.addPlanRecord(vo);
// 查询审核记录
List<Map<String, String>> list = mapper.getUserAuditRecord(BusinessConstants.SAFETY_PLAN, Integer.parseInt(statusType) - 1, plan);
if (CollectionUtils.isNotEmpty(list)) {
int num = 0;
for (Map<String, String> item : list) {
String auditor = item.get("auditor");
if (!Objects.equals(auditor, "0")) {
num++;
}
}
if (num == list.size()) {
// 审核记录和审核人员数量相同时则流转到下一审核节点
//修改下次 审核流程
vo.setAuditStatus("1");
if (Objects.equals(statusType, "2")) {
vo.setAuditType("3");
} else if (Objects.equals(statusType, "3")) {
vo.setAuditType("4");
} else if (Objects.equals(statusType, "4")) {
vo.setAuditType("1");
vo.setAuditStatus("2");
}
//修改审核状态
mapper.updatePlanAudit(vo);
return ServerResponse.createBySuccessMsg("审核通过");
} else {
return ServerResponse.createBySuccessMsg("审核通过,请等待其他用户审核");
}
}else{
return ServerResponse.createErroe("未配置审核用户");
}
}
/**
* 会签-驳回
*/
@Transactional
public ServerResponse countersignAuditError(PlanAuditRecordVo vo, String statusType, SelfUserEntity user, PlanApplyVo plan) {
//修改审核状态
vo.setAuditType(statusType);//审核节点
mapper.updatePlanAudit(vo);
vo.setAuditor(Integer.parseInt(user.getUserId() + ""));
vo.setUpdater(Integer.parseInt(user.getUserId() + ""));
vo.setAuditName(user.getUsername());
vo.setAuditNum(plan.getAuditNum());
planApplyMapper.addPlanRecord(vo);
return ServerResponse.createBySuccessMsg("驳回成功");
}
}

View File

@ -0,0 +1,14 @@
package com.bonus.aqgqj.manager.constant;
/**
* @className:BusinessConstants
* @author:cwchen
* @date:2025-01-23-16:58
* @version:1.0
* @description:常量
*/
public class BusinessConstants {
/**安全工器具计划审核*/
public static final String SAFETY_PLAN = "safety_plan";
}

View File

@ -19,7 +19,8 @@
updater,
update_time,
status_type,
need_num
need_num,
audit_num
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="code != null and code!=''">#{code},</if>
@ -35,7 +36,8 @@
#{updater},
#{updateTime},
'2',
#{needNum}
#{needNum},
#{auditNum}
</trim>
</insert>
<!--添加安全工器具数据-->
@ -71,6 +73,7 @@
<if test="auditType != null and auditType!=''">audit_type,</if>
<if test="auditName != null and auditName!=''">audit_name,</if>
id,
audit_num
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="applyId != null">#{applyId},</if>
@ -82,7 +85,8 @@
<if test="updateTime != null">#{updateTime},</if>
<if test="auditType != null and auditType!=''">#{auditType},</if>
<if test="auditName != null and auditName!=''">#{auditName},</if>
null
null,
#{auditNum}
</trim>
</insert>
<!--添加/修改安全工器具数据-->
@ -114,7 +118,7 @@
<update id="editPlanApply">
UPDATE st_plan_apply SET project_id = #{projectId},project_part = #{projectPart},project_content = #{projectContent},
need_time = #{needTime},remark = #{remark},updater = #{updater},update_time = #{updateTime},
need_num = #{needNum} WHERE id = #{id}
need_num = #{needNum},audit_num = (audit_num + 1) WHERE id = #{id}
</update>
<!--修改审核状态-->
<update id="editAuditStatus">
@ -246,4 +250,10 @@
AND INSTR(mt.name,#{modelName}) > 0
</if>
</select>
<!--判断需求计划是否被修改-->
<select id="getPlanData" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM st_plan_apply spa
WHERE spa.id = #{id} AND spa.status_type = '2' AND spa.status = '1'
</select>
</mapper>

View File

@ -19,7 +19,8 @@
spa.create_time AS createTime,
spa.remark,
spa.status,
spa.status_type AS statusType
spa.status_type AS statusType,
spa.audit_num AS auditNum
FROM st_plan_apply spa
LEFT JOIN bm_project tbp ON spa.project_id = tbp.bid_id
<where>
@ -43,11 +44,57 @@
<select id="getPlanApplyData" resultType="com.bonus.aqgqj.business.backstage.entity.plan.PlanApplyVo">
SELECT status,
status_type AS statusType,
project_id AS projectId
project_id AS projectId,
audit_num AS auditNum,
id
FROM st_plan_apply WHERE id= #{id}
</select>
<!--统计本次计划所需数量-->
<select id="getPlanNeedNum" resultType="java.lang.Integer">
SELECT IFNULL(SUM(need_num),0) AS num FROM st_plan_details WHERE apply_id=#{applyId}
</select>
<!--查询用户是否有审核权限-->
<select id="getUserPermission" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM sys_audit_model sam
LEFT join sys_audit_config sac ON sam.id=sac.model_id
LEFT JOIN sys_audit_user_config sauc ON sauc.config_id=sac.id
WHERE sam.model_code=#{name} AND sac.type=#{statusType} AND
sauc.user_id=#{userId}
</select>
<!--查询该条数据属于审核节点的审核类型1 会签 2 或签-->
<select id="getAuditType" resultType="java.lang.Integer">
SELECT sac.audit_type
FROM sys_audit_model sam
LEFT JOIN sys_audit_config sac ON sam.id=sac.model_id
WHERE sam.model_code=#{name} AND sac.type=#{statusType}
</select>
<!--查询审核节点会签人员的审核记录-->
<select id="getUserAuditRecord" resultType="java.util.Map">
SELECT sauc.user_id AS userId,IFNULL(a.auditor,'0') AS auditor
FROM sys_audit_model sam
LEFT join sys_audit_config sac ON sam.id=sac.model_id
LEFT JOIN sys_audit_user_config sauc ON sauc.config_id=sac.id
LEFT JOIN (
SELECT spr.auditor
FROM st_plan_record spr
WHERE spr.apply_id = #{params.id} AND spr.audit_num = #{params.auditNum}
)a ON sauc.user_id = a.auditor
WHERE sam.model_code=#{name} AND sac.type=#{statusType}
</select>
<!--判断是否具有审核按钮-->
<select id="getHasAuditBtn" resultType="java.lang.Integer">
<if test="type == 1">
SELECT COUNT(*)
FROM sys_audit_model sam
LEFT join sys_audit_config sac ON sam.id=sac.model_id
LEFT JOIN sys_audit_user_config sauc ON sauc.config_id=sac.id
WHERE sam.model_code=#{name} AND sac.type=#{statusType} AND sauc.user_id=#{userId}
</if>
<if test="type == 2">
SELECT COUNT(*)
FROM st_plan_record spr
WHERE spr.apply_id = #{params.id} AND spr.auditor = #{userId} AND spr.audit_type = #{params.statusType} AND spr.audit_num = #{params.auditNum}
</if>
</select>
</mapper>