From c992f192b2adc17b6582857bf5d77396890fbb04 Mon Sep 17 00:00:00 2001 From: wuzhen <52326163@qq.com> Date: Sun, 24 Aug 2025 14:55:36 +0800 Subject: [PATCH] wuzhen update --- .../JcbtScholarshipTypeController.java | 9 + .../service/IJcbtScholarshipTypeService.java | 8 + .../impl/JcbtScholarshipTypeServiceImpl.java | 47 ++ web/src/api/jcbt/scholarshipType.ts | 11 + web/src/views/jcbt/scholarship/type/index.vue | 78 ++- web/src/views/zsjy/enrollment/index.vue | 579 +++++++++++------- web/src/views/zsjy/internship/daily/index.vue | 260 +++++--- .../views/zsjy/internship/msgmanage/index.vue | 476 +++++++++----- .../views/zsjy/internship/pmonthly/index.vue | 337 ++++++---- web/src/views/zsjy/internship/visit/index.vue | 520 +++++++--------- 10 files changed, 1419 insertions(+), 906 deletions(-) diff --git a/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/controller/JcbtScholarshipTypeController.java b/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/controller/JcbtScholarshipTypeController.java index 3db8ab2c..1bf840a6 100644 --- a/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/controller/JcbtScholarshipTypeController.java +++ b/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/controller/JcbtScholarshipTypeController.java @@ -295,4 +295,13 @@ public class JcbtScholarshipTypeController extends BaseController { return R.ok(compatibleTypes); } + /** + * 获取奖学金类型的互斥关系显示文本 + */ + @SaCheckPermission("jcbt:scholarshipType:query") + @GetMapping("/{id}/exclusiveRelationDisplay") + public R getExclusiveRelationDisplay(@NotNull(message = "主键不能为空") @PathVariable Long id) { + return R.ok(scholarshipTypeService.getExclusiveRelationDisplay(id)); + } + } diff --git a/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/IJcbtScholarshipTypeService.java b/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/IJcbtScholarshipTypeService.java index dccdb4d9..b5bbfa52 100644 --- a/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/IJcbtScholarshipTypeService.java +++ b/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/IJcbtScholarshipTypeService.java @@ -91,4 +91,12 @@ public interface IJcbtScholarshipTypeService { */ List queryOptions(); + /** + * 获取奖学金类型的互斥关系显示文本 + * + * @param scholarshipTypeId 奖学金类型ID + * @return 互斥关系显示文本 + */ + String getExclusiveRelationDisplay(Long scholarshipTypeId); + } diff --git a/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/impl/JcbtScholarshipTypeServiceImpl.java b/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/impl/JcbtScholarshipTypeServiceImpl.java index 79b8ae08..4e4af648 100644 --- a/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/impl/JcbtScholarshipTypeServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/impl/JcbtScholarshipTypeServiceImpl.java @@ -14,10 +14,12 @@ import org.dromara.jcbt.domain.vo.JcbtScholarshipTypeVo; import org.dromara.jcbt.domain.JcbtScholarshipType; import org.dromara.jcbt.mapper.JcbtScholarshipTypeMapper; import org.dromara.jcbt.service.IJcbtScholarshipTypeService; +import org.dromara.jcbt.service.IJcbtScholarshipCompatibilityService; import java.util.List; import java.util.Map; import java.util.Collection; +import java.util.ArrayList; /** * 奖学金类型Service业务层处理 @@ -30,6 +32,7 @@ import java.util.Collection; public class JcbtScholarshipTypeServiceImpl implements IJcbtScholarshipTypeService { private final JcbtScholarshipTypeMapper baseMapper; + private final IJcbtScholarshipCompatibilityService compatibilityService; /** * 查询奖学金类型 @@ -231,4 +234,48 @@ public class JcbtScholarshipTypeServiceImpl implements IJcbtScholarshipTypeServi JcbtScholarshipType::getTypeCategory, JcbtScholarshipType::getAwardAmount); return baseMapper.selectVoList(lqw); } + + /** + * 获取奖学金类型的互斥关系显示文本 + */ + @Override + public String getExclusiveRelationDisplay(Long scholarshipTypeId) { + // 1. 获取当前奖学金类型信息 + JcbtScholarshipTypeVo currentType = queryById(scholarshipTypeId); + if (currentType == null) { + return "互斥(无)"; + } + + // 2. 如果是EXCLUSIVE类型,显示"互斥(与全部其他奖学金类型)" + if ("EXCLUSIVE".equals(currentType.getCompatibilityType())) { + return "互斥(与全部其他奖学金类型)"; + } + + // 3. 如果是CUSTOM类型,查询具体的互斥关系 + if ("CUSTOM".equals(currentType.getCompatibilityType())) { + List exclusiveTypeIds = compatibilityService.getExclusiveTypeIds(scholarshipTypeId); + + if (exclusiveTypeIds == null || exclusiveTypeIds.isEmpty()) { + return "互斥(无)"; + } + + // 查询互斥的奖学金类型名称 + List exclusiveTypeNames = new ArrayList<>(); + for (Long exclusiveTypeId : exclusiveTypeIds) { + JcbtScholarshipTypeVo exclusiveType = queryById(exclusiveTypeId); + if (exclusiveType != null) { + exclusiveTypeNames.add(exclusiveType.getTypeName()); + } + } + + if (exclusiveTypeNames.isEmpty()) { + return "互斥(无)"; + } + + return "互斥(与" + String.join("、", exclusiveTypeNames) + ")"; + } + + // 4. 其他情况(如COMPATIBLE),显示"互斥(无)" + return "互斥(无)"; + } } diff --git a/web/src/api/jcbt/scholarshipType.ts b/web/src/api/jcbt/scholarshipType.ts index 34d79954..7483b06e 100644 --- a/web/src/api/jcbt/scholarshipType.ts +++ b/web/src/api/jcbt/scholarshipType.ts @@ -329,3 +329,14 @@ export const getCompatibleTypes = (id: string | number): AxiosPromise => { + return request({ + url: `/jcbt/scholarshipType/${id}/exclusiveRelationDisplay`, + method: 'get' + }); +}; diff --git a/web/src/views/jcbt/scholarship/type/index.vue b/web/src/views/jcbt/scholarship/type/index.vue index 9def5386..7b859ee7 100644 --- a/web/src/views/jcbt/scholarship/type/index.vue +++ b/web/src/views/jcbt/scholarship/type/index.vue @@ -155,11 +155,16 @@ ¥{{ parseFloat(scope.row.awardAmount || '0').toLocaleString() }} - + @@ -473,6 +478,7 @@ import { checkScholarshipTypeNameUnique, getCompatibilityConfig, saveCompatibilityConfig, + getExclusiveRelationDisplay, type ScholarshipTypeVO, type ScholarshipTypeForm, type ScholarshipTypeQuery, @@ -526,6 +532,9 @@ const availableScholarshipTypes = ref([]); // 当前奖学金的兼容性配置(用于编辑时显示原来的配置) const currentCompatibilityConfig = ref(null); +// 互斥关系显示文本缓存 +const exclusiveRelationCache = ref>(new Map()); + const dataRules = reactive({ typeCode: [ { required: true, message: '奖学金类型编码不能为空', trigger: 'blur' }, @@ -626,6 +635,44 @@ const getCompatibilityTagType = (value: string) => { return typeMap[value] || 'warning'; // 未知类型用橙色警告标签 }; +/** 获取互斥关系显示文本 */ +const getExclusiveRelationText = (scholarshipTypeId: string | number): string => { + if (!scholarshipTypeId) return ''; + + // 先从缓存中获取 + const cached = exclusiveRelationCache.value.get(scholarshipTypeId); + if (cached !== undefined) { + return cached; + } + + // 异步获取并缓存 + getExclusiveRelationDisplay(scholarshipTypeId).then(response => { + exclusiveRelationCache.value.set(scholarshipTypeId, response.data); + }).catch(error => { + console.warn('获取互斥关系显示文本失败:', error); + exclusiveRelationCache.value.set(scholarshipTypeId, '互斥(无)'); + }); + + return '加载中...'; +}; + +/** 预加载互斥关系显示文本 */ +const preloadExclusiveRelations = async () => { + const customTypes = scholarshipTypeList.value.filter(item => item.compatibilityType === 'CUSTOM'); + + for (const type of customTypes) { + if (type.id && !exclusiveRelationCache.value.has(type.id)) { + try { + const response = await getExclusiveRelationDisplay(type.id); + exclusiveRelationCache.value.set(type.id, response.data); + } catch (error) { + console.warn(`获取奖学金类型 ${type.id} 的互斥关系失败:`, error); + exclusiveRelationCache.value.set(type.id, '互斥(无)'); + } + } + } +}; + /** 查询奖学金类型列表 */ const getList = async () => { loading.value = true; @@ -659,6 +706,9 @@ const getList = async () => { scholarshipTypeList.value = response.rows; total.value = response.total; + // 预加载CUSTOM类型的互斥关系显示文本 + preloadExclusiveRelations(); + // 计算统计数据 calculateStatistics(); } finally { @@ -688,6 +738,8 @@ const resetQuery = () => { daterangeCreateTime.value = ['', '']; queryFormRef.value?.resetFields(); queryParams.value.pageNum = 1; + // 清空缓存 + exclusiveRelationCache.value.clear(); handleQuery(); }; @@ -769,6 +821,8 @@ const handleDelete = async (row?: ScholarshipTypeVO) => { try { await proxy?.$modal.confirm(`是否确认删除奖学金类型"${typeNames.join('、')}"?`); await delScholarshipType(typeIds); + // 清空缓存以便重新加载 + exclusiveRelationCache.value.clear(); await getList(); proxy?.$modal.msgSuccess('删除成功'); } catch (error) { @@ -790,6 +844,8 @@ const handleStatusChange = async (row: ScholarshipTypeVO) => { await proxy?.$modal.confirm(`确认要${text}"${row.typeName}"吗?`); await changeScholarshipTypeStatus(row.id!, row.status!); proxy?.$modal.msgSuccess(`${text}成功`); + // 清空缓存以便重新加载 + exclusiveRelationCache.value.clear(); await getList(); } catch (error) { if (error !== 'cancel') { @@ -824,6 +880,8 @@ const dialogSubmit = () => { } dialogOpen.value = false; + // 清空缓存以便重新加载 + exclusiveRelationCache.value.clear(); await getList(); } catch (error) { proxy?.$modal.msgError(form.value.id ? '修改失败' : '新增失败'); @@ -1057,4 +1115,16 @@ onMounted(() => { margin-bottom: 0 !important; } } + +/* 兼容性详情样式 */ +.compatibility-detail { + margin-top: 4px; + font-size: 12px; +} + +.exclusive-relation-text { + color: #909399; + line-height: 1.2; + word-break: break-word; +} diff --git a/web/src/views/zsjy/enrollment/index.vue b/web/src/views/zsjy/enrollment/index.vue index 7c9f18f1..1c8f522c 100644 --- a/web/src/views/zsjy/enrollment/index.vue +++ b/web/src/views/zsjy/enrollment/index.vue @@ -2,125 +2,133 @@
- - - - - - - - - - - - - - - - - - - - - - - - - - - +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - 搜索 - 重置 - - - - - + + + + + + + + + + + + + + + + + + + + + 搜索 + 重置 + + + + + +
- - + + -
- 新增 - 修改 - 删除 - 导出 - 批量审核 -
-
- - -
- - - - + + + + - + - +
- - -
- -
+ +
+ +
+ @@ -892,6 +892,7 @@ const handleBatchCurrentChange = (val: number) => { const queryFormRef = ref(); const enrollmentInfoFormRef = ref(); +const enrollmentTableRef = ref(); const dialog = reactive({ visible: false, @@ -1594,6 +1595,33 @@ const handleExport = () => { ); }; +/** 批量更新按钮操作 */ +const handleBatchUpdate = async () => { + if (ids.value.length === 0) { + proxy?.$modal.msgError('请选择要修改的招生报名信息'); + return; + } + if (ids.value.length > 1) { + proxy?.$modal.msgError('批量修改功能暂不支持,请选择单条记录进行修改'); + return; + } + // 如果只选择了一条记录,调用单个修改方法 + const row = enrollmentInfoList.value.find(item => item.id === ids.value[0]); + if (row) { + handleUpdate(row); + } +}; + +/** 批量删除按钮操作 */ +const handleBatchDelete = async () => { + if (ids.value.length === 0) { + proxy?.$modal.msgError('请选择要删除的招生报名信息'); + return; + } + // 调用现有的删除方法,它已经支持批量删除 + handleDelete(); +}; + /** 批量审核按钮操作 */ const handleBatchAudit = async () => { if (ids.value.length === 0) { @@ -1920,77 +1948,157 @@ onMounted(() => { diff --git a/web/src/views/zsjy/internship/daily/index.vue b/web/src/views/zsjy/internship/daily/index.vue index 5429a0c0..5355b373 100644 --- a/web/src/views/zsjy/internship/daily/index.vue +++ b/web/src/views/zsjy/internship/daily/index.vue @@ -1,5 +1,5 @@