lex-xin 6 月之前
父節點
當前提交
6200a408e2

+ 1 - 1
dev-dist/sw.js

@@ -82,7 +82,7 @@ define(['./workbox-88bf3160'], (function (workbox) { 'use strict';
     "revision": "3ca0b8505b4bec776b69afdba2768812"
   }, {
     "url": "index.html",
-    "revision": "0.2kkppsecoao"
+    "revision": "0.as64rvo1j3"
   }], {});
   workbox.cleanupOutdatedCaches();
   workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), {

+ 1 - 1
public/version.json

@@ -1 +1 @@
-{"version":1727084284229}
+{"version":1727149225174}

+ 24 - 8
src/components/card-type/index.module.less

@@ -1,12 +1,4 @@
-:global {
-  .n-card--bordered {
-    border: 1Px solid rgba(202, 228, 244, 1) !important;
 
-    &:hover {
-      border: 1Px solid rgba(0, 122, 254, 1) !important;
-    }
-  }
-}
 
 .card-section-content {
   border-radius: 14px;
@@ -18,6 +10,8 @@
   //   }
   // }
 
+  
+
   // 图片禁止拖动
   img {
     -moz-user-select: none;
@@ -50,6 +44,28 @@
   display: inline-flex;
   transition: all .3s ease-in-out;
 
+  :global {
+    .n-card--bordered {
+      border: 1Px solid rgba(202, 228, 244, 1) !important;
+  
+      &:hover {
+        border: 1Px solid rgba(0, 122, 254, 1) !important;
+      }
+    }
+  }
+
+  &.isError {
+    :global {
+      .n-card--bordered {
+        border: 1Px solid #d03050 !important;
+    
+        &:hover {
+          border: 1Px solid #d03050 !important;
+        }
+      }
+    }
+  }
+
   &.cardDrag {
     cursor: move;
 

+ 6 - 0
src/components/card-type/index.tsx

@@ -112,6 +112,11 @@ export default defineComponent({
     audioPlayTypeSize: {
       type: String as PropType<'default' | 'small'>,
       deafult: 'default'
+    },
+    /** 是否开始错误提示 border isError */
+    isError: {
+      type: Boolean,
+      default: false,
     }
   },
   /**
@@ -267,6 +272,7 @@ export default defineComponent({
         draggable={!props.draggable ? false : props.item.exist ? false : true}
         class={[
           styles['card-section'],
+          props.isError ? styles.isError : '',
           'card-section-container',
           !props.draggable ? '' : props.item.exist ? '' : styles.cardDrag
         ]}

+ 3 - 3
src/views/home/components/practiceData.tsx

@@ -84,6 +84,7 @@ export default defineComponent({
       ];
     };
     const getList = async () => {
+      state.loading = true
       try {
         const res = await getTrainingStatList({
           page: 1,
@@ -120,6 +121,7 @@ export default defineComponent({
       } catch (e) {
         console.log(e);
       }
+      state.loading = false
     };
     expose({ getList });
     const setChart = () => {
@@ -232,9 +234,7 @@ export default defineComponent({
       });
     };
 
-    onMounted(() => {
-      getList();
-    });
+    getList();
 
     return () => (
       <>

+ 9 - 9
src/views/home/components/practiceRanking.tsx

@@ -41,13 +41,13 @@ export default defineComponent({
       console.log('ranking===>');
       return props.timer;
     });
-    const search = () => {
-      console.log('search', state);
-    };
+    // const search = () => {
+    //   console.log('search', state);
+    // };
 
-    const onReset = () => {
-      console.log('search');
-    };
+    // const onReset = () => {
+    //   console.log('search');
+    // };
     const getList = async () => {
       state.loading = true;
       try {
@@ -62,15 +62,15 @@ export default defineComponent({
         });
         state.tableList = res.data.rows;
         state.pagination.pageTotal = res.data.total;
-        state.loading = false;
       } catch (e) {
-        state.loading = false;
+        
         console.log(e);
       }
+      state.loading = false;
     };
     expose({ getList });
+    getList()
     onMounted(async () => {
-      await getList();
 
       nextTick(() => {
         // 把默认的排序删除

+ 3 - 3
src/views/home/components/trainData.tsx

@@ -164,6 +164,7 @@ export default defineComponent({
       });
     };
     const getList = async () => {
+      state.loading = true
       try {
         const res = await getTrainingStat({
           ...getTimes(
@@ -206,6 +207,7 @@ export default defineComponent({
         state.loading = false;
         console.log(e);
       }
+      state.loading = false
     };
     expose({ getList });
     const setChart = () => {
@@ -385,9 +387,7 @@ export default defineComponent({
         // ]
       });
     };
-    onMounted(() => {
-      getList();
-    });
+    getList();
 
     return () => (
       <>

+ 15 - 0
src/views/prepare-lessons/api.ts

@@ -304,3 +304,18 @@ export const api_materialDetail = (id: string) => {
 export const api_lessonCoursewareTeacherCategory = () => {
   return request.get('/edu-app/lessonCourseware/teacherCategory');
 };
+
+
+
+/**
+ *  @description: 备课页面检测声部
+ * @param params
+ */
+export const api_courseScheduleCheck = (params: {
+  classGroupId: string
+  chapterLessonCoursewareId: string
+}) => {
+  return request.post('/edu-app/courseSchedule/check', {
+    data: params
+  });
+};

+ 11 - 32
src/views/prepare-lessons/components/lesson-main/courseware-head/index.tsx

@@ -56,10 +56,16 @@ export default defineComponent({
       updateSubjectList(item.subjects || []);
     };
 
-    const checkCoursewareForm = () => {
+    const checkCoursewareForm = (type: string = 'ALL') => {
       //
-      checkForms.value[0] = forms.name ? '' : 'error';
-      checkForms.value[1] = forms.subjects?.length > 0 ? '' : 'error';
+      if(type === 'name') {
+        checkForms.value[0] = forms.name ? '' : 'error';
+      } else if(type === "subject") {
+        checkForms.value[1] = forms.subjects?.length > 0 ? '' : 'error';
+      } else {
+        checkForms.value[0] = forms.name ? '' : 'error';
+        checkForms.value[1] = forms.subjects?.length > 0 ? '' : 'error';
+      }
     };
 
     const updateSubjectList = (ids?: any[]) => {
@@ -150,35 +156,6 @@ export default defineComponent({
             <span class={[styles.btnTitle]}>
               <span>*</span>课件乐器
             </span>
-            {/* <NSelect
-              status={checkForms.value[1]}
-              placeholder="请选择声部(可多选)"
-              class={styles.btnSubjectList}
-              options={prepareStore.getSubjectList}
-              labelField="name"
-              valueField="id"
-              multiple
-              maxTagCount={2}
-              size="small"
-              v-model:value={forms.subjects}
-              clearable
-              v-slots={{
-                action: () => (
-                  <>
-                    <NButton
-                      text
-                      style=" --n-width: 100% "
-                      size="small"
-                      onClick={() => chioseAll(prepareStore.getSubjectList)}>
-                      全选
-                    </NButton>
-                  </>
-                )
-              }}
-              onUpdate:value={() => {
-                checkForms.value[1] = forms.subjects?.length > 0 ? '' : 'error';
-              }}
-            /> */}
             <NCascader
               status={checkForms.value[1]}
               placeholder="请选择乐器(可多选)"
@@ -197,6 +174,8 @@ export default defineComponent({
               v-model:value={forms.subjects}
               onUpdate:value={() => {
                 checkForms.value[1] = forms.subjects?.length > 0 ? '' : 'error';
+                // console.log(form)
+                eventGlobal.emit('coursewareSubjectChange', forms.subjects)
               }}
               v-slots={{
                 action: () => (

+ 70 - 4
src/views/prepare-lessons/components/lesson-main/courseware-presets/index.tsx

@@ -33,7 +33,8 @@ import {
   api_addByOpenCourseware,
   api_teacherChapterLessonCoursewareRemove,
   teacherChapterLessonCoursewareList,
-  courseScheduleStart
+  courseScheduleStart,
+  api_courseScheduleCheck
 } from '../../../api';
 import { useRoute, useRouter } from 'vue-router';
 import TheMessageDialog from '/src/components/TheMessageDialog';
@@ -91,6 +92,7 @@ export default defineComponent({
       showAttendClass: false,
       attendClassType: 'change', //
       attendClassItem: {} as any,
+      attendClassId: null as any,
       previewModal: false,
       previewParams: {
         type: '',
@@ -99,7 +101,9 @@ export default defineComponent({
         detailId: ''
       } as any,
       workVisiable: false,
-      wikiCategoryIdChild: null
+      wikiCategoryIdChild: null,
+      instrumentErrorVisiable: false,
+      instrumentErrorContent: ""
     });
 
     const getCoursewareList = async () => {
@@ -414,6 +418,45 @@ export default defineComponent({
       }
     };
 
+    /** 上课前检测声部 */
+    const onClassCheckInstrument = async (item: any,
+      classGroupId: any,
+      instrumentId?: any) => {
+        
+      try {
+        if(classGroupId) {
+          const {data} = await api_courseScheduleCheck({
+            classGroupId,
+            chapterLessonCoursewareId: item.id
+          })
+          forms.attendClassItem = item;
+          forms.attendClassId = classGroupId;
+          if(!data.chapterLessonCoursewareFlag) {
+            forms.instrumentErrorVisiable = true;
+            forms.instrumentErrorContent = '课件支持的乐器与班级不符,是否继续使用该课件上课?'
+          } else if(!data.materialFlag) {
+            forms.instrumentErrorVisiable = true;
+            forms.instrumentErrorContent = '课件中含有不符合班级乐器的资源,是否继续使用该课件上课?'
+          } else {
+            onStartClass(
+              item,
+              classGroupId,
+              instrumentId
+            );
+          }
+        } else {
+          onStartClass(
+            item,
+            classGroupId,
+            instrumentId
+          );
+        }
+        
+      } catch {
+        // 
+      }
+    }
+
     const selectChildObj = (item: any) => {
       const obj: any = {};
       item?.forEach((child: any) => {
@@ -581,7 +624,7 @@ export default defineComponent({
                             });
                           }}
                           onStartClass={() =>
-                            onStartClass(item, forms.classGroupId)
+                            onClassCheckInstrument(item, forms.classGroupId)
                           }
                           onDelete={() => {
                             forms.selectItem = item;
@@ -741,6 +784,29 @@ export default defineComponent({
           />
         </NModal>
 
+        <NModal
+          maskClosable={modalClickMask}
+          v-model:show={forms.instrumentErrorVisiable}
+          preset="card"
+          class={['modalTitle', styles.removeVisiable1]}
+          title={'提示'}>
+          <TheMessageDialog
+            content={forms.instrumentErrorContent}
+            contentDirection="left"
+            onClose={() => {
+              forms.instrumentErrorVisiable = false;
+              
+            }}
+            onConfirm={() => {
+              // 
+              onStartClass(
+                forms.attendClassItem,
+                forms.attendClassId
+              );
+            }}
+          />
+        </NModal>
+
         {/* 应用内预览或上课 */}
         <PreviewWindow
           v-model:show={forms.previewModal}
@@ -779,7 +845,7 @@ export default defineComponent({
               }
             }}
             onConfirm={async (item: any) => {
-              onStartClass(
+              onClassCheckInstrument(
                 forms.attendClassItem,
                 item.classGroupId,
                 item.instrumentId

+ 108 - 160
src/views/prepare-lessons/components/lesson-main/courseware/addCourseware.tsx

@@ -12,44 +12,28 @@ import {
   NButton,
   NModal,
   NScrollbar,
-  NSelect,
   NSpace,
   NSpin,
   useMessage,
-  useDialog,
-  NSwitch,
   NInput,
   NTooltip,
-  NImage,
-  NIcon,
   NForm,
   NFormItem
 } from 'naive-ui';
 import CardType from '/src/components/card-type';
-// import AttendClass from '/src/views/prepare-lessons/model/attend-class';
 import { usePrepareStore } from '/src/store/modules/prepareLessons';
-// import { useCatchStore } from '/src/store/modules/catchData';
-// import TheEmpty from '/src/components/TheEmpty';
 import {
   api_teacherChapterLessonCoursewareAdd,
   api_teacherChapterLessonCoursewareUpdate,
   api_teacherChapterLessonCoursewareDetail,
   api_materialDetail
-  // courseScheduleStart,
-  // queryCourseware,
-  // saveCourseware
 } from '../../../api';
 import Draggable from 'vuedraggable';
 import iconDelete from '../../../images/icon-delete-default.png';
 import iconAddMusic from '../../../images/icon-add-music.png';
-// import { onBeforeRouteUpdate, useRoute, useRouter } from 'vue-router';
-// import deepClone from '/src/helpers/deep-clone';
 import CardPreview from '/src/components/card-preview';
 import PreviewWindow from '/src/views/preview-window';
-// import { state } from '/src/state';
-// import SubjectSync from '../../../model/subject-sync';
 import { eventGlobal } from '/src/utils';
-// import iconTips from '../../../images/icon-tips.png';
 import TheMessageDialog from '/src/components/TheMessageDialog';
 import AddItemModel from '../../../model/add-item-model';
 import AddOtherSource from '../../../model/add-other-source';
@@ -67,13 +51,9 @@ export default defineComponent({
   },
   emits: ['change'],
   setup(props, { emit }) {
-    // const catchStore = useCatchStore();
     const userStore = useUserStore();
 
     const prepareStore = usePrepareStore();
-    // const route = useRoute();
-    // const router = useRouter();
-    // const dialog = useDialog();
     const message = useMessage();
 
     const forms = reactive({
@@ -114,7 +94,7 @@ export default defineComponent({
       messageOperation: {
         visiable: false,
         loading: false, // 是否显示加载
-        type: 'delete' as 'delete' | 'addItem' | 'save' | 'pageLive',
+        type: 'delete' as 'delete' | 'addItem' | 'save' | 'pageLive' | 'checkInstrument',
         contentDirection: 'center' as 'left' | 'center' | 'right',
         title: '删除知识点',
         content: '请确认是否删除该知识点,删除知识点后将同步删除知识点下的资源',
@@ -168,6 +148,8 @@ export default defineComponent({
                 type: sub.type,
                 title: sub.bizInfo.name,
                 dataJson: sub.dataJson,
+                instrumentIds: sub.instrumentIds, // 素材编号
+                isError: checkCurrentIsInstrument(sub.instruments), // 是否异常 当前素材是否在选中的乐器里面
                 // isCollect: !!sub.favoriteFlag,
                 isSelected: sub.source === 'PLATFORM' ? true : false,
                 audioPlayTypeArray: sub.audioPlayTypes
@@ -209,6 +191,21 @@ export default defineComponent({
       forms.loadingStatus = false;
     };
 
+    /** 检测当前素材是否包含所选声部 */
+    const checkCurrentIsInstrument = (instruments: string) => {
+      // 当前素材是否在选中的乐器里面
+      let isError = false 
+      if(forms.subjects.length <= 0) {
+        return true
+      }
+      forms.subjects.forEach((item: any) => {
+        if(!instruments?.includes(item)) {
+          isError = true
+        }
+      })
+      return isError
+    }
+
     // 删除
     const onDelete = (j: number, index: number) => {
       const coursewareItem = forms.coursewareList[index];
@@ -271,7 +268,7 @@ export default defineComponent({
       } else if (type === 'addItem') {
         forms.coursewareList.push({ name: '', list: [] });
         addCoursewareItem(forms.addCoursewareItem);
-      } else if (type === 'save' || type === 'pageLive') {
+      } else if (type === 'save' || type === 'pageLive' || type === "checkInstrument") {
         if (forms.messageOperation.loading) return;
         if (!forms.name) {
           message.error('请输入课件标题');
@@ -308,6 +305,9 @@ export default defineComponent({
           return;
         }
 
+        // 检测是否有异常资源
+        if(checkInstrumentIdsSubmit() && type !== 'checkInstrument') return
+
         forms.messageOperation.loading = true;
         const resultStatus = await onSaveCourseWare();
         forms.messageOperation.loading = false;
@@ -318,15 +318,7 @@ export default defineComponent({
           ) {
             forms.messageCallBack();
           }
-          emit('change', {
-            status: false,
-            addParam: {
-              isAdd: !props.groupItem.id ? true : false,
-              name: forms.name,
-              id: forms.createId
-            }
-          });
-          eventGlobal.emit('teacher-slideshow', false);
+          onCancelSave()
         }
       }
       forms.messageOperation.visiable = false;
@@ -456,6 +448,50 @@ export default defineComponent({
       });
     };
 
+    /** 取消保存时处理 */
+    const onCancelSave = () => {
+      emit('change', {
+        status: false,
+        addParam: {
+          isAdd: false,
+          name: forms.name,
+          id: forms.createId
+        }
+      });
+      eventGlobal.emit('teacher-slideshow', false);
+    }
+
+    /** 提交数据前做拦截提示 */
+    const checkInstrumentIdsSubmit = () => {
+      let status = false
+
+      // 修改声部后重新检测状态
+      forms.coursewareList.forEach((item: any) => {
+        const childList = item.list || []
+        childList.forEach((child: any) => {
+          if(child.isError) {
+            status = true
+          }
+        })
+      })
+
+      if(status) {
+        forms.messageOperation = {
+          visiable: true,
+          type: 'checkInstrument',
+          loading: false,
+          contentDirection: 'center',
+          title: '提示',
+          content: '课件中含有不符合课件乐器的资源,是否继续保存?',
+          cancelButtonText: '取消',
+          confirmButtonText: '保存',
+          index: 0
+        };
+      }
+
+      return status
+    }
+
     // 提交
     const onSubmit = async () => {
       try {
@@ -490,22 +526,18 @@ export default defineComponent({
           return;
         }
 
+        // 检测是否有异常资源
+        if(checkInstrumentIdsSubmit()) return
+
         if (forms.openFlag && !userStore.getReadCoursewareOpenAgreement) {
           showModalMask.value = true;
           return;
         }
+
         const resultStatus = await onSaveCourseWare();
 
         if (resultStatus) {
-          emit('change', {
-            status: false,
-            addParam: {
-              isAdd: !props.groupItem.id ? true : false,
-              name: forms.name,
-              id: forms.createId
-            }
-          });
-          eventGlobal.emit('teacher-slideshow', false);
+          onCancelSave()
         }
       } catch {
         //
@@ -567,6 +599,12 @@ export default defineComponent({
     };
 
     const addItem = (item: any, point?: any) => {
+      if(forms.subjects.length <= 0) {
+        message.error('请先选择乐器')
+        eventGlobal.emit('checkCoursewareForm', 'subject')
+        return
+      }
+      item.isError = checkCurrentIsInstrument(item.instrumentIds) // 是否异常
       if (forms.coursewareList.length <= 0) {
         // 添加到临时对象
         forms.addCoursewareItem = item;
@@ -603,16 +641,7 @@ export default defineComponent({
       if (objA === objB && baseA === baseB) {
         if (typeof event == 'function') {
           event();
-
-          emit('change', {
-            status: false,
-            addParam: {
-              isAdd: false,
-              name: forms.name,
-              id: forms.createId
-            }
-          });
-          eventGlobal.emit('teacher-slideshow', false);
+          onCancelSave()
         }
       } else {
         forms.messageCallBack = event;
@@ -648,16 +677,7 @@ export default defineComponent({
       const baseB = JSON.stringify(forms.baseInfo);
 
       if (objA === objB && baseA === baseB) {
-        emit('change', {
-          status: false,
-          addParam: {
-            isAdd: false,
-            name: forms.name,
-            id: forms.createId
-          }
-        });
-
-        eventGlobal.emit('teacher-slideshow', false);
+        onCancelSave()
       } else {
         forms.messageOperation = {
           visiable: true,
@@ -683,6 +703,19 @@ export default defineComponent({
       onSubmit();
     };
 
+    // 声部变化时
+    const onCourseWareSubjectChange = (subjects: any) => {
+      forms.subjects = subjects
+
+      // 修改声部后重新检测状态
+      forms.coursewareList.forEach((item: any) => {
+        const childList = item.list || []
+        childList.forEach((child: any) => {
+          child.isError = checkCurrentIsInstrument(child.instrumentIds)
+        })
+      })
+    }
+
     onMounted(async () => {
       // 修改时重置默认数据
       if (props.groupItem?.id) {
@@ -695,6 +728,9 @@ export default defineComponent({
       eventGlobal.on('onPrepareAddItem', addItem);
       eventGlobal.on('pageBeforeLeave', onPageBeforeLeave);
 
+      // 选择乐器改变时
+      eventGlobal.on('coursewareSubjectChange', onCourseWareSubjectChange)
+
       // 取消
       eventGlobal.on('coursewareClosed', onCancelCourseware);
       // 保存
@@ -704,6 +740,7 @@ export default defineComponent({
     onUnmounted(() => {
       eventGlobal.off('onPrepareAddItem', addItem);
       eventGlobal.off('pageBeforeLeave', onPageBeforeLeave);
+      eventGlobal.off('coursewareSubjectChange', onCourseWareSubjectChange)
       eventGlobal.off('coursewareClosed', onCancelCourseware);
       eventGlobal.off('coursewareSave', onSubmitCourseware);
     });
@@ -734,51 +771,8 @@ export default defineComponent({
               {forms.coursewareList.map((item: any, index: number) => (
                 <div
                   class={[styles.listItems, 'row-group']}
-                  // onDragenter={(e: any) => {
-                  //   e.preventDefault();
-                  // }}
-                  // onDragover={(e: any) => {
-                  //   e.preventDefault();
-                  // }}
-                  // onDrop={(e: any) => {
-                  //   let dropItem = e.dataTransfer.getData('text');
-                  //   dropItem =
-                  //     dropItem && e.dataTransfer.effectAllowed === 'all'
-                  //       ? JSON.parse(dropItem)
-                  //       : {};
-                  //   // 判断是否有数据
-                  //   if (dropItem.id) {
-                  //     // 获取拖拽的目标元素
-                  //     eventGlobal.emit(
-                  //       'onPrepareAddItem',
-                  //       {
-                  //         materialId: dropItem.id,
-                  //         coverImg: dropItem.coverImg,
-                  //         type: dropItem.type,
-                  //         title: dropItem.title,
-                  //         refFlag: dropItem.refFlag,
-                  //         isCollect: dropItem.isCollect,
-                  //         isSelected: dropItem.isSelected,
-                  //         content: dropItem.content,
-                  //         removeFlag: false,
-                  //         index,
-                  //         addType: 'drag'
-                  //       },
-                  //       {
-                  //         x: e.clientX,
-                  //         y: e.clientY
-                  //       }
-                  //     );
-                  //   }
-                  // }}
                 >
                   <div class={styles.knowledgePoint}>
-                    {/* <div class={styles.btnItem}>
-                      <span class={styles.btnTitle}>
-                        <span>*</span>知识点名称:
-                      </span>
-
-                    </div> */}
                     <NFormItem
                       class={styles.btnItem}
                       label="知识点名称"
@@ -847,27 +841,19 @@ export default defineComponent({
                     // @ts-ignore
                     group="description"
                     scroll={true}
-                    // scrollSensitivity={120}
-                    // forceAutoScrollFallback={true}
                     animation={200}
-                    // onChange={(evt: any) => {
-                    //   const added = evt.added;
-                    //   // 是否为添加
-                    //   if (!added || (added && !added.element)) {
-                    //     return;
-                    //   }
-
-                    //   if (added.element.sourceForm !== 'resource-item') {
-                    //     return;
-                    //   }
-                    //   // console.log(forms.coursewareList, 'courseware');
-                    // }}
                     onAdd={(evt: any) => {
                       // console.log(
                       const list = forms.coursewareList[index].list;
                       const dropItem = list[evt.newDraggableIndex];
-                      console.log(dropItem, 'dropItem');
                       if (dropItem.sourceForm === 'resource-item') {
+                        if(forms.subjects.length <= 0) {
+                          list.splice(evt.newDraggableIndex, 1)
+                          message.error('请先选择乐器')
+                          eventGlobal.emit('checkCoursewareForm', 'subject')
+                          return
+                        }
+
                         addDragCoursewareItem(
                           {
                             materialId: dropItem.id,
@@ -877,6 +863,7 @@ export default defineComponent({
                             refFlag: dropItem.refFlag,
                             isCollect: dropItem.isCollect,
                             isSelected: dropItem.isSelected,
+                            isError: checkCurrentIsInstrument(dropItem.instrumentIds), // 是否异常
                             content: dropItem.content,
                             audioPlayTypeArray: dropItem.audioPlayTypeArray,
                             removeFlag: false,
@@ -927,6 +914,7 @@ export default defineComponent({
                             <div class={styles.itemWrapBox}>
                               <CardType
                                 class={[styles.itemContent]}
+                                isError={item.isError}
                                 isShowCollect={false}
                                 offShelf={item.removeFlag ? true : false}
                                 // onOffShelf={() => onRemove(item)}
@@ -975,29 +963,6 @@ export default defineComponent({
                       )
                     }}
                   </Draggable>
-                  {/* )}
-                  {item.list <= 0 && (
-                    <div class={styles.list}>
-                      <div class={styles.itemWrap}>
-                        <div class={styles.itemWrapBox}>
-                          <div
-                            class={[
-                              styles.itemContent,
-                              styles.addMusicItem,
-                              'handle'
-                            ]}
-                            onClick={() => {
-                              forms.addOtherSource = true;
-                              forms.addOtherIndex = index;
-                            }}>
-                            <img src={iconAddMusic} />
-
-                            <p class={styles.addMusicName}>添加资源</p>
-                          </div>
-                        </div>
-                      </div>
-                    </div>
-                  )} */}
                 </div>
               ))}
 
@@ -1083,15 +1048,7 @@ export default defineComponent({
                 forms.messageOperation.type === 'save' ||
                 forms.messageOperation.type === 'pageLive'
               ) {
-                emit('change', {
-                  status: false,
-                  addParam: {
-                    isAdd: false,
-                    name: forms.name,
-                    id: forms.createId
-                  }
-                });
-                eventGlobal.emit('teacher-slideshow', false);
+                onCancelSave()
                 if (
                   forms.messageOperation.type === 'pageLive' &&
                   typeof forms.messageCallBack === 'function'
@@ -1149,16 +1106,7 @@ export default defineComponent({
               try {
                 const resultStatus = await onSaveCourseWare();
                 if (resultStatus) {
-                  userStore.setReadCoursewareOpenAgreement(true);
-                  emit('change', {
-                    status: false,
-                    addParam: {
-                      isAdd: !props.groupItem.id ? true : false,
-                      name: forms.name,
-                      id: forms.createId
-                    }
-                  });
-                  eventGlobal.emit('teacher-slideshow', false);
+                  onCancelSave()
                 }
               } catch {
                 //

+ 0 - 5
src/views/prepare-lessons/components/lesson-main/index.tsx

@@ -34,11 +34,6 @@ export default defineComponent({
     };
 
     const onSaveCourseware = () => {
-      // console.log(
-      //   coursewareHeadRef.value,
-      //   coursewareHeadRef.value?.getForms(),
-      //   '12'
-      // );
       eventGlobal.emit('coursewareSave', coursewareHeadRef.value?.getForms());
     };
 

+ 52 - 21
src/views/prepare-lessons/components/lesson-main/train/assign-homework.tsx

@@ -86,7 +86,8 @@ export default defineComponent({
       chapterLessonCoursewareId: props.chapterLessonCoursewareId || null,
       gradeList: [] as any,
       classList: [] as any,
-      currentGradeNum: null,
+      currentGradeNum: null as any,
+      currentClassList: [], // 当前选择的年级
       expireDate: dayjs().add(7, 'day').format('YYYY-MM-DD HH:mm') as any, // 默认7天
       classGroupId: null as any,
       studentList: [] as any,
@@ -112,6 +113,7 @@ export default defineComponent({
           item.classGroupList.forEach((i: any) => {
             classList.push({
               label: i.currentClass + '班',
+              defaultLabel: i.name,
               value: i.id,
               lastStudy: i.lastStudy,
               preStudentNum: i.preStudentNum
@@ -270,7 +272,6 @@ export default defineComponent({
             }
           }
         );
-        console.log(data, 'data');
         const result = data || [];
         result.forEach((item: any) => {
           if (item.paramName === 'homework_file_expire_time') {
@@ -298,12 +299,12 @@ export default defineComponent({
               .format('YYYY-MM-DD HH:mm');
           }
 
-          console.log(
-            dayjs()
-              .add(Number(maxDeadlineTime.value), 'day')
-              .format('YYYY-MM-DD'),
-            'pickerEndTime.value'
-          );
+          // console.log(
+          //   dayjs()
+          //     .add(Number(maxDeadlineTime.value), 'day')
+          //     .format('YYYY-MM-DD'),
+          //   'pickerEndTime.value'
+          // );
           // state.pickerEndTime =
         }
       } catch {
@@ -323,18 +324,26 @@ export default defineComponent({
       } else {
         status = ts < forms.currentTime;
       }
-      console.log(
-        status,
-        '1212',
-        ts > pickerEndTime.value,
-        forms.currentTime,
-        ts,
-        pickerEndTime.value
-      );
+      // console.log(
+      //   status,
+      //   '1212',
+      //   ts > pickerEndTime.value,
+      //   forms.currentTime,
+      //   ts,
+      //   pickerEndTime.value
+      // );
       // pickerEndTime.value && pickerEndTime.value > ts;
       return status;
     };
 
+    const changeHomeWork = (type: any) => {
+      forms.homeworkObj = type
+      if(!props.classGroupId) {
+        forms.currentGradeNum = null
+        forms.classGroupId = null
+      }
+    }
+
     onMounted(async () => {
       await getDefaultParamConfig();
       await getCurrentGradeYear();
@@ -375,7 +384,7 @@ export default defineComponent({
                   styles.switch,
                   forms.homeworkObj === 'CLASS' ? styles.active : ''
                 ]}
-                onClick={() => (forms.homeworkObj = 'CLASS')}>
+                onClick={() => changeHomeWork("CLASS")}>
                 按班级布置
               </NButton>
               <NButton
@@ -384,7 +393,7 @@ export default defineComponent({
                   styles.switch,
                   forms.homeworkObj === 'PERSON' ? styles.active : ''
                 ]}
-                onClick={() => (forms.homeworkObj = 'PERSON')}>
+                onClick={() => changeHomeWork("PERSON")}>
                 按学生布置
               </NButton>
             </NSpace>
@@ -414,13 +423,14 @@ export default defineComponent({
                 required: true,
                 message: '请选择年级',
                 trigger: 'change',
-                type: 'number'
+                type: forms.homeworkObj === 'CLASS' || props.classGroupId ? 'number' : 'array'
               }
             ]}>
             <NSelect
               disabled={props.classGroupId ? true : false}
               v-model:value={forms.currentGradeNum}
               placeholder="请选择年级"
+              multiple={forms.homeworkObj === 'CLASS' || props.classGroupId ? false : true}
               options={forms.gradeList}
               clearable
               onUpdate:value={() => {
@@ -470,9 +480,30 @@ export default defineComponent({
                   !forms.currentGradeNum && styles.disabled
                 ]}
                 onClick={() => {
-                  if (!forms.currentGradeNum) {
+                  if (forms.currentGradeNum.length <= 0) {
                     return;
                   }
+
+                  console.log(forms.currentGradeNum, 'currentGradeNum', forms.gradeList)
+
+                  const tempClass: any = []
+                  forms.gradeList.forEach((item: any) => {
+                    // 为了区分上课页面和作业页面
+                    if(Array.isArray(forms.currentGradeNum)) {
+                      if(forms.currentGradeNum.includes(item.value)) {
+                        const child = item.childrens || []
+                        tempClass.push(...child)
+                      }
+                    } else {
+                      if(forms.currentGradeNum === item.value) {
+                        const child = item.childrens || []
+                        tempClass.push(...child)
+                      }
+                    }
+                  })
+
+                  forms.currentClassList = tempClass
+
                   const tempIds: any = [];
                   forms.studentList.forEach((item: any) => {
                     tempIds.push(item.id);
@@ -570,7 +601,7 @@ export default defineComponent({
             currentGradeNum={forms.currentGradeNum as any}
             selectIds={forms.selectIds}
             studentList={forms.studentList}
-            classList={forms.classList}
+            classList={forms.currentClassList}
             onClose={() => (forms.workVisiable = false)}
             onConfirm={(val: any) => {
               forms.studentList = val || [];

+ 1 - 1
src/views/prepare-lessons/components/lesson-main/train/assign-student/index.module.less

@@ -210,7 +210,7 @@
 
   .btnGroup {
     margin-right: 27px;
-    padding-top: 12px;
+    padding-top: 8px;
 
     :global {
       .n-button {

+ 12 - 20
src/views/prepare-lessons/components/lesson-main/train/assign-student/index.tsx

@@ -59,7 +59,7 @@ export default defineComponent({
       indeterminate: false,
       searchFrom: {
         upgradeFlag: true,
-        currentGradeNum: props.currentGradeNum || '',
+        currentGradeNums: null as any,
         gradeYear: null,
         classGroupId: props.classGroupId || '',
         classInstrumentId: '',
@@ -82,15 +82,6 @@ export default defineComponent({
       try {
         const { data } = await api_getCurrentGradeYear({});
         state.searchFrom.gradeYear = data;
-        // const { data } = await getGradeYearList();
-        // const temp = data || [];
-        // temp.forEach((i: any) => {
-        //   i.name = i.name + '学年';
-        // });
-        // state.popSelectYearList = temp || [];
-        // if (temp.length > 0 && !state.searchFrom.gradeYear) {
-        //   state.searchFrom.gradeYear = temp[0].id;
-        // }
       } catch {
         //
       }
@@ -196,6 +187,13 @@ export default defineComponent({
     };
 
     onMounted(async () => {
+      console.log(props.currentGradeNum, 'props.currentGradeNum-----')
+      if(Array.isArray(props.currentGradeNum)) {
+        state.searchFrom.currentGradeNums = props.currentGradeNum.join(',')
+      } else {
+        state.searchFrom.currentGradeNums = props.currentGradeNum
+      }
+
       state.checkboxIds = props.selectIds || [];
       state.loading = true;
       await catchStore.getSubjects();
@@ -218,21 +216,15 @@ export default defineComponent({
               <NSelect
                 placeholder="全部班级"
                 disabled={props.classGroupId ? true : false}
+                labelField="defaultLabel"
+                filterable
+                clearable
                 v-model:value={state.searchFrom.classGroupId}
                 onUpdate:value={() => onSearch()}
                 options={
-                  [{ label: '全部班级', value: '' }, ...props.classList] as any
+                  [{ defaultLabel: '全部班级', value: '' }, ...props.classList] as any
                 }
               />
-              {/* <NSelect
-                options={[
-                  { label: '全部乐器', value: '' },
-                  ...catchStore.getEnableSubjects
-                ]}
-                placeholder="全部乐器"
-                v-model:value={state.searchFrom.classInstrumentId}
-                onUpdate:value={() => onSearch()}
-              /> */}
               <NCascader
                 options={[
                   { name: '全部乐器', id: '' },

+ 0 - 25
src/views/prepare-lessons/components/lesson-main/train/index.tsx

@@ -449,7 +449,6 @@ export default defineComponent({
               }}>
               {forms.trainList.length > 0 && (
                 <>
-                  {/* {forms.drag ? ( */}
                   <Draggable
                     v-model:modelValue={forms.trainList}
                     itemKey="id"
@@ -496,30 +495,6 @@ export default defineComponent({
                       }
                     }}
                   </Draggable>
-                  {/* ) : (
-                    <div class={styles.list}>
-                      {forms.trainList.map((item: any) => (
-                        <TrainType
-                          item={item}
-                          type="prepare"
-                          offShelf={item.removeFlag ? true : false}
-                          onOffShelf={() => onRemove(item)}
-                          onEdit={(child: any) => {
-                            // console.log('edit', child);
-                            const { trainingConfigJson, id, musicId, ...res } =
-                              child;
-                            forms.editItem = {
-                              ...res,
-                              id: musicId,
-                              trainId: id,
-                              ...trainingConfigJson
-                            };
-                            forms.editStatus = true;
-                          }}
-                        />
-                      ))}
-                    </div>
-                  )} */}
                 </>
               )}
 

+ 5 - 3
src/views/prepare-lessons/components/resource-main/components/resource-item/index.tsx

@@ -85,9 +85,9 @@ export default defineComponent({
         const tempRows = data.rows || [];
         const temp: any = [];
         tempRows.forEach((row: any) => {
-          const index = prepareStore.getCoursewareList.findIndex(
-            (course: any) => course.materialId === row.id
-          );
+          // const index = prepareStore.getCoursewareList.findIndex(
+          //   (course: any) => course.materialId === row.id
+          // );
           temp.push({
             id: row.id,
             coverImg: row.coverImg,
@@ -98,6 +98,7 @@ export default defineComponent({
             isSelected: row.sourceFrom === 'PLATFORM' ? true : false,
             containAccompaniment: row.containAccompaniment,
             content: row.content,
+            instrumentIds: row.instrumentIds,
             sourceForm: 'resource-item',
             audioPlayTypeArray: row.audioPlayTypes
               ? row.audioPlayTypes.split(',')
@@ -157,6 +158,7 @@ export default defineComponent({
           isCollect: item.isCollect,
           isSelected: item.isSelected,
           audioPlayTypeArray: item.audioPlayTypeArray,
+          instrumentIds: item.instrumentIds,
           content: item.content,
           removeFlag: false
         });

+ 0 - 1
src/views/prepare-lessons/components/resource-main/components/resource-item/resource-search-group/index.tsx

@@ -92,7 +92,6 @@ export default defineComponent({
         ...tags
       ];
 
-      console.log(tagSubjectList.value, 'tagSubjectList.value');
     };
     onMounted(async () => {
       // await catchStore.getMusicSheetCategory();

+ 3 - 0
src/views/prepare-lessons/model/select-resources/select-item/index.tsx

@@ -111,6 +111,7 @@ export default defineComponent({
             isCollect: !!row.favoriteFlag,
             isSelected: row.sourceFrom === 'PLATFORM' ? true : false,
             refFlag: row.refFlag,
+            instrumentIds: row.instrumentIds,
             audioPlayTypeArray: row.audioPlayTypes
               ? row.audioPlayTypes.split(',')
               : [],
@@ -152,6 +153,8 @@ export default defineComponent({
           refFlag: item.refFlag,
           isCollect: item.isCollect,
           isSelected: item.isSelected,
+          audioPlayTypeArray: item.audioPlayTypeArray,
+          instrumentIds: item.instrumentIds,
           content: item.content,
           removeFlag: false
         });

+ 1 - 1
vite.config.ts

@@ -169,7 +169,7 @@ export default defineConfig(() => {
     },
     server: {
       host: '0.0.0.0',
-      port: 5002,
+      port: 5005,
       strictPort: true,
       cors: true,
       https: false,