Преглед изворни кода

课程类型添加逻辑:只允许存在一层主题/年级,二级也只允许出现一层类型/通识课、实操课

liyanbo пре 5 месеци
родитељ
комит
25fb0cfd16

+ 44 - 5
src/views/bjdx/coursetype/CourseTypeForm.vue

@@ -19,14 +19,14 @@
           check-strictly
           default-expand-all
           placeholder="请选择课程父级类型"
+          @change="handleParentChange"
         />
       </el-form-item>
       <el-form-item label="课程类型节点" prop="ctTypeNode">
-        <el-segmented v-model="formData.ctTypeNode" :options="[
-          { label: '年级', value: '0' },
-          { label: '通识课', value: '1' },
-          { label: '实操课', value: '2' },
-        ]" />
+        <el-segmented 
+          v-model="formData.ctTypeNode" 
+          :options="segmentedOptions"
+        />
       </el-form-item>
       <el-form-item label="课程类型名称" prop="ctType">
         <el-input v-model="formData.ctType" placeholder="请输入课程类型名称" />
@@ -85,6 +85,33 @@ const formRules = reactive({
 const formRef = ref() // 表单 Ref
 const courseTypeTree = ref() // 树形结构
 
+// 计算属性:判断父级ID是否为根节点(0)
+const isRootParent = computed(() => {
+  return formData.value.ctParentId === 0 || formData.value.ctParentId === '0'
+})
+
+// 分段控件选项(根据父级ID动态配置禁用状态)
+const segmentedOptions = computed(() => {
+  return [
+    { label: '年级', value: '0', disabled: !isRootParent.value },  // 非根节点时禁用年级
+    { label: '通识课', value: '1', disabled: isRootParent.value },  // 根节点时禁用通识课
+    { label: '实操课', value: '2', disabled: isRootParent.value },  // 根节点时禁用实操课
+  ]
+})
+
+// 处理父级类型变更
+const handleParentChange = () => {
+  if (isRootParent.value) {
+    // 当父级是根节点时,强制设置为年级类型
+    formData.value.ctTypeNode = '0'
+  } else {
+    // 当父级不是根节点时,如果当前类型是年级,则改为通识课
+    if (formData.value.ctTypeNode === '0' || formData.value.ctTypeNode === 0) {
+      formData.value.ctTypeNode = '1'
+    }
+  }
+}
+
 /** 打开弹窗 */
 const open = async (type: string, id?: number, parentId?: number) => {
   dialogVisible.value = true
@@ -93,12 +120,24 @@ const open = async (type: string, id?: number, parentId?: number) => {
   resetForm()
   if (parentId) {
     formData.value.ctParentId = parentId
+    // 根据父级ID设置默认的类型节点
+    if (parentId === 0 || parentId === '0') {
+      formData.value.ctTypeNode = '0' // 根节点时默认年级
+    } else {
+      formData.value.ctTypeNode = '1' // 非根节点时默认通识课
+    }
   }
   // 修改时,设置数据
   if (id) {
     formLoading.value = true
     try {
       formData.value = await CourseTypeApi.getCourseType(id)
+      // 确保类型与父级ID匹配
+      if (isRootParent.value && formData.value.ctTypeNode !== '0') {
+        formData.value.ctTypeNode = '0'
+      } else if (!isRootParent.value && formData.value.ctTypeNode === '0') {
+        formData.value.ctTypeNode = '1'
+      }
     } finally {
       formLoading.value = false
     }

+ 1 - 1
src/views/bjdx/coursetype/index.vue

@@ -108,7 +108,7 @@
           <el-button
             link
             type="primary"
-            v-if="scope.row.tenantId == getTenantId()"
+            v-if="scope.row.tenantId == getTenantId() && scope.row.ctTypeNode == '0'"
             @click="openForm('create', undefined, scope.row.id)"
             v-hasPermi="['bjdx:course-type:create']"
           >

+ 44 - 4
src/views/blockly/blocklyType/BlocklyTypeForm.vue

@@ -19,13 +19,14 @@
           check-strictly
           default-expand-all
           placeholder="请选择课程父级类型"
+          @change="handleParentChange"
         />
       </el-form-item>
       <el-form-item label="课程类型节点" prop="ctTypeNode">
-        <el-segmented v-model="formData.ctTypeNode" :options="[
-          { label: '主题', value: '0' },
-          { label: '类型', value: '1' },
-        ]" />
+        <el-segmented 
+          v-model="formData.ctTypeNode" 
+          :options="segmentedOptions"
+        />
       </el-form-item>
       <el-form-item label="课程类型名称" prop="ctType">
         <el-input v-model="formData.ctType" placeholder="请输入课程类型名称" />
@@ -84,6 +85,32 @@ const formRules = reactive({
 const formRef = ref() // 表单 Ref
 const blocklyTypeTree = ref() // 树形结构
 
+// 计算属性:判断父级ID是否为根节点(0)
+const isRootParent = computed(() => {
+  return formData.value.ctParentId === 0 || formData.value.ctParentId === '0'
+})
+
+// 分段控件选项(根据父级ID动态配置禁用状态)
+const segmentedOptions = computed(() => {
+  return [
+    { label: '主题', value: '0', disabled: !isRootParent.value },  // 非根节点时禁用主题
+    { label: '类型', value: '1', disabled: isRootParent.value },   // 根节点时禁用类型
+  ]
+})
+
+// 处理父级类型变更
+const handleParentChange = () => {
+  if (isRootParent.value) {
+    // 当父级是根节点时,强制设置为主题类型
+    formData.value.ctTypeNode = '0'
+  } else {
+    // 当父级不是根节点时,如果当前类型是主题,则改为类型
+    if (formData.value.ctTypeNode === '0' || formData.value.ctTypeNode === 0) {
+      formData.value.ctTypeNode = '1'
+    }
+  }
+}
+
 /** 打开弹窗 */
 const open = async (type: string, id?: number, parentId?: number) => {
   dialogVisible.value = true
@@ -92,12 +119,25 @@ const open = async (type: string, id?: number, parentId?: number) => {
   resetForm()
   if (parentId) {
     formData.value.ctParentId = parentId
+    // 根据父级ID设置默认的类型节点
+    if (parentId !== 0 && parentId !== '0') {
+      formData.value.ctTypeNode = '1' // 非根节点时默认类型
+    } else {
+      formData.value.ctTypeNode = '0' // 根节点时默认主题
+    }
   }
   // 修改时,设置数据
   if (id) {
     formLoading.value = true
     try {
       formData.value = await BlocklyTypeApi.getBlocklyType(id)
+      // 确保类型与父级ID匹配
+      debugger
+      if (isRootParent.value && formData.value.ctTypeNode !== '0') {
+        formData.value.ctTypeNode = '0'
+      } else if (!isRootParent.value && formData.value.ctTypeNode === '0') {
+        formData.value.ctTypeNode = '1'
+      }
     } finally {
       formLoading.value = false
     }

+ 1 - 1
src/views/blockly/blocklyType/index.vue

@@ -104,7 +104,7 @@
           <el-button
             link
             type="primary"
-            v-if="scope.row.tenantId == getTenantId()"
+            v-if="scope.row.tenantId == getTenantId() && scope.row.ctTypeNode == '0'"
             @click="openForm('create', undefined, scope.row.id)"
             v-hasPermi="['blockly:blockly-type:create']"
           >