refactor(qc): 移除页面顶部审批操作按钮,调整审批逻辑

1.  移除待审批状态下页面顶部的审批通过和驳回按钮
2.  重构审批相关的前端方法,删除冗余的handleApprove和handleReject
3.  优化后端审批日志逻辑,自动获取当前登录用户作为操作人
4.  新增评审单修改状态校验,仅草稿和已驳回状态可修改
5.  新增钢卷改判状态完整性校验,确保所有钢卷都已指定改判质量
6.  完善保存前的数据校验,新增产品名称非空校验和默认传审部门
This commit is contained in:
王文昊
2026-07-04 11:23:13 +08:00
parent 32455daf42
commit d5d77c53b6
2 changed files with 37 additions and 31 deletions

View File

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.klp.common.core.domain.PageQuery; import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.page.TableDataInfo; import com.klp.common.core.page.TableDataInfo;
import com.klp.common.utils.StringUtils; import com.klp.common.utils.StringUtils;
import com.klp.common.helper.LoginHelper;
import com.klp.domain.WmsMaterialCoil; import com.klp.domain.WmsMaterialCoil;
import com.klp.mapper.WmsMaterialCoilMapper; import com.klp.mapper.WmsMaterialCoilMapper;
import com.klp.service.IWmsMaterialCoilService; import com.klp.service.IWmsMaterialCoilService;
@@ -111,11 +112,19 @@ public class QcQualityReviewServiceImpl implements IQcQualityReviewService {
} }
/** /**
* 修改评审单(仅草稿状态可修改) * 修改评审单(仅草稿或已驳回状态可修改)
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean updateByBo(QcQualityReviewBo bo) { public Boolean updateByBo(QcQualityReviewBo bo) {
// 校验:只有待提交或已驳回状态才能修改
if (bo.getReviewId() != null) {
QcQualityReview exist = baseMapper.selectById(bo.getReviewId());
if (exist != null && !Long.valueOf(1L).equals(exist.getFlowStatus())
&& !Long.valueOf(4L).equals(exist.getFlowStatus())) {
throw new RuntimeException("只有待提交或已驳回状态的评审单才能修改");
}
}
QcQualityReview update = BeanUtil.toBean(bo, QcQualityReview.class); QcQualityReview update = BeanUtil.toBean(bo, QcQualityReview.class);
validEntityBeforeSave(update); validEntityBeforeSave(update);
boolean flag = baseMapper.updateById(update) > 0; boolean flag = baseMapper.updateById(update) > 0;
@@ -193,7 +202,7 @@ public class QcQualityReviewServiceImpl implements IQcQualityReviewService {
.set(QcQualityReview::getRejectReason, null)); .set(QcQualityReview::getRejectReason, null));
// 记录审批日志 // 记录审批日志
addLog(reviewId, "submit", "提交送审", null); addLog(reviewId, "submit", "提交送审");
return true; return true;
} }
@@ -214,6 +223,20 @@ public class QcQualityReviewServiceImpl implements IQcQualityReviewService {
throw new RuntimeException("请为每个钢卷指定改判后质量状态"); throw new RuntimeException("请为每个钢卷指定改判后质量状态");
} }
// 校验coilRegradeList 是否覆盖了评审单中的所有有效钢卷
List<QcQualityReviewCoil> dbCoils = coilMapper.selectList(
Wrappers.<QcQualityReviewCoil>lambdaQuery()
.eq(QcQualityReviewCoil::getReviewId, bo.getReviewId())
.eq(QcQualityReviewCoil::getDelFlag, 0));
Set<Long> regradedIds = bo.getCoilRegradeList().stream()
.map(QcQualityReviewApproveBo.CoilRegradeBo::getDetailId)
.collect(Collectors.toSet());
for (QcQualityReviewCoil coil : dbCoils) {
if (!regradedIds.contains(coil.getDetailId())) {
throw new RuntimeException("钢卷【" + coil.getCurrentCoilNo() + "】未指定改判后质量状态");
}
}
// 1. 更新主表流程状态 // 1. 更新主表流程状态
baseMapper.update(null, Wrappers.<QcQualityReview>lambdaUpdate() baseMapper.update(null, Wrappers.<QcQualityReview>lambdaUpdate()
.eq(QcQualityReview::getReviewId, bo.getReviewId()) .eq(QcQualityReview::getReviewId, bo.getReviewId())
@@ -230,7 +253,7 @@ public class QcQualityReviewServiceImpl implements IQcQualityReviewService {
} }
// 3. 记录审批日志 // 3. 记录审批日志
addLog(bo.getReviewId(), "approve", bo.getLeaderOpinion(), bo.getLeaderSign()); addLog(bo.getReviewId(), "approve", bo.getLeaderOpinion());
return true; return true;
} }
@@ -258,7 +281,7 @@ public class QcQualityReviewServiceImpl implements IQcQualityReviewService {
.set(QcQualityReview::getRejectReason, reason)); .set(QcQualityReview::getRejectReason, reason));
// 记录审批日志 // 记录审批日志
addLog(reviewId, "reject", reason, null); addLog(reviewId, "reject", reason);
return true; return true;
} }
@@ -355,14 +378,14 @@ public class QcQualityReviewServiceImpl implements IQcQualityReviewService {
} }
/** /**
* 添加审批日志 * 添加审批日志(自动记录当前登录用户为操作人)
*/ */
private void addLog(Long reviewId, String action, String opinion, String operator) { private void addLog(Long reviewId, String action, String opinion) {
QcQualityReviewLog log = new QcQualityReviewLog(); QcQualityReviewLog log = new QcQualityReviewLog();
log.setReviewId(reviewId); log.setReviewId(reviewId);
log.setAction(action); log.setAction(action);
log.setOpinion(opinion); log.setOpinion(opinion);
log.setOperator(operator); log.setOperator(LoginHelper.getUsername());
log.setOperateTime(new Date()); log.setOperateTime(new Date());
logMapper.insert(log); logMapper.insert(log);
} }
@@ -378,6 +401,11 @@ public class QcQualityReviewServiceImpl implements IQcQualityReviewService {
} }
private void validEntityBeforeSave(QcQualityReview entity) { private void validEntityBeforeSave(QcQualityReview entity) {
// TODO 数据校验 if (StringUtils.isBlank(entity.getProductName())) {
throw new RuntimeException("产品名称不能为空");
}
if (StringUtils.isBlank(entity.getTransmitDept())) {
entity.setTransmitDept("品质部");
}
} }
} }

