diff --git a/frontend/src/views/student/studentInfo/index.vue b/frontend/src/views/student/studentInfo/index.vue
index 371e9a04b..9f651aa98 100644
--- a/frontend/src/views/student/studentInfo/index.vue
+++ b/frontend/src/views/student/studentInfo/index.vue
@@ -86,7 +86,7 @@
-
+
diff --git a/frontend/src/views/teachBusiness/timetableAdjust/index.vue b/frontend/src/views/teachBusiness/timetableAdjust/index.vue
index 409c72be5..90e5c06db 100644
--- a/frontend/src/views/teachBusiness/timetableAdjust/index.vue
+++ b/frontend/src/views/teachBusiness/timetableAdjust/index.vue
@@ -359,7 +359,7 @@ export default {
{ label: '已发回', value: 2 },
{ label: '已拒绝', value: 3 }
],
- statCards: [],
+ statCards: this.createStatCards([0, 0, 0, 0]),
// 新增申请
addVisible: false,
addLoading: false,
@@ -397,7 +397,10 @@ export default {
}
},
created() {
- this.loadYearOptions().then(() => this.loadList())
+ this.loadYearOptions().then(() => {
+ this.loadStatistics()
+ this.loadList()
+ })
},
methods: {
/* ---------- 年度下拉(数据来自 /semester/all) ---------- */
@@ -458,12 +461,10 @@ export default {
const data = response.data || {}
this.tableData = data.records || []
this.total = data.total || 0
- this.refreshStatCards()
this.loading = false
}).catch(() => {
this.tableData = []
this.total = 0
- this.refreshStatCards()
this.loading = false
})
},
@@ -481,18 +482,56 @@ export default {
}
this.loadList()
},
- refreshStatCards() {
- const list = this.tableData
- this.statCards = [
- { title: '本页申请', value: list.length, gradient: 'linear-gradient(135deg, #00875a 0%, #00b877 100%)', filter: undefined },
- { title: '教研室待审批', value: list.filter(i => i.jyspzzt === 0).length, gradient: 'linear-gradient(135deg, #e6a23c 0%, #f8b04c 100%)', filter: 0 },
- { title: '教研室已同意', value: list.filter(i => i.jyspzzt === 1).length, gradient: 'linear-gradient(135deg, #409eff 0%, #66b1ff 100%)', filter: 1 },
- { title: '教研室已拒绝', value: list.filter(i => i.jyspzzt === 3).length, gradient: 'linear-gradient(135deg, #f56c6c 0%, #f78989 100%)', filter: 3 }
+ loadStatistics() {
+ const baseParams = {
+ nd: this.defaultNd,
+ pageNum: 1,
+ pageSize: 1
+ }
+ const statusFilters = [undefined, 0, 1, 3]
+ const requests = statusFilters.map(status => {
+ const params = Object.assign({}, baseParams)
+ if (status !== undefined) {
+ params.jyspzzt = status
+ }
+ return listScheduleAdjust(params)
+ .then(response => Number((response.data && response.data.total) || 0))
+ .catch(() => 0)
+ })
+ return Promise.all(requests).then(counts => {
+ this.statCards = this.createStatCards(counts)
+ })
+ },
+ createStatCards(counts) {
+ return [
+ {
+ title: '本页申请',
+ value: counts[0],
+ gradient: 'linear-gradient(135deg, #00875a 0%, #00b877 100%)',
+ filter: undefined
+ },
+ {
+ title: '教研室待审批',
+ value: counts[1],
+ gradient: 'linear-gradient(135deg, #e6a23c 0%, #f8b04c 100%)',
+ filter: 0
+ },
+ {
+ title: '教研室已同意',
+ value: counts[2],
+ gradient: 'linear-gradient(135deg, #409eff 0%, #66b1ff 100%)',
+ filter: 1
+ },
+ {
+ title: '教研室已拒绝',
+ value: counts[3],
+ gradient: 'linear-gradient(135deg, #f56c6c 0%, #f78989 100%)',
+ filter: 3
+ }
]
},
handleStatClick(card) {
- if (card.filter === undefined) return
- this.queryParams.jyspzzt = this.queryParams.jyspzzt === card.filter ? undefined : card.filter
+ this.queryParams.jyspzzt = card.filter
this.handleQuery()
},
/* ---------- 新增申请 ---------- */
diff --git a/frontend/src/views/teachBusiness/trainingPlan/index.vue b/frontend/src/views/teachBusiness/trainingPlan/index.vue
index 21811aa2b..41d759ad9 100644
--- a/frontend/src/views/teachBusiness/trainingPlan/index.vue
+++ b/frontend/src/views/teachBusiness/trainingPlan/index.vue
@@ -146,24 +146,27 @@
:close-on-click-modal="false">
-
-
-
-
-
-
-
-
-
-
-
+
+
+
@@ -207,7 +210,20 @@
-
+
+
+
@@ -231,8 +247,21 @@
-
-
+
+
+
+
@@ -294,7 +323,7 @@
{{ fmtVal(detail.data.zybb) }}
{{ fmtYesNo(detail.data.zgzy) }}
{{ fmtVal(detail.data.zdyfl) }}
- {{ fmtVal(detail.data.jxgljgbh) }}
+ {{ fmtVal(detail.data.jxgljgbh) }}
{{ fmtVal(detail.data.gfmc) }}
{{ fmtVal(detail.data.zygf) }}
{{ fmtVal(detail.data.jc) }}
@@ -326,6 +355,7 @@ import {
listTraining
} from '@/api/teachBusiness/training'
import { getDicts } from '@/api/system/dict/data'
+import { optionselect } from '@/api/system/dict/type'
const TRAINING_TYPE_DICT_CODE = 'train_type'
const TRAINING_LEVEL_DICT_CODE = 'train_level'
@@ -344,6 +374,9 @@ export default {
},
trainingTypeOptions: [],
trainingLevelOptions: [],
+ majorDirectionOptions: [],
+ studentCategoryOptions: [],
+ teachingOrganizationOptions: [],
// 列表
tableData: [],
total: 0,
@@ -367,9 +400,7 @@ export default {
data: {}
},
rules: {
- zydh: [{ required: true, message: '请输入专业代号', trigger: 'blur' }],
zymc: [{ required: true, message: '请输入专业名称', trigger: 'blur' }],
- zydm: [{ required: true, message: '请输入专业代码', trigger: 'blur' }],
pxcc: [{ required: true, message: '请选择培训层次', trigger: 'change' }],
pxlx: [{ required: true, message: '请选择培训类型', trigger: 'change' }]
}
@@ -381,19 +412,66 @@ export default {
},
methods: {
/**
- * 从系统字典加载培训类型和培训层次,提交标签以匹配现有业务数据。
+ * 从系统字典加载表单下拉选项;文本业务字段提交标签,机构字段提交编号。
*/
- loadTrainingDictionaries() {
- return Promise.all([
- getDicts(TRAINING_TYPE_DICT_CODE),
- getDicts(TRAINING_LEVEL_DICT_CODE)
- ]).then(([typeResponse, levelResponse]) => {
- this.trainingTypeOptions = typeResponse.data || []
- this.trainingLevelOptions = levelResponse.data || []
- }).catch(() => {
- this.trainingTypeOptions = []
- this.trainingLevelOptions = []
+ async loadTrainingDictionaries() {
+ const emptyResponse = { data: [] }
+ const [typeResponse, levelResponse, dictTypeResponse] = await Promise.all([
+ getDicts(TRAINING_TYPE_DICT_CODE).catch(() => emptyResponse),
+ getDicts(TRAINING_LEVEL_DICT_CODE).catch(() => emptyResponse),
+ optionselect().catch(() => emptyResponse)
+ ])
+ this.trainingTypeOptions = typeResponse.data || []
+ this.trainingLevelOptions = levelResponse.data || []
+
+ const dictTypes = dictTypeResponse.data || []
+ const [directionOptions, categoryOptions, organizationOptions] = await Promise.all([
+ this.loadNamedDictionary(dictTypes, '专业方向'),
+ this.loadNamedDictionary(dictTypes, '学员类别'),
+ this.loadNamedDictionary(dictTypes, '教学管理机构')
+ ])
+ this.majorDirectionOptions = directionOptions
+ this.studentCategoryOptions = categoryOptions
+ this.teachingOrganizationOptions = organizationOptions
+ this.mergeExistingSelectOptions()
+ },
+ async loadNamedDictionary(dictTypes, dictName) {
+ const dictType = dictTypes.find(item => item.dictName === dictName) ||
+ dictTypes.find(item => String(item.dictName || '').includes(dictName))
+ if (!dictType || !dictType.dictType) {
+ return []
+ }
+ try {
+ const response = await getDicts(dictType.dictType)
+ return response.data || []
+ } catch (error) {
+ return []
+ }
+ },
+ mergeExistingSelectOptions() {
+ this.majorDirectionOptions = this.mergeTextOptions(this.majorDirectionOptions, 'zyfx', true)
+ this.studentCategoryOptions = this.mergeTextOptions(this.studentCategoryOptions, 'xylb', true)
+ this.teachingOrganizationOptions = this.mergeTextOptions(
+ this.teachingOrganizationOptions,
+ 'jxgljgbh',
+ false
+ )
+ },
+ mergeTextOptions(dictionaryOptions, fieldName, usesLabel) {
+ const options = dictionaryOptions.slice()
+ const existingValues = new Set(options.map(item => String(usesLabel ? item.dictLabel : item.dictValue)))
+ this.tableData.forEach(row => {
+ const value = row[fieldName]
+ if (value === '' || value === null || value === undefined || existingValues.has(String(value))) {
+ return
+ }
+ options.push({
+ dictLabel: String(value),
+ dictValue: String(value)
+ })
+ existingValues.add(String(value))
})
+ return options
},
/* ---------- 列表加载 ---------- */
@@ -413,6 +491,7 @@ export default {
const data = response.data || {}
this.tableData = data.records || []
this.total = data.total || 0
+ this.mergeExistingSelectOptions()
}).catch(() => {
this.tableData = []
this.total = 0