lex před 1 rokem
rodič
revize
343692fba3
24 změnil soubory, kde provedl 918 přidání a 388 odebrání
  1. 1 1
      public/version.json
  2. 2 2
      src/components/layout/layoutTop.tsx
  3. 2 2
      src/components/layout/modals/suggestion-option.tsx
  4. 19 0
      src/store/modules/prepareLessons.ts
  5. 2 1
      src/styles/index.less
  6. 22 22
      src/views/attend-class/model/train-type/index.module.less
  7. 2 2
      src/views/attend-class/model/train-type/index.tsx
  8. 9 9
      src/views/attend-class/model/train-update/index.tsx
  9. 10 0
      src/views/homework-record/api.ts
  10. 51 13
      src/views/homework-record/index.module.less
  11. 202 93
      src/views/homework-record/index.tsx
  12. 35 0
      src/views/prepare-lessons/api.ts
  13. 13 2
      src/views/prepare-lessons/components/lesson-main/index.tsx
  14. 4 0
      src/views/prepare-lessons/components/lesson-main/train-presets/index.module.less
  15. 186 41
      src/views/prepare-lessons/components/lesson-main/train-presets/index.tsx
  16. 69 13
      src/views/prepare-lessons/components/lesson-main/train/assign-homework.tsx
  17. 11 5
      src/views/prepare-lessons/components/lesson-main/train/index.module.less
  18. 147 131
      src/views/prepare-lessons/components/lesson-main/train/index.tsx
  19. 67 34
      src/views/prepare-lessons/components/resource-main/components/select-music/index.tsx
  20. 36 3
      src/views/prepare-lessons/components/resource-main/index.tsx
  21. 3 1
      src/views/prepare-lessons/index.tsx
  22. 7 3
      src/views/prepare-lessons/model/select-music/index.tsx
  23. 16 8
      src/views/prepare-lessons/model/work-section/index.tsx
  24. 2 2
      vite.config.ts

+ 1 - 1
public/version.json

@@ -1 +1 @@
-{"version":1706251752246}
+{"version":1706856340042}

+ 2 - 2
src/components/layout/layoutTop.tsx

@@ -133,10 +133,10 @@ export default defineComponent({
         // let currentSrc = ''
         img.src = imgList[i];
         img.onload = function (e) {
-          console.log('加载完毕', e, img.complete);
+          // console.log('加载完毕', e, img.complete);
         };
         img.onerror = function (e) {
-          console.log('加载错误', e);
+          // console.log('加载错误', e);
         };
       }
     };

+ 2 - 2
src/components/layout/modals/suggestion-option.tsx

@@ -236,10 +236,10 @@ export default defineComponent({
         // let currentSrc = ''
         img.src = imgList[i];
         img.onload = function (e) {
-          console.log('加载完毕', e, img.complete);
+          // console.log('加载完毕', e, img.complete);
         };
         img.onerror = function (e) {
-          console.log('加载错误', e);
+          // console.log('加载错误', e);
         };
       }
     };

+ 19 - 0
src/store/modules/prepareLessons.ts

