浏览代码

需求合并

yuanliang 1 年之前
父节点
当前提交
d135326feb
共有 1 个文件被更改,包括 196 次插入94 次删除
  1. 196 94
      src/views/music-library/music-sheet/modal/music-operationV2.tsx

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

@@ -301,8 +301,8 @@ export default defineComponent({
       musicSheetSoundList_all_subject: null, // 全部声部原音
       // musicSheetCategoriesId: null,
       status: false,
-      musicSheetType: 'SINGLE', // 曲目类型
-      sourceType: null as any, //来源类型/作者属性(PLATFORM: 平台; ORG: 机构; PERSON: 个人)
+      musicSheetType: 'CONCERT', // 曲目类型
+      sourceType: 'PLATFORM' as any, //来源类型/作者属性(PLATFORM: 平台; ORG: 机构; PERSON: 个人)
       // userId: null, // 所属人
       appAuditFlag: 0, // 是否审核版本
       midiFileUrl: null, // 伴奏文件 MIDI文件(保留字段)
@@ -343,7 +343,7 @@ export default defineComponent({
       subjectList: [] as any,
       showMusicSheetOwnerDialog: false, //所属人弹框
       // musicSheetOwnerData: {}, //所属人信息
-      multiTracks: null,
+      multiTracks: null as any,
       multiInstruments: null,
       appData: [], // 应用列表
       ownerName: null as any, // 所属人名称描述
@@ -412,11 +412,6 @@ export default defineComponent({
           }
         }
 
-        if (!state.isAutoSave) {
-          state.isAutoSave = true
-          state.productOpen = true
-          return
-        }
         try {
           //extConfigJson: {"repeatedBeats":0,"gradualTimes":{"75":"02:38:60","77":"02:43:39"}}
           let audioPlayTypes = [] as any;
@@ -432,6 +427,7 @@ export default defineComponent({
             audioPlayTypes.push("SING")
           }
 
+          var existYzFile = false;
           if (musicSheetType == 'SINGLE') {
             if (forms.isAllSubject) {
               if (forms.musicSheetSoundList_all_subject) {
@@ -442,19 +438,15 @@ export default defineComponent({
                   audioPlayType: 'PLAY'
                 })
               }
-              if (!state.fSongFile && !state.bSongFile && !forms.musicSheetSoundList_all_subject) {
-                message.warning("请上传音频文件")
-                return
+              if (forms.musicSheetSoundList_all_subject) {
+                existYzFile = true
               }
             } else {
-              var existYzFile = false;
               if (forms.musicSheetSoundList_YZ.length > 0) {
                 audioPlayTypes.push("PLAY")
                 forms.musicSheetSoundList_YZ.forEach((musicSheetSound: any) => {
-                  if (forms.musicalInstrumentIdList.includes(musicSheetSound.musicalInstrumentId)) {
-                    if (musicSheetSound.audioFileUrl != null) {
-                      existYzFile = true
-                    }
+                  if (forms.musicalInstrumentIdList.includes(musicSheetSound.musicalInstrumentId) && musicSheetSound.audioFileUrl) {
+                    existYzFile = true
                     musicSheetSoundList.push({
                       ...musicSheetSound,
                       musicSheetId: props.data.id,
@@ -462,25 +454,23 @@ export default defineComponent({
                   }
                 })
               }
-              if (!state.fSongFile && !state.bSongFile && !existYzFile) {
-                message.warning("请上传音频文件")
-                return
-              }
             }
+          } else if (musicSheetType == 'CONCERT') {
+            audioPlayTypes.push("PLAY")
+            forms.musicSheetSoundList_YY.forEach((musicSheetSound: any) => {
+              if (musicSheetSound.audioFileUrl) {
+                musicSheetSoundList.push({
+                  ...musicSheetSound,
+                  musicSheetId: props.data.id,
+                })
+                existYzFile = true
+              }
+            })
+          }
+          if (!state.fSongFile && !state.bSongFile && !existYzFile) {
+            message.warning("请上传音频文件")
+            return
           }
-
-
-            if (musicSheetType == 'CONCERT' && forms.musicSheetSoundList_YY.length > 0) {
-              audioPlayTypes.push("PLAY")
-              forms.musicSheetSoundList_YY.forEach((musicSheetSound: any) => {
-                if (musicSheetSound.audioFileUrl) {
-                  musicSheetSoundList.push({
-                    ...musicSheetSound,
-                    musicSheetId: props.data.id,
-                  })
-                }
-              })
-            }
 
           if (state.bSongFile) {
             forms.musicSheetAccompanimentList.push({
@@ -490,7 +480,12 @@ export default defineComponent({
             })
           }
 
-          //
+          // 生成图片
+          if (!state.isAutoSave) {
+            state.isAutoSave = true
+            state.productOpen = true
+            return
+          }
 
 
           const obj = {
@@ -531,6 +526,7 @@ export default defineComponent({
             isUseSingSystemBeat: forms.isUseSingSystemBeat,
             isPlaySingBeat: forms.isPlaySingBeat,
             isAllSubject: forms.isAllSubject,
+            musicSheetExtend: forms.sourceType == 'PLATFORM' ? null : forms.musicSheetExtend,
           }
           if (forms.audioType == 'MIDI') {
             obj.musicSheetSoundList = []
@@ -550,6 +546,7 @@ export default defineComponent({
         }
         setTimeout(() => {
           btnLoading.value = false
+          state.isAutoSave = false
         }, 100)
       })
     }
@@ -566,35 +563,67 @@ export default defineComponent({
           )
         } catch (error) {
         }
+        forms.musicSheetSoundList_YY = forms.musicSheetSoundList_YY.filter((item: any) => {
+          return (!item.track || !containOther(item.track) || (item.track?.toLocaleUpperCase?.() != 'COMMON' && forms.multiTracksSelection.includes(item.track)))
+        })
+
         state.partListNames = getPartListNames(res?.target?.result as any) as any
         // parseInstrumentAndSubject(res?.target?.result as any)
         // 这里是如果没有当前音轨就重新写
-        for (let j = 0; j < state.partListNames.length; j++) {
-          if (!forms.musicSheetSoundList_YY[j]) {
-            forms.musicSheetSoundList_YY.push({audioFileUrl: null, track: null})
+
+        let map = new Map<String, String>()
+        for (let i = 0; i < forms.musicSheetSoundList_YY.length; i++) {
+          let track = forms.musicSheetSoundList_YY[i].track;
+          if (track) {
+            map.set(track, forms.musicSheetSoundList_YY[i])
           }
-          forms.musicSheetSoundList_YY[j].track = state.partListNames[j].value
         }
 
-        // 循环添加所在音轨的原音
-        for (
-            let index = forms.musicSheetSoundList_YY.length;
-            index < state.partListNames.length;
-            index++
-        ) {
-          const part = state.partListNames[index].value
-          const sysData = {
-            ...forms.musicSheetSoundList_YY[0],
-            track: part
+        let newMusicSheetSoundList = []
+        let tracks = [] as any
+        for (let j = 0; j < state.partListNames.length; j++) {
+          let track = state.partListNames[j].value;
+          if (map.has(track)) {
+            newMusicSheetSoundList.push(map.get(track))
+          } else {
+            newMusicSheetSoundList.push({audioFileUrl: null, track: track, musicalInstrumentId: null})
           }
-          if (!sysData.speed) {
-            sysData.speed = state.xmlFirstSpeed
+          tracks.push(track)
+          if(!forms.multiTracksSelection.includes(track)) {
+            forms.multiTracksSelection.push(track)
           }
-          createSys(sysData)
         }
 
+        for (let i = 0; i < forms.musicSheetSoundList_YY.length; i++) {
+          let track = forms.musicSheetSoundList_YY[i].track;
+          if (!track || !tracks.includes(track)) {
+            forms.musicSheetSoundList_YY[i].track = null
+            newMusicSheetSoundList.push(forms.musicSheetSoundList_YY[i])
+          }
+        }
+        forms.musicSheetSoundList_YY = newMusicSheetSoundList
+
+        forms.multiTracksSelection = forms.multiTracksSelection.filter((track: any) => {
+          return tracks.includes(track)
+        })
+        // 全选选中
+        state.multiTracks = 'all'
+
+        // 循环添加所在音轨的原音
+        // for (let index = forms.musicSheetSoundList.length; index < state.partListNames.length; index++) {
+        //   const part = state.partListNames[index].value
+        //   const sysData = {
+        //     ...forms.musicSheetSoundList[0],
+        //     track: part
+        //   }
+        //   if (!sysData.speed) {
+        //     sysData.speed = state.xmlFirstSpeed
+        //   }
+        //   createSys(sysData)
+        // }
+
         if (forms.musicSheetSoundList_YY.length == 0) {
-          forms.musicSheetSoundList_YY.push({audioFileUrl: '', track: ''})
+          forms.musicSheetSoundList_YY.push({ audioFileUrl: '', track: '' })
         }
       }
       xmlRead.readAsText(file)
@@ -609,6 +638,12 @@ export default defineComponent({
       return false
     }
 
+    const validSoundNum = () => {
+      return forms.musicSheetSoundList_YY.filter((item: any) => {
+        return (!item.track || !containOther(item.track) || (item.track?.toLocaleUpperCase?.() != 'COMMON' && forms.multiTracksSelection.includes(item.track)))
+      }).length;
+    }
+
     const parseInstrumentAndSubject = (xml: any) => {
       if (!xml) return
       const xmlParse = new DOMParser().parseFromString(xml, 'text/xml')
@@ -617,7 +652,8 @@ export default defineComponent({
       const instrumentEle = xmlParse.getElementsByTagName('virtual-instrument')
       for (let index = 0; index < instrumentEle.length; index++) {
         const note = instrumentEle[index]
-        const instrumentCode = note.getElementsByTagName('virtual-name')?.[0]?.textContent || ''
+        let instrumentCode = note.getElementsByTagName('virtual-name')?.[0]?.textContent || ''
+        instrumentCode = instrumentCode.toLocaleLowerCase().trim()
         if (instrumentCode && !instrumentCodeList.includes(instrumentCode)) {
           instrumentCodeList.push(instrumentCode)
         }
@@ -647,7 +683,9 @@ export default defineComponent({
       // })
       const codeIdMap = new Map<string, string>()
       state.instrumentData.forEach((data: any) => {
-        codeIdMap.set(data.code, data.id + '')
+        if (!data.disabled) {
+          codeIdMap.set(data.code.toLocaleLowerCase().trim(), data.id + '')
+        }
       })
       forms.musicalInstrumentIdList = []
       instrumentCodeList.forEach((code: string) => {
@@ -669,14 +707,24 @@ export default defineComponent({
       const partList: any =
           xmlParse.getElementsByTagName('part-list')?.[0]?.getElementsByTagName('score-part') || []
       let partListNames = Array.from(partList).map((item: any) => {
-        let part = item.getElementsByTagName('part-name')?.[0]?.textContent || ''
+        let part = item.getElementsByTagName('part-name')?.[0]
         // evxml没有分轨,需要手动设置一个默认的名称,用于上传原音
-        if (forms.isEvxml) {
-          part = part || 'noPartName'
+        // if (forms.isEvxml) {
+        //   part = part || 'noPartName'
+        // }
+        // 优先解析声轨,没有就取id值
+        let track = ''
+        if (part) {
+          track = part.textContent || ''
+        } else {
+          let id = item.getAttribute('id')
+          if (id) {
+            track = id
+          }
         }
         return {
-          value: part.trim(),
-          label: part.trim()
+          value: track.trim(),
+          label: track.trim()
         }
       })
 
@@ -690,9 +738,9 @@ export default defineComponent({
 
       partListNames = partListNames.filter((n: any) => n.value?.toLocaleUpperCase?.() != 'COMMON')
 
-      if (partListNames.length > 0) {
-        forms.musicSheetSoundList_YY = forms.musicSheetSoundList_YY.slice(0, partListNames.length)
-      }
+      // if (partListNames.length > 0) {
+      //   forms.musicSheetSoundList = forms.musicSheetSoundList.slice(0, partListNames.length)
+      // }
 
       state.xmlFirstSpeed = xmlParse.getElementsByTagName('per-minute')?.[0]?.textContent || ''
       if (!forms.playSpeed) {
@@ -737,7 +785,7 @@ export default defineComponent({
     // 反显声部
     const showBackSubject = async (musicalInstrumentIdList: []) => {
       try {
-        const {data} = await subjectPage({
+        const { data } = await subjectPage({
           page: 1,
           rows: 999,
           musicalInstrumentIdList: musicalInstrumentIdList
@@ -767,15 +815,21 @@ export default defineComponent({
         negativeText: '取消',
         onPositiveClick: async () => {
           const sound = forms.musicSheetSoundList_YY[index]
-          const track = sound.track
-          if (track != null) {
-            const selectIndex = forms.multiTracksSelection.indexOf(track)
-            if (selectIndex > -1) {
-              forms.multiTracksSelection.splice(selectIndex, 1)
-            }
+          let track = sound.track
+          // if (!track) {
+          //   track = ''
+          // }
+          // if (track) {
+          const selectIndex = forms.multiTracksSelection.indexOf(track)
+          if (selectIndex > -1) {
+            forms.multiTracksSelection.splice(selectIndex, 1)
           } else {
             forms.musicSheetSoundList_YY.splice(index, 1)
           }
+
+          if (state.multiTracks == 'all' && state.partListNames.length != forms.multiTracksSelection.length) {
+            state.multiTracks = null
+          }
         }
       })
     }
@@ -802,12 +856,13 @@ export default defineComponent({
         forms.multiTracksSelection = []
       }
     }
+
     const setOwnerName = () => {
       if (forms.sourceType == 'PLATFORM') {
         state.ownerName = ''
         return
       }
-      if (!forms.musicSheetExtend || !forms.sourceType || !forms.musicSheetExtend?.userId) {
+      if (!forms.sourceType || !forms.musicSheetExtend?.userId) {
         return
       }
       const appId = forms.musicSheetExtend.applicationId
@@ -832,6 +887,19 @@ export default defineComponent({
       }
     }
 
+    // 声轨数据兼容
+    const formatTrack = (track: string) => {
+      if (!track) {
+        return '';
+      }
+      const trim = track.trim().toUpperCase();
+      // 导入后的脏数据兼容
+      if (trim == 'P1' || trim == 'NULL') {
+        return '';
+      }
+      return track.trim();
+    }
+
     const changeSubject = async (subjectIdList: []) => {
       state.instrumentList = []
       if (!subjectIdList || subjectIdList.length == 0) {
@@ -958,6 +1026,10 @@ export default defineComponent({
                 forms.subjectIds.push(subjectId)
               }
             })
+            state.subjectList = state.subjectList.filter((subject: any) => {
+              return (!subject.disabled || subjectIds.includes(subject.value));
+            })
+
           }
           forms.musicalInstrumentIdList = data.musicalInstrumentIds ? data.musicalInstrumentIds.split(',') : []
           await changeSubject(forms.subjectIds)
@@ -1032,36 +1104,52 @@ export default defineComponent({
               let names = state.partListNames.map((next: any) => next.label)
               forms.multiTracksSelection = names.filter((next: any) => forms.multiTracksSelection.includes(next.toLocaleUpperCase()))
 
-              if (state.musicSheetSoundList.length === 1 && state.musicSheetSoundList[0].track === 'P1') {
+              const existSoundList = data.musicSheetSoundList ? data.musicSheetSoundList : []
+              // 如果只有一个原音文件,并且原音没有对应声轨,取xml解析中的第一个声轨绑定当当前原音
+              if (existSoundList.length === 1 && !formatTrack(existSoundList[0].track)) {
+                let track = state.partListNames.length > 0 ? state.partListNames[0].value : null;
                 forms.musicSheetSoundList_YY.push({
-                  audioFileUrl: state.musicSheetSoundList[0].audioFileUrl, // 原音
-                  track: state.partListNames[0].value || '', // 轨道
+                  audioFileUrl: existSoundList[0].audioFileUrl, // 原音
+                  musicalInstrumentId: existSoundList[0].musicalInstrumentId,
+                  track: track, // 轨道
                   audioPlayType: 'PLAY'
                 })
+                if (track && !forms.multiTracksSelection.includes(track)) {
+                  forms.multiTracksSelection.push(track)
+                }
               } else {
                 const tracks = [] as any
                 state.partListNames.forEach((item: any) => {
                   let audioFileUrl = null
-                  state.musicSheetSoundList.forEach((next: any) => {
-                    let track = next.track ? next.track : ''
-                    if (track.trim() == item.value) {
+                  let musicalInstrumentId = null
+                  existSoundList.forEach((next: any) => {
+                    if (!next.track || next.track.trim() == '') {
+                      next.track = ''
+                    }
+                    if (next.track == item.value) {
                       audioFileUrl = next.audioFileUrl
+                      musicalInstrumentId = next.musicalInstrumentId
                     }
                   })
                   forms.musicSheetSoundList_YY.push({
                     audioFileUrl: audioFileUrl, // 原音
-                    track: item.value, // 轨道
-                    audioPlayType: 'PLAY'
+                    musicalInstrumentId: musicalInstrumentId, // 乐器
+                    track: item.value // 轨道
                   })
                   tracks.push(item.value)
                 })
 
+                if (tracks.length == forms.multiTracksSelection.length) {
+                  state.multiTracks = 'all'
+                }
+
                 // 处理没有声轨,但有原音
                 if (data.musicSheetType == 'CONCERT') {
                   state.musicSheetSoundList.forEach((next: any) => {
                     if (next.track && !tracks.includes(next.track.trim()) && next.audioPlayType == 'PLAY') {
                       forms.musicSheetSoundList_YY.push({
                         audioFileUrl: next.audioFileUrl, // 原音
+                        musicalInstrumentId: next.musicalInstrumentId,
                         track: next.track ? next.track.trim() : '', // 轨道
                         audioPlayType: 'PLAY'
                       })
@@ -1078,9 +1166,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
     })
@@ -1143,7 +1231,7 @@ export default defineComponent({
                     path="musicCover"
                     rule={[
                       {
-                        required: true,
+                        required: false,
                         message: '请上传曲目封面',
                         trigger: ['input', 'blur']
                       }
@@ -1372,9 +1460,9 @@ export default defineComponent({
                       text="点击上传XML文件"
                       onReadFileInputEventAsArrayBuffer={readFileInputEventAsArrayBuffer}
                       onRemove={() => {
-                        forms.multiTracksSelection = []
-                        state.partListNames = []
-                        forms.musicSheetSoundList_YY = []
+                        // forms.multiTracksSelection = []
+                        // state.partListNames = []
+                        // forms.musicSheetSoundList_YY = []
                         // forms.musicalInstrumentIdList = []
                         // forms.subjectIds = []
                       }}
@@ -1475,6 +1563,7 @@ export default defineComponent({
                           v-model:value={forms.musicalInstrumentIdList}
                           clearable
                           multiple
+                          filterable
                           maxTagCount={2}
                           onUpdateValue={async (value: any) => {
                           }}
@@ -1508,9 +1597,7 @@ export default defineComponent({
                     rule={[
                       {
                         required: true,
-                        message: `请选择${
-                            forms.musicSheetType === 'SINGLE' ? '页面渲染声轨' : '用户可切换声轨'
-                        }`,
+                        message: `请选择${forms.musicSheetType === 'SINGLE' ? '页面渲染声轨' : '用户可切换声轨'}`,
                         trigger: 'change',
                         type: 'array'
                       }
@@ -1540,7 +1627,15 @@ export default defineComponent({
                                 }
                               ]}
                           >
-                            <NCheckboxGroup v-model:value={forms.multiTracksSelection}>
+                            <NCheckboxGroup v-model:value={forms.multiTracksSelection}
+                                            onUpdateValue={(val: any) => {
+                                              if (state.partListNames.length != val.length) {
+                                                state.multiTracks = null
+                                              } else {
+                                                state.multiTracks = 'all'
+                                              }
+                                            }}
+                            >
                               <NGrid yGap={2} cols={4}>
                                 {state.partListNames.map((item: any) => (
                                     <NGi>
@@ -2002,10 +2097,14 @@ export default defineComponent({
                                                 )
                                               }
 
-                                              if (value && !forms.multiTracksSelection.includes(value)) {
+                                              if (value != null && !forms.multiTracksSelection.includes(value)) {
                                                 forms.multiTracksSelection.push(value)
                                               }
                                               item.track = value
+
+                                              if (state.partListNames.length == forms.multiTracksSelection.length) {
+                                                state.multiTracks = 'all'
+                                              }
                                             }}
                                         />
                                       </NFormItemGi>
@@ -2077,6 +2176,9 @@ export default defineComponent({
               preset="dialog"
               closeOnEsc={false}
               maskClosable={false}
+              onClose={()=> {
+                state.isAutoSave = false
+              }}
               showIcon={false}
           >
             <MusicCreateImg
@@ -2088,14 +2190,14 @@ export default defineComponent({
                     forms.musicImg = item.musicImg
                     forms.musicFirstImg = item.musicFirstImg
                     forms.musicJianImg = item.musicJianImg
-                    onSubmit()
+                    await onSubmit()
                   } catch (e: any) {
                     //
                     console.log(e, 'e')
                   }
-                  setTimeout(() => {
-                    state.isAutoSave = false
-                  }, 50)
+                  // setTimeout(() => {
+                  //   state.isAutoSave = false
+                  // }, 50)
                 }}
             />
           </NModal>