fix(): 修复隐患处罚权限控制和查询逻辑

dev
lishiwei 2026-07-03 11:45:42 +08:00
parent 6e0c639f60
commit 6b4ab1e961
5 changed files with 154 additions and 41 deletions

View File

@ -2,6 +2,7 @@ package com.zcloud.key.project.command.hidden;
import com.alibaba.cola.dto.SingleResponse;
import com.alibaba.cola.exception.BizException;
import com.jjb.saas.framework.auth.utils.AuthContext;
import com.zcloud.gbscommon.utils.Tools;
import com.zcloud.key.project.command.convertor.hidden.HiddenPenaltyCoConvertor;
import com.zcloud.key.project.command.project.MessageNoticeExe;
@ -10,10 +11,9 @@ import com.zcloud.key.project.domain.gateway.hidden.HiddenPenaltyGateway;
import com.zcloud.key.project.domain.model.hidden.HiddenPenaltyE;
import com.zcloud.key.project.dto.clientobject.hidden.HiddenPenaltyCO;
import com.zcloud.key.project.dto.hidden.HiddenPenaltyAddCmd;
import com.zcloud.key.project.persistence.dataobject.hidden.HiddenDO;
import com.zcloud.key.project.persistence.dataobject.hidden.HiddenPenaltyDO;
import com.zcloud.key.project.persistence.repository.hidden.HiddenPenaltyRepository;
import com.zcloud.key.project.persistence.repository.hidden.HiddenRepository;
import com.zcloud.key.project.persistence.repository.project.KeyProjectPenaltyPersonnelRepository;
import lombok.AllArgsConstructor;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
@ -31,13 +31,21 @@ public class HiddenPenaltyAddExe {
private final HiddenPenaltyGateway hiddenPenaltyGateway;
private final HiddenPenaltyRepository hiddenPenaltyRepository;
private final HiddenPenaltyCoConvertor hiddenPenaltyCoConvertor;
private final HiddenRepository hiddenRepository;
private final MessageNoticeExe messageNoticeExe;
private final MessageTemplateConfig messageTemplateConfig;
private final KeyProjectPenaltyPersonnelRepository keyProjectPenaltyPersonnelRepository;
@Transactional(rollbackFor = Exception.class)
public SingleResponse<HiddenPenaltyCO> execute(HiddenPenaltyAddCmd cmd) {
HiddenPenaltyDO target = resolveTarget(cmd);
Long currentUserId = AuthContext.getUserId();
if (target != null && !canOperate(target, currentUserId)) {
throw new BizException("无权限发起处罚");
}
if (target == null && StringUtils.isNotBlank(cmd.getKeyProjectId()) && !canOperate(cmd.getKeyProjectId(), currentUserId)) {
throw new BizException("无权限发起处罚");
}
if (target != null) {
if (Integer.valueOf(0).equals(target.getFineFlag())
@ -80,7 +88,16 @@ public class HiddenPenaltyAddExe {
return hiddenPenaltyRepository.getByPenaltyId(cmd.getHiddenPenaltyId());
}
List<HiddenPenaltyDO> list = hiddenPenaltyRepository.getByHiddenId(cmd.getHiddenId());
if (list != null && !list.isEmpty()) {
if (list == null || list.isEmpty()) {
return null;
}
for (HiddenPenaltyDO item : list) {
if (!Integer.valueOf(0).equals(item.getFineFlag())
|| !Integer.valueOf(0).equals(item.getFeedbackStatus())
|| !Integer.valueOf(0).equals(item.getEditFlag())) {
return item;
}
}
for (HiddenPenaltyDO item : list) {
if (Integer.valueOf(0).equals(item.getFineFlag())
&& Integer.valueOf(0).equals(item.getFeedbackStatus())
@ -88,24 +105,54 @@ public class HiddenPenaltyAddExe {
return item;
}
}
}
return null;
}
private boolean canOperate(HiddenPenaltyDO penaltyDO, Long userId) {
if (penaltyDO == null || userId == null) {
return false;
}
if (userId.equals(penaltyDO.getCreateId()) || userId.equals(penaltyDO.getPenalizedUserId())) {
return true;
}
return canOperate(penaltyDO.getKeyProjectId(), userId);
}
private boolean canOperate(String keyProjectId, Long userId) {
if (StringUtils.isBlank(keyProjectId) || userId == null) {
return false;
}
return keyProjectPenaltyPersonnelRepository.getListByProjectId(keyProjectId)
.stream()
.anyMatch(person -> userId.equals(person.getUserId()));
}
private void handlePenaltyIssued(HiddenPenaltyDO penaltyDO) {
HiddenDO hiddenDO = hiddenRepository.getInfoByHiddenId(penaltyDO.getHiddenId());
if (hiddenDO != null) {
messageNoticeExe.sendMessageCompleteEvent(hiddenDO.getId());
if (penaltyDO == null) {
return;
}
if (penaltyDO.getId() != null) {
messageNoticeExe.sendMessageCompleteEvent(penaltyDO.getId());
}
if (!Integer.valueOf(1).equals(penaltyDO.getFineFlag()) || penaltyDO.getPenalizedUserId() == null) {
return;
}
Map<String, Object> sendParams = new HashMap<>();
if (penaltyDO.getProjectName() != null && !penaltyDO.getProjectName().isEmpty()) {
if (StringUtils.isNotBlank(penaltyDO.getProjectName())) {
sendParams.put("checkTitle", penaltyDO.getProjectName());
}
messageNoticeExe.messageNotice(penaltyDO.getPenalizedUserId(), messageTemplateConfig.getHiddenDangerPenaltyFeedbackPersonApplyFeedback(), sendParams);
messageNoticeExe.sendMessageAddEvent(penaltyDO.getPenalizedUserId(), "您有一条待反馈处罚,请及时缴纳处罚金并上传凭证。", "待反馈处罚", penaltyDO.getId(), penaltyDO.getId());
messageNoticeExe.messageNotice(
penaltyDO.getPenalizedUserId(),
messageTemplateConfig.getHiddenDangerPenaltyFeedbackPersonApplyFeedback(),
sendParams
);
messageNoticeExe.sendMessageAddEvent(
penaltyDO.getPenalizedUserId(),
"您有一条待反馈处罚,请及时缴纳处罚金并上传凭证。",
"待反馈处罚",
penaltyDO.getId(),
penaltyDO.getId()
);
}
}

View File

@ -26,6 +26,7 @@ import com.zcloud.key.project.dto.inspection.SafetyEnvironmentalInspectionUserAd
import com.zcloud.key.project.persistence.dataobject.hidden.HiddenDO;
import com.zcloud.key.project.persistence.dataobject.hidden.HiddenFindUserDO;
import com.zcloud.key.project.persistence.dataobject.hidden.HiddenPenaltyDO;
import com.zcloud.key.project.persistence.dataobject.inspection.SafetyEnvironmentalInspectionDO;
import com.zcloud.key.project.persistence.dataobject.inspection.SafetyEnvironmentalInspectionContentDO;
import com.zcloud.key.project.persistence.dataobject.inspection.SafetyEnvironmentalInspectionUserDO;
import com.zcloud.key.project.persistence.dataobject.project.KeyProjectDO;
@ -35,6 +36,7 @@ import com.zcloud.key.project.persistence.repository.hidden.HiddenPenaltyReposit
import com.zcloud.key.project.persistence.repository.hidden.HiddenRepository;
import com.zcloud.key.project.persistence.repository.impl.inspection.SafetyEnvironmentalInspectionContentRepositoryImpl;
import com.zcloud.key.project.persistence.repository.inspection.SafetyEnvironmentalInspectionContentRepository;
import com.zcloud.key.project.persistence.repository.inspection.SafetyEnvironmentalInspectionRepository;
import com.zcloud.key.project.persistence.repository.inspection.SafetyEnvironmentalInspectionUserRepository;
import com.zcloud.key.project.persistence.repository.project.KeyProjectPenaltyPersonnelRepository;
import com.zcloud.key.project.persistence.repository.project.KeyProjectRepository;
@ -67,6 +69,7 @@ public class SafetyEnvironmentalInspectionAddExe {
private final HiddenPenaltyRepository hiddenPenaltyRepository;
private final KeyProjectRepository keyProjectRepository;
private final KeyProjectPenaltyPersonnelRepository keyProjectPenaltyPersonnelRepository;
private final SafetyEnvironmentalInspectionRepository safetyEnvironmentalInspectionRepository;
private final MessageNoticeExe messageNoticeExe;
private final MessageTemplateConfig messageTemplateConfig;
@ -191,31 +194,30 @@ public class SafetyEnvironmentalInspectionAddExe {
KeyProjectDO projectDO = keyProjectRepository.getOne(projectQuery);
List<HiddenPenaltyDO> penaltyList = new ArrayList<>();
hiddenAddCmdList.forEach(hiddenAddCmd -> personnelList.forEach(person -> {
hiddenAddCmdList.forEach(hiddenAddCmd -> {
HiddenPenaltyDO penalty = new HiddenPenaltyDO();
penalty.setHiddenPenaltyId(Tools.get32UUID());
penalty.setHiddenId(hiddenAddCmd.getHiddenId());
penalty.setKeyProjectId(cmd.getKeyProjectId());
penalty.setPenalizedCorpId(safetyEnvironmentalInspectionE.getInspectedCorpinfoId());
penalty.setPenalizedUserId(person.getUserId());
penalty.setFineFlag(0);
penalty.setFeedbackStatus(0);
penalty.setEditFlag(0);
penaltyList.add(penalty);
}));
});
hiddenPenaltyRepository.saveBatch(penaltyList);
// 通知处罚人
String projectName = projectDO != null ? projectDO.getProjectName() : "";
Map<String, Object> sendParams = new HashMap<>();
sendParams.put("keyProject", projectName);
personnelList.forEach(person -> {
penaltyList.forEach(penalty -> personnelList.forEach(person -> {
messageNoticeExe.messageNotice(person.getUserId(),
messageTemplateConfig.getHiddenDangerPenaltyPersonApplyPenalty(), sendParams);
messageNoticeExe.sendMessageAddEvent(person.getUserId(),
"您有一条待处罚隐患,请及时发起处罚。", "待处罚",
safetyEnvironmentalInspectionE.getId(), safetyEnvironmentalInspectionE.getId());
});
penalty.getId(), penalty.getId());
}));
}
}
} catch (Exception e) {
@ -229,6 +231,10 @@ public class SafetyEnvironmentalInspectionAddExe {
BeanUtils.copyProperties(safetyEnvironmentalInspectionE, safetyEnvironmentalInspectionCO);
//TODO 站内信
if (cmd.getStatus() == 1) {
SafetyEnvironmentalInspectionDO inspectionDO = safetyEnvironmentalInspectionRepository.getByInspectionId(safetyEnvironmentalInspectionE.getInspectionId());
if (inspectionDO != null) {
safetyEnvironmentalInspectionCO.setId(inspectionDO.getId());
}
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("key_project_id", cmd.getKeyProjectId());
queryWrapper.ne("apply_status", 0);
@ -236,16 +242,16 @@ public class SafetyEnvironmentalInspectionAddExe {
queryWrapper.orderByDesc("update_time");
queryWrapper.last("limit 1");
KeyProjectDO keyProjectDO = keyProjectRepository.getOne(queryWrapper);
List<SafetyEnvironmentalInspectionUserDO> messageUserList = safetyEnvironmentalInspectionUserRepository.listAllByInspectionId(cmd.getInspectionId(), 2);
List<SafetyEnvironmentalInspectionUserDO> messageUserList = safetyEnvironmentalInspectionUserRepository.listAllByInspectionId(safetyEnvironmentalInspectionE.getInspectionId(), 2);
// todo 可能会导致异步任务被线程池拒绝
// for (SafetyEnvironmentalInspectionUserDO insUser : messageUserList){
// Map<String, Object> sendParams = new HashMap<>();
// sendParams.put("initiatorName", ssoUser.getName());
// sendParams.put("checkTitle", keyProjectDO.getProjectName());
// messageNoticeExe.messageNotice(insUser.getUserId(), messageTemplateConfig.getCheckerApplyCheck(), sendParams);
// //待办
// messageNoticeExe.sendMessageAddEvent(insUser.getUserId(), "您有一条【安全环保检查】待处理","待核实", safetyEnvironmentalInspectionCO.getId(), insUser.getId());
// }
for (SafetyEnvironmentalInspectionUserDO insUser : messageUserList){
Map<String, Object> sendParams = new HashMap<>();
sendParams.put("initiatorName", ssoUser.getName());
sendParams.put("checkTitle", keyProjectDO.getProjectName());
messageNoticeExe.messageNotice(insUser.getUserId(), messageTemplateConfig.getCheckerApplyCheck(), sendParams);
//待办
messageNoticeExe.sendMessageAddEvent(insUser.getUserId(), "您有一条【安全环保检查】待处理","待核实", safetyEnvironmentalInspectionCO.getId(), insUser.getId());
}
}
return safetyEnvironmentalInspectionCO;
}

View File

@ -118,11 +118,11 @@ public class SafetyEnvironmentalInspectionUpdateExe {
// 删除检查核实人数据 及对应待办信息
safetyEnvironmentalInspectionUserRepository.deleteByInspectionId(safetyEnvironmentalInspectionE.getInspectionId(), 2);
List<SafetyEnvironmentalInspectionUserDO> deleteUserList = safetyEnvironmentalInspectionUserRepository.listAllByInspectionId(safetyEnvironmentalInspectionE.getInspectionId(),2);
for (SafetyEnvironmentalInspectionUserDO deleteUser : deleteUserList){
messageNoticeExe.sendMessageDeleteEvent(deleteUser.getId());
}
safetyEnvironmentalInspectionUserRepository.deleteByInspectionId(safetyEnvironmentalInspectionE.getInspectionId(), 2);
// 新增检查核实人数据
safetyEnvironmentalInspectionUserRepository.batchInsert(BeanUtil.copyToList(insUserList, SafetyEnvironmentalInspectionUserDO.class));
@ -223,30 +223,29 @@ public class SafetyEnvironmentalInspectionUpdateExe {
KeyProjectDO projectDO = keyProjectRepository.getOne(projectQuery);
List<HiddenPenaltyDO> penaltyList = new ArrayList<>();
hiddenAddCmdList.forEach(hiddenAddCmd -> personnelList.forEach(person -> {
hiddenAddCmdList.forEach(hiddenAddCmd -> {
HiddenPenaltyDO penalty = new HiddenPenaltyDO();
penalty.setHiddenPenaltyId(Tools.get32UUID());
penalty.setHiddenId(hiddenAddCmd.getHiddenId());
penalty.setKeyProjectId(cmd.getKeyProjectId());
penalty.setPenalizedCorpId(safetyEnvironmentalInspectionE.getInspectedCorpinfoId());
penalty.setPenalizedUserId(person.getUserId());
penalty.setFineFlag(0);
penalty.setFeedbackStatus(0);
penalty.setEditFlag(0);
penaltyList.add(penalty);
}));
});
hiddenPenaltyRepository.saveBatch(penaltyList);
String projectName = projectDO != null ? projectDO.getProjectName() : "";
Map<String, Object> sendParams = new HashMap<>();
sendParams.put("keyProject", projectName);
personnelList.forEach(person -> {
penaltyList.forEach(penalty -> personnelList.forEach(person -> {
messageNoticeExe.messageNotice(person.getUserId(),
messageTemplateConfig.getHiddenDangerPenaltyPersonApplyPenalty(), sendParams);
messageNoticeExe.sendMessageAddEvent(person.getUserId(),
"您有一条待处罚隐患,请及时发起处罚。", "待处罚",
safetyEnvironmentalInspectionE.getId(), safetyEnvironmentalInspectionE.getId());
});
penalty.getId(), penalty.getId());
}));
}
}
//TODO 站内信
@ -346,6 +345,7 @@ public class SafetyEnvironmentalInspectionUpdateExe {
for (SafetyEnvironmentalInspectionUserDO deleteUser : deleteUserList){
messageNoticeExe.sendMessageDeleteEvent(deleteUser.getId());
}
safetyEnvironmentalInspectionUserRepository.deleteByInspectionId(safetyEnvironmentalInspectionE.getInspectionId(), 2);
// 删除检查内容
List<SafetyEnvironmentalInspectionContentDO> deleteContentList = safetyEnvironmentalInspectionContentRepository.listAllByInspectionId(safetyEnvironmentalInspectionE.getInspectionId());
safetyEnvironmentalInspectionContentRepository.deleteByInspectionId(safetyEnvironmentalInspectionE.getInspectionId());

View File

@ -33,6 +33,35 @@
<where>
hp.delete_enum = 'FALSE'
AND (h.source NOT IN (2, 3) OR i.inspection_id IS NOT NULL)
AND NOT EXISTS (
SELECT 1
FROM hidden_penalty hp_latest
WHERE hp_latest.delete_enum = 'FALSE'
AND hp_latest.hidden_id = hp.hidden_id
AND (
(
IFNULL(hp_latest.feedback_status, 0) * 100
+ IFNULL(hp_latest.fine_flag, 0) * 10
+ IFNULL(hp_latest.edit_flag, 0)
) &gt; (
IFNULL(hp.feedback_status, 0) * 100
+ IFNULL(hp.fine_flag, 0) * 10
+ IFNULL(hp.edit_flag, 0)
)
OR (
(
IFNULL(hp_latest.feedback_status, 0) * 100
+ IFNULL(hp_latest.fine_flag, 0) * 10
+ IFNULL(hp_latest.edit_flag, 0)
) = (
IFNULL(hp.feedback_status, 0) * 100
+ IFNULL(hp.fine_flag, 0) * 10
+ IFNULL(hp.edit_flag, 0)
)
AND hp_latest.id &gt; hp.id
)
)
)
<if test="params.xgfCorpinfoName != null and params.xgfCorpinfoName != ''">
AND xci.corp_name LIKE CONCAT('%', #{params.xgfCorpinfoName}, '%')
</if>
@ -66,7 +95,17 @@
AND hp.fine_flag = #{params.fineFlag}
</if>
<if test="params.currentUserId != null">
AND (hp.create_id = #{params.currentUserId} OR hp.penalized_user_id = #{params.currentUserId})
AND (
hp.create_id = #{params.currentUserId}
OR hp.penalized_user_id = #{params.currentUserId}
OR EXISTS (
SELECT 1
FROM key_project_penalty_personnel kpp
WHERE kpp.delete_enum = 'FALSE'
AND kpp.key_project_id = hp.key_project_id
AND kpp.user_id = #{params.currentUserId}
)
)
</if>
<if test="params.penaltyDesc != null and params.penaltyDesc != ''">
AND hp.penalty_desc LIKE CONCAT('%', #{params.penaltyDesc}, '%')
@ -98,6 +137,9 @@
LEFT JOIN user xmu ON xmu.id = kp.xgf_master_user_id
LEFT JOIN user xmu2 ON xmu2.id = kp2.xgf_master_user_id
WHERE hp.hidden_id = #{hiddenId} AND hp.delete_enum = 'FALSE'
ORDER BY
(IFNULL(hp.feedback_status, 0) * 100 + IFNULL(hp.fine_flag, 0) * 10 + IFNULL(hp.edit_flag, 0)) DESC,
hp.id DESC
</select>
<select id="getByPenaltyId" resultType="com.zcloud.key.project.persistence.dataobject.hidden.HiddenPenaltyDO">

View File

@ -227,7 +227,16 @@
GROUP_CONCAT(DISTINCT CASE WHEN kpc.camera_type = 2 THEN kpc.camera_id END) AS mobileCameraIdList
FROM corp_info cp
LEFT JOIN key_project kp
ON cp.id = kp.jurisdiction_corpinfo_id AND kp.delete_enum = 'FALSE' AND kp.apply_status != 0 AND kp.apply_status != 7
ON cp.id = kp.jurisdiction_corpinfo_id
AND kp.delete_enum = 'FALSE'
AND kp.apply_status in (1,2,3,4,5,6)
AND NOT EXISTS (
SELECT 1
FROM key_project kp_latest
WHERE kp_latest.delete_enum = 'FALSE'
AND kp_latest.key_project_id = kp.key_project_id
AND kp_latest.id > kp.id
)
left join key_project_camera kpc on kp.key_project_id = kpc.key_project_id AND kpc.delete_enum = 'FALSE'
LEFT JOIN camera c ON c.camera_id = kpc.camera_id
left join safety_environmental_inspection sei on cp.id = sei.corp_id AND sei.delete_enum = 'FALSE' and
@ -313,7 +322,16 @@
GROUP_CONCAT(DISTINCT CASE WHEN kpc.camera_type = 2 THEN kpc.camera_id END) AS mobileCameraIdList
FROM corp_info cp
LEFT JOIN key_project kp
ON cp.id = kp.jurisdiction_corpinfo_id AND kp.delete_enum = 'FALSE' AND kp.apply_status != 0
ON cp.id = kp.jurisdiction_corpinfo_id
AND kp.delete_enum = 'FALSE'
AND kp.apply_status in (1,2,3,4,5,6)
AND NOT EXISTS (
SELECT 1
FROM key_project kp_latest
WHERE kp_latest.delete_enum = 'FALSE'
AND kp_latest.key_project_id = kp.key_project_id
AND kp_latest.id > kp.id
)
left join key_project_camera kpc on kp.key_project_id = kpc.key_project_id AND kpc.delete_enum = 'FALSE'
LEFT JOIN camera c ON c.camera_id = kpc.camera_id
left join safety_environmental_inspection sei on cp.id = sei.corp_id AND sei.delete_enum = 'FALSE' and sei.inspected_corpinfo_id = #{params.xgfCorpinfoId} and