@@ -34,6 +34,25 @@ export const usePrepareStore = defineStore('prepare-lessons-store', {
     getSelectKey(): string {
       return this.selectKey;
     },
+    /** 获取选择课的名称 */
+    getSelectName(): string {
+      let title = '';
+      for (let index = 0; index < this.getTreeList.length; index++) {
+        const element = this.getTreeList[index];
+        if (element.id === this.selectKey) {
+          title = element.name;
+        }
+
+        if (!title && element.knowledgeList.length > 0) {
+          element.knowledgeList?.forEach((item: any) => {
+            if (item.id === this.selectKey) {
+              title = item.name;
+            }
+          });
+        }
+      }
+      return title;
+    },
     /** 获取教材编号 */
     getLessonCoursewareId(): string {
       return this.lessonCoursewareId;

+ 2 - 1
src/styles/index.less

@@ -377,7 +377,8 @@ body {
 }
 
 .n-base-selection,
-.n-input {
+.n-input,
+.n-input-group-label {
   --n-height: max(40px, 36Px) !important;
   --n-border-radius: 8px !important;
   font-size: max(15px, 13Px) !important;

+ 22 - 22
src/views/attend-class/model/train-type/index.module.less

@@ -267,28 +267,28 @@
 }
 
 
-.evaluationType {
-  background: #fff0eb;
-
-  .btn {
-    background: linear-gradient(270deg, #ff7b57 0%, #ff3460 100%);
-  }
-
-  .train-content {
-    border: 1px solid rgba(249, 45, 83, 0.5);
-  }
-
-  .train-footer {
-    :global {
-      .n-tag {
-        --n-border: none !important;
-        color: #f92d53;
-        border: 1px solid #f92d53;
-
-      }
-    }
-  }
-}
+// .evaluationType {
+//   background: #fff0eb;
+
+//   .btn {
+//     background: linear-gradient(270deg, #ff7b57 0%, #ff3460 100%);
+//   }
+
+//   .train-content {
+//     border: 1px solid rgba(249, 45, 83, 0.5);
+//   }
+
+//   .train-footer {
+//     :global {
+//       .n-tag {
+//         --n-border: none !important;
+//         color: #f92d53;
+//         border: 1px solid #f92d53;
+
+//       }
+//     }
+//   }
+// }
 
 .offShelfBg {
   position: absolute;

+ 2 - 2
src/views/attend-class/model/train-type/index.tsx

@@ -309,7 +309,7 @@ export default defineComponent({
             <NSpace size={12}>
               <n-button
                 quaternary
-                disabled={props.isDelete}
+                disabled={!props.isDelete}
                 class={styles.operation}
                 onClick={(e: MouseEvent) => {
                   e.stopPropagation();
@@ -325,7 +325,7 @@ export default defineComponent({
               {/* {props.type === 'homework' && ( */}
               <n-button
                 quaternary
-                disabled={props.isDelete}
+                disabled={!props.isDelete}
                 class={styles.operation}
                 onClick={(e: MouseEvent) => {
                   e.stopPropagation();

+ 9 - 9
src/views/attend-class/model/train-update/index.tsx

@@ -83,15 +83,15 @@ export default defineComponent({
           }
           configJson.practiceChapterMax = forms.baseMaxScore;
           params.trainingConfigJson = configJson;
-          if (props.type === 'train') {
-            if (forms.id) {
-              await lessonPreTrainingUpdate(params);
-              message.success('修改成功');
-            } else {
-              await lessonPreTrainingAdd(params);
-              message.success('添加成功');
-            }
-          }
+          // if (props.type === 'train') {
+          // if (forms.id) {
+          //   await lessonPreTrainingUpdate(params);
+          //   message.success('修改成功');
+          // } else {
+          //   await lessonPreTrainingAdd(params);
+          //   message.success('添加成功');
+          // }
+          // }
 
           emit('close');
           emit('confirm', params);

+ 10 - 0
src/views/homework-record/api.ts

@@ -0,0 +1,10 @@
+import request from '@/utils/request';
+
+/**
+ * 作业记录 - 作业列表
+ */
+export const api_trainingList = (params: any) => {
+  return request.post('/edu-app/lessonTraining/trainingList', {
+    data: params
+  });
+};

+ 51 - 13
src/views/homework-record/index.module.less

@@ -9,25 +9,29 @@
     max-width: 260px;
   }
 
-  .CDatePickerItem {
-    :global {
-      .n-input {
-        width: 303px;
-      }
-    }
-  }
+  // .CDatePickerItem {
+  //   :global {
+  //     .n-input {
+  //       width: 303px;
+  //     }
+  //   }
+  // }
 
   :global {
+    .n-form.n-form--inline {
+      flex-wrap: wrap;
+    }
+
     .n-form.n-form--inline .n-form-item {
       margin-right: 18px;
     }
 
-    .n-form-item-blank>div {
-      .n-select {
-        min-width: 150px !important;
-        width: 150px !important;
-      }
-    }
+    // .n-form-item-blank>div {
+    //   .n-select {
+    //     min-width: 150px !important;
+    //     width: 150px !important;
+    //   }
+    // }
   }
 }
 
@@ -74,6 +78,40 @@
 
 }
 
+.workVisiable {
+  width: 1158px;
+}
+
+.workContainer {
+  display: flex;
+  align-items: center;
+
+  .workTrain {
+    flex: 1;
+    height: 75vh;
+
+    &>div {
+      padding-top: 15px;
+    }
+  }
+
+  :global {
+    .train-container {
+      max-height: calc(var(--window-page-lesson-height) - 135px) !important;
+
+      .train-listSection {
+        min-height: calc(var(--window-page-lesson-height) - 135px) !important;
+      }
+    }
+  }
+
+  .resourceMain {
+    flex: 0 0 360px;
+    height: 75vh;
+    box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.1);
+  }
+}
+
 .removeVisiable {
   width: 432px;
 

+ 202 - 93
src/views/homework-record/index.tsx

@@ -9,6 +9,7 @@ import {
   NImage,
   NModal,
   NSpace,
+  NSpin,
   useMessage
 } from 'naive-ui';
 import SearchInput from '@/components/searchInput';
@@ -21,17 +22,34 @@ import { initCache, setCache } from '/src/hooks/use-async';
 import { classArray, getgradeNumList } from '../classList/contants';
 import teacherIcon from '@components/layout/images/teacherIcon.png';
 import Pagination from '/src/components/pagination';
+import { api_trainingList } from './api';
+import TheEmpty from '/src/components/TheEmpty';
+import { getTimes } from '/src/utils';
+import dayjs from 'dayjs';
+import Train from '../prepare-lessons/components/lesson-main/train';
+import ResourceMain from '../prepare-lessons/components/resource-main';
+import { useResizeObserver } from '@vueuse/core';
+import { nextTick } from 'process';
+
+export const getCurrentMonth = () => {
+  return [dayjs().startOf('month').valueOf(), dayjs().endOf('month').valueOf()];
+};
 export default defineComponent({
   name: 'homework-record',
   setup() {
     const state = reactive({
+      workVisiable: false,
       searchForm: {
         keyword: null as any,
         currentClass: '',
         currentGradeNum: '',
         subjectId: '',
         gradeYear: '',
-        gradeLevel: ''
+        gradeLevel: '',
+        homeworkObj: '',
+        status: '',
+        timer: getCurrentMonth() as any,
+        selfFlag: true
       },
       loading: false,
       pagination: {
@@ -53,7 +71,7 @@ export default defineComponent({
     const route = useRoute();
     const search = () => {
       state.pagination.page = 1;
-      // getList();
+      getList();
       setCache({ current: state.searchForm, saveKey: route.path });
     };
     state.gradeNumList = getgradeNumList();
@@ -64,7 +82,11 @@ export default defineComponent({
         currentGradeNum: '' as any,
         subjectId: '' as any,
         gradeYear: '' as any,
-        gradeLevel: ''
+        gradeLevel: '',
+        homeworkObj: '',
+        status: '',
+        timer: getCurrentMonth() as any,
+        selfFlag: true
       };
       if (state.popSelectYearList.length > 0) {
         state.searchForm.gradeYear = state.popSelectYearList[1].id;
@@ -73,27 +95,59 @@ export default defineComponent({
       setCache({ current: state.searchForm, saveKey: route.path });
     };
 
+    const getModalHeight = () => {
+      useResizeObserver(
+        document.querySelector('#model-homework-height') as HTMLElement,
+        (entries: any) => {
+          const entry = entries[0];
+          const { height } = entry.contentRect;
+          document.documentElement.style.setProperty(
+            '--window-page-lesson-height',
+            height + 'px'
+          );
+        }
+      );
+    };
+
     const getList = async () => {
       //   // classGroupList
-      //   state.loading = true;
-      //   try {
-      //     const res = await classGroupList({
-      //       ...state.searchForm,
-      //       ...state.pagination
-      //     });
-      //     state.tableList = res.data.rows;
-      //     state.pagination.pageTotal = res.data.total;
-      //     state.loading = false;
-      //     setTimeout(() => {
-      //       if (state.tableList.length > 0) {
-      //         showGuide.value = true;
-      //       }
-      //     }, 500);
-      //   } catch (e) {
-      //     state.loading = false;
-      //     console.log(e);
-      //   }
-      //   console.log('getList');
+      state.loading = true;
+      try {
+        const res = await api_trainingList({
+          ...state.searchForm,
+          ...state.pagination,
+          ...getTimes(
+            state.searchForm.timer,
+            ['startTime', 'endTime'],
+            'YYYY-MM-DD'
+          )
+        });
+        const result = res.data.rows || [];
+        result.forEach((item: any) => {
+          let pTitle = '';
+          let eTitle = '';
+          if (
+            item.studentLessonTrainingDetails &&
+            item.studentLessonTrainingDetails.length > 0
+          ) {
+            item.studentLessonTrainingDetails.forEach((child: any) => {
+              if (child.trainingType === 'PRACTICE') {
+                pTitle += pTitle ? '、' + child.musicName : child.musicName;
+              } else {
+                eTitle += eTitle ? '、' + child.musicName : child.musicName;
+              }
+            });
+          }
+          item.pTitle = pTitle;
+          item.eTitle = eTitle;
+        });
+        state.tableList = res.data.rows;
+        state.pagination.pageTotal = res.data.total;
+        state.loading = false;
+      } catch (e) {
+        state.loading = false;
+        console.log(e);
+      }
     };
 
     // 获取学年
@@ -148,6 +202,7 @@ export default defineComponent({
       state.loading = true;
       await getYearList();
       await getLevelList();
+      await getList();
       state.loading = false;
     });
     return () => (
@@ -166,6 +221,22 @@ export default defineComponent({
             <NFormItem>
               <CSelect
                 {...({
+                  options: [
+                    { id: '', name: '作业对象' },
+                    { id: 'PERSON', name: '个人' },
+                    { id: 'CLASS', name: '班级' }
+                  ],
+                  placeholder: '选择作业对象',
+                  clearable: true,
+                  inline: true,
+                  labelField: 'name',
+                  valueField: 'id'
+                } as any)}
+                v-model:value={state.searchForm.homeworkObj}></CSelect>
+            </NFormItem>
+            <NFormItem>
+              <CSelect
+                {...({
                   options: state.popSelectYearList,
                   placeholder: '选择学年',
                   clearable: true,
@@ -211,20 +282,23 @@ export default defineComponent({
             <NFormItem>
               <CSelect
                 {...({
-                  // options: state.subjectList,
+                  options: [
+                    { value: '', label: '全部状态' },
+                    { value: 0, label: '进行中' },
+                    { value: 1, label: '已结束' }
+                  ],
                   placeholder: '选择状态',
                   clearable: true,
                   inline: true
                 } as any)}
-                v-model:value={state.searchForm.subjectId}></CSelect>
+                v-model:value={state.searchForm.status}></CSelect>
             </NFormItem>
             <NFormItem>
               <CDatePicker
                 class={styles.CDatePickerItem}
                 separator={'-'}
                 type="daterange"
-                // timerValue={timer.value}
-              ></CDatePicker>
+                timerValue={state.searchForm.timer}></CDatePicker>
             </NFormItem>
             <NFormItem>
               <NSpace justify="end">
@@ -245,7 +319,12 @@ export default defineComponent({
         <NButton
           class={styles.addBtn}
           type="primary"
-          onClick={() => (state.showaddClass = true)}
+          onClick={() => {
+            state.workVisiable = true;
+            nextTick(() => {
+              getModalHeight();
+            });
+          }}
           v-slots={{
             icon: () => (
               <>
@@ -259,78 +338,93 @@ export default defineComponent({
           布置作业
         </NButton>
         <div class={styles.tableWrap}>
-          <div class={styles.listSection}>
-            {[1, 2, 3].map(() => (
-              <div class={styles.item}>
-                <div class={styles.header}>
-                  <NAvatar class={styles.navatar} round src={teacherIcon} />
-                  <div class={styles.userInfo}>
-                    <h2>孙忆枫</h2>
-                    <p>
-                      布置时间:2022-10-08<span>|</span>
-                      <span>截止时间:2022-10-09</span>
-                    </p>
-                  </div>
-                  <div class={styles.ing}>进行中</div>
-                </div>
-                <div class={styles.content}>
-                  <div>
-                    <div class={styles.homeTitle}>2024年01月17日-课后作业</div>
-                    <div class={styles.homeContent}>
-                      <span class={styles.title}>作业对象:</span>
-                      <span class={styles.text}>一年级1班、一年级2班</span>
+          <NSpin show={state.loading}>
+            <div class={styles.listSection}>
+              {state.tableList.map((item: any) => (
+                <div class={styles.item}>
+                  <div class={styles.header}>
+                    <NAvatar
+                      class={styles.navatar}
+                      round
+                      src={item.teacherAvatar || teacherIcon}
+                    />
+                    <div class={styles.userInfo}>
+                      <h2>{item.teacherName}</h2>
+                      <p>
+                        布置时间:{dayjs(item.createTime).format('YYYY-MM-DD')}
+                        <span>|</span>
+                        <span>
+                          截止时间:
+                          {dayjs(item.expireDate).format('YYYY-MM-DD')}
+                        </span>
+                      </p>
                     </div>
-                    <div class={[styles.homeContent, styles.homeworkText]}>
-                      <span class={styles.title}>作业内容:</span>
-                      <div class={styles.pSection}>
-                        <p class={[styles.text, styles.p1]}>
-                          练习曲目《小星星》、《我和我的祖国》、《千与千寻》-课后作业
-                          练习曲目《小星星》、《我和我的祖国》、《千与千寻》-课后作业
-                        </p>
-                        <p class={[styles.text, styles.p2]}>
-                          练习曲目《小星星》、《我和我的祖国》、《千与千寻》-课后作业
-                        </p>
-                      </div>
-                    </div>
-                    <div class={styles.homeSubmit}>
-                      <span class={styles.title}>已提交:</span>
-                      <span class={styles.text}>0/50人</span>
-                      <NDivider vertical />
-                      <span class={styles.title}>提交率:</span>
-                      <span class={styles.text}>60%</span>
-                      <NDivider vertical />
-                      <span class={styles.title}>合格人数:</span>
-                      <span class={styles.text}>20人</span>
-                      <NDivider vertical />
-                      <span class={styles.title}>合格率:</span>
-                      <span class={styles.text}>80%</span>
+                    <div class={item.status === 1 ? styles.over : styles.ing}>
+                      {item.status === 1 ? '已结束' : '进行中'}
                     </div>
                   </div>
+                  <div class={styles.content}>
+                    <div>
+                      <div class={styles.homeTitle}>{item.name}</div>
+                      <div class={styles.homeContent}>
+                        <span class={styles.title}>作业对象:</span>
+                        <span class={styles.text}>{item.homeworkObjName}</span>
+                      </div>
+                      <div class={[styles.homeContent, styles.homeworkText]}>
+                        <span class={styles.title}>作业内容:</span>
+                        <div class={styles.pSection}>
+                          <p class={[styles.text, styles.p1]}>{item.pTitle}</p>
+                          <p class={[styles.text, styles.p2]}>{item.eTitle}</p>
+                        </div>
+                      </div>
+                      <div class={styles.homeSubmit}>
+                        <span class={styles.title}>已提交:</span>
+                        <span class={styles.text}>
+                          {item.trainingNum || 0}/{item.trainingNum || 0}人
+                        </span>
+                        <NDivider vertical />
+                        <span class={styles.title}>提交率:</span>
+                        <span class={styles.text}>
+                          {item.trainingRate || 0}%
+                        </span>
+                        <NDivider vertical />
+                        <span class={styles.title}>合格人数:</span>
+                        <span class={styles.text}>
+                          {item.standardNum || 0}人
+                        </span>
+                        <NDivider vertical />
+                        <span class={styles.title}>合格率:</span>
+                        <span class={styles.text}>
+                          {item.qualifiedRate || 0}%
+                        </span>
+                      </div>
+                    </div>
 
-                  <NButton class={styles.errorBtn} type="error" color="#F94D50">
-                    撤回
-                  </NButton>
+                    <NButton
+                      class={styles.errorBtn}
+                      type="error"
+                      color="#F94D50">
+                      撤回
+                    </NButton>
+                  </div>
                 </div>
-              </div>
-            ))}
-          </div>
-          {/* <NDataTable
-            v-slots={{
-              empty: () => <TheEmpty></TheEmpty>
-            }}
-            class={styles.classTable}
-            loading={state.loading}
-            columns={columns()}
-            data={state.tableList}></NDataTable> */}
-          <Pagination
-            v-model:page={state.pagination.page}
-            v-model:pageSize={state.pagination.rows}
-            v-model:pageTotal={state.pagination.pageTotal}
-            onList={getList}
-            sync
-          />
-        </div>
+              ))}
+            </div>
+            {state.tableList.length <= 0 && (
+              <TheEmpty class={styles.nowEmpty} />
+            )}
+          </NSpin>
 
+          {state.tableList.length > 0 && (
+            <Pagination
+              v-model:page={state.pagination.page}
+              v-model:pageSize={state.pagination.rows}
+              v-model:pageTotal={state.pagination.pageTotal}
+              onList={getList}
+              sync
+            />
+          )}
+        </div>
         {/* <NModal
           v-model:show={state.removeVisiable}
           preset="card"
@@ -352,6 +446,21 @@ export default defineComponent({
             </NSpace>
           </div>
         </NModal> */}
+
+        <NModal
+          v-model:show={state.workVisiable}
+          preset="card"
+          class={['modalTitle background', styles.workVisiable]}
+          title={'作业详情'}>
+          <div id="model-homework-height" class={styles.workContainer}>
+            <div class={styles.workTrain}>
+              <Train />
+            </div>
+            <div class={styles.resourceMain}>
+              <ResourceMain cardType="homerowk-record" />
+            </div>
+          </div>
+        </NModal>
       </div>
     );
   }

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

@@ -170,3 +170,38 @@ export const musicPracticeRecordDetail = (params: any) => {
     params: params
   });
 };
+
+/**
+ * 预设作业列表
+ */
+export const lessonPreTrainingV2Page = (params: any) => {
+  return request.post('/edu-app/lessonPreTrainingV2/page', {
+    data: params
+  });
+};
+
+/**
+ * 预设作业 添加/修改
+ */
+export const lessonPreTrainingV2Save = (params: any) => {
+  return request.post('/edu-app/lessonPreTrainingV2/save', {
+    data: params
+  });
+};
+
+/**
+ * 预设作业 删除
+ */
+export const lessonPreTrainingV2Remove = (params: any) => {
+  return request.post('/edu-app/lessonPreTrainingV2/remove', {
+    data: params,
+    requestType: 'form'
+  });
+};
+
+/**
+ * 预设作业 详情
+ */
+export const lessonPreTrainingV2Detail = (params: any) => {
+  return request.get('/edu-app/lessonPreTrainingV2/detail/' + params.id);
+};

+ 13 - 2
src/views/prepare-lessons/components/lesson-main/index.tsx

@@ -12,7 +12,8 @@ export default defineComponent({
   setup() {
     const prepareStore = usePrepareStore();
     const state = reactive({
-      editWorkShow: false // 是否编辑预设
+      editWorkShow: false, // 是否编辑预设
+      editWork: {} as any // 预设模板编号
     });
 
     return () => (
@@ -49,8 +50,10 @@ export default defineComponent({
             <div>
               {state.editWorkShow ? (
                 <Train
+                  lessonPreTraining={state.editWork}
                   onChange={(val: any) => {
                     state.editWorkShow = val.status;
+
                     if (!val.status) {
                       eventGlobal.emit('teacher-slideshow', false);
                     }
@@ -58,7 +61,15 @@ export default defineComponent({
                 />
               ) : (
                 <TrainPresets
-                  onChange={(val: any) => (state.editWorkShow = val.status)}
+                  onChange={(val: any) => {
+                    state.editWorkShow = val.status;
+                    state.editWork = {
+                      ...val.lessonPreTraining,
+                      title:
+                        val.lessonPreTraining?.title ||
+                        prepareStore.getSelectName + '课后作业'
+                    };
+                  }}
                 />
               )}
             </div>

+ 4 - 0
src/views/prepare-lessons/components/lesson-main/train-presets/index.module.less

@@ -153,4 +153,8 @@
       }
     }
   }
+}
+
+.assignHomework {
+  width: 720px;
 }

+ 186 - 41
src/views/prepare-lessons/components/lesson-main/train-presets/index.tsx

@@ -1,4 +1,4 @@
-import { defineComponent, reactive } from 'vue';
+import { defineComponent, onMounted, reactive, watch } from 'vue';
 import styles from './index.module.less';
 import {
   NButton,
@@ -7,19 +7,136 @@ import {
   NModal,
   NScrollbar,
   NSpace,
-  NSpin
+  NSpin,
+  useMessage
 } from 'naive-ui';
+import { useUserStore } from '@/store/modules/users';
 import add from '@/views/studentList/images/add.png';
 import WorkSection from '../../../model/work-section';
 import { eventGlobal } from '/src/utils';
+import { usePrepareStore } from '/src/store/modules/prepareLessons';
+import {
+  lessonPreTrainingV2Page,
+  lessonPreTrainingV2Remove,
+  lessonPreTrainingV2Save
+} from '../../../api';
+import { storeToRefs } from 'pinia';
+import AssignHomework from '../train/assign-homework';
+import qs from 'query-string';
 
 export default defineComponent({
   name: 'train-presets',
   emits: ['change'],
   setup(props, { emit }) {
+    const prepareStore = usePrepareStore();
+    const users = useUserStore();
+    const { info } = storeToRefs(users);
+    const message = useMessage();
     const forms = reactive({
+      assignHomeworkStatus: false,
       editTitleVisiable: false,
-      removeVisiable1: false
+      editTitle: '',
+      editBtnLoading: false,
+      selectItem: {} as any,
+      removeVisiable1: false,
+      loadingStatus: false,
+      tableList: [] as any
+    });
+
+    const getList = async () => {
+      forms.loadingStatus = true;
+      try {
+        // 判断是否有选择对应的课件 或声部
+        if (!prepareStore.getSelectKey) return (forms.loadingStatus = false);
+        const { data } = await lessonPreTrainingV2Page({
+          page: 1,
+          coursewareDetailKnowledgeId: prepareStore.getSelectKey
+        });
+        const result = data.rows || [];
+        const tempList: any = [];
+        result.forEach((item: any) => {
+          const { lessonPreTrainingDetails, ...ies } = item;
+          const tList: any = {
+            ...ies,
+            pTitle: '',
+            eTitle: '',
+            teacherAvatar: info.value?.avatar,
+            teacherName: info.value?.nickname,
+            lessonPreTrainingDetails
+          };
+          lessonPreTrainingDetails.forEach((child: any) => {
+            if (child.trainingType === 'PRACTICE') {
+              tList.pTitle += tList.pTitle
+                ? '、' + child.musicName
+                : child.musicName;
+            }
+            if (child.trainingType === 'EVALUATION') {
+              tList.eTitle += tList.eTitle
+                ? '、' + child.musicName
+                : child.musicName;
+            }
+          });
+
+          tempList.push(tList);
+        });
+
+        forms.tableList = tempList;
+      } catch {
+        //
+      }
+      forms.loadingStatus = false;
+    };
+    // 监听选择的key 左侧选择了其它的课
+    watch(
+      () => prepareStore.getSelectKey,
+      () => {
+        // forms.drag = false;
+        // prepareStore.setIsEditResource(false);
+        getList();
+      }
+    );
+
+    /** 修改标题 */
+    const onEditTitleSubmit = async () => {
+      if (!forms.editTitle) {
+        message.error('请输入作业标题');
+        return;
+      }
+      forms.editBtnLoading = true;
+      try {
+        await lessonPreTrainingV2Save({
+          id: forms.selectItem.id,
+          title: forms.editTitle
+        });
+        message.success('修改成功');
+        forms.editTitleVisiable = false;
+        forms.tableList.forEach((item: any) => {
+          if (item.id === forms.selectItem.id) {
+            item.title = forms.editTitle;
+          }
+        });
+      } catch {
+        //
+      }
+      forms.editBtnLoading = false;
+    };
+
+    /** 删除 */
+    const onRemove = async () => {
+      forms.editBtnLoading = true;
+      try {
+        await lessonPreTrainingV2Remove({ id: forms.selectItem.id });
+        message.success('删除成功');
+        forms.removeVisiable1 = false;
+        getList();
+      } catch {
+        //
+      }
+      forms.editBtnLoading = false;
+    };
+
+    onMounted(() => {
+      getList();
     });
     return () => (
       <div class={styles.trainPresets}>
@@ -48,28 +165,47 @@ export default defineComponent({
           </NSpace>
         </div>
 
-        <NScrollbar
-          class={[
-            styles.listContainer
-            // forms.drag ? styles.listContainerDrag : ''
-          ]}>
-          {/* <NSpin></NSpin> */}
-          <div class={[styles.list]}>
-            <WorkSection
-              onEditTitle={() => {
-                forms.editTitleVisiable = true;
-              }}
-              onEdit={() => {
-                // 设置右侧栏状态
-                eventGlobal.emit('teacher-slideshow', true);
-                emit('change', { status: true });
-              }}
-              onConfirm={() => {
-                //
-              }}
-              onDelete={() => (forms.removeVisiable1 = true)}
-            />
-          </div>
+        <NScrollbar class={[styles.listContainer]}>
+          <NSpin show={forms.loadingStatus}>
+            <div class={styles.listSection}>
+              <div class={[styles.list]}>
+                {forms.tableList.map((item: any) => (
+                  <WorkSection
+                    item={item}
+                    onEditTitle={() => {
+                      forms.selectItem = item;
+                      forms.editTitle = item.title;
+                      forms.editTitleVisiable = true;
+                    }}
+                    onEdit={() => {
+                      // 设置右侧栏状态
+                      eventGlobal.emit('teacher-slideshow', true);
+                      emit('change', {
+                        status: true,
+                        lessonPreTraining: item
+                      });
+                    }}
+                    onConfirm={() => {
+                      //
+                      if (
+                        !item.lessonPreTrainingDetails ||
+                        item.lessonPreTrainingDetails.length <= 0
+                      ) {
+                        message.error('作业预设不能为空');
+                        return;
+                      }
+                      forms.assignHomeworkStatus = true;
+                      forms.selectItem = item;
+                    }}
+                    onDelete={() => {
+                      forms.removeVisiable1 = true;
+                      forms.selectItem = item;
+                    }}
+                  />
+                ))}
+              </div>
+            </div>
+          </NSpin>
         </NScrollbar>
 
         <NModal
@@ -78,7 +214,7 @@ export default defineComponent({
           class={['modalTitle', styles.removeVisiable1]}
           title={'删除作业'}>
           <div class={styles.studentRemove}>
-            <p>请确认是否删除【2024年01月17日-课后作业】,删除后不可恢复</p>
+            <p>请确认是否删除【{forms.selectItem.title}】,删除后不可恢复</p>
 
             <NSpace class={styles.btnGroupModal} justify="center">
               <NButton round onClick={() => (forms.removeVisiable1 = false)}>
@@ -87,13 +223,8 @@ export default defineComponent({
               <NButton
                 round
                 type="primary"
-                onClick={() => {
-                  // forms.trainList.forEach((item: any) => {
-                  //   forms.removeIds.push(item.id);
-                  // });
-                  // forms.trainList = [];
-                  // forms.removeVisiable1 = false;
-                }}>
+                onClick={onRemove}
+                loading={forms.editBtnLoading}>
                 确定
               </NButton>
             </NSpace>
@@ -106,7 +237,11 @@ export default defineComponent({
           class={['modalTitle', styles.removeVisiable1]}
           title={'作业重命名'}>
           <div class={styles.studentRemove}>
-            <NInput placeholder="请输入作业名称" />
+            <NInput
+              placeholder="请输入作业标题"
+              v-model:value={forms.editTitle}
+              maxlength={100}
+            />
 
             <NSpace class={styles.btnGroupModal} justify="center">
               <NButton round onClick={() => (forms.editTitleVisiable = false)}>
@@ -115,18 +250,28 @@ export default defineComponent({
               <NButton
                 round
                 type="primary"
-                onClick={() => {
-                  // forms.trainList.forEach((item: any) => {
-                  //   forms.removeIds.push(item.id);
-                  // });
-                  // forms.trainList = [];
-                  // forms.removeVisiable1 = false;
-                }}>
+                onClick={onEditTitleSubmit}
+                loading={forms.editBtnLoading}>
                 确定
               </NButton>
             </NSpace>
           </div>
         </NModal>
+
+        {/* 添加自定义教材 */}
+        <NModal
+          v-model:show={forms.assignHomeworkStatus}
+          preset="card"
+          showIcon={false}
+          class={['modalTitle background', styles.assignHomework]}
+          title={'布置作业'}
+          blockScroll={false}>
+          <AssignHomework
+            item={forms.selectItem}
+            trainList={[]}
+            onClose={() => (forms.assignHomeworkStatus = false)}
+          />
+        </NModal>
       </div>
     );
   }

+ 69 - 13
src/views/prepare-lessons/components/lesson-main/train/assign-homework.tsx

@@ -1,10 +1,11 @@
-import { defineComponent, onMounted, reactive, ref } from 'vue';
+import { PropType, defineComponent, onMounted, reactive, ref } from 'vue';
 import styles from './index.module.less';
 import {
   NButton,
   NDatePicker,
   NForm,
   NFormItem,
+  NInput,
   NSelect,
   NSpace,
   useMessage
@@ -19,10 +20,18 @@ import { usePrepareStore } from '/src/store/modules/prepareLessons';
 export default defineComponent({
   name: 'assign-homework',
   props: {
+    item: {
+      type: Object,
+      default: () => ({})
+    },
     /** 初始数据 */
     trainList: {
       type: Array,
       default: () => []
+    },
+    homeworkType: {
+      type: String as PropType<'CLASSWORK' | 'HOMEWORK'>,
+      default: 'HOMEWORK'
     }
   },
   emits: ['close', 'confirm'],
@@ -31,8 +40,12 @@ export default defineComponent({
     const prepareStore = usePrepareStore();
     const forms = reactive({
       currentTime: dayjs(dayjs().format('YYYY-MM-DD')).valueOf(),
+      homeworkObj: 'CLASS' as 'PERSON' | 'CLASS',
+      homeworkType: props.homeworkType,
       id: null as any,
       uploading: false,
+      title: props.item.title,
+      courseScheduleId: null,
       gradeList: [] as any,
       classList: [] as any,
       currentGradeNum: null,
@@ -45,7 +58,6 @@ export default defineComponent({
     const getClassGroupList = async () => {
       try {
         const defaultSelectClassGroupId = prepareStore.getClassGroupId;
-        console.log('defaultSelectClassGroupId:', defaultSelectClassGroupId);
         const { data } = await classGroupList({
           upgradeFlag: true
         });
@@ -62,7 +74,6 @@ export default defineComponent({
             });
 
             if (i.id === defaultSelectClassGroupId) {
-              console.log('id: ', defaultSelectClassGroupId);
               forms.currentGradeNum = i.currentGradeNum;
               forms.classGroupId = i.id;
             }
@@ -101,17 +112,9 @@ export default defineComponent({
         if (err) {
           return;
         }
-        // const item = forms.classList.find(
-        //   (item: any) => item.value === forms.classGroupId
-        // );
-        // if (item && item.preStudentNum <= 0) {
-        //   message.error('当前班级暂无学生,无法布置作业');
-        //   return;
-        // }
-
         forms.uploading = true;
         try {
-          const trainList = props.trainList || [];
+          const trainList = props.item.lessonPreTrainingDetails || [];
           const details: any[] = [];
           trainList.forEach((item: any) => {
             details.push({
@@ -121,9 +124,15 @@ export default defineComponent({
             });
           });
           const params = {
+            title: forms.title,
+            homeworkObj: forms.homeworkObj,
+            homeworkType: forms.homeworkType,
             lessonTrainingDetails: details,
             expireDate: forms.expireDate + ' 23:59:59',
             classGroupId: forms.classGroupId
+              ? forms.classGroupId.join(',')
+              : null,
+            courseScheduleId: forms.courseScheduleId
           };
           await lessonTrainingAdd(params);
           message.success('布置成功');
@@ -147,6 +156,47 @@ export default defineComponent({
           labelWidth={'auto'}
           labelPlacement="left">
           <NFormItem
+            label="布置方式"
+            path="homeworkObj"
+            rule={[{ required: true, message: '请选择布置方式' }]}>
+            <NSpace>
+              <NButton
+                secondary
+                class={[
+                  styles.switch,
+                  forms.homeworkObj === 'CLASS' ? styles.active : ''
+                ]}
+                onClick={() => (forms.homeworkObj = 'CLASS')}>
+                按班级布置
+              </NButton>
+              <NButton
+                secondary
+                class={[
+                  styles.switch,
+                  forms.homeworkObj === 'PERSON' ? styles.active : ''
+                ]}
+                onClick={() => (forms.homeworkObj = 'PERSON')}>
+                按学生布置
+              </NButton>
+            </NSpace>
+          </NFormItem>
+          <NFormItem
+            label="作业标题"
+            path="title"
+            rule={[
+              {
+                required: true,
+                message: '请输入作业标题',
+                trigger: 'blur'
+              }
+            ]}>
+            <NInput
+              v-model:value={forms.title}
+              placeholder="请选择作业标题"
+              clearable
+            />
+          </NFormItem>
+          <NFormItem
             label="年级"
             path="currentGradeNum"
             rule={[
@@ -172,12 +222,18 @@ export default defineComponent({
             label="班级"
             path="classGroupId"
             rule={[
-              { required: true, message: '请选择班级', trigger: 'change' }
+              {
+                required: true,
+                message: '请选择班级',
+                trigger: 'change',
+                type: 'array'
+              }
             ]}>
             <NSelect
               v-model:value={forms.classGroupId}
               placeholder="请选择班级"
               clearable
+              multiple
               options={forms.classList}
             />
           </NFormItem>

+ 11 - 5
src/views/prepare-lessons/components/lesson-main/train/index.module.less

@@ -117,17 +117,13 @@
 }
 
 .btnGroupClass {
-  padding-top: 10px;
+  margin-top: 10px;
 }
 
 .listContainer {
   margin-top: 12px;
   // // 52 + 28 + 38
-  // max-height: calc(var(--window-page-lesson-height) - 148px);
 
-  // .listSection {
-  //   min-height: calc(var(--window-page-lesson-height) - 148px);
-  // }
 
   max-height: calc(var(--window-page-lesson-height) - 196px);
 
@@ -190,6 +186,16 @@
       }
     }
   }
+
+  .switch {
+    height: 37px !important;
+    border-radius: 8px;
+
+    &.active {
+      background: #198CFE;
+      color: #fff;
+    }
+  }
 }
 
 .removeVisiable {

+ 147 - 131
src/views/prepare-lessons/components/lesson-main/train/index.tsx

@@ -19,7 +19,9 @@ import Draggable from 'vuedraggable';
 import {
   lessonPreTrainingBatchSave,
   lessonPreTrainingPage,
-  lessonPreTrainingDelete
+  lessonPreTrainingDelete,
+  lessonPreTrainingV2Detail,
+  lessonPreTrainingV2Save
 } from '../../../api';
 import { evaluateDifficult } from '/src/utils/contants';
 import TrainUpdate from '/src/views/attend-class/model/train-update';
@@ -27,21 +29,28 @@ import AssignHomework from './assign-homework';
 import Trainguide from '@/custom-plugins/guide-page/train-guide';
 import { eventGlobal } from '/src/utils';
 import iconTips from '../../../images/icon-tips.png';
+import { typeFormat } from '../../resource-main/components/select-music';
 export default defineComponent({
   name: 'courseware-modal',
+  props: {
+    lessonPreTraining: {
+      type: Object,
+      default: () => ({})
+    }
+  },
   emits: ['change'],
   setup(props, { emit }) {
     const catchStore = useCatchStore();
     const prepareStore = usePrepareStore();
     const dialog = useDialog();
     const message = useMessage();
+    console.log(props.lessonPreTraining, ' props.lessonPreTraining');
     const forms = reactive({
-      tipsStatus: localStorage.getItem('prepare-lesson-train-tip')
-        ? true
-        : false,
+      title: props.lessonPreTraining?.title,
+      preBtnLoading: false,
       showAttendClass: false,
       list: [] as any,
-      drag: false,
+      drag: true,
       loadingStatus: false,
       trainList: [] as any,
       assignHomeworkStatus: false,
@@ -51,15 +60,9 @@ export default defineComponent({
       removeVisiable: false,
       removeVisiable1: false
     });
-    const showGuide = ref(false);
+    // const showGuide = ref(false);
     // 完成编辑
     const onOverEdit = async () => {
-      // dialog.warning({
-      //   title: '提示',
-      //   content: `是否完成编辑?`,
-      //   positiveText: '确定',
-      //   negativeText: '取消',
-      //   onPositiveClick: async () => {
       try {
         // 保存课件
         await lessonPreTrainingBatchSave({
@@ -88,16 +91,12 @@ export default defineComponent({
       forms.loadingStatus = true;
       try {
         // 判断是否有选择对应的课件
-        if (!prepareStore.getSelectKey) return;
-        const { data } = await lessonPreTrainingPage({
-          coursewareKnowledgeDetailId: prepareStore.getSelectKey,
-          subjectId: prepareStore.getSubjectId,
-          page: 1,
-          rows: 99
+        if (!props.lessonPreTraining?.id) return (forms.loadingStatus = false);
+        const { data } = await lessonPreTrainingV2Detail({
+          id: props.lessonPreTraining?.id
         });
-        const tempRows = data.rows || [];
+        const tempRows = data.lessonPreTrainingDetails || [];
         const temp: any = [];
-
         tempRows.forEach((row: any) => {
           let tList: string[] = [];
           const configJson = row.trainingConfigJson;
@@ -131,22 +130,19 @@ export default defineComponent({
           }
         });
         forms.trainList = tempCourse || [];
-        setTimeout(() => {
-          showGuide.value = true;
-        }, 500);
       } catch {
         //
       }
       forms.loadingStatus = false;
     };
 
-    // 声部变化时
-    watch(
-      () => prepareStore.getSubjectId,
-      () => {
-        getList();
-      }
-    );
+    // // 声部变化时
+    // watch(
+    //   () => prepareStore.getSubjectId,
+    //   () => {
+    //     getList();
+    //   }
+    // );
     // 监听选择的key 左侧选择了其它的课
     watch(
       () => prepareStore.getSelectKey,
@@ -155,24 +151,12 @@ export default defineComponent({
         getList();
       }
     );
-    watch(
-      () => prepareStore.getIsAddTrain,
-      (val: boolean) => {
-        if (val) {
-          forms.trainList = [];
-          getList();
-          prepareStore.setIsAddTrain(false);
-        }
-      }
-    );
-
     // 删除
     const onDelete = (item: any) => {
       //
       forms.removeIds.push(item.id);
       const index = forms.trainList.findIndex((c: any) => c.id === item.id);
       forms.trainList.splice(index, 1);
-      // prepareStore.setCoursewareList(forms.trainList);
     };
 
     // 单个删除
@@ -195,12 +179,45 @@ export default defineComponent({
       }
     };
 
+    /** 保存预设 */
+    const onPreSave = async () => {
+      forms.preBtnLoading = true;
+      try {
+        const lessonPreTrainingDetails: any = [];
+        forms.trainList.forEach((item: any) => {
+          lessonPreTrainingDetails.push({
+            trainingType: item.trainingType,
+            musicId: item.musicId,
+            trainingConfigJson: item.trainingConfigJson,
+            musicName: item.musicName
+          });
+        });
+        await lessonPreTrainingV2Save({
+          title: forms.title,
+          coursewareKnowledgeDetailId: prepareStore.getSelectKey,
+          lessonPreTrainingDetails
+        });
+        message.success('保存预设成功');
+        // forms.removeVisiable = true;
+        // forms.drag = false;
+        prepareStore.setIsEditTrain(false);
+        forms.removeIds = [];
+        // getList();
+        emit('change', { status: false });
+      } catch {
+        //
+      }
+      forms.preBtnLoading = false;
+    };
+
     onMounted(async () => {
       await getList();
 
       // 动态添加数据
       eventGlobal.on('onTrainAddItem', (item: any) => {
         forms.drag = true;
+        // 临时储存编号
+        item.id = item.id || new Date().getTime() + '__tmp';
         forms.trainList.push(item);
         prepareStore.setTrainList(forms.trainList);
       });
@@ -211,7 +228,11 @@ export default defineComponent({
           <NSpace>
             <div class={styles.btnItem}>
               <span class={styles.btnTitle}>声部:</span>
-              <NInput placeholder={'请输入标题'} />
+              <NInput
+                placeholder={'请输入标题'}
+                v-model:value={forms.title}
+                maxlength={100}
+              />
             </div>
           </NSpace>
 
@@ -219,8 +240,6 @@ export default defineComponent({
             <NButton
               type="error"
               onClick={() => {
-                // forms.trainList = [];
-                // prepareStore.setTrainList([]);
                 forms.removeVisiable1 = true;
               }}>
               清空
@@ -228,9 +247,10 @@ export default defineComponent({
             <NButton
               type="error"
               onClick={() => {
-                forms.drag = false;
+                // forms.drag = false;
                 prepareStore.setIsEditTrain(false);
                 forms.removeIds = [];
+                prepareStore.setTrainList([]);
                 // getList();
                 emit('change', { status: false });
               }}>
@@ -238,64 +258,25 @@ export default defineComponent({
             </NButton>
             <NButton
               type="default"
-              onClick={() => {
-                forms.removeVisiable = true;
-              }}>
+              disabled={forms.trainList.length <= 0}
+              onClick={onPreSave}
+              loading={forms.preBtnLoading}>
               保存预设
             </NButton>
           </NSpace>
-          {/* {forms.drag ? (
-            <NSpace>
-              <NButton
-                type="error"
-                onClick={() => {
-                  // forms.trainList = [];
-                  // prepareStore.setTrainList([]);
-                  forms.removeVisiable1 = true;
-                }}>
-                清空资源
-              </NButton>
-              <NButton
-                type="error"
-                onClick={() => {
-                  forms.drag = false;
-                  prepareStore.setIsEditTrain(false);
-                  forms.removeIds = [];
-                  getList();
-                }}>
-                取消编辑
-              </NButton>
-              <NButton
-                type="default"
-                onClick={() => {
-                  forms.removeVisiable = true;
-                }}>
-                完成编辑
-              </NButton>
-            </NSpace>
-          ) : (
-            <NSpace>
-              <NButton
-                type="default"
-                onClick={() => {
-                  forms.drag = true;
-                  prepareStore.setIsEditTrain(true);
-                }}>
-                编辑
-              </NButton>
-            </NSpace>
-          )} */}
         </div>
 
         <NScrollbar
           class={[
-            styles.listContainer
+            styles.listContainer,
+            'train-container'
             // forms.drag ? styles.listContainerDrag : ''
           ]}>
           <NSpin show={forms.loadingStatus}>
             <div
               class={[
                 styles.listSection,
+                'train-listSection',
                 !forms.loadingStatus && prepareStore.getTrainList.length <= 0
                   ? styles.emptySection
                   : ''
@@ -307,8 +288,8 @@ export default defineComponent({
                 e.preventDefault();
               }}
               onDrop={(e: any) => {
-                console.log('onDrop', Date.now());
                 let dropItem = e.dataTransfer.getData('text');
+                console.log(dropItem, 'dropItem', dropItem);
                 dropItem = dropItem ? JSON.parse(dropItem) : {};
                 // 判断是否有数据
                 if (dropItem.id) {
@@ -317,40 +298,53 @@ export default defineComponent({
               }}>
               {forms.trainList.length > 0 && (
                 <>
-                  {forms.drag ? (
-                    <Draggable
-                      v-model:modelValue={forms.trainList}
-                      itemKey="id"
-                      // tag="transition-group"
-                      componentData={{
-                        itemKey: 'id',
-                        tag: 'div',
-                        animation: 200,
-                        group: 'description',
-                        disabled: false
-                      }}
-                      class={styles.list}>
-                      {{
-                        item: (element: any) => {
-                          const item = element.element;
-                          return (
-                            <div
-                              data-id={item.musicId}
-                              class={styles.itemBlock}>
-                              <TrainType
-                                item={item}
-                                isDelete
-                                type="prepare"
-                                onDelete={(child: any) => onDelete(child)}
-                                offShelf={item.removeFlag ? true : false}
-                                onOffShelf={() => onRemove(item)}
-                              />
-                            </div>
-                          );
-                        }
-                      }}
-                    </Draggable>
-                  ) : (
+                  {/* {forms.drag ? ( */}
+                  <Draggable
+                    v-model:modelValue={forms.trainList}
+                    itemKey="id"
+                    componentData={{
+                      itemKey: 'id',
+                      tag: 'div',
+                      animation: 200,
+                      group: 'description',
+                      disabled: false
+                    }}
+                    class={styles.list}>
+                    {{
+                      item: (element: any) => {
+                        const item = element.element;
+                        return (
+                          <div data-id={item.musicId} class={styles.itemBlock}>
+                            <TrainType
+                              item={item}
+                              isDelete
+                              type="prepare"
+                              onDelete={(child: any) => onDelete(child)}
+                              offShelf={item.removeFlag ? true : false}
+                              onOffShelf={() => onRemove(item)}
+                              onEdit={(child: any) => {
+                                // console.log(forms.trainList);
+                                const {
+                                  trainingConfigJson,
+                                  id,
+                                  musicId,
+                                  ...res
+                                } = child;
+                                forms.editItem = {
+                                  ...res,
+                                  id: musicId,
+                                  trainId: id,
+                                  ...trainingConfigJson
+                                };
+                                forms.editStatus = true;
+                              }}
+                            />
+                          </div>
+                        );
+                      }
+                    }}
+                  </Draggable>
+                  {/* ) : (
                     <div class={styles.list}>
                       {forms.trainList.map((item: any) => (
                         <TrainType
@@ -373,7 +367,7 @@ export default defineComponent({
                         />
                       ))}
                     </div>
-                  )}
+                  )} */}
                 </>
               )}
 
@@ -392,7 +386,8 @@ export default defineComponent({
             <NButton
               type="primary"
               // {...{ id: 'train-0' }}
-              disabled={forms.drag}
+              // disabled={forms.drag}
+              disabled={forms.trainList.length <= 0}
               onClick={() => {
                 let count = 0;
                 forms.trainList.forEach((item: any) => {
@@ -420,9 +415,29 @@ export default defineComponent({
           <TrainUpdate
             item={forms.editItem}
             onClose={() => (forms.editStatus = false)}
-            onConfirm={() => {
+            onConfirm={(item: any) => {
               forms.editItem = {};
-              prepareStore.setIsAddTrain(true);
+              // prepareStore.setIsAddTrain(true);
+
+              const tList = typeFormat(
+                item.trainingType,
+                item.trainingConfigJson
+              );
+              //
+              const train = {
+                ...item,
+                typeList: tList
+              };
+
+              forms.trainList.forEach((item: any) => {
+                if (item.id === train.id) {
+                  // item = train;
+                  item.trainingConfigJson = train.trainingConfigJson;
+                  item.trainingType = train.trainingType;
+                  item.typeList = train.typeList;
+                }
+              });
+              prepareStore.setTrainList(forms.trainList);
             }}
           />
         </NModal>
@@ -469,7 +484,7 @@ export default defineComponent({
           <div class={styles.studentRemove}>
             <p>
               请确认是否要清空作业?
-              <span>点击确认后所有的作业内容 将被清空掉。</span>
+              {/* <span>点击确认后所有的作业内容 将被清空掉。</span> */}
             </p>
 
             <NSpace class={styles.btnGroupModal} justify="center">
@@ -481,6 +496,7 @@ export default defineComponent({
                     forms.removeIds.push(item.id);
                   });
                   forms.trainList = [];
+                  prepareStore.setTrainList([]);
                   forms.removeVisiable1 = false;
                 }}>
                 确定

+ 67 - 34
src/views/prepare-lessons/components/resource-main/components/select-music/index.tsx

@@ -12,6 +12,40 @@ import requestOrigin from 'umi-request';
 import CardPreview from '/src/components/card-preview';
 import { evaluateDifficult } from '/src/utils/contants';
 import { eventGlobal } from '/src/utils';
+import { materialQueryPage } from '/src/views/natural-resources/api';
+
+const formatType = (type: string) => {
+  if (type === 'sahreMusic') {
+    return 2;
+  } else if (type === 'myMusic') {
+    return 3;
+  } else if (type === 'collectMusic') {
+    return 4;
+  }
+};
+
+export const typeFormat = (trainingType: string, configJson: any) => {
+  let tList: string[] = [];
+
+  if (trainingType === 'EVALUATION') {
+    tList = [
+      `${evaluateDifficult[configJson.evaluateDifficult]}`,
+      configJson.practiceChapterBegin || configJson.practiceChapterEnd
+        ? `${configJson.practiceChapterBegin}-${configJson.practiceChapterEnd}小节`
+        : '全部小节',
+      // `速度${configJson.evaluateSpeed}`,
+      `${configJson.trainingTimes}分合格`
+    ];
+  } else {
+    tList = [
+      `${configJson.practiceChapterBegin}-${configJson.practiceChapterEnd}小节`,
+      `速度${configJson.practiceSpeed}`,
+      `${configJson.trainingTimes}分钟`
+    ];
+  }
+  return tList;
+};
+
 export default defineComponent({
   name: 'share-resources',
   props: {
@@ -20,7 +54,7 @@ export default defineComponent({
       default: 'myMusic'
     }
   },
-  setup() {
+  setup(props) {
     const prepareStore = usePrepareStore();
     const state = reactive({
       loading: false,
@@ -32,6 +66,7 @@ export default defineComponent({
       searchGroup: {
         name: '',
         musicSheetCategoriesId: '',
+        sourceType: formatType(props.type),
         status: 1,
         versionFlag: false,
         musicSubject: null
@@ -48,28 +83,48 @@ export default defineComponent({
         if (state.pagination.page === 1) {
           state.loading = true;
         }
-        const { data } = await musicSheetPage({
+        // const { data } = await musicSheetPage({
+        //   ...state.searchGroup,
+        //   ...state.pagination,
+        //   musicSubject: prepareStore.getSubjectId
+        // });
+        const { data } = await materialQueryPage({
           ...state.searchGroup,
           ...state.pagination,
-          musicSubject: prepareStore.getSubjectId
+          subjectId: prepareStore.getSubjectId
         });
         state.loading = false;
         const tempRows = data.rows || [];
         const temp: any = [];
 
+        // tempRows.forEach((row: any) => {
+        //   const index = prepareStore.getTrainList.findIndex(
+        //     (course: any) => course.musicId === row.id
+        //   );
+        //   temp.push({
+        //     id: row.id,
+        //     coverImg: row.musicSvg,
+        //     type: 'MUSIC',
+        //     title: row.musicSheetName,
+        //     isCollect: false,
+        //     isSelected: true,
+        //     content: row.id,
+        //     xmlFileUrl: row.xmlFileUrl,
+        //     exist: index !== -1 ? true : false // 是否存在
+        //   });
+        // });
         tempRows.forEach((row: any) => {
-          const index = prepareStore.getTrainList.findIndex(
-            (course: any) => course.musicId === row.id
+          const index = prepareStore.getCoursewareList.findIndex(
+            (course: any) => course.materialId === row.id
           );
           temp.push({
             id: row.id,
-            coverImg: row.musicSvg,
-            type: 'MUSIC',
-            title: row.musicSheetName,
-            isCollect: false,
-            isSelected: true,
-            content: row.id,
-            xmlFileUrl: row.xmlFileUrl,
+            coverImg: row.coverImg,
+            type: row.type,
+            title: row.name,
+            isCollect: !!row.favoriteFlag,
+            isSelected: row.sourceFrom === 'PLATFORM' ? true : false,
+            content: row.content,
             exist: index !== -1 ? true : false // 是否存在
           });
         });
@@ -146,28 +201,6 @@ export default defineComponent({
       state.editStatus = true;
     };
 
-    const typeFormat = (trainingType: string, configJson: any) => {
-      let tList: string[] = [];
-
-      if (trainingType === 'EVALUATION') {
-        tList = [
-          `${evaluateDifficult[configJson.evaluateDifficult]}`,
-          configJson.practiceChapterBegin || configJson.practiceChapterEnd
-            ? `${configJson.practiceChapterBegin}-${configJson.practiceChapterEnd}小节`
-            : '全部小节',
-          // `速度${configJson.evaluateSpeed}`,
-          `${configJson.trainingTimes}分合格`
-        ];
-      } else {
-        tList = [
-          `${configJson.practiceChapterBegin}-${configJson.practiceChapterEnd}小节`,
-          `速度${configJson.practiceSpeed}`,
-          `${configJson.trainingTimes}分钟`
-        ];
-      }
-      return tList;
-    };
-
     onMounted(() => {
       getList();
 

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

@@ -1,4 +1,11 @@
-import { defineComponent, reactive } from 'vue';
+import {
+  PropType,
+  defineComponent,
+  nextTick,
+  onMounted,
+  reactive,
+  ref
+} from 'vue';
 import styles from './index.module.less';
 import { NTabs, NTabPane, NModal } from 'naive-ui';
 import SelectMusicModal from '../../model/select-music';
@@ -11,7 +18,14 @@ import requestOrigin from 'umi-request';
 
 export default defineComponent({
   name: 'resource-main',
-  setup() {
+  props: {
+    /** 类型 */
+    cardType: {
+      type: String as PropType<'' | 'homerowk-record'>,
+      default: ''
+    }
+  },
+  setup(props, { expose }) {
     const prepareStore = usePrepareStore();
     const forms = reactive({
       tabType: 'myResources',
@@ -21,6 +35,8 @@ export default defineComponent({
       editStatus: false,
       editItem: {} as any
     });
+    const tabRef = ref();
+    const workRef = ref();
 
     const onAdd = async (item: any) => {
       let xmlStatus = 'init';
@@ -52,6 +68,20 @@ export default defineComponent({
       forms.editStatus = true;
     };
 
+    const resetTabPosition = () => {
+      nextTick(() => {
+        tabRef.value?.syncBarPosition();
+        workRef.value?.syncBarPosition();
+      });
+    };
+
+    onMounted(() => {
+      resetTabPosition();
+    });
+
+    expose({
+      resetTabPosition
+    });
     return () => (
       <div
         class={[
@@ -60,8 +90,10 @@ export default defineComponent({
             ? styles.resourceClose
             : ''
         ]}>
-        {prepareStore.getTabType === 'courseware' ? (
+        {prepareStore.getTabType === 'courseware' &&
+        props.cardType !== 'homerowk-record' ? (
           <NTabs
+            ref={tabRef}
             animated
             value={forms.tabType}
             paneClass={styles.paneTitle}
@@ -115,6 +147,7 @@ export default defineComponent({
           </NTabs>
         ) : (
           <NTabs
+            ref={workRef}
             animated
             value={forms.tabWorkType}
             paneClass={styles.paneTitle}

+ 3 - 1
src/views/prepare-lessons/index.tsx

@@ -24,6 +24,7 @@ export default defineComponent({
       sidebarShow: true
     });
     const prepareStore = usePrepareStore();
+    const resourceMainRef = ref();
     // console.log(prepareStore, 'prepareStore');
     const { treeList, coursewareList } = storeToRefs(prepareStore);
     const showGuide = computed(() => {
@@ -53,6 +54,7 @@ export default defineComponent({
 
     const onSlideChange = (val: boolean) => {
       state.sidebarShow = val;
+      resourceMainRef.value?.resetTabPosition();
     };
     onMounted(() => {
       // 指引事件
@@ -116,7 +118,7 @@ export default defineComponent({
         </div>
         {/* 资源 */}
         <div class={[styles.resourceMain]} id="lessons-1">
-          <ResourceMain />
+          <ResourceMain ref={resourceMainRef} />
         </div>
         {showGuide.value ? <LessonsGuide></LessonsGuide> : null}
       </div>

+ 7 - 3
src/views/prepare-lessons/model/select-music/index.tsx

@@ -3,6 +3,7 @@ import { defineComponent, onMounted, ref, toRefs } from 'vue';
 import styles from './index.module.less';
 import SelectItem from './select-item';
 import { useResizeObserver } from '@vueuse/core';
+import { emit } from 'process';
 
 export default defineComponent({
   name: 'select-music',
@@ -17,8 +18,8 @@ export default defineComponent({
       default: ''
     }
   },
-  emits: ['select'],
-  setup(props) {
+  emits: ['select', 'add'],
+  setup(props, { emit }) {
     const { type } = toRefs(props);
     const tabType = ref(type.value);
 
@@ -49,7 +50,10 @@ export default defineComponent({
             tabType.value = val;
           }}>
           <NTabPane name="myResources" tab={'我的曲目'}>
-            <SelectItem type="myResources" />
+            <SelectItem
+              type="myResources"
+              onAdd={(item: any) => emit('add', item)}
+            />
           </NTabPane>
           <NTabPane name="shareResources" tab={'共享曲目'}>
             <SelectItem type="shareResources" />

+ 16 - 8
src/views/prepare-lessons/model/work-section/index.tsx

@@ -5,6 +5,12 @@ import teacherIcon from '@components/layout/images/teacherIcon.png';
 
 export default defineComponent({
   name: 'work-section',
+  props: {
+    item: {
+      type: Object,
+      default: () => ({})
+    }
+  },
   emits: ['edit', 'delete', 'confirm', 'editTitle'],
   setup(props, { emit }) {
     return () => (
@@ -13,9 +19,9 @@ export default defineComponent({
           <div
             class={styles.headerName}
             onClick={() => {
-              emit('editTitle');
+              emit('editTitle', props.item);
             }}>
-            <span>其多列-课后作业课后作业课后作业课后作业</span>
+            <span>{props.item.title}</span>
             <i class={styles.iconEdit}></i>
           </div>
 
@@ -32,13 +38,15 @@ export default defineComponent({
         </div>
 
         <div class={styles.content}>
-          <NAvatar class={styles.navatar} round src={teacherIcon} />
+          <NAvatar
+            class={styles.navatar}
+            round
+            src={props.item.teacherAvatar || teacherIcon}
+          />
           <div class={styles.userInfo}>
-            <h2>孙忆枫</h2>
-            <p class={styles.p1}>
-              练习曲目《小星星》、《我和我的祖国》练习曲目《小星星》、《我和我的祖国》
-            </p>
-            <p class={styles.p2}>评测曲目《我和我的祖国》</p>
+            <h2>{props.item.teacherName}</h2>
+            {props.item.pTitle && <p class={styles.p1}>{props.item.pTitle}</p>}
+            {props.item.eTitle && <p class={styles.p2}>{props.item.eTitle}</p>}
           </div>
           <NSpace class={styles.btnGroup} justify="center" vertical>
             <NButton

+ 2 - 2
vite.config.ts

@@ -23,8 +23,8 @@ function resolve(dir: string) {
 }
 // https://vitejs.dev/config/
 // https://github.com/vitejs/vite/issues/1930 .env
-// const proxyUrl = 'https://dev.kt.colexiu.com/';
-const proxyUrl = 'https://test.lexiaoya.cn';
+const proxyUrl = 'https://dev.kt.colexiu.com/';
+// const proxyUrl = 'https://test.lexiaoya.cn';
 // const proxyUrl = 'http://192.168.3.14:7989';
 const now = new Date().getTime();
 export default defineConfig(() => {