|
|
@@ -1,35 +1,49 @@
|
|
|
<template>
|
|
|
<div class="app_container">
|
|
|
<!-- 顶部科目选择区域 -->
|
|
|
- <div class="section">
|
|
|
- <div class="section_title">选择科目 (6选3):</div>
|
|
|
+ <div class="section" v-if="electiveFormItm?.label">
|
|
|
+ <div class="section_title">{{electiveFormItm?.label}}:</div>
|
|
|
<el-checkbox-group
|
|
|
v-model="selectedSubjects"
|
|
|
class="check_group_btn_list"
|
|
|
@change="(val)=>handleSelectChange(val)">
|
|
|
<el-checkbox-button
|
|
|
- v-for="checkItem in subjectList"
|
|
|
- :key="checkItem.id"
|
|
|
- :label="checkItem.name"
|
|
|
- :value="checkItem.id"/>
|
|
|
+ v-for="checkItem in electiveFormItm?.selectList"
|
|
|
+ :key="checkItem.value"
|
|
|
+ :label="checkItem.label"
|
|
|
+ :value="checkItem.value"/>
|
|
|
</el-checkbox-group>
|
|
|
</div>
|
|
|
|
|
|
- <!-- 动态渲染的班级列表区域 -->
|
|
|
- <template v-for="sub in selectedSubjectDetail" :key="sub.id">
|
|
|
+ <!-- 非选科班级列表 -->
|
|
|
+ <template v-for="sub in noElectiveTeachingSubjectFormItms" :key="sub.key">
|
|
|
<div class="section">
|
|
|
- <div class=" section_title">{{ sub.name }}班级:</div>
|
|
|
- <!-- 模拟数据:每个科目生成多个班级选项 -->
|
|
|
+ <div class=" section_title">{{ sub.label }}:</div>
|
|
|
<el-radio-group
|
|
|
- v-model="selected_classes[sub.id]"
|
|
|
+ v-model="selectedSubjectClasses[sub.key]"
|
|
|
class="radio_group_list">
|
|
|
- <el-radio v-for="n in 10" :key="n" :value="n">
|
|
|
- {{ sub.name }}{{ n }}班
|
|
|
+ <el-radio v-for="classItm in sub.selectList" :key="classItm.value" :value="classItm.value">
|
|
|
+ {{ classItm.label }}
|
|
|
</el-radio>
|
|
|
</el-radio-group>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
+ <!-- 动态渲染选科的班级列表区域 -->
|
|
|
+ <template v-for="sub in electiveTeachingSubjectFormItms" :key="sub.key">
|
|
|
+ <div class="section">
|
|
|
+ <div class=" section_title">{{ sub.label }}:</div>
|
|
|
+ <el-radio-group
|
|
|
+ v-model="selectedSubjectClasses[sub.key]"
|
|
|
+ class="radio_group_list">
|
|
|
+ <el-radio v-for="classItm in sub.selectList"
|
|
|
+ :key="classItm.value"
|
|
|
+ :value="classItm.value">
|
|
|
+ {{ classItm.label }}
|
|
|
+ </el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
<!-- 底部确认按钮 -->
|
|
|
<div class="bottom_action_bar">
|
|
|
<el-button class="button_background" @click="handle_confirm">确认</el-button>
|
|
|
@@ -41,159 +55,210 @@
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
import { onMounted, ref,computed } from 'vue';
|
|
|
+import { useRouter } from 'vue-router';
|
|
|
+import {getEvaluationSubjectApi, saveEvaluationSubjectApi} from '@/api/questionnaireTaskListPage'
|
|
|
+import { ElMessage } from 'element-plus';
|
|
|
+
|
|
|
+
|
|
|
+interface FormItm {
|
|
|
+ key: String,
|
|
|
+ label: String,
|
|
|
+ type?:string,
|
|
|
+ rules?: any[],
|
|
|
+ hidden?: Boolean,
|
|
|
+ custom:Boolean,
|
|
|
+ style: Record<string, any>,
|
|
|
+ selectList?: { label: string, value: any }[] | [],
|
|
|
+}
|
|
|
|
|
|
-import {getEvaluationSubjectApi} from '@/api/questionnaireTaskListPage'
|
|
|
|
|
|
+const router = useRouter()
|
|
|
|
|
|
// 存储 获取到的选科 和教学班数据
|
|
|
-const electiveFormItm = ref() // 选科 form项配置
|
|
|
-const noElectiveTeachingSubjectFormItms = ref([]) // 非选科 教学班form项配置
|
|
|
+const electiveFormItm = ref<FormItm|null>({}) // 选科 form项配置
|
|
|
+const noElectiveTeachingSubjectFormItms = ref<FormItm[]>([]) // 非选科 教学班form项配置
|
|
|
const electiveSubjectClassData = ref([]) // 所有的选科教学班数据 ————后续动态过滤
|
|
|
+const electiveTeachingSubjectFormItms = ref<FormItm[]>([]) // 选科 教学班form项配置 _动态变量
|
|
|
|
|
|
+const electiveNeedCount = ref(0) //选科的必选数量
|
|
|
|
|
|
// 存储选中的 选科/班级 项目
|
|
|
const selectedElectives = ref([]) // 选中的选科项
|
|
|
const selectedTeachingClass = ref<Record<string,string[]>>({}) // 选中的教学班 班级项
|
|
|
|
|
|
+// 选中的信息
|
|
|
+const selectedSubjectClasses = ref<Record<string,string>>({}); // 已选科目的班级id 列表
|
|
|
+const selectedSubjects = ref<string[]>([]) // 已选中的科目列表
|
|
|
|
|
|
-onMounted( async()=>{
|
|
|
- // console.log('加载了')
|
|
|
- // let res = await getEvaluationSubjectApi()
|
|
|
- // if(res?.code == 200){
|
|
|
- // const {classData, subjectData,needCount,selectionCount,selectionStatus } = res.data
|
|
|
-
|
|
|
- // // 1. 选科数据 配置项
|
|
|
- // let electiveSubjectOptions = subjectData?.map(item=>{
|
|
|
- // return {
|
|
|
- // label:item.name,
|
|
|
- // value:item.id
|
|
|
- // }
|
|
|
- // }) || []
|
|
|
- // selectedElectives.value = subjectData?.filter(subject=>{
|
|
|
- // return subject.usedStatus // 是否选中,false-否,true-是
|
|
|
- // }).map(itm=>{
|
|
|
- // return itm.id
|
|
|
- // })
|
|
|
-
|
|
|
-
|
|
|
- // // 选科表单项配置
|
|
|
- // // selectionStatus 选科状态,0-未勾选,1-已勾选
|
|
|
- // if(selectionStatus == 1){
|
|
|
- // electiveFormItm.value = {
|
|
|
- // key: 'electiveSubject',
|
|
|
- // label: `选择科目(${selectionCount}选${needCount})`,
|
|
|
- // type:'checkboxButton',
|
|
|
- // rules:[
|
|
|
- // {required:true,trigger:'blur',message:'请选择'}
|
|
|
- // ],
|
|
|
- // hidden:false,
|
|
|
- // custom:false,
|
|
|
- // style:{},
|
|
|
- // selectList:electiveSubjectOptions,
|
|
|
- // }
|
|
|
- // }else{
|
|
|
- // electiveFormItm.value = null
|
|
|
- // }
|
|
|
-
|
|
|
-
|
|
|
- // // 2. 教学班数据
|
|
|
- // // 分为在选科中的和不在选科中的
|
|
|
- // // (1)非选科的 科目教学班数据
|
|
|
- // const noElectiveSubjectClassData = classData.filter(item=>{
|
|
|
- // return item.subjectStatus === 0
|
|
|
- // })
|
|
|
- // // 非选科的 科目教学班配置项列表
|
|
|
- // noElectiveTeachingSubjectFormItms.value = noElectiveSubjectClassData.map(subjectMsg=>{
|
|
|
- // let classOpts = subjectMsg?.classData?.map(classItm=>{
|
|
|
- // return {label:classItm.name, value:classItm.id}
|
|
|
- // }) || []
|
|
|
-
|
|
|
- // return {
|
|
|
- // key: subjectMsg.evaluationSubjectId,
|
|
|
- // label: subjectMsg.subjectName,
|
|
|
- // type:'radio',
|
|
|
- // rules:[
|
|
|
- // {required:true,trigger:'blur',message:'请选择'}
|
|
|
- // ],
|
|
|
- // hidden:false,
|
|
|
- // custom:false,
|
|
|
- // style:{},
|
|
|
- // selectList:classOpts,
|
|
|
- // }
|
|
|
- // })
|
|
|
-
|
|
|
-
|
|
|
- // // (2)选科 的科目教学班数据
|
|
|
- // electiveSubjectClassData.value = classData?.filter(item=>{
|
|
|
- // return item.subjectStatus === 1
|
|
|
- // }) || []
|
|
|
-
|
|
|
-
|
|
|
- // //(3) 每个科目的默认选中班级赋值
|
|
|
- // classData?.map(subjectClass=>{
|
|
|
- // let selectedClass = subjectClass.classData.filter(classItm=>{
|
|
|
- // return classItm.usedStatus
|
|
|
- // }).map(itm=>{
|
|
|
- // return itm.id
|
|
|
- // })
|
|
|
- // selectedTeachingClass.value[subjectClass.evaluationSubjectId] = selectedClass
|
|
|
- // })
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- // // 3. 最终的教学班配置项列表
|
|
|
- // // 默认只显示 非选科中的科目教学班数据
|
|
|
- // // formItemList.value =electiveFormItm.value ? [
|
|
|
- // // electiveFormItm.value,
|
|
|
- // // ...noElectiveTeachingSubjectFormItms.value
|
|
|
- // // ] : noElectiveTeachingSubjectFormItms.value
|
|
|
+
|
|
|
+
|
|
|
+// 切换科目选中状态
|
|
|
+const handleSelectChange = (val)=>{
|
|
|
+ // 先要限制科目数量
|
|
|
+ // if(val.length >2){
|
|
|
+ // selectedSubjects.value.splice(0, val.length- 2)
|
|
|
// }
|
|
|
|
|
|
-})
|
|
|
+ // 选中状态也需要更新
|
|
|
+ let exitstSelectedKeys = Object.keys(selectedSubjectClasses.value)
|
|
|
+ let fixedKeys= noElectiveTeachingSubjectFormItms.value?.map(item=>item.key)
|
|
|
+ let deleteKeys = exitstSelectedKeys.filter(key=>{
|
|
|
+ !(fixedKeys.includes(key) || val.includes(key))
|
|
|
+ })
|
|
|
+ // 删除不在页面上展示的已选中班级项
|
|
|
+ deleteKeys.map(item=>{
|
|
|
+ delete selectedSubjectClasses.value[item]
|
|
|
+ })
|
|
|
|
|
|
|
|
|
-// ======================================
|
|
|
+ // 动态的 选科 科目班级 配置(展示)项列表
|
|
|
+ let finalElectiveTeachingSubjectData = electiveSubjectClassData.value.filter(item=>{
|
|
|
+ return val.includes(item.evaluationSubjectId)
|
|
|
+ })?.map(subjectMsg=>{
|
|
|
+ let classOpts = subjectMsg?.classData?.map(classItm=>{
|
|
|
+ return {label:classItm.name, value:classItm.id}
|
|
|
+ }) || []
|
|
|
+ return {
|
|
|
+ key: subjectMsg.evaluationSubjectId,
|
|
|
+ label: subjectMsg.subjectName,
|
|
|
+ type:'radio',
|
|
|
+ rules:[
|
|
|
+ {required:true,trigger:'blur',message:'请选择'}
|
|
|
+ ],
|
|
|
+ hidden:false,
|
|
|
+ custom:false,
|
|
|
+ style:{},
|
|
|
+ selectList:classOpts,
|
|
|
+ }
|
|
|
+ })
|
|
|
+ // // 动态变更 教学班选项的信息
|
|
|
+ electiveTeachingSubjectFormItms.value = finalElectiveTeachingSubjectData
|
|
|
+}
|
|
|
|
|
|
|
|
|
|
|
|
+// 点击确认
|
|
|
+const handle_confirm = async () => {
|
|
|
+ let evaluationSubjectIds = selectedSubjects.value
|
|
|
|
|
|
-// 初始化科目数据
|
|
|
-const subjectList = ref([
|
|
|
- { id: 'phy', name: '物理', is_selected: true },
|
|
|
- { id: 'chem', name: '化学', is_selected: true },
|
|
|
- { id: 'bio', name: '生物', is_selected: true },
|
|
|
- { id: 'pol', name: '政治', is_selected: false },
|
|
|
- { id: 'his', name: '历史', is_selected: false },
|
|
|
- { id: 'geo', name: '地理', is_selected: false },
|
|
|
-]);
|
|
|
+ let subjectClassObj = {...selectedSubjectClasses.value}
|
|
|
|
|
|
-// 存储已选科目的班级ID,结构如: { phy: 1, chem: 2 }
|
|
|
-const selected_classes = ref({});
|
|
|
|
|
|
-// 获取当前已选中的科目列表
|
|
|
-const selectedSubjects = ref([])
|
|
|
+ // 最终提交只保留 展示的项
|
|
|
+ let evaluationClassIds = Object.values(subjectClassObj)
|
|
|
|
|
|
-const selectedSubjectDetail = computed(()=>{
|
|
|
- return subjectList.value.filter(subject=>{
|
|
|
- return selectedSubjects.value?.includes(subject.id)
|
|
|
- })
|
|
|
-})
|
|
|
|
|
|
-// 切换科目选中状态
|
|
|
-const handleSelectChange = ()=>{
|
|
|
+ if(evaluationSubjectIds.length > electiveNeedCount.value){
|
|
|
+ ElMessage.warning(`选科数量最多为${electiveNeedCount.value}个`)
|
|
|
+ return
|
|
|
+ }else if(evaluationSubjectIds.length < electiveNeedCount.value){
|
|
|
+ ElMessage.warning(`选科数量最少为${electiveNeedCount.value}个`)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if(evaluationClassIds.length < (noElectiveTeachingSubjectFormItms.value.length + electiveTeachingSubjectFormItms.value.length)){
|
|
|
+ ElMessage.warning('请确保选科班级填写完整')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ let transferParams = {
|
|
|
+ evaluationSubjectIds,
|
|
|
+ evaluationClassIds
|
|
|
+ }
|
|
|
+ let res = undefined
|
|
|
+ try{
|
|
|
+ res = await saveEvaluationSubjectApi(transferParams)
|
|
|
+ }catch{}
|
|
|
+ if(res?.code == 200){
|
|
|
+ router.push('/app/selfQuestionnaireProcess')
|
|
|
+ }
|
|
|
+};
|
|
|
|
|
|
-}
|
|
|
|
|
|
+onMounted( async()=>{
|
|
|
+ console.log('加载了')
|
|
|
+ let res = await getEvaluationSubjectApi()
|
|
|
+ if(res?.code == 200){
|
|
|
+ const {classData, subjectData,needCount,selectionCount,selectionStatus } = res.data
|
|
|
+
|
|
|
+ // 1. 选科数据 配置项
|
|
|
+ let electiveSubjectOptions = subjectData?.map(item=>{
|
|
|
+ return {
|
|
|
+ label:item.name,
|
|
|
+ value:item.id
|
|
|
+ }
|
|
|
+ }) || []
|
|
|
+ selectedElectives.value = subjectData?.filter(subject=>{
|
|
|
+ return subject.usedStatus // 是否选中,false-否,true-是
|
|
|
+ }).map(itm=>{
|
|
|
+ return itm.id
|
|
|
+ })
|
|
|
+
|
|
|
+
|
|
|
+ // 选科表单项配置
|
|
|
+ electiveNeedCount.value = needCount
|
|
|
+ // selectionStatus 选科状态,0-未勾选,1-已勾选
|
|
|
+ if(selectionStatus == 1){
|
|
|
+ electiveFormItm.value = {
|
|
|
+ key: 'electiveSubject',
|
|
|
+ label: `选择科目(${selectionCount}选${needCount})`,
|
|
|
+ type:'checkboxButton',
|
|
|
+ rules:[
|
|
|
+ {required:true,trigger:'blur',message:'请选择'}
|
|
|
+ ],
|
|
|
+ hidden:false,
|
|
|
+ custom:false,
|
|
|
+ style:{},
|
|
|
+ selectList:electiveSubjectOptions,
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ electiveFormItm.value = null
|
|
|
+ }
|
|
|
|
|
|
|
|
|
+ // 2. 教学班数据
|
|
|
+ // 分为在选科中的和不在选科中的
|
|
|
+ // (1)非选科的 科目教学班数据
|
|
|
+ const noElectiveSubjectClassData = classData.filter(item=>{
|
|
|
+ return item.subjectStatus === 0
|
|
|
+ })
|
|
|
+ // 非选科的 科目教学班配置项列表
|
|
|
+ noElectiveTeachingSubjectFormItms.value = noElectiveSubjectClassData.map(subjectMsg=>{
|
|
|
+ let classOpts = subjectMsg?.classData?.map(classItm=>{
|
|
|
+ return {label:classItm.name, value:classItm.id}
|
|
|
+ }) || []
|
|
|
+
|
|
|
+ return {
|
|
|
+ key: subjectMsg.evaluationSubjectId,
|
|
|
+ label: subjectMsg.subjectName,
|
|
|
+ type:'radio',
|
|
|
+ rules:[
|
|
|
+ {required:true,trigger:'blur',message:'请选择'}
|
|
|
+ ],
|
|
|
+ hidden:false,
|
|
|
+ custom:false,
|
|
|
+ style:{},
|
|
|
+ selectList:classOpts,
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+
|
|
|
+ // (2)选科 的科目教学班数据
|
|
|
+ electiveSubjectClassData.value = classData?.filter(item=>{
|
|
|
+ return item.subjectStatus === 1
|
|
|
+ }) || []
|
|
|
|
|
|
-// 点击确认
|
|
|
-const handle_confirm = () => {
|
|
|
- console.log('选科结果:', selectedSubjects.value);
|
|
|
- console.log('班级选择:', selected_classes.value);
|
|
|
- // 这里可以添加校验逻辑,例如必须为每个选中的科目选择班级
|
|
|
- alert('提交成功,请查看控制台输出');
|
|
|
-};
|
|
|
+
|
|
|
+ //(3) 每个科目的默认选中班级赋值
|
|
|
+ classData?.map(subjectClass=>{
|
|
|
+ let selectedClass = subjectClass.classData.filter(classItm=>{
|
|
|
+ return classItm.usedStatus
|
|
|
+ }).map(itm=>{
|
|
|
+ return itm.id
|
|
|
+ })
|
|
|
+ selectedTeachingClass.value[subjectClass.evaluationSubjectId] = selectedClass
|
|
|
+ })
|
|
|
+ }
|
|
|
+})
|
|
|
|
|
|
|
|
|
</script>
|
|
|
@@ -205,11 +270,18 @@ const handle_confirm = () => {
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
gap:calc(32 * var(--app-rpx));
|
|
|
+
|
|
|
overflow: auto;
|
|
|
width: 100%;
|
|
|
min-height: 100vh;
|
|
|
background-color: #ffffff;
|
|
|
- padding:calc(30 * var(--app-rpx)) calc(19 * var(--app-rpx)) calc(104 * var(--app-rpx)); /* 为底部按钮留出空间 */
|
|
|
+
|
|
|
+ // 44px塌陷 ___原因未找到———— 待完善
|
|
|
+ padding:calc(30 * var(--app-rpx)) calc(19 * var(--app-rpx)) calc((84 + 20 + 44) * var(--app-rpx)); /* 为底部按钮留出空间 */
|
|
|
+
|
|
|
+ > * {
|
|
|
+ flex-shrink: 0;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
.section{
|