Browse Source

Merge branch 'feature/0429-musicV2' into test-online

yuanliang 1 year ago
parent
commit
904e08ddfd

+ 26 - 4
src/views/music-library/music-sheet/component/music-list.tsx

@@ -72,7 +72,8 @@ export default defineComponent({
         categoriesId: null, //是否审核版本
         musicCategoryId: null, //曲目分类
         musicalInstrumentId: null, // 乐器ID
-        dataCorrect: null // 数据修复
+        dataCorrect: null, // 数据修复
+        generateMetronomeAudio: null, // 是否生成节拍器音频
       },
       dataList: [] as any,
       subjectList: [] as any,
@@ -145,9 +146,11 @@ export default defineComponent({
                 <NDescriptionsItem label="分类">
                   <TheTooltip content={row.musicCategoryName} />
                 </NDescriptionsItem>
-                <NDescriptionsItem label="可用声部">
-                  <TheTooltip content={row.subjectNames} />
-                </NDescriptionsItem>
+                {!row.isAllSubject && (
+                    <NDescriptionsItem label="可用声部">
+                      <TheTooltip content={row.subjectNames}/>
+                    </NDescriptionsItem>
+                )}
                 {/*<NDescriptionsItem label="可用乐器">*/}
                 {/*  <TheTooltip content={row.musicalInstrumentNames} />*/}
                 {/*</NDescriptionsItem>*/}
@@ -772,6 +775,25 @@ export default defineComponent({
               }
             />
           </NFormItem>
+          <NFormItem label="生成节拍器音频" path="generateMetronomeAudio">
+            <NSelect
+              v-model={[state.searchForm.generateMetronomeAudio, 'value']}
+              placeholder="请选择是否生成节拍器音频"
+              clearable
+              options={
+                [
+                  {
+                    label: '已生成',
+                    value: true
+                  },
+                  {
+                    label: '未生成',
+                    value: false
+                  }
+                ] as any
+              }
+            />
+          </NFormItem>
           <NFormItem>
             <NSpace>
               <NButton type="primary" onClick={onSearch}>

+ 305 - 196
src/views/music-library/music-sheet/modal/music-operationV2.tsx

@@ -4,7 +4,7 @@ import {
   NButton,
   NCascader,
   NCheckbox,
-  NCheckboxGroup,
+  NCheckboxGroup, NDivider,
   NForm,
   NFormItem,
   NFormItemGi,
@@ -23,7 +23,7 @@ import {
   useDialog,
   useMessage
 } from 'naive-ui'
-import {defineComponent, onMounted, PropType, reactive, ref} from 'vue'
+import {defineComponent, onMounted, PropType, reactive, ref, watch} from 'vue'
 import {musicSheetCategoriesQueryTree, musicSheetDetail, musicSheetSave} from '../../api'
 import UploadFile from '@/components/upload-file'
 import styles from './index.module.less'
@@ -37,7 +37,6 @@ 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元素
@@ -327,6 +326,10 @@ export default defineComponent({
       isShowFingering: true, // 是否显示指法
       solmizationFileUrl: null, // 唱名文件
       isAllSubject: false, // 适用声部
+
+      fSongList:[] as any,// 范唱列表
+      isScoreRender: true, // 总谱渲染
+      scoreAudioFileUrl: null as any, // 总谱文件
     })
     const state = reactive({
       loading: false,
@@ -335,8 +338,7 @@ export default defineComponent({
       xmlFirstSpeed: null as any, // 第一个音轨速度
       partListNames: [] as any, // 所有音轨声部列表
       musicSheetCategories: [] as any,
-      musicSheetAccompanimentUrls: '' as any,
-      musicSheetAccompanimentUrlList: [] as any,
+      musicSheetAccompanimentUrl: null as any,
       instrumentData: [],
       instrumentList: [] as any,
       instrumentIdNameMap: new Map() as any,
@@ -352,15 +354,26 @@ export default defineComponent({
       productItem: {} as any,
       productIfameSrc: '',
       isAutoSave: false, // 是否自动保存
-      fSongFile: null as any, // 范唱
       bSongFile: null as any, // 伴唱
       musicSheetSoundList: [] as any,
+
+      subjectDisabled: false, // 声部不可用
+      instrumentDisabled: false, // 乐器不可用
+      initFSongMap: new Map() as any, //初始化的范唱
     })
     const gradualData = reactive({
       list: [] as any[],
       gradualRefs: [] as any[]
     })
 
+    watch(
+        () => forms.multiTracksSelection,
+        (value) => {
+          initInstrumentAndSubjectByCode(value)
+          initFSongList()
+        }
+    )
+
     const btnLoading = ref(false)
     const formsRef = ref()
     const message = useMessage()
@@ -414,24 +427,23 @@ export default defineComponent({
 
         try {
           //extConfigJson: {"repeatedBeats":0,"gradualTimes":{"75":"02:38:60","77":"02:43:39"}}
-          let audioPlayTypes = [] as any;
+          let audioPlayTypes = new Set() as any;
           let musicSheetSoundList = [];
           let musicSheetType = forms.musicSheetType;
-          if (state.fSongFile) {
-            musicSheetSoundList.push({
-              musicSheetId: props.data.id,
-              audioFileUrl: state.fSongFile,
-              audioPlayType: 'SING',
-              solmizationFileUrl: forms.solmizationFileUrl
-            })
-            audioPlayTypes.push("SING")
+
+          for (let i = 0; i < forms.fSongList.length; i++) {
+            let fSong = forms.fSongList[i]
+            if (fSong.audioFileUrl || fSong.solmizationFileUrl || fSong.femaleSolmizationFileUrl) {
+              musicSheetSoundList.push(fSong)
+              audioPlayTypes.add("SING")
+            }
           }
 
           var existYzFile = false;
           if (musicSheetType == 'SINGLE') {
             if (forms.isAllSubject) {
               if (forms.musicSheetSoundList_all_subject) {
-                audioPlayTypes.push("PLAY")
+                audioPlayTypes.add("PLAY")
                 musicSheetSoundList.push({
                   audioFileUrl: forms.musicSheetSoundList_all_subject,
                   musicSheetId: props.data.id,
@@ -440,8 +452,8 @@ export default defineComponent({
                 existYzFile = true
               }
             } else {
-              if (forms.musicSheetSoundList_YZ.length > 0 && forms.playMode == 'MP3') {
-                audioPlayTypes.push("PLAY")
+              if (forms.musicSheetSoundList_YZ.length > 0) {
+                audioPlayTypes.add("PLAY")
                 forms.musicSheetSoundList_YZ.forEach((musicSheetSound: any) => {
                   if (forms.musicalInstrumentIdList.includes(musicSheetSound.musicalInstrumentId) && musicSheetSound.audioFileUrl) {
                     existYzFile = true
@@ -454,35 +466,45 @@ export default defineComponent({
               }
             }
           } else if (musicSheetType == 'CONCERT') {
-            audioPlayTypes.push("PLAY")
+            audioPlayTypes.add("PLAY")
             forms.musicSheetSoundList_YY.forEach((musicSheetSound: any) => {
-              if (musicSheetSound.audioFileUrl && musicSheetSound.track != null) {
+              if (musicSheetSound.audioFileUrl && forms.multiTracksSelection.includes(musicSheetSound.track)) {
                 musicSheetSoundList.push({
                   ...musicSheetSound,
                   musicSheetId: props.data.id,
+                  audioPlayType: 'PLAY'
                 })
                 existYzFile = true
               }
             })
           }
-          if (!state.fSongFile && !state.bSongFile && !existYzFile) {
+          if (!state.bSongFile && !existYzFile) {
             message.warning("请上传音频文件")
             return
           }
 
+          // 生成图片
+          if (!state.isAutoSave) {
+            state.isAutoSave = true
+            state.productOpen = true
+            return
+          }
+
           if (state.bSongFile) {
             forms.musicSheetAccompanimentList.push({
               musicSheetId: props.data.id,
               audioFileUrl: state.bSongFile,
+              scoreAudioFileUrl: (forms.multiTracksSelection.length > 1 && forms.isScoreRender && forms.scoreAudioFileUrl) ? forms.scoreAudioFileUrl : null,
               audioPlayType: 'SING'
             })
           }
 
-          // 生成图片
-          if (!state.isAutoSave) {
-            state.isAutoSave = true
-            state.productOpen = true
-            return
+          if (state.musicSheetAccompanimentUrl) {
+            forms.musicSheetAccompanimentList.push({
+              musicSheetId: props.data.id,
+              audioFileUrl: state.musicSheetAccompanimentUrl,
+              audioPlayType: 'PLAY'
+            })
           }
 
 
@@ -493,7 +515,7 @@ export default defineComponent({
             appAuditFlag: forms.appAuditFlag,
             subjectIds: forms.isAllSubject ? "" : forms.subjectIds.join(','),
             remark: forms.remark,
-            audioPlayTypes: audioPlayTypes.join(','),
+            audioPlayTypes: Array.from(audioPlayTypes).join(','),
             musicalInstrumentIds: forms.isAllSubject ? "" : forms.musicalInstrumentIdList.join(','),
             composer: forms.composer,
             musicSheetType: forms.musicSheetType,
@@ -549,6 +571,32 @@ export default defineComponent({
       })
     }
 
+    const initFSongList = async () => {
+      forms.fSongList.forEach((fSong: any) => {
+        state.initFSongMap.set(fSong.track, fSong)
+      })
+
+      let fSongList = [] as any
+      forms.multiTracksSelection.forEach((item: any) => {
+        if (state.initFSongMap.has(item)) {
+          fSongList.push(state.initFSongMap.get(item))
+        } else {
+          fSongList.push({
+            musicSheetId: props.data.id,
+            audioFileUrl: null,
+            audioPlayType: 'SING',
+            musicalInstrumentId: null,
+            track: item,
+            // musicalInstrumentName: state.instrumentIdNameMap.get(item),
+            musicalInstrumentName: null,
+            solmizationFileUrl: null, // 唱名男
+            femaleSolmizationFileUrl: null, // 唱名女
+          })
+        }
+      })
+      forms.fSongList = fSongList
+    }
+
     // 上传XML,初始化音轨 音轨速度 乐器、声部
     const readFileInputEventAsArrayBuffer = (file: any) => {
       // 是否是evxml
@@ -566,7 +614,7 @@ export default defineComponent({
         })
 
         state.partListNames = getPartListNames(res?.target?.result as any) as any
-        // parseInstrumentAndSubject(res?.target?.result as any)
+        parseInstrumentAndSubject(res?.target?.result as any)
         // 这里是如果没有当前音轨就重新写
 
         let map = new Map<String, String>()
@@ -657,44 +705,58 @@ export default defineComponent({
         }
       }
       // 乐器支持多编码,暂不开放
-      // const codeIdMap = new Map<string, []>() as any
-      // state.instrumentData.forEach((data: any) => {
-      //   const codes = data.code.split(/,|,/)
-      //   codes.forEach((code: string) => {
-      //     if (codeIdMap.has(code)) {
-      //       codeIdMap.get(code).push(data.id + '')
-      //     } else {
-      //       const arr = [] as any;
-      //       arr.push(data.id + '')
-      //       codeIdMap.set(code, arr)
-      //     }
-      //     // codeIdMap.set(code, data.id + '')
-      //   })
-      // })
-      // forms.musicalInstrumentIdList = []
-      // instrumentCodeList.forEach((code: string) => {
-      //   if (codeIdMap.has(code)) {
-      //     codeIdMap.get(code).forEach((c: any) => {
-      //       forms.musicalInstrumentIdList.push(c)
-      //     })
-      //   }
-      // })
-      const codeIdMap = new Map<string, string>()
+      initInstrumentAndSubjectByCode(instrumentCodeList)
+    }
+
+    // 通过乐器编码反显乐器和声部
+    const initInstrumentAndSubjectByCode = async (codes: string[]) => {
+      // 选择一个声轨,独奏
+      // 选择了多个声轨,合奏,乐器和声部自动反显,不可修改
+      if (!codes || codes.length <= 1) {
+        forms.musicSheetType = 'SINGLE'
+        state.subjectDisabled = false
+        state.instrumentDisabled = false
+        return
+      }
+      forms.musicSheetType = 'CONCERT'
+      state.subjectDisabled = true
+      state.instrumentDisabled = true
+
+      forms.musicalInstrumentIdList = []
+      forms.subjectIds = []
+
+
+      const codeIdMap = new Map<string, []>() as any
       state.instrumentData.forEach((data: any) => {
         if (!data.disabled) {
-          codeIdMap.set(data.code.toLocaleLowerCase().trim(), data.id + '')
+          const codes = data.code.split(/[,,]/)
+          codes.forEach((code: string) => {
+            let codeTemp = code.trim().toLowerCase()
+            if (codeIdMap.has(codeTemp)) {
+              codeIdMap.get(codeTemp).push(data.id + '')
+            } else {
+              const arr = [] as any;
+              arr.push(data.id + '')
+              codeIdMap.set(codeTemp, arr)
+            }
+          })
         }
       })
-      forms.musicalInstrumentIdList = []
-      instrumentCodeList.forEach((code: string) => {
+      for (let i = 0; i < codes.length; i++) {
+        let code = codes[i].trim().toLowerCase()
         if (codeIdMap.has(code)) {
-          forms.musicalInstrumentIdList.push(codeIdMap.get(code))
+          codeIdMap.get(code).forEach((c: any) => {
+            if (!forms.musicalInstrumentIdList.includes(c)) {
+              forms.musicalInstrumentIdList.push(c)
+            }
+          })
         }
-      })
+      }
 
       // 声部
       if (forms.musicalInstrumentIdList.length > 0) {
-        showBackSubject(forms.musicalInstrumentIdList)
+        await showBackSubject(forms.musicalInstrumentIdList)
+        changeSubject(forms.subjectIds)
       }
     }
 
@@ -836,23 +898,19 @@ export default defineComponent({
       if (!value) {
         return
       }
+      let tempMultiTracksSelection = [] as any
       if (value === 'all') {
-        forms.multiTracksSelection = []
         state.partListNames.forEach((next: any) => {
-          forms.multiTracksSelection.push(next.value)
+          tempMultiTracksSelection.push(next.value)
         })
       } else if (value === 'invert') {
         state.partListNames.forEach((next: any) => {
-          const indexOf = forms.multiTracksSelection.indexOf(next.value)
-          if (indexOf > -1) {
-            forms.multiTracksSelection.splice(indexOf, 1)
-          } else {
-            forms.multiTracksSelection.push(next.value)
+          if (!forms.multiTracksSelection.includes(next.value)) {
+            tempMultiTracksSelection.push(next.value)
           }
         })
-      } else if (value === 'allUncheck') {
-        forms.multiTracksSelection = []
       }
+      forms.multiTracksSelection = tempMultiTracksSelection
     }
 
     const setOwnerName = () => {
@@ -1008,7 +1066,7 @@ export default defineComponent({
           forms.musicCover = data.musicCover
           forms.remark = data.remark
           forms.status = data.status
-          forms.musicSheetType = data.musicSheetType || 'SINGLE'
+          // forms.musicSheetType = data.musicSheetType || 'SINGLE'
           forms.sourceType = data.sourceType
           forms.appAuditFlag = data.appAuditFlag ? 1 : 0
           forms.midiFileUrl = data.midiFileUrl
@@ -1029,8 +1087,6 @@ export default defineComponent({
             })
 
           }
-          forms.musicalInstrumentIdList = data.musicalInstrumentIds ? data.musicalInstrumentIds.split(',') : []
-          await changeSubject(forms.subjectIds)
           forms.musicCategoryId = data.musicCategoryId
           forms.audioType = data.audioType
           forms.isPlayBeat = data.isPlayBeat
@@ -1054,18 +1110,20 @@ export default defineComponent({
             let audioPlayType = next.audioPlayType;
             if (audioPlayType && audioPlayType == 'SING') {
               state.bSongFile = next.audioFileUrl;
+              forms.scoreAudioFileUrl = next.scoreAudioFileUrl
             } else {
-              state.musicSheetAccompanimentUrlList.push(next.audioFileUrl)
-              forms.musicSheetAccompanimentList.push(next)
+              state.musicSheetAccompanimentUrl = next.audioFileUrl
             }
           })
 
           // 初始化演奏
           for (let i = 0; i < state.musicSheetSoundList.length; i++) {
-            if (state.musicSheetSoundList[i].audioPlayType == 'SING') {
+            if (state.musicSheetSoundList[i].audioPlayType == 'SING' && state.musicSheetSoundList[i].track != null) {
               // 范唱 唱名
-              state.fSongFile = state.musicSheetSoundList[i].audioFileUrl
-              forms.solmizationFileUrl = state.musicSheetSoundList[i].solmizationFileUrl
+              state.initFSongMap.set(state.musicSheetSoundList[i].track, {
+                ...state.musicSheetSoundList[i],
+                // musicalInstrumentName: state.instrumentIdNameMap.get(state.musicSheetSoundList[i].musicalInstrumentId),
+              })
             } else {
               if (forms.isAllSubject) {
                 forms.musicSheetSoundList_all_subject = state.musicSheetSoundList[i].audioFileUrl
@@ -1081,6 +1139,9 @@ export default defineComponent({
             }
           }
 
+          forms.musicalInstrumentIdList = data.musicalInstrumentIds ? data.musicalInstrumentIds.split(',') : []
+          await changeSubject(forms.subjectIds)
+
 
           setOwnerName()
           axios.get(data.xmlFileUrl).then((res: any) => {
@@ -1091,16 +1152,18 @@ export default defineComponent({
               state.partListNames = getPartListNames(res?.data as any) as any
 
               // 初始化音轨和原音
+              let multiTracksSelection = [] as any
               if (data.multiTracksSelection) {
                 data.multiTracksSelection = data.multiTracksSelection.toLocaleUpperCase()
               }
               if (!data.multiTracksSelection || data.multiTracksSelection.trim() == '' || data.multiTracksSelection.trim() == 'NULL') {
-                forms.multiTracksSelection = ['']
+                multiTracksSelection.push('')
               } else {
-                forms.multiTracksSelection = data.multiTracksSelection.split(',')
+                multiTracksSelection = data.multiTracksSelection.split(',')
               }
               let names = state.partListNames.map((next: any) => next.label)
-              forms.multiTracksSelection = names.filter((next: any) => forms.multiTracksSelection.includes(next.toLocaleUpperCase()))
+              multiTracksSelection = names.filter((next: any) => multiTracksSelection.includes(next.toLocaleUpperCase()))
+              forms.multiTracksSelection = multiTracksSelection
 
               const existSoundList = data.musicSheetSoundList ? data.musicSheetSoundList : []
               // 如果只有一个原音文件,并且原音没有对应声轨,取xml解析中的第一个声轨绑定当当前原音
@@ -1146,8 +1209,11 @@ export default defineComponent({
                   state.multiTracks = 'all'
                 }
 
+                // 根据声轨数量判断独奏合奏
+                forms.musicSheetType = forms.multiTracksSelection.length > 1 ? 'CONCERT' : 'SINGLE'
+
                 // 处理没有声轨,但有原音
-                if (data.musicSheetType == 'CONCERT') {
+                if (forms.musicSheetType == 'CONCERT') {
                   state.musicSheetSoundList.forEach((next: any) => {
                     if (next.audioPlayType == 'PLAY') {
                       if (next.track && !tracks.includes(next.track.trim()) && next.audioPlayType == 'PLAY') {
@@ -1491,36 +1557,53 @@ export default defineComponent({
               </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="musicSheetType"
+                    label="是否节奏练习"
+                    path="isAllSubject"
                     rule={[
                       {
                         required: true,
-                        message: '请选择谱面渲染',
-                        trigger: 'change'
+                        message: '请选择是否节奏练习',
                       }
                     ]}
                 >
-                  <NRadioGroup v-model:value={forms.musicSheetType}>
-                    <NRadio value={'SINGLE'}>多声轨</NRadio>
-                    <NRadio value={'CONCERT'}>单声轨</NRadio>
+                  <NRadioGroup v-model:value={forms.isAllSubject}>
+                    <NRadio value={false}>否</NRadio>
+                    <NRadio value={true}>是</NRadio>
                   </NRadioGroup>
                 </NFormItemGi>
                 <NFormItemGi
-                    label="适用声部"
-                    path="isAllSubject"
+                    label="速度"
+                    path="playSpeed"
                     rule={[
                       {
-                        required: true,
-                        message: '请选择适用声部',
+                        required: false,
+                        message: '请输入速度'
                       }
                     ]}
                 >
-                  <NRadioGroup v-model:value={forms.isAllSubject}>
-                    <NRadio value={false}>部分声部</NRadio>
-                    <NRadio value={true}>全部声部</NRadio>
-                  </NRadioGroup>
+                  <NInputNumber
+                      placeholder="请输入速度"
+                      v-model:value={forms.playSpeed}
+                      min={0}
+                      style="width:100%"
+                  />
                 </NFormItemGi>
               </NGrid>
               {!forms.isAllSubject && (
@@ -1540,11 +1623,12 @@ export default defineComponent({
                       <NSelect
                           v-model:value={forms.subjectIds}
                           options={state.subjectList}
+                          disabled={state.subjectDisabled}
                           multiple
                           filterable
                           clearable
                           placeholder="请选择可用声部"
-                          maxTagCount={2}
+                          maxTagCount={10}
                           onUpdateValue={async (val: any) => {
                             await changeSubject(val)
                           }}
@@ -1566,43 +1650,25 @@ export default defineComponent({
                           placeholder="请选择可用乐器"
                           options={state.instrumentList}
                           v-model:value={forms.musicalInstrumentIdList}
+                          disabled = {state.instrumentDisabled}
                           clearable
                           multiple
                           filterable
-                          maxTagCount={2}
+                          maxTagCount={10}
                           onUpdateValue={async (value: any) => {
                           }}
                       />
                     </NFormItemGi>
                   </NGrid>
               )}
-              <NGrid cols={2}>
-                <NFormItemGi
-                    label="速度"
-                    path="playSpeed"
-                    rule={[
-                      {
-                        required: false,
-                        message: '请输入速度'
-                      }
-                    ]}
-                >
-                  <NInputNumber
-                      placeholder="请输入速度"
-                      v-model:value={forms.playSpeed}
-                      min={0}
-                      style="width:100%"
-                  />
-                </NFormItemGi>
-              </NGrid>
               <NGrid cols={1}>
                 <NFormItemGi
-                    label={`${forms.musicSheetType === 'SINGLE' ? '页面渲染声轨' : '用户可切换声轨'}`}
+                    label={'切换声轨'}
                     path="multiTracksSelection"
                     rule={[
                       {
                         required: true,
-                        message: `请选择${forms.musicSheetType === 'SINGLE' ? '页面渲染声轨' : '用户可切换声轨'}`,
+                        message: `请选择切换声轨`,
                         trigger: 'change',
                         type: 'array'
                       }
@@ -1655,8 +1721,27 @@ export default defineComponent({
                   </NGrid>
                 </NFormItemGi>
               </NGrid>
-
-
+              {forms.multiTracksSelection.length > 1 && (
+                  <NGrid cols={1}>
+                    <NFormItemGi
+                        label="总谱渲染"
+                        path="isScoreRender"
+                        rule={[
+                          {
+                            required: true,
+                            message: '请选择总谱渲染'
+                          }
+                        ]}
+                    >
+                      <NRadioGroup
+                          v-model:value={forms.isScoreRender}
+                      >
+                        <NRadio value={true}>支持</NRadio>
+                        <NRadio value={false}>不支持</NRadio>
+                      </NRadioGroup>
+                    </NFormItemGi>
+                  </NGrid>
+              )}
               <NAlert showIcon={false} style={{marginBottom: '12px'}}>
                 演唱文件
               </NAlert>
@@ -1713,38 +1798,11 @@ export default defineComponent({
               </NGrid>
               <NGrid cols={2}>
                 <NFormItemGi
-                    label="上传范唱"
-                    path="fSongFile"
-                    rule={[
-                      {
-                        required: false,
-                        message: '请选择上传范唱',
-                        trigger: ['change', 'input']
-                      }
-                    ]}
-                >
-                  <UploadFile
-                      desc={'上传范唱'}
-                      disabled={state.previewMode}
-                      size={30}
-                      key={'xmlFileUrl'}
-                      v-model:fileList={state.fSongFile}
-                      tips="仅支持上传.mp3格式文件"
-                      listType="image"
-                      accept=".mp3"
-                      bucketName="cloud-coach"
-                      text="点击上传范唱文件"
-                      onRemove={() => {
-                      }}
-                  />
-                </NFormItemGi>
-                <NFormItemGi
                     label="上传伴唱"
                     path="bSongFile"
                     rule={[
                       {
                         required: false,
-                        message: '请选择上传.MID格式文件'
                       }
                     ]}
                 >
@@ -1761,34 +1819,107 @@ export default defineComponent({
                   />
                 </NFormItemGi>
               </NGrid>
-              <NGrid cols={2}>
-                <NFormItemGi
-                    label="上传唱名"
-                    path="solmizationFileUrl"
-                    rule={[
-                      {
-                        required: false,
-                        message: '请选择上传唱名',
-                        trigger: ['change', 'input']
-                      }
-                    ]}
-                >
-                  <UploadFile
-                      desc={'上传唱名'}
-                      disabled={state.previewMode}
-                      size={30}
-                      key={'xmlFileUrl'}
-                      v-model:fileList={forms.solmizationFileUrl}
-                      tips="仅支持上传.mp3格式文件"
-                      listType="image"
-                      accept=".mp3"
-                      bucketName="cloud-coach"
-                      text="点击上传唱名文件"
-                      onRemove={() => {
-                      }}
-                  />
-                </NFormItemGi>
-              </NGrid>
+              {forms.fSongList.length > 0 && forms.fSongList.map((item: any) => {
+                return (
+                    <NGrid class={styles.audioSection}>
+                      <NFormItemGi
+                          span={12}
+                          label={item.track + '范唱'}
+                          path={item.audioFileUrl}
+                          rule={[
+                            {
+                              required: false,
+                            }
+                          ]}
+                      >
+                        <UploadFile
+                            desc={'上传范唱'}
+                            disabled={state.previewMode}
+                            size={100}
+                            v-model:fileList={item.audioFileUrl}
+                            tips="仅支持上传.mp3格式文件"
+                            listType="image"
+                            accept=".mp3"
+                            bucketName="cloud-coach"
+                            text={'点击上传范唱文件'}
+                        />
+                      </NFormItemGi>
+                    </NGrid>
+                )
+              })}
+              {forms.multiTracksSelection.length > 1 && forms.isScoreRender && (
+                  <NGrid cols={2} class={styles.audioSection}>
+                    <NFormItemGi
+                        label="总谱范唱"
+                        path="scoreRenderFile"
+                        rule={[
+                          {
+                            required: false,
+                          }
+                        ]}
+                    >
+                      <UploadFile
+                          desc={'上传总谱范唱'}
+                          disabled={state.previewMode}
+                          size={30}
+                          v-model:fileList={forms.scoreAudioFileUrl}
+                          tips="仅支持上传.mp3格式文件"
+                          listType="image"
+                          accept=".mp3"
+                          bucketName="cloud-coach"
+                          text="点击上传总谱范唱"
+                      />
+                    </NFormItemGi>
+                  </NGrid>
+              )}
+              {forms.fSongList.length > 0 && forms.fSongList.map((item: any) => {
+                return (
+                    <NGrid cols={2}>
+                      <NFormItemGi
+                          label={item.track + '唱名(男)'}
+                          path={item.solmizationFileUrl}
+                          rule={[
+                            {
+                              required: false,
+                            }
+                          ]}
+                      >
+                        <UploadFile
+                            desc={'上传范唱'}
+                            disabled={state.previewMode}
+                            size={100}
+                            v-model:fileList={item.solmizationFileUrl}
+                            tips="仅支持上传.mp3格式文件"
+                            listType="image"
+                            accept=".mp3"
+                            bucketName="cloud-coach"
+                            text={'点击上传唱名文件'}
+                        />
+                      </NFormItemGi>
+                      <NFormItemGi
+                          label={item.track + '唱名(女)'}
+                          path={item.femaleSolmizationFileUrl}
+                          rule={[
+                            {
+                              required: false,
+                            }
+                          ]}
+                      >
+                        <UploadFile
+                            desc={'上传范唱'}
+                            disabled={state.previewMode}
+                            size={100}
+                            v-model:fileList={item.femaleSolmizationFileUrl}
+                            tips="仅支持上传.mp3格式文件"
+                            listType="image"
+                            accept=".mp3"
+                            bucketName="cloud-coach"
+                            text={'点击上传唱名文件'}
+                        />
+                      </NFormItemGi>
+                    </NGrid>
+                )
+              })}
               <NAlert showIcon={false} style={{marginBottom: '12px'}}>
                 演奏文件
               </NAlert>
@@ -1873,7 +2004,7 @@ export default defineComponent({
                       <UploadFile
                           disabled={state.previewMode}
                           size={30}
-                          v-model:imageList={state.musicSheetAccompanimentUrlList}
+                          v-model:fileList={state.musicSheetAccompanimentUrl}
                           tips="仅支持上传.mp3格式文件"
                           listType="image"
                           accept=".mp3"
@@ -1881,29 +2012,7 @@ export default defineComponent({
                           text="点击上传伴奏文件"
                           max={1}
                           desc={'上传伴奏文件'}
-                          onUpload:success={(file) => {
-                            state.musicSheetAccompanimentUrls = [state.musicSheetAccompanimentUrls, file.url].filter(Boolean).join(',')
-                            state.musicSheetAccompanimentUrlList = state.musicSheetAccompanimentUrls?.split(',').filter(Boolean)
-
-                            // 清除伴奏
-                            // forms.musicSheetAccompanimentList = forms.musicSheetAccompanimentList.filter((next: any) => {
-                            //   return next.audioPlayType == 'SING'
-                            // })
-                            forms.musicSheetAccompanimentList = []
-                            for (let i = 0; i < state.musicSheetAccompanimentUrlList.length; i++) {
-                              forms.musicSheetAccompanimentList.push({
-                                audioFileUrl: state.musicSheetAccompanimentUrlList[i],
-                                sortNumber: i + 1,
-                                audioPlayType: 'PLAY'
-                              })
-                            }
-                          }}
-                          onRemove={() => {
-                            state.musicSheetAccompanimentUrlList = []
-                            state.musicSheetAccompanimentUrls = ''
-                          }}
                           // onReadFileInputEventAsArrayBuffer={readFileInputEventAsArrayBuffer}
-                          multiple={true}
                       />
                     </NFormItemGi>
                 )}

+ 2 - 2
vite.config.ts

@@ -19,9 +19,9 @@ function pathResolve(dir: string) {
 }
 
 // const proxyUrl = 'https://dev.lexiaoya.cn'
-//const proxyUrl = 'http://127.0.0.1:7293/'
+const proxyUrl = 'http://127.0.0.1:7293/'
 // const proxyUrl = 'https://resource.colexiu.com/'
-const proxyUrl = 'https://dev.resource.colexiu.com'
+// const proxyUrl = 'https://dev.resource.colexiu.com'
 // https://test.resource.colexiu.com/
 
 export default ({ command, mode }: ConfigEnv): UserConfig => {