在奖学金类型管理界面中,兼得类型字段存在以下问题:
PARTIAL_COMPATIBLE(部分兼容)选项PRIORITY(优先级)类型的文本和颜色映射PRIORITY 选项根据 docs/需求文档/奖惩补贴需求/奖学金管理基础数据.sql:
-- 兼得关系类型数据字典
(2000000000000005001, 1, '兼容', 'COMPATIBLE', 'jcbt_compatibility_type', '', 'success', 'N', 1, NOW(), '可以同时获得'),
(2000000000000005002, 2, '互斥', 'EXCLUSIVE', 'jcbt_compatibility_type', '', 'danger', 'N', 1, NOW(), '不能同时获得'),
(2000000000000005003, 3, '优先级', 'PRIORITY', 'jcbt_compatibility_type', '', 'warning', 'N', 1, NOW(), '有优先级关系'),
(2000000000000005004, 4, '自定义配置', 'CUSTOM', 'jcbt_compatibility_type', '', 'primary', 'N', 1, NOW(), '可自定义具体的兼得关系');
文件: web/src/views/jcbt/scholarship/type/index.vue
位置: 第36-43行
<!-- 修改前 -->
<el-form-item label="兼得类型" prop="compatibilityType">
<el-select v-model="queryParams.compatibilityType" placeholder="请选择兼得类型" clearable style="width: 100%">
<el-option label="互斥" value="EXCLUSIVE" />
<el-option label="兼容" value="COMPATIBLE" />
<el-option label="部分兼容" value="PARTIAL_COMPATIBLE" /> <!-- ❌ 错误值 -->
</el-select>
</el-form-item>
<!-- 修改后 -->
<el-form-item label="兼得类型" prop="compatibilityType">
<el-select v-model="queryParams.compatibilityType" placeholder="请选择兼得类型" clearable style="width: 100%">
<el-option label="互斥" value="EXCLUSIVE" />
<el-option label="兼容" value="COMPATIBLE" />
<el-option label="优先级" value="PRIORITY" /> <!-- ✅ 正确值 -->
<el-option label="自定义配置" value="CUSTOM" /> <!-- ✅ 新增选项 -->
</el-select>
</el-form-item>
文件: web/src/views/jcbt/scholarship/type/index.vue
位置: 第602-609行
// 修改前
const getCompatibilityText = (value: string) => {
const compatibilityMap: { [key: string]: string } = {
'EXCLUSIVE': '完全互斥', // ❌ 与数据字典不一致
'COMPATIBLE': '完全兼容', // ❌ 与数据字典不一致
'CUSTOM': '自定义配置'
// ❌ 缺少 PRIORITY 映射
};
return compatibilityMap[value] || value;
};
// 修改后
const getCompatibilityText = (value: string) => {
const compatibilityMap: { [key: string]: string } = {
'EXCLUSIVE': '互斥', // ✅ 与数据字典一致
'COMPATIBLE': '兼容', // ✅ 与数据字典一致
'PRIORITY': '优先级', // ✅ 新增映射
'CUSTOM': '自定义配置'
};
return compatibilityMap[value] || value;
};
文件: web/src/views/jcbt/scholarship/type/index.vue
位置: 第611-618行
// 修改前
const getCompatibilityTagType = (value: string) => {
const typeMap: { [key: string]: string } = {
'EXCLUSIVE': 'danger',
'COMPATIBLE': 'success',
'CUSTOM': 'primary'
// ❌ 缺少 PRIORITY 颜色映射
};
return typeMap[value] || '';
};
// 修改后
const getCompatibilityTagType = (value: string) => {
const typeMap: { [key: string]: string } = {
'EXCLUSIVE': 'danger', // 红色标签
'COMPATIBLE': 'success', // 绿色标签
'PRIORITY': 'warning', // ✅ 新增橙色标签
'CUSTOM': 'primary' // 蓝色标签
};
return typeMap[value] || '';
};
文件: web/src/views/jcbt/scholarship/type/index.vue
位置: 第335-341行
<!-- 修改前 -->
<el-form-item label="兼得类型" prop="compatibilityType">
<el-select v-model="form.compatibilityType" @change="handleCompatibilityTypeChange" placeholder="请选择兼得类型" style="width: 100%">
<el-option label="完全兼容" value="COMPATIBLE" /> <!-- ❌ 文本不一致 -->
<el-option label="完全互斥" value="EXCLUSIVE" /> <!-- ❌ 文本不一致 -->
<el-option label="自定义配置" value="CUSTOM" />
<!-- ❌ 缺少 PRIORITY 选项 -->
</el-select>
</el-form-item>
<!-- 修改后 -->
<el-form-item label="兼得类型" prop="compatibilityType">
<el-select v-model="form.compatibilityType" @change="handleCompatibilityTypeChange" placeholder="请选择兼得类型" style="width: 100%">
<el-option label="兼容" value="COMPATIBLE" /> <!-- ✅ 文本一致 -->
<el-option label="互斥" value="EXCLUSIVE" /> <!-- ✅ 文本一致 -->
<el-option label="优先级" value="PRIORITY" /> <!-- ✅ 新增选项 -->
<el-option label="自定义配置" value="CUSTOM" />
</el-select>
</el-form-item>
PARTIAL_COMPATIBLE 选项PRIORITY 类型数据显示为原始值而非友好文本PRIORITY 类型显示正确的标签颜色PRIORITY 选项,无法选择此类型EXCLUSIVE → 红色(danger)COMPATIBLE → 绿色(success)PRIORITY → 橙色(warning)CUSTOM → 蓝色(primary)/jcbt/scholarship/typedocs/需求文档/奖惩补贴需求/奖学金管理基础数据.sqldocs/开发文档/API/奖学金管理API.md(需同步更新).cursor/cursorrules-frontend.md建议后续版本改为使用数据字典组件,避免硬编码:
<el-select v-model="queryParams.compatibilityType">
<el-option
v-for="dict in jcbt_compatibility_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
在 JcbtScholarshipTypeVo.java 中添加字典注解:
@ExcelProperty(value = "兼得类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "jcbt_compatibility_type")
private String compatibilityType;
用户反馈修复后仍然看不到兼得类型字段的值,为了更好地排查问题,添加调试功能。
const getCompatibilityText = (value: string) => {
// 添加调试信息
console.log('兼得类型值:', value, '类型:', typeof value);
const compatibilityMap: { [key: string]: string } = {
'EXCLUSIVE': '互斥',
'COMPATIBLE': '兼容',
'PRIORITY': '优先级',
'CUSTOM': '自定义配置'
};
// 处理空值情况
if (!value || value === 'null' || value === 'undefined') {
return '未设置';
}
const result = compatibilityMap[value] || `未知类型(${value})`;
console.log('兼得类型映射结果:', result);
return result;
};
const getCompatibilityTagType = (value: string) => {
const typeMap: { [key: string]: string } = {
'EXCLUSIVE': 'danger',
'COMPATIBLE': 'success',
'PRIORITY': 'warning',
'CUSTOM': 'primary'
};
// 处理空值情况
if (!value || value === 'null' || value === 'undefined') {
return 'info'; // 灰色标签表示未设置
}
return typeMap[value] || 'warning'; // 未知类型用橙色警告标签
};
在getList函数中添加数据调试输出:
// 添加调试信息 - 检查兼得类型数据
console.log('奖学金类型列表数据:', response.rows);
response.rows.forEach((item, index) => {
console.log(`第${index + 1}条数据的兼得类型:`, item.compatibilityType);
});
Ctrl + F5 或 Ctrl + Shift + RCmd + Shift + RF12 打开开发者工具Console(控制台)选项卡观察以下信息:
compatibilityType 字段值🔴 如果控制台显示 undefined 或 null
compatibilityType 字段为空🔴 如果控制台显示 未知类型(XXXXX)
🔴 如果控制台没有任何输出
🔴 如果显示 "未设置"
通过深入调试分析,发现了问题的根本原因:
数据库表结构中缺少 compatibility_type 字段!
compatibilityType 正确compatibilityType 正确compatibility_type 正确compatibility_type 字段backend/sql/jcbt_scholarship_management.sql): 缺少 compatibility_type 字段docs/需求文档/奖惩补贴需求/): 包含字段使用但没有字段定义文件: backend/sql/fix_compatibility_type_field.sql
-- 为奖学金类型表添加兼得类型字段
ALTER TABLE `jcbt_scholarship_type`
ADD COLUMN IF NOT EXISTS `compatibility_type` VARCHAR(20) DEFAULT 'COMPATIBLE'
COMMENT '兼得类型:EXCLUSIVE-完全互斥,COMPATIBLE-完全兼容,PRIORITY-优先级关系,CUSTOM-自定义配置'
AFTER `application_guide`;
-- 添加索引
ALTER TABLE `jcbt_scholarship_type`
ADD INDEX IF NOT EXISTS `idx_compatibility_type` (`compatibility_type`) COMMENT '兼得类型索引';
-- 更新现有数据
UPDATE `jcbt_scholarship_type`
SET `compatibility_type` = 'COMPATIBLE'
WHERE `compatibility_type` IS NULL AND `deleted` = 0;
# 在MySQL中执行修复脚本
mysql -u your_username -p your_database < backend/sql/fix_compatibility_type_field.sql
-- 检查表结构
DESCRIBE jcbt_scholarship_type;
-- 检查数据
SELECT id, type_name, compatibility_type FROM jcbt_scholarship_type WHERE deleted = 0 LIMIT 5;
Ctrl+F5 或 Cmd+Shift+R修复完成后,页面应该显示:
修复完成时间: 2025-08-04 14:30:00
调试功能添加时间: 2025-08-04 14:45:00
根本问题发现时间: 2025-08-04 15:00:00
通过检查后端代码发现,问题不是数据库表结构缺失,而是后端临时逻辑的判断条件不完整!
// 只判断null,不判断空字符串
if (vo.getCompatibilityType() == null) {
vo.setCompatibilityType("CUSTOM");
}
// 同时判断null和空字符串
if (vo.getCompatibilityType() == null || vo.getCompatibilityType().trim().isEmpty()) {
vo.setCompatibilityType("COMPATIBLE");
}
JcbtScholarshipTypeServiceImpl.javaqueryById, queryPageList, queryList== null 改为 == null || trim().isEmpty()"CUSTOM" 改为 "COMPATIBLE"Ctrl+F5 或 Cmd+Shift+RcompatibilityType字段值修复完成后,页面应该显示:
这个问题教给我们:
null,还要判断空字符串trim().isEmpty()处理空白字符串修复完成时间: 2025-08-04 14:30:00
调试功能添加时间: 2025-08-04 14:45:00
根本问题发现时间: 2025-08-04 15:00:00
最终修复完成时间: 2025-08-04 15:15:00
详情页面修复时间: 2025-08-04 15:30:00
验证状态: 🟢 代码已修复,等待重启后端验证
部署状态: 🟢 只需重启后端服务(无需数据库修改)
用户反馈详情页面信息展示不全,经检查发现以下问题:
typeCode) - VO中有但详情页没显示description) - VO中有但详情页没显示applicationGuide) - VO中有但详情页没显示isSystem) - VO中有但详情页没显示viewData.typeLevel 但VO中实际是 levelTypeweb/src/views/jcbt/scholarship/type/index.vue{{ viewData.typeCode || '无' }}{{ viewData.description || '无' }}{{ viewData.applicationGuide || '无' }}viewData.typeLevel → viewData.levelType:span="2"占满整行,阅读体验更好