fix(qc): 优化质量评审模块的字典使用与逻辑修复
1. 替换改判状态硬编码选项为系统字典 2. 修复钢卷明细更新的误删问题,仅在传coilList时更新 3. 拆分评审意见表单避免数据串用 4. 补充线上数据库修复脚本与缺失字典 5. 修复钢卷字段名不匹配问题
This commit is contained in:
38
docs/sql_fix_online.sql
Normal file
38
docs/sql_fix_online.sql
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
-- =============================================================
|
||||||
|
-- 线上 klp-oa 库修复脚本
|
||||||
|
-- 1. 删除乱码父菜单
|
||||||
|
-- 2. 补充缺失字典
|
||||||
|
-- =============================================================
|
||||||
|
SET NAMES utf8mb4;
|
||||||
|
|
||||||
|
-- ========== 1. 清理乱码父菜单 ==========
|
||||||
|
DELETE FROM sys_role_menu WHERE menu_id = 2100000000000000035;
|
||||||
|
DELETE FROM sys_menu WHERE menu_id = 2100000000000000035;
|
||||||
|
|
||||||
|
-- ========== 2. 补充缺失字典类型 ==========
|
||||||
|
INSERT IGNORE INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, update_by, update_time, remark)
|
||||||
|
VALUES ('改判后质量状态', 'regrade_quality_type', '0', 'admin', NOW(), 'admin', NOW(), '');
|
||||||
|
|
||||||
|
-- ========== 3. 补充缺失字典数据 ==========
|
||||||
|
-- quality_review_status 缺的3条
|
||||||
|
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES (2, '待审批', '2', 'quality_review_status', '', 'warning', 'Y', '0', 'admin', NOW());
|
||||||
|
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES (3, '已通过', '3', 'quality_review_status', '', 'success', 'Y', '0', 'admin', NOW());
|
||||||
|
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES (4, '已驳回', '4', 'quality_review_status', '', 'danger', 'Y', '0', 'admin', NOW());
|
||||||
|
|
||||||
|
-- regrade_quality_type 全部5条
|
||||||
|
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES (1, '协议销售', 'protocol_sale', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
|
||||||
|
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES (2, '转分剪', 'to_slitting', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
|
||||||
|
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES (3, '降级', 'downgrade', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
|
||||||
|
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES (4, '返修', 'rework', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
|
||||||
|
INSERT IGNORE INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time)
|
||||||
|
VALUES (5, '报废', 'scrap', 'regrade_quality_type', '', '', 'Y', '0', 'admin', NOW());
|
||||||
|
|
||||||
|
-- ========== 4. 验证 ==========
|
||||||
|
SELECT 'OK' as result FROM sys_dict_type WHERE dict_type = 'regrade_quality_type' LIMIT 1;
|
||||||
@@ -121,13 +121,15 @@ public class QcQualityReviewServiceImpl implements IQcQualityReviewService {
|
|||||||
validEntityBeforeSave(update);
|
validEntityBeforeSave(update);
|
||||||
boolean flag = baseMapper.updateById(update) > 0;
|
boolean flag = baseMapper.updateById(update) > 0;
|
||||||
if (flag) {
|
if (flag) {
|
||||||
// 先删除原有明细,再重新插入
|
// 只有明确传了coilList才更新钢卷明细(saveOpinion等场景不传coilList,避免误删)
|
||||||
|
if (bo.getCoilList() != null) {
|
||||||
coilMapper.delete(Wrappers.<QcQualityReviewCoil>lambdaQuery()
|
coilMapper.delete(Wrappers.<QcQualityReviewCoil>lambdaQuery()
|
||||||
.eq(QcQualityReviewCoil::getReviewId, bo.getReviewId()));
|
.eq(QcQualityReviewCoil::getReviewId, bo.getReviewId()));
|
||||||
if (CollUtil.isNotEmpty(bo.getCoilList())) {
|
if (CollUtil.isNotEmpty(bo.getCoilList())) {
|
||||||
saveCoilList(bo.getReviewId(), bo.getCoilList());
|
saveCoilList(bo.getReviewId(), bo.getCoilList());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return flag;
|
return flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -334,6 +336,7 @@ public class QcQualityReviewServiceImpl implements IQcQualityReviewService {
|
|||||||
int seq = 1;
|
int seq = 1;
|
||||||
for (QcQualityReviewCoilBo coilBo : coilBoList) {
|
for (QcQualityReviewCoilBo coilBo : coilBoList) {
|
||||||
QcQualityReviewCoil coil = BeanUtil.toBean(coilBo, QcQualityReviewCoil.class);
|
QcQualityReviewCoil coil = BeanUtil.toBean(coilBo, QcQualityReviewCoil.class);
|
||||||
|
coil.setDetailId(null); // 清空主键,使用数据库自增(避免软删除后重复)
|
||||||
coil.setReviewId(reviewId);
|
coil.setReviewId(reviewId);
|
||||||
coil.setExecuteStatus(0L);
|
coil.setExecuteStatus(0L);
|
||||||
if (coil.getGroupSeq() == null) {
|
if (coil.getGroupSeq() == null) {
|
||||||
|
|||||||
@@ -145,11 +145,11 @@
|
|||||||
<!-- ===== 品质部评审意见 ===== -->
|
<!-- ===== 品质部评审意见 ===== -->
|
||||||
<el-card class="detail-section" shadow="never">
|
<el-card class="detail-section" shadow="never">
|
||||||
<div slot="header"><span><i class="el-icon-edit-outline"></i> 品质部评审意见</span></div>
|
<div slot="header"><span><i class="el-icon-edit-outline"></i> 品质部评审意见</span></div>
|
||||||
<div v-if="editing" class="section-editor">
|
<div v-if="currentRow.flowStatus === 1 || currentRow.flowStatus === 4" class="section-editor">
|
||||||
<el-input type="textarea" :rows="3" v-model="editForm.deptOpinion" placeholder="请填写品质部评审意见..." />
|
<el-input type="textarea" :rows="3" v-model="opinionForm.deptOpinion" placeholder="请填写品质部评审意见..." />
|
||||||
<div style="margin-top:8px; display:flex; gap:8px;">
|
<div style="margin-top:8px; display:flex; gap:8px;">
|
||||||
<el-input v-model="editForm.deptSign" placeholder="签字人" style="width:160px;" size="small" />
|
<el-input v-model="opinionForm.deptSign" placeholder="签字人" style="width:160px;" size="small" />
|
||||||
<el-date-picker v-model="editForm.deptSignDate" type="date" placeholder="签字日期" size="small" />
|
<el-date-picker v-model="opinionForm.deptSignDate" type="date" placeholder="签字日期" size="small" />
|
||||||
</div>
|
</div>
|
||||||
<el-button size="small" type="primary" @click="saveOpinion" style="margin-top:8px;">保存意见</el-button>
|
<el-button size="small" type="primary" @click="saveOpinion" style="margin-top:8px;">保存意见</el-button>
|
||||||
</div>
|
</div>
|
||||||
@@ -182,8 +182,8 @@
|
|||||||
<div class="approve-coil-title">请为每个钢卷指定改判后质量状态:</div>
|
<div class="approve-coil-title">请为每个钢卷指定改判后质量状态:</div>
|
||||||
<div v-for="coil in coilList" :key="coil.detailId" class="approve-coil-row">
|
<div v-for="coil in coilList" :key="coil.detailId" class="approve-coil-row">
|
||||||
<span class="approve-coil-label">{{ coil.currentCoilNo }}({{ coil.spec }})</span>
|
<span class="approve-coil-label">{{ coil.currentCoilNo }}({{ coil.spec }})</span>
|
||||||
<el-select v-model="approveCoilMap[coil.detailId]" placeholder="请选择改判后状态" size="small" style="width:180px;">
|
<el-select v-model="approveCoilMap[coil.detailId]" placeholder="请选择改判后等级" size="small" style="width:180px;">
|
||||||
<el-option v-for="item in regradeOptions" :key="item.value" :label="item.label" :value="item.value" />
|
<el-option v-for="item in dict.type.coil_quality_status" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -264,7 +264,6 @@
|
|||||||
<div class="dialog-section">
|
<div class="dialog-section">
|
||||||
<div class="dialog-section-header">
|
<div class="dialog-section-header">
|
||||||
<span>问题钢卷</span>
|
<span>问题钢卷</span>
|
||||||
<el-button size="mini" type="primary" plain icon="el-icon-plus" @click="showCoilSelector = true">选择O级钢卷</el-button>
|
|
||||||
</div>
|
</div>
|
||||||
<el-table :data="editForm.coilList" border style="width:100%" size="small" max-height="250">
|
<el-table :data="editForm.coilList" border style="width:100%" size="small" max-height="250">
|
||||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||||
@@ -283,7 +282,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<div v-if="editForm.coilList.length === 0" class="dialog-table-empty">请点击上方按钮选择O级钢卷</div>
|
<div v-if="editForm.coilList.length === 0" class="dialog-table-empty" style="cursor:pointer;" @click="showCoilSelector = true">请选择O级钢卷</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- ===== 钢卷选择器(嵌套在弹窗内) ===== -->
|
<!-- ===== 钢卷选择器(嵌套在弹窗内) ===== -->
|
||||||
@@ -332,7 +331,7 @@ import CoilSelector from '@/components/CoilSelector'
|
|||||||
export default {
|
export default {
|
||||||
name: 'QualityReview',
|
name: 'QualityReview',
|
||||||
components: { CoilSelector },
|
components: { CoilSelector },
|
||||||
dicts: ['quality_review_status', 'regrade_quality_type'],
|
dicts: ['quality_review_status', 'regrade_quality_type', 'coil_quality_status'],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
// 列表
|
// 列表
|
||||||
@@ -355,6 +354,12 @@ export default {
|
|||||||
// 钢卷选择
|
// 钢卷选择
|
||||||
showCoilSelector: false,
|
showCoilSelector: false,
|
||||||
|
|
||||||
|
// 品质部意见编辑(独立于editForm,避免串数据)
|
||||||
|
opinionForm: {
|
||||||
|
deptOpinion: '',
|
||||||
|
deptSign: '',
|
||||||
|
deptSignDate: undefined
|
||||||
|
},
|
||||||
// 编辑弹窗
|
// 编辑弹窗
|
||||||
dialogVisible: false,
|
dialogVisible: false,
|
||||||
dialogTitle: '',
|
dialogTitle: '',
|
||||||
@@ -375,14 +380,6 @@ export default {
|
|||||||
productName: [{ required: true, message: '请输入产品名称', trigger: 'blur' }]
|
productName: [{ required: true, message: '请输入产品名称', trigger: 'blur' }]
|
||||||
},
|
},
|
||||||
|
|
||||||
// 改判状态选项(硬编码后备,优先使用字典)
|
|
||||||
regradeOptions: [
|
|
||||||
{ label: '协议销售', value: 'protocol_sale' },
|
|
||||||
{ label: '转分剪', value: 'to_slitting' },
|
|
||||||
{ label: '降级', value: 'downgrade' },
|
|
||||||
{ label: '返修', value: 'rework' },
|
|
||||||
{ label: '报废', value: 'scrap' }
|
|
||||||
],
|
|
||||||
// 审批
|
// 审批
|
||||||
approveAction: 'approve',
|
approveAction: 'approve',
|
||||||
approveForm: {
|
approveForm: {
|
||||||
@@ -430,6 +427,12 @@ export default {
|
|||||||
map[c.detailId] = c.regradeQuality || ''
|
map[c.detailId] = c.regradeQuality || ''
|
||||||
})
|
})
|
||||||
this.approveCoilMap = map
|
this.approveCoilMap = map
|
||||||
|
// 初始化品质部意见编辑(独立于editForm)
|
||||||
|
this.opinionForm = {
|
||||||
|
deptOpinion: data.deptOpinion || '',
|
||||||
|
deptSign: data.deptSign || '',
|
||||||
|
deptSignDate: data.deptSignDate || undefined
|
||||||
|
}
|
||||||
this.approveForm.reviewId = reviewId
|
this.approveForm.reviewId = reviewId
|
||||||
this.approveForm.leaderOpinion = ''
|
this.approveForm.leaderOpinion = ''
|
||||||
this.approveForm.leaderSign = ''
|
this.approveForm.leaderSign = ''
|
||||||
@@ -507,7 +510,7 @@ export default {
|
|||||||
coilId: coil.coilId,
|
coilId: coil.coilId,
|
||||||
currentCoilNo: coil.currentCoilNo,
|
currentCoilNo: coil.currentCoilNo,
|
||||||
supplierCoilNo: coil.supplierCoilNo || coil.enterCoilNo,
|
supplierCoilNo: coil.supplierCoilNo || coil.enterCoilNo,
|
||||||
spec: coil.spec,
|
spec: coil.specification, // CoilSelector返回的字段名为specification
|
||||||
netWeight: coil.netWeight,
|
netWeight: coil.netWeight,
|
||||||
defectDesc: '',
|
defectDesc: '',
|
||||||
groupSeq: startIdx + idx + 1,
|
groupSeq: startIdx + idx + 1,
|
||||||
@@ -628,9 +631,9 @@ export default {
|
|||||||
if (!this.currentRow) return
|
if (!this.currentRow) return
|
||||||
updateQualityReview({
|
updateQualityReview({
|
||||||
reviewId: this.currentRow.reviewId,
|
reviewId: this.currentRow.reviewId,
|
||||||
deptOpinion: this.editForm.deptOpinion,
|
deptOpinion: this.opinionForm.deptOpinion,
|
||||||
deptSign: this.editForm.deptSign,
|
deptSign: this.opinionForm.deptSign,
|
||||||
deptSignDate: this.editForm.deptSignDate
|
deptSignDate: this.opinionForm.deptSignDate
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.$modal.msgSuccess('保存成功')
|
this.$modal.msgSuccess('保存成功')
|
||||||
this.handleRefreshDetail()
|
this.handleRefreshDetail()
|
||||||
|
|||||||
@@ -57,7 +57,7 @@
|
|||||||
<el-table-column label="改判后状态" width="160">
|
<el-table-column label="改判后状态" width="160">
|
||||||
<template slot-scope="s">
|
<template slot-scope="s">
|
||||||
<el-select v-model="approveCoilMap[s.row.detailId]" placeholder="请选择" size="small">
|
<el-select v-model="approveCoilMap[s.row.detailId]" placeholder="请选择" size="small">
|
||||||
<el-option v-for="item in regradeOptions" :key="item.value" :label="item.label" :value="item.value" />
|
<el-option v-for="item in dict.type.coil_quality_status" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@@ -81,7 +81,7 @@ import { listQualityReview, approveQualityReview, rejectQualityReview, getQualit
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'QualityReviewTodo',
|
name: 'QualityReviewTodo',
|
||||||
dicts: ['quality_review_status', 'regrade_quality_type'],
|
dicts: ['quality_review_status', 'regrade_quality_type', 'coil_quality_status'],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
loading: false,
|
loading: false,
|
||||||
@@ -92,13 +92,6 @@ export default {
|
|||||||
pageSize: 20,
|
pageSize: 20,
|
||||||
flowStatus: 2
|
flowStatus: 2
|
||||||
},
|
},
|
||||||
regradeOptions: [
|
|
||||||
{ label: '协议销售', value: 'protocol_sale' },
|
|
||||||
{ label: '转分剪', value: 'to_slitting' },
|
|
||||||
{ label: '降级', value: 'downgrade' },
|
|
||||||
{ label: '返修', value: 'rework' },
|
|
||||||
{ label: '报废', value: 'scrap' }
|
|
||||||
],
|
|
||||||
approveDialog: {
|
approveDialog: {
|
||||||
visible: false,
|
visible: false,
|
||||||
review: null
|
review: null
|
||||||
|
|||||||
Reference in New Issue
Block a user