Explorar o código

Merge branch 'feature/0429-music' of http://git.dayaedu.com/lex/resource-admin into hqyNewVersion

黄琪勇 hai 1 ano
pai
achega
db5a39c1cc

+ 11 - 0
src/views/music-library/music-sheet/component/music-list.tsx

@@ -455,9 +455,20 @@ export default defineComponent({
         const { data } = await musicSheetCategoriesQueryTree({})
         // state.musicSheetCategories = filterPointCategory(data, 'musicSheetCategoriesList')
         state.musicSheetCategories = data || []
+        clearEmptyMusicCategory(state.musicSheetCategories)
       } catch (e) {}
     }
 
+    const clearEmptyMusicCategory = (data: any) => {
+      for (let i = 0; i < data.length; i++) {
+        if (data[i].musicSheetCategoriesList.length < 1) {
+          data[i].musicSheetCategoriesList = null
+        } else {
+          clearEmptyMusicCategory(data[i].musicSheetCategoriesList)
+        }
+      }
+    }
+
     // 获取声部
     const initSubjectList = async () => {
       try {

+ 267 - 193
src/views/music-library/music-sheet/modal/music-operationV2.tsx

@@ -37,6 +37,7 @@ import MusicSheetOwnerDialog from '@views/music-library/music-sheet/modal/musicS
 import {sysApplicationPage} from '@views/menu-manage/api'
 import {filterPointCategory} from '@views/teaching-manage/unit-test'
 import MusicCreateImg from './music-create-img'
+import {TABS_ROUTES} from "@/store/mutation-types";
 
 /**
  * 获取指定元素下一个Note元素
@@ -337,7 +338,7 @@ export default defineComponent({
       musicSheetAccompanimentUrls: '' as any,
       musicSheetAccompanimentUrlList: [] as any,
       instrumentData: [],
-      instrumentList: [],
+      instrumentList: [] as any,
       instrumentIdNameMap: new Map() as any,
       subjectList: [] as any,
       showMusicSheetOwnerDialog: false, //所属人弹框
@@ -371,6 +372,46 @@ export default defineComponent({
         if (error) {
           return
         }
+        // 校验合奏时声轨与乐器是否存在不匹配情况
+        if (forms.musicSheetType == 'CONCERT') {
+          let set = [] as any;
+          const {data} = await musicalInstrumentPage({page: 1, rows: 9999})
+          data.rows.map((row: any) => {
+            if (row.code) {
+              row.code.split(',').forEach((code: string) => {
+                let temp = code.replaceAll(' ', '')
+                set.push(temp.toLocaleLowerCase())
+              })
+            }
+          })
+          let unDefinedTrack = [] as any
+          forms.multiTracksSelection.forEach((item: any) => {
+            if (item) {
+              let contain = false;
+              let code = item.replaceAll(' ', '').toLocaleLowerCase()
+              for (let i = 0; i < set.length; i++) {
+                if (set[i].startsWith(code) || set[i].endsWith(code)) {
+                  contain = true
+                  break
+                }
+              }
+              if (!contain) {
+                unDefinedTrack.push(item)
+              }
+            }
+          })
+          if (unDefinedTrack.length > 0) {
+            dialog.warning({
+              title: '提示',
+              content: `声轨未配置:${unDefinedTrack.join(',')}`,
+              positiveText: '确定',
+              onPositiveClick: () => {
+              },
+            })
+            return
+          }
+        }
+
         if (!state.isAutoSave) {
           state.isAutoSave = true
           state.productOpen = true
@@ -619,18 +660,18 @@ export default defineComponent({
           part = part || 'noPartName'
         }
         return {
-          value: part,
-          label: part
+          value: part.trim(),
+          label: part.trim()
         }
       })
 
       // 处理空数据
-      if (partListNames.length === 1 && forms.details.id && !partListNames[0].value) {
-        partListNames[0] = {
-          value: forms.details.multiTracksSelection,
-          label: forms.details.multiTracksSelection
-        }
-      }
+      // if (partListNames.length === 1 && forms.details.id && !partListNames[0].value) {
+      //   partListNames[0] = {
+      //     value: forms.details.multiTracksSelection,
+      //     label: forms.details.multiTracksSelection
+      //   }
+      // }
 
       partListNames = partListNames.filter((n: any) => n.value?.toLocaleUpperCase?.() != 'COMMON')
 
@@ -712,7 +753,7 @@ export default defineComponent({
         onPositiveClick: async () => {
           const sound = forms.musicSheetSoundList_YY[index]
           const track = sound.track
-          if (track) {
+          if (track != null) {
             const selectIndex = forms.multiTracksSelection.indexOf(track)
             if (selectIndex > -1) {
               forms.multiTracksSelection.splice(selectIndex, 1)
@@ -776,6 +817,33 @@ export default defineComponent({
       }
     }
 
+    const changeSubject = async (subjectIdList: []) => {
+      state.instrumentList = []
+      if (!subjectIdList || subjectIdList.length == 0) {
+        forms.musicalInstrumentIdList = []
+        return
+      }
+      let enableFlag = null;
+      if (props.type === 'add') {
+        enableFlag = true;
+      }
+      let tempMusicalInstrumentIdList = [] as any
+      const {data} = await musicalInstrumentPage({page: 1, rows: 999, subjectIds: subjectIdList, enableFlag: enableFlag});
+      data.rows.map((item: any) => {
+        tempMusicalInstrumentIdList.push(item.id + '')
+        state.instrumentList.push(
+            {
+              label: item.name,
+              value: item.id + '',
+              disabled: !item.enableFlag
+            }
+        )
+      })
+      forms.musicalInstrumentIdList = forms.musicalInstrumentIdList.filter((item: any) => {
+        return tempMusicalInstrumentIdList.includes(item)
+      })
+    }
+
     onMounted(async () => {
       state.loading = true
       if (props.type === 'preview') {
@@ -789,7 +857,6 @@ export default defineComponent({
         try {
           const {data} = await musicalInstrumentPage({page: 1, rows: 999})
           const tempList = data.rows || []
-          state.instrumentData = tempList
           tempList.forEach((item: any) => {
             item.label = item.name
             item.value = item.id + ''
@@ -805,7 +872,8 @@ export default defineComponent({
               'audioPlayType': 'PLAY'
             });
           })
-          state.instrumentList = tempList
+          state.instrumentData = tempList
+          // state.instrumentList = tempList
         } catch {
         }
       }
@@ -876,9 +944,8 @@ export default defineComponent({
               }
             })
           }
-          forms.musicalInstrumentIdList = data.musicalInstrumentIds
-              ? data.musicalInstrumentIds.split(',')
-              : []
+          forms.musicalInstrumentIdList = data.musicalInstrumentIds ? data.musicalInstrumentIds.split(',') : []
+          await changeSubject(forms.subjectIds)
           forms.musicCategoryId = data.musicCategoryId
           forms.audioType = data.audioType
           forms.isPlayBeat = data.isPlayBeat
@@ -939,12 +1006,12 @@ export default defineComponent({
               state.partListNames = getPartListNames(res?.data as any) as any
 
               // 初始化音轨和原音
-              forms.multiTracksSelection = data.multiTracksSelection ? data.multiTracksSelection.split(',') : []
+              forms.multiTracksSelection = data.multiTracksSelection ? data.multiTracksSelection.trim().split(',') : ['']
 
               if (state.musicSheetSoundList.length === 1 && state.musicSheetSoundList[0].track === 'P1') {
                 forms.musicSheetSoundList_YY.push({
                   audioFileUrl: state.musicSheetSoundList[0].audioFileUrl, // 原音
-                  track: state.partListNames[0].value || null, // 轨道
+                  track: state.partListNames[0].value || '', // 轨道
                   audioPlayType: 'PLAY'
                 })
               } else {
@@ -952,7 +1019,8 @@ export default defineComponent({
                 state.partListNames.forEach((item: any) => {
                   let audioFileUrl = null
                   state.musicSheetSoundList.forEach((next: any) => {
-                    if (next.track && next.track == item.value) {
+                    let track = next.track ? next.track : ''
+                    if (track.trim() == item.value) {
                       audioFileUrl = next.audioFileUrl
                     }
                   })
@@ -967,10 +1035,10 @@ export default defineComponent({
                 // 处理没有声轨,但有原音
                 if (data.musicSheetType == 'CONCERT') {
                   state.musicSheetSoundList.forEach((next: any) => {
-                    if (!tracks.includes(next.track) && next.audioPlayType == 'PLAY') {
+                    if (next.track && !tracks.includes(next.track.trim()) && next.audioPlayType == 'PLAY') {
                       forms.musicSheetSoundList_YY.push({
                         audioFileUrl: next.audioFileUrl, // 原音
-                        track: next.track ? next.track : null, // 轨道
+                        track: next.track ? next.track.trim() : '', // 轨道
                         audioPlayType: 'PLAY'
                       })
                     }
@@ -986,9 +1054,9 @@ export default defineComponent({
         state.subjectList = state.subjectList.filter((next: any) => {
           return next.enableFlag == true
         })
-        state.instrumentList = state.instrumentList.filter((next: any) => {
-          return next.enableFlag == true
-        })
+        // state.instrumentList = state.instrumentList.filter((next: any) => {
+        //   return next.enableFlag == true
+        // })
       }
       state.loading = false
     })
@@ -1078,52 +1146,24 @@ export default defineComponent({
                   />
                 </NFormItemGi>
                 <NFormItemGi
-                    label="谱面渲染"
-                    path="musicSheetType"
-                    rule={[
-                      {
-                        required: true,
-                        message: '请选择谱面渲染',
-                        trigger: 'change'
-                      }
-                    ]}
-                >
-                  <NRadioGroup v-model:value={forms.musicSheetType}>
-                    <NRadio value={'SINGLE'}>多声轨</NRadio>
-                    <NRadio value={'CONCERT'}>单声轨</NRadio>
-                  </NRadioGroup>
-                </NFormItemGi>
-              </NGrid>
-              <NGrid cols={2}>
-                <NFormItemGi
-                    label="适用声部"
-                    path="isAllSubject"
+                    label="曲目分类"
+                    path="musicCategoryId"
                     rule={[
                       {
                         required: true,
-                        message: '请选择适用声部',
-                      }
-                    ]}
-                >
-                  <NRadioGroup v-model:value={forms.isAllSubject}>
-                    <NRadio value={false}>部分声部</NRadio>
-                    <NRadio value={true}>全部声部</NRadio>
-                  </NRadioGroup>
-                </NFormItemGi>
-                <NFormItemGi
-                    label="速度"
-                    path="playSpeed"
-                    rule={[
-                      {
-                        required: false,
-                        message: '请输入速度'
+                        message: '请选择曲目分类',
+                        trigger: ['change']
                       }
                     ]}
                 >
-                  <NInputNumber
-                      placeholder="请输入速度"
-                      v-model:value={forms.playSpeed}
-                      style="width:100%"
+                  <NCascader
+                      valueField="id"
+                      labelField="name"
+                      children-field="musicSheetCategoriesList"
+                      placeholder="请选择分类"
+                      v-model:value={forms.musicCategoryId}
+                      options={state.musicSheetCategories}
+                      clearable
                   />
                 </NFormItemGi>
               </NGrid>
@@ -1236,27 +1276,6 @@ export default defineComponent({
                       v-model:value={forms.appAuditFlag}
                   />
                 </NFormItemGi>
-                <NFormItemGi
-                    label="曲目分类"
-                    path="musicCategoryId"
-                    rule={[
-                      {
-                        required: true,
-                        message: '请选择曲目分类',
-                        trigger: ['change']
-                      }
-                    ]}
-                >
-                  <NCascader
-                      valueField="id"
-                      labelField="name"
-                      children-field="musicSheetCategoriesList"
-                      placeholder="请选择分类"
-                      v-model:value={forms.musicCategoryId}
-                      options={state.musicSheetCategories}
-                      clearable
-                  />
-                </NFormItemGi>
               </NGrid>
               <NAlert showIcon={false} style={{marginBottom: '12px'}}>
                 曲目设置
@@ -1354,6 +1373,165 @@ export default defineComponent({
                 </NFormItemGi>
               </NGrid>
 
+              <NGrid cols={2}>
+                <NFormItemGi
+                    label="谱面渲染"
+                    path="musicSheetType"
+                    rule={[
+                      {
+                        required: true,
+                        message: '请选择谱面渲染',
+                        trigger: 'change'
+                      }
+                    ]}
+                >
+                  <NRadioGroup v-model:value={forms.musicSheetType}>
+                    <NRadio value={'SINGLE'}>多声轨</NRadio>
+                    <NRadio value={'CONCERT'}>单声轨</NRadio>
+                  </NRadioGroup>
+                </NFormItemGi>
+                <NFormItemGi
+                    label="适用声部"
+                    path="isAllSubject"
+                    rule={[
+                      {
+                        required: true,
+                        message: '请选择适用声部',
+                      }
+                    ]}
+                >
+                  <NRadioGroup v-model:value={forms.isAllSubject}>
+                    <NRadio value={false}>部分声部</NRadio>
+                    <NRadio value={true}>全部声部</NRadio>
+                  </NRadioGroup>
+                </NFormItemGi>
+              </NGrid>
+              {!forms.isAllSubject && (
+                  <NGrid cols={2}>
+                    <NFormItemGi
+                        label="可用声部"
+                        path="subjectIds"
+                        rule={[
+                          {
+                            required: true,
+                            message: '请选择可用声部',
+                            trigger: 'change',
+                            type: 'array'
+                          }
+                        ]}
+                    >
+                      <NSelect
+                          v-model:value={forms.subjectIds}
+                          options={state.subjectList}
+                          multiple
+                          filterable
+                          clearable
+                          placeholder="请选择可用声部"
+                          maxTagCount={2}
+                          onUpdateValue={async (val: any) => {
+                            await changeSubject(val)
+                          }}
+                      />
+                    </NFormItemGi>
+                    <NFormItemGi
+                        label="可用乐器"
+                        path="musicalInstrumentIdList"
+                        rule={[
+                          {
+                            required: true,
+                            message: '请选择可用乐器',
+                            trigger: 'change',
+                            type: 'array'
+                          }
+                        ]}
+                    >
+                      <NSelect
+                          placeholder="请选择可用乐器"
+                          options={state.instrumentList}
+                          v-model:value={forms.musicalInstrumentIdList}
+                          clearable
+                          multiple
+                          maxTagCount={2}
+                          onUpdateValue={async (value: any) => {
+                          }}
+                      />
+                    </NFormItemGi>
+                  </NGrid>
+              )}
+              <NGrid cols={2}>
+                <NFormItemGi
+                    label="速度"
+                    path="playSpeed"
+                    rule={[
+                      {
+                        required: false,
+                        message: '请输入速度'
+                      }
+                    ]}
+                >
+                  <NInputNumber
+                      placeholder="请输入速度"
+                      v-model:value={forms.playSpeed}
+                      style="width:100%"
+                  />
+                </NFormItemGi>
+              </NGrid>
+              <NGrid cols={1}>
+                <NFormItemGi
+                    label={`${forms.musicSheetType === 'SINGLE' ? '页面渲染声轨' : '用户可切换声轨'}`}
+                    path="multiTracksSelection"
+                    rule={[
+                      {
+                        required: true,
+                        message: `请选择${
+                            forms.musicSheetType === 'SINGLE' ? '页面渲染声轨' : '用户可切换声轨'
+                        }`,
+                        trigger: 'change',
+                        type: 'array'
+                      }
+                    ]}
+                >
+                  <NGrid style="padding-top: 4px;">
+                    <NGi span={24}>
+                      <NRadioGroup
+                          v-model:value={state.multiTracks}
+                          onUpdateValue={(value) => {
+                            checkMultiTracks(value)
+                          }}
+                      >
+                        <NRadio value={'all'}>全选</NRadio>
+                        <NRadio value={'allUncheck'}>重置</NRadio>
+                        <NRadio value={'invert'}>反选</NRadio>
+                      </NRadioGroup>
+                    </NGi>
+                    {state.partListNames && state.partListNames.length > 0 && (
+                        <NGi span={24} style={'margin-top:5px'}>
+                          <NFormItemGi
+                              label=""
+                              path="multiTracksSelection"
+                              rule={[
+                                {
+                                  required: false
+                                }
+                              ]}
+                          >
+                            <NCheckboxGroup v-model:value={forms.multiTracksSelection}>
+                              <NGrid yGap={2} cols={4}>
+                                {state.partListNames.map((item: any) => (
+                                    <NGi>
+                                      <NCheckbox value={item.value} label={item.label}/>
+                                    </NGi>
+                                ))}
+                              </NGrid>
+                            </NCheckboxGroup>
+                          </NFormItemGi>
+                        </NGi>
+                    )}
+                  </NGrid>
+                </NFormItemGi>
+              </NGrid>
+
+
               <NAlert showIcon={false} style={{marginBottom: '12px'}}>
                 演唱文件
               </NAlert>
@@ -1555,55 +1733,6 @@ export default defineComponent({
                   </NRadioGroup>
                 </NFormItemGi>
               </NGrid>
-              {!forms.isAllSubject && (
-                  <NGrid cols={2}>
-                    <NFormItemGi
-                        label="可用声部"
-                        path="subjectIds"
-                        rule={[
-                          {
-                            required: true,
-                            message: '请选择可用声部',
-                            trigger: 'change',
-                            type: 'array'
-                          }
-                        ]}
-                    >
-                      <NSelect
-                          v-model:value={forms.subjectIds}
-                          options={state.subjectList}
-                          multiple
-                          filterable
-                          clearable
-                          placeholder="请选择可用声部"
-                          maxTagCount={2}
-                      />
-                    </NFormItemGi>
-                    <NFormItemGi
-                        label="可用乐器"
-                        path="musicalInstrumentIdList"
-                        rule={[
-                          {
-                            required: true,
-                            message: '请选择可用乐器',
-                            trigger: 'change',
-                            type: 'array'
-                          }
-                        ]}
-                    >
-                      <NSelect
-                          placeholder="请选择可用乐器"
-                          options={state.instrumentList}
-                          v-model:value={forms.musicalInstrumentIdList}
-                          clearable
-                          multiple
-                          maxTagCount={2}
-                          onUpdateValue={async (value: any) => {
-                          }}
-                      />
-                    </NFormItemGi>
-                  </NGrid>
-              )}
               <NGrid cols={2}>
                 {forms.playMode === 'MP3' && (
                     <NFormItemGi
@@ -1738,67 +1867,12 @@ export default defineComponent({
                     </NFormItem>
                   </>
               )}
-              <NGrid cols={1}>
-                <NFormItemGi
-                    label={`${forms.musicSheetType === 'SINGLE' ? '页面渲染声轨' : '用户可切换声轨'}`}
-                    path="multiTracksSelection"
-                    rule={[
-                      {
-                        required: true,
-                        message: `请选择${
-                            forms.musicSheetType === 'SINGLE' ? '页面渲染声轨' : '用户可切换声轨'
-                        }`,
-                        trigger: 'change',
-                        type: 'array'
-                      }
-                    ]}
-                >
-                  <NGrid style="padding-top: 4px;">
-                    <NGi span={24}>
-                      <NRadioGroup
-                          v-model:value={state.multiTracks}
-                          onUpdateValue={(value) => {
-                            checkMultiTracks(value)
-                          }}
-                      >
-                        <NRadio value={'all'}>全选</NRadio>
-                        <NRadio value={'allUncheck'}>重置</NRadio>
-                        <NRadio value={'invert'}>反选</NRadio>
-                      </NRadioGroup>
-                    </NGi>
-                    {state.partListNames && state.partListNames.length > 0 && (
-                        <NGi span={24} style={'margin-top:5px'}>
-                          <NFormItemGi
-                              label=""
-                              path="multiTracksSelection"
-                              rule={[
-                                {
-                                  required: false
-                                }
-                              ]}
-                          >
-                            <NCheckboxGroup v-model:value={forms.multiTracksSelection}>
-                              <NGrid yGap={2} cols={4}>
-                                {state.partListNames.map((item: any) => (
-                                    <NGi>
-                                      <NCheckbox value={item.value} label={item.label}/>
-                                    </NGi>
-                                ))}
-                              </NGrid>
-                            </NCheckboxGroup>
-                          </NFormItemGi>
-                        </NGi>
-                    )}
-                  </NGrid>
-                </NFormItemGi>
-              </NGrid>
-
               {/*独奏*/}
               {forms.musicSheetType == 'SINGLE' && forms.playMode === 'MP3' && !forms.isAllSubject && forms.musicSheetSoundList_YZ.map((item: any, index: any) => {
                 return (
                     <>
-                      <NGrid cols={1}>
-                        {forms.musicalInstrumentIdList.includes(item.musicalInstrumentId) && (
+                      {forms.musicalInstrumentIdList.includes(item.musicalInstrumentId) && (
+                          <NGrid class={styles.audioSection}>
                             <NFormItemGi
                                 span={12}
                                 label={item.musicalInstrumentName}
@@ -1822,8 +1896,8 @@ export default defineComponent({
                                   bucketName="cloud-coach"
                               />
                             </NFormItemGi>
-                        )}
-                      </NGrid>
+                          </NGrid>
+                      )}
                     </>
                 )
               })
@@ -1873,7 +1947,7 @@ export default defineComponent({
                                           path={`musicSheetSoundList_YY[${index}].track`}
                                           rule={[
                                             {
-                                              required: true,
+                                              required: false,
                                               message: '请选择所属轨道'
                                             }
                                           ]}