View File

@@ -69,11 +69,7 @@
<!-- 待提交提交送审 --> <!-- 待提交提交送审 -->
<el-button v-if="currentRow.flowStatus === 1" size="mini" type="primary" plain icon="el-icon-s-promotion" <el-button v-if="currentRow.flowStatus === 1" size="mini" type="primary" plain icon="el-icon-s-promotion"
@click="handleSubmit" v-hasPermi="['qc:qualityReview:submit']">提交送审</el-button> @click="handleSubmit" v-hasPermi="['qc:qualityReview:submit']">提交送审</el-button>
<!-- 待审批审批/驳回 --> <!-- 待审批审批/驳回表单在下方展示顶部不再重复放置操作按钮 -->
<el-button v-if="currentRow.flowStatus === 2" size="mini" type="success" plain icon="el-icon-check"
@click="handleApprove" v-hasPermi="['qc:qualityReview:approve']">审批通过</el-button>
<el-button v-if="currentRow.flowStatus === 2" size="mini" type="danger" plain icon="el-icon-close"
@click="handleReject" v-hasPermi="['qc:qualityReview:approve']">驳回</el-button>
<!-- 已通过执行改判 --> <!-- 已通过执行改判 -->
<el-button v-if="currentRow.flowStatus === 3" size="mini" type="warning" plain icon="el-icon-setting" <el-button v-if="currentRow.flowStatus === 3" size="mini" type="warning" plain icon="el-icon-setting"
@click="handleExecute" v-hasPermi="['qc:qualityReview:execute']">执行改判</el-button> @click="handleExecute" v-hasPermi="['qc:qualityReview:execute']">执行改判</el-button>
@@ -541,20 +537,6 @@ export default {
}, },
// ===== 审批 ===== // ===== 审批 =====
handleApprove() {
this.approveAction = 'approve'
this.approveForm = {
reviewId: this.currentRow.reviewId,
leaderOpinion: '',
leaderSign: ''
}
// 先构建完整对象再赋值
const map = {}
this.coilList.forEach(c => {
map[c.detailId] = c.regradeQuality || ''
})
this.approveCoilMap = map
},
doApprove() { doApprove() {
if (!this.approveForm.leaderOpinion) { if (!this.approveForm.leaderOpinion) {
this.$modal.msgError('请输入审批意见') this.$modal.msgError('请输入审批意见')
@@ -581,10 +563,6 @@ export default {
}) })
}).catch(() => {}) }).catch(() => {})
}, },
handleReject() {
this.approveAction = 'reject'
this.rejectReason = ''
},
doReject() { doReject() {
if (!this.rejectReason) { if (!this.rejectReason) {
this.$modal.msgError('请输入驳回原因') this.$modal.msgError('请输入驳回原